diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/LimitedCreative.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/LimitedCreative.java index d2a582d..f7cba5b 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/LimitedCreative.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/LimitedCreative.java @@ -1,14 +1,10 @@ package de.jaschastarke.minecraft.limitedcreative; -import java.util.List; - import de.jaschastarke.Backdoor; import de.jaschastarke.I18n; import de.jaschastarke.bukkit.lib.Core; import de.jaschastarke.bukkit.lib.PluginLang; import de.jaschastarke.bukkit.lib.configuration.command.ConfigCommand; -import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockLocation; -import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockState; public class LimitedCreative extends Core { protected Config config = null; @@ -44,16 +40,6 @@ public class LimitedCreative extends Core { new Backdoor().install(); } - @Override - public List> getDatabaseClasses() { - List> list = super.getDatabaseClasses(); - list.add(BlockLocation.class); - list.add(BlockState.class); - return list; - } - - - @Override public boolean isDebug() { return config.getDebug(); diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/ModBlockStates.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/ModBlockStates.java index 0949827..06438ad 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/ModBlockStates.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/ModBlockStates.java @@ -1,19 +1,18 @@ package de.jaschastarke.minecraft.limitedcreative; -import com.avaje.ebean.EbeanServer; -import com.avaje.ebean.Query; - import de.jaschastarke.bukkit.lib.CoreModule; import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockListener; -import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockState; import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockStateConfig; +import de.jaschastarke.minecraft.limitedcreative.blockstate.DBQueries; import de.jaschastarke.minecraft.limitedcreative.blockstate.PlayerListener; import de.jaschastarke.modularize.IModule; import de.jaschastarke.modularize.ModuleEntry; +import de.jaschastarke.modularize.ModuleEntry.ModuleState; public class ModBlockStates extends CoreModule { private BlockStateConfig config; private FeatureBlockItemSpawn blockDrops; + private DBQueries queries; public ModBlockStates(LimitedCreative plugin) { super(plugin); @@ -31,15 +30,23 @@ public class ModBlockStates extends CoreModule { if (blockDrops == null) blockDrops = plugin.addModule(new FeatureBlockItemSpawn(plugin)).getModule(); - listeners.addListener(new BlockListener(this)); - listeners.addListener(new PlayerListener(this)); - config = new BlockStateConfig(this, entry); plugin.getPluginConfig().registerSection(config); - plugin.getDatabaseManager().registerDatabaseClass(BlockState.class); + + listeners.addListener(new BlockListener(this)); + listeners.addListener(new PlayerListener(this)); } @Override public void onEnable() { + try { + queries = new DBQueries(getPlugin().getDatabaseConnection()); + queries.initTable(); + } catch (Exception e) { + e.printStackTrace(); + getLog().warn(plugin.getLocale().trans("block_state.error.sql_connection_failed", getName())); + entry.initialState = ModuleState.NOT_INITIALIZED; + return; + } super.onEnable(); getLog().info(plugin.getLocale().trans("basic.loaded.module")); @@ -49,17 +56,13 @@ public class ModBlockStates extends CoreModule { super.onDisable();; } - public EbeanServer getDB() { - return plugin.getDatabaseManager().getDatabase(); - } - public Query getBSQuery() { - return plugin.getDatabaseManager().getDatabase().find(BlockState.class); - } - public BlockStateConfig getConfig() { return config; } public FeatureBlockItemSpawn getBlockSpawn() { return blockDrops; } + public DBQueries getQueries() { + return queries; + } } diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockListener.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockListener.java index bfec66c..7073131 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockListener.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockListener.java @@ -1,5 +1,6 @@ package de.jaschastarke.minecraft.limitedcreative.blockstate; +import java.sql.SQLException; import java.util.Date; import org.bukkit.GameMode; @@ -21,18 +22,24 @@ public class BlockListener implements Listener { public void onBlockBreak(BlockBreakEvent event) { if (event.isCancelled()) return; - - BlockLocation bl = new BlockLocation(event.getBlock().getLocation()); - BlockState s = mod.getDB().find(BlockState.class, bl); - if (s != null) { - if (mod.isDebug()) - mod.getLog().debug("Breaking bad, err.. block: " + s.toString()); - - if (s.getGameMode() == GameMode.CREATIVE && event.getPlayer().getGameMode() != GameMode.CREATIVE) { - mod.getBlockSpawn().block(event.getBlock(), event.getPlayer()); + + try { + //BlockLocation bl = new BlockLocation(event.getBlock().getLocation()); + //BlockState s = mod.getDB().find(BlockState.class, bl); + BlockState s = mod.getQueries().find(event.getBlock().getLocation()); + if (s != null) { + if (mod.isDebug()) + mod.getLog().debug("Breaking bad, err.. block: " + s.toString()); + + if (s.getGameMode() == GameMode.CREATIVE && event.getPlayer().getGameMode() != GameMode.CREATIVE) { + mod.getBlockSpawn().block(event.getBlock(), event.getPlayer()); + } + + mod.getQueries().delete(s); } - - mod.getDB().delete(s); + } catch (SQLException e) { + mod.getLog().warn("DB-Error while in onBlockBreak: "+e.getMessage()); + event.setCancelled(true); } } @EventHandler(priority = EventPriority.MONITOR) @@ -40,7 +47,7 @@ public class BlockListener implements Listener { if (event.isCancelled()) return; - BlockLocation bl = new BlockLocation(event.getBlock().getLocation()); + /*BlockLocation bl = new BlockLocation(event.getBlock().getLocation()); BlockState s = mod.getDB().find(BlockState.class, bl); if (s != null) { // This shouldn't happen @@ -54,6 +61,6 @@ public class BlockListener implements Listener { s.setDate(new Date()); if (mod.isDebug()) mod.getLog().debug("Saving BlockState: " + s.toString()); - mod.getDB().save(s); + mod.getDB().save(s);*/ } } diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockLocation.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockLocation.java index 50a1094..eb58fdd 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockLocation.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockLocation.java @@ -12,6 +12,7 @@ import org.bukkit.World; @Embeddable @Entity +@Deprecated public class BlockLocation implements Serializable { private static final long serialVersionUID = -8644798679923736348L; diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockState.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockState.java index 4ed7963..bbbb380 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockState.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/BlockState.java @@ -3,9 +3,9 @@ package de.jaschastarke.minecraft.limitedcreative.blockstate; import java.util.Date; import javax.persistence.Column; -import javax.persistence.EmbeddedId; +//import javax.persistence.EmbeddedId; import javax.persistence.Entity; -import javax.persistence.IdClass; +//import javax.persistence.IdClass; import javax.persistence.Table; import org.bukkit.Bukkit; @@ -18,7 +18,7 @@ import com.avaje.ebean.validation.NotNull; @Entity @Table(name = "block_state") -@IdClass(BlockLocation.class) +//@IdClass(BlockLocation.class) public class BlockState { public static enum Source { SEED, // There is no way to determine this source, but lets be prepared for miracles ;) @@ -36,8 +36,9 @@ public class BlockState { @Id private int z;*/ - @EmbeddedId - private BlockLocation blockLocation; + /*@EmbeddedId + private BlockLocation blockLocation;*/ + private Location location; @Column(name = "gm") private GameMode gameMode; @@ -52,18 +53,19 @@ public class BlockState { @NotNull private Source source = Source.UNKNOWN; - +/* public BlockLocation getBlockLocation() { return blockLocation; } public void setBlockLocation(BlockLocation loc) { this.blockLocation = loc; - } + }*/ public Location getLocation() { /*return new Location(Bukkit.getWorld(world), x, y, z);*/ - return getBlockLocation().getLocation(); + //return getBlockLocation().getLocation(); + return location; } public void setLocation(Location loc) { @@ -71,7 +73,8 @@ public class BlockState { x = loc.getBlockX(); y = loc.getBlockY(); z = loc.getBlockZ();*/ - setBlockLocation(new BlockLocation(loc)); + //setBlockLocation(new BlockLocation(loc)); + location = loc; } public GameMode getGameMode() { @@ -125,7 +128,8 @@ public class BlockState { @Override public String toString() { - return blockLocation.toString() + " by " + + //return blockLocation.toString() + " by " + + return location.toString() + " by " + (source == Source.PLAYER ? playerName : (source.toString() + (playerName != null ? "(" + playerName + ")" : ""))) + (gameMode != null ? "" : (" in GM: " + gameMode)) + " at " + date.toString(); diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/DBQueries.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/DBQueries.java new file mode 100644 index 0000000..89ad7b8 --- /dev/null +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/DBQueries.java @@ -0,0 +1,106 @@ +package de.jaschastarke.minecraft.limitedcreative.blockstate; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.bukkit.GameMode; +import org.bukkit.Location; + +import de.jaschastarke.database.db.Database; +import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockState.Source; + +public class DBQueries { + private Database db; + public DBQueries(Database db) { + this.db = db; + } + + private PreparedStatement find = null; + public BlockState find(Location loc) throws SQLException { + if (find == null) { + find = db.prepare("SELECT * FROM block_state WHERE x = ? AND y = ? AND z = ? AND world = ?"); + } + find.setInt(1, loc.getBlockX()); + find.setInt(2, loc.getBlockX()); + find.setInt(3, loc.getBlockX()); + find.setString(4, loc.getWorld().getUID().toString()); + ResultSet rs = find.executeQuery(); + if (rs.next()) { + BlockState bs = new BlockState(); + bs.setLocation(loc); + bs.setDate(rs.getDate("cdate")); + bs.setGameMode(getGameMode(rs)); + bs.setPlayerName(rs.getString("player")); + bs.setSource(getSource(rs)); + return bs; + } + return null; + } + + private PreparedStatement delete = null; + public boolean delete(BlockState s) throws SQLException { + if (delete == null) { + delete = db.prepare("DELETE FROM block_state WHERE x = ? AND y = ? AND z = ? AND world = ?"); + } + delete.setInt(1, s.getLocation().getBlockX()); + delete.setInt(2, s.getLocation().getBlockX()); + delete.setInt(3, s.getLocation().getBlockX()); + delete.setString(4, s.getLocation().getWorld().getUID().toString()); + return delete.executeUpdate() > 0; + } + + private GameMode getGameMode(ResultSet rs) { + switch (db.getType()) { + case SQLite: + try { + return GameMode.values()[rs.getInt("gm")]; + } catch (Exception e) { + db.getLogger().warn("Couldn't get GameMode from result-set: "+e.getMessage()); + return GameMode.SURVIVAL; + } + default: + throw new RuntimeException("Currently only SQLite is supported."); + } + } + + private Source getSource(ResultSet rs) { + switch (db.getType()) { + case SQLite: + try { + return Source.values()[rs.getInt("source")]; + } catch (Exception e) { + db.getLogger().warn("Couldn't get Source from result-set: "+e.getMessage()); + return Source.UNKNOWN; + } + default: + throw new RuntimeException("Currently only SQLite is supported."); + } + } + + public void initTable() throws SQLException { + switch (db.getType()) { + case SQLite: + if (db.getDDL().tableExists("block_state")) { + db.execute( + "CREATE TABLE block_state ("+ + "x integer,"+ + "y integer,"+ + "z integer,"+ + "world varchar(40),"+ + "gm integer,"+ + "player varchar(255),"+ + "cdate timestamp not null,"+ + "source integer not null,"+ + "constraint ck_block_state_gm check (gm in (0,1,2)),"+ + "constraint ck_block_state_source check (source in (0,1,2,3))"+ + ")" + ); + db.getLogger().info("Created SQLite-Table: block_state"); + } + break; + default: + throw new RuntimeException("Currently only SQLite is supported."); + } + } +} diff --git a/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/PlayerListener.java b/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/PlayerListener.java index 51896d3..ae42552 100644 --- a/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/PlayerListener.java +++ b/src/main/java/de/jaschastarke/minecraft/limitedcreative/blockstate/PlayerListener.java @@ -23,7 +23,7 @@ public class PlayerListener implements Listener { public void onInteract(PlayerInteractEvent event) { if (event.isCancelled()) return; - if (event.getAction() == Action.RIGHT_CLICK_BLOCK && mod.getPlugin().getPermManager().hasPermission(event.getPlayer(), BlockStatePermissions.TOOL)) { + /*if (event.getAction() == Action.RIGHT_CLICK_BLOCK && mod.getPlugin().getPermManager().hasPermission(event.getPlayer(), BlockStatePermissions.TOOL)) { Block b = event.getClickedBlock(); if (b != null && event.getPlayer().getItemInHand().getType().equals(mod.getConfig().getTool())) { BlockState s = mod.getDB().find(BlockState.class, new BlockLocation(b.getLocation())); @@ -53,6 +53,6 @@ public class PlayerListener implements Listener { if (ret != null) event.getPlayer().sendMessage(ret); } - } + }*/ } }