WorldEdit Intergration for remember BlockState
(Should work with LogBlock, untested)
This commit is contained in:
parent
614a3e9007
commit
e7a794add7
10 changed files with 346 additions and 11 deletions
14
pom.xml
14
pom.xml
|
@ -68,6 +68,12 @@
|
|||
<artifactId>plib</artifactId>
|
||||
<version>${plib.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<!-- http://dl.bukkit.org/ -->
|
||||
<groupId>org.bukkit</groupId>
|
||||
<artifactId>bukkit</artifactId>
|
||||
<version>1.6.2-R0.1-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<!-- http://dev.bukkit.org/server-mods/worldguard/ -->
|
||||
<groupId>com.sk89q</groupId>
|
||||
|
@ -93,10 +99,10 @@
|
|||
<version>2.0.26</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<!-- http://dl.bukkit.org/ -->
|
||||
<groupId>org.bukkit</groupId>
|
||||
<artifactId>bukkit</artifactId>
|
||||
<version>1.6.2-R0.1-SNAPSHOT</version>
|
||||
<!-- http://dev.bukkit.org/bukkit-plugins/logblock/ -->
|
||||
<groupId>de.diddiz</groupId>
|
||||
<artifactId>logblock</artifactId>
|
||||
<version>1.70</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
|
|
@ -4,7 +4,9 @@ import de.jaschastarke.bukkit.lib.CoreModule;
|
|||
import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockListener;
|
||||
import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockStateConfig;
|
||||
import de.jaschastarke.minecraft.limitedcreative.blockstate.DBQueries;
|
||||
import de.jaschastarke.minecraft.limitedcreative.blockstate.DependencyListener;
|
||||
import de.jaschastarke.minecraft.limitedcreative.blockstate.PlayerListener;
|
||||
import de.jaschastarke.minecraft.limitedcreative.blockstate.worldedit.LCEditSessionFactory;
|
||||
import de.jaschastarke.modularize.IModule;
|
||||
import de.jaschastarke.modularize.ModuleEntry;
|
||||
import de.jaschastarke.modularize.ModuleEntry.ModuleState;
|
||||
|
@ -35,6 +37,7 @@ public class ModBlockStates extends CoreModule<LimitedCreative> {
|
|||
|
||||
listeners.addListener(new BlockListener(this));
|
||||
listeners.addListener(new PlayerListener(this));
|
||||
listeners.addListener(new DependencyListener(this));
|
||||
}
|
||||
@Override
|
||||
public void onEnable() {
|
||||
|
@ -48,6 +51,12 @@ public class ModBlockStates extends CoreModule<LimitedCreative> {
|
|||
return;
|
||||
}
|
||||
super.onEnable();
|
||||
try {
|
||||
if (plugin.getServer().getPluginManager().isPluginEnabled("WorldEdit"))
|
||||
LCEditSessionFactory.initFactory(this);
|
||||
} catch (Exception e) {
|
||||
getLog().warn(plugin.getLocale().trans("block_state.warning.worldedit_sessionfactory_failed", e.getMessage()));
|
||||
}
|
||||
|
||||
getLog().info(plugin.getLocale().trans("basic.loaded.module"));
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ import org.bukkit.event.block.BlockBreakEvent;
|
|||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
|
||||
import de.jaschastarke.minecraft.limitedcreative.ModBlockStates;
|
||||
import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockState.Source;
|
||||
|
||||
public class BlockListener implements Listener {
|
||||
private ModBlockStates mod;
|
||||
|
@ -29,7 +30,7 @@ public class BlockListener implements Listener {
|
|||
if (mod.isDebug())
|
||||
mod.getLog().debug("Breaking bad, err.. block: " + s.toString());
|
||||
|
||||
if (s.getGameMode() == GameMode.CREATIVE && event.getPlayer().getGameMode() != GameMode.CREATIVE) {
|
||||
if ((s.getGameMode() == GameMode.CREATIVE || s.getSource() == Source.EDIT) && event.getPlayer().getGameMode() != GameMode.CREATIVE) {
|
||||
if (mod.isDebug())
|
||||
mod.getLog().debug("... was placed by creative. Drop prevented");
|
||||
mod.getBlockSpawn().block(event.getBlock(), event.getPlayer());
|
||||
|
@ -49,10 +50,12 @@ public class BlockListener implements Listener {
|
|||
|
||||
try {
|
||||
BlockState s = mod.getQueries().find(event.getBlock().getLocation());
|
||||
boolean update = false;
|
||||
if (s != null) {
|
||||
// This shouldn't happen
|
||||
if (mod.isDebug())
|
||||
mod.getLog().debug("Replacing current BlockState: " + s.toString());
|
||||
update = true;
|
||||
} else {
|
||||
s = new BlockState();
|
||||
s.setLocation(event.getBlock().getLocation());
|
||||
|
@ -61,7 +64,11 @@ public class BlockListener implements Listener {
|
|||
s.setDate(new Date());
|
||||
if (mod.isDebug())
|
||||
mod.getLog().debug("Saving BlockState: " + s.toString());
|
||||
mod.getQueries().insert(s);
|
||||
|
||||
if (update)
|
||||
mod.getQueries().update(s);
|
||||
else
|
||||
mod.getQueries().insert(s);
|
||||
} catch (SQLException e) {
|
||||
mod.getLog().warn("DB-Error while onBlockPlace: "+e.getMessage());
|
||||
event.setCancelled(true);
|
||||
|
|
|
@ -98,8 +98,8 @@ public class BlockState {
|
|||
}
|
||||
|
||||
public void setSource(Source source) {
|
||||
if (source != Source.PLAYER)
|
||||
setPlayer(null);
|
||||
if (source != Source.PLAYER && source != Source.EDIT)
|
||||
setPlayerName(null);
|
||||
this.source = source;
|
||||
}
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ package de.jaschastarke.minecraft.limitedcreative.blockstate;
|
|||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Types;
|
||||
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Location;
|
||||
|
@ -50,6 +51,31 @@ public class DBQueries {
|
|||
delete.setString(4, s.getLocation().getWorld().getUID().toString());
|
||||
return delete.executeUpdate() > 0;
|
||||
}
|
||||
|
||||
private PreparedStatement update = null;
|
||||
public boolean update(BlockState s) throws SQLException {
|
||||
if (update == null) {
|
||||
update = db.prepare("UPDATE lc_block_state SET gm = ?, player = ?, cdate = ?, source = ?"+
|
||||
"WHERE x = ? AND y = ? AND z = ? AND world = ? ");
|
||||
}
|
||||
if (s.getGameMode() == null)
|
||||
update.setNull(5, Types.INTEGER);
|
||||
else if (db.getType() == Type.MySQL)
|
||||
update.setString(1, s.getGameMode().name());
|
||||
else
|
||||
update.setInt(1, s.getGameMode().getValue());
|
||||
update.setString(2, s.getPlayerName());
|
||||
update.setTimestamp(3, new java.sql.Timestamp(s.getDate().getTime()));
|
||||
if (db.getType() == Type.MySQL)
|
||||
update.setString(4, s.getSource().name());
|
||||
else
|
||||
update.setInt(4, s.getSource().ordinal());
|
||||
update.setInt(5, s.getLocation().getBlockX());
|
||||
update.setInt(6, s.getLocation().getBlockY());
|
||||
update.setInt(7, s.getLocation().getBlockZ());
|
||||
update.setString(8, s.getLocation().getWorld().getUID().toString());
|
||||
return update.executeUpdate() > 0;
|
||||
}
|
||||
|
||||
private PreparedStatement insert = null;
|
||||
public boolean insert(BlockState s) throws SQLException {
|
||||
|
@ -61,7 +87,9 @@ public class DBQueries {
|
|||
insert.setInt(2, s.getLocation().getBlockY());
|
||||
insert.setInt(3, s.getLocation().getBlockZ());
|
||||
insert.setString(4, s.getLocation().getWorld().getUID().toString());
|
||||
if (db.getType() == Type.MySQL)
|
||||
if (s.getGameMode() == null)
|
||||
insert.setNull(5, Types.INTEGER);
|
||||
else if (db.getType() == Type.MySQL)
|
||||
insert.setString(5, s.getGameMode().name());
|
||||
else
|
||||
insert.setInt(5, s.getGameMode().getValue());
|
||||
|
@ -139,7 +167,7 @@ public class DBQueries {
|
|||
"gm ENUM('CREATIVE', 'SURVIVAL', 'ADVENTURE'),"+
|
||||
"player VARCHAR(255),"+
|
||||
"cdate TIMESTAMP NOT NULL,"+
|
||||
"source ENUM('SEED','PLAYER','EDIT','UNKNOWN'),"+
|
||||
"source ENUM('SEED','PLAYER','EDIT','UNKNOWN') NOT NULL,"+
|
||||
"PRIMARY KEY (x, y, z, world)"+
|
||||
")"
|
||||
);
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
package de.jaschastarke.minecraft.limitedcreative.blockstate;
|
||||
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.server.PluginEnableEvent;
|
||||
|
||||
import de.jaschastarke.minecraft.limitedcreative.ModBlockStates;
|
||||
import de.jaschastarke.minecraft.limitedcreative.blockstate.worldedit.LCEditSessionFactory;
|
||||
|
||||
public class DependencyListener implements Listener {
|
||||
private ModBlockStates mod;
|
||||
|
||||
public DependencyListener(ModBlockStates mod) {
|
||||
this.mod = mod;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPluginLoaded(PluginEnableEvent event) {
|
||||
if (event.getPlugin().getName().equals("LogBlock") || event.getPlugin().getName().equals("WorldEdit")) {
|
||||
try {
|
||||
if (mod.getPlugin().getServer().getPluginManager().isPluginEnabled("WorldEdit"))
|
||||
LCEditSessionFactory.initFactory(mod);
|
||||
} catch (Exception e) {
|
||||
mod.getLog().warn(mod.getPlugin().getLocale().trans("block_state.warning.worldedit_sessionfactory_failed", e.getMessage()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
package de.jaschastarke.minecraft.limitedcreative.blockstate.worldedit;
|
||||
|
||||
import com.sk89q.worldedit.EditSession;
|
||||
import com.sk89q.worldedit.LocalPlayer;
|
||||
import com.sk89q.worldedit.LocalWorld;
|
||||
import com.sk89q.worldedit.Vector;
|
||||
import com.sk89q.worldedit.bags.BlockBag;
|
||||
import com.sk89q.worldedit.blocks.BaseBlock;
|
||||
|
||||
public class LCEditSession extends EditSession {
|
||||
private LCEditSessionFactory factory;
|
||||
private LocalPlayer player;
|
||||
|
||||
public LCEditSession(LCEditSessionFactory factory, LocalWorld world, int maxBlocks, BlockBag blockBag, LocalPlayer player) {
|
||||
super(world, maxBlocks, blockBag);
|
||||
this.factory = factory;
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
public LCEditSession(LCEditSessionFactory factory, LocalWorld world, int maxBlocks, LocalPlayer player) {
|
||||
super(world, maxBlocks);
|
||||
this.factory = factory;
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean rawSetBlock(Vector pt, BaseBlock block) {
|
||||
boolean success = super.rawSetBlock(pt, block);
|
||||
if (success)
|
||||
factory.onBlockEdit(player, pt, block);
|
||||
return success;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,189 @@
|
|||
package de.jaschastarke.minecraft.limitedcreative.blockstate.worldedit;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Date;
|
||||
|
||||
import org.bukkit.Location;
|
||||
|
||||
import com.sk89q.worldedit.EditSession;
|
||||
import com.sk89q.worldedit.EditSessionFactory;
|
||||
import com.sk89q.worldedit.LocalPlayer;
|
||||
import com.sk89q.worldedit.LocalWorld;
|
||||
import com.sk89q.worldedit.Vector;
|
||||
import com.sk89q.worldedit.WorldEdit;
|
||||
import com.sk89q.worldedit.bags.BlockBag;
|
||||
import com.sk89q.worldedit.blocks.BaseBlock;
|
||||
import com.sk89q.worldedit.bukkit.BukkitWorld;
|
||||
|
||||
import de.jaschastarke.minecraft.limitedcreative.ModBlockStates;
|
||||
import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockState;
|
||||
import de.jaschastarke.minecraft.limitedcreative.blockstate.BlockState.Source;
|
||||
|
||||
public class LCEditSessionFactory extends EditSessionFactory {
|
||||
private ModBlockStates mod;
|
||||
private EditSessionParent parent;
|
||||
|
||||
static enum EditSessionParent {
|
||||
WORLDEDIT,
|
||||
LOGBLOCK("de.jaschastarke.minecraft.limitedcreative.blockstate.worldedit.LCEditSession_LogBlock");
|
||||
|
||||
private String cls = null;
|
||||
EditSessionParent() {
|
||||
}
|
||||
EditSessionParent(String cls) {
|
||||
this.cls = cls;
|
||||
}
|
||||
public EditSession createInstance(LCEditSessionFactory factory, LocalWorld world, int maxBlocks, LocalPlayer player) {
|
||||
if (this.cls != null) {
|
||||
try {
|
||||
@SuppressWarnings("unchecked")
|
||||
Class<EditSession> sessClass = (Class<EditSession>) Class.forName(cls);
|
||||
return sessClass.getConstructor(LCEditSessionFactory.class, LocalWorld.class, int.class, LocalPlayer.class)
|
||||
.newInstance(factory, world, maxBlocks, player);
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
} catch (InstantiationException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IllegalArgumentException e) {
|
||||
e.printStackTrace();
|
||||
} catch (InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
} catch (NoSuchMethodException e) {
|
||||
e.printStackTrace();
|
||||
} catch (SecurityException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return new LCEditSession(factory, world, maxBlocks, player);
|
||||
}
|
||||
|
||||
public EditSession createInstance(LCEditSessionFactory factory, LocalWorld world, int maxBlocks, BlockBag blockBag, LocalPlayer player) {
|
||||
if (this.cls != null) {
|
||||
try {
|
||||
@SuppressWarnings("unchecked")
|
||||
Class<EditSession> sessClass = (Class<EditSession>) Class.forName(cls);
|
||||
return sessClass.getConstructor(LCEditSessionFactory.class, LocalWorld.class, int.class, LocalPlayer.class)
|
||||
.newInstance(factory, world, maxBlocks, player);
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
} catch (InstantiationException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IllegalArgumentException e) {
|
||||
e.printStackTrace();
|
||||
} catch (InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
} catch (NoSuchMethodException e) {
|
||||
e.printStackTrace();
|
||||
} catch (SecurityException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return new LCEditSession(factory, world, maxBlocks, player);
|
||||
}
|
||||
}
|
||||
|
||||
public ModBlockStates getLimitedCreativeModule() {
|
||||
return mod;
|
||||
}
|
||||
|
||||
public LCEditSessionFactory(ModBlockStates mod, EditSessionParent parent) {
|
||||
this.mod = mod;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EditSession getEditSession(LocalWorld world, int maxBlocks, LocalPlayer player) {
|
||||
return parent.createInstance(this, world, maxBlocks, player);
|
||||
/*switch (parent) {
|
||||
case LOGBLOCK:
|
||||
return new LCEditSession_LogBlock(this, world, maxBlocks, player);
|
||||
default:
|
||||
return new LCEditSession(this, world, maxBlocks, player);
|
||||
}*/
|
||||
}
|
||||
|
||||
// Without Player, the world isn't know, so we can't opporate
|
||||
/*@Override
|
||||
public EditSession getEditSession(LocalWorld world, int maxBlocks) {
|
||||
return new LCEditSession(this, world, maxBlocks, null);
|
||||
}*/
|
||||
|
||||
@Override
|
||||
public EditSession getEditSession(LocalWorld world, int maxBlocks, BlockBag blockBag, LocalPlayer player) {
|
||||
return parent.createInstance(this, world, maxBlocks, blockBag, player);
|
||||
/*switch (parent) {
|
||||
case LOGBLOCK:
|
||||
return new LCEditSession_LogBlock(this, world, maxBlocks, blockBag, player);
|
||||
default:
|
||||
return new LCEditSession(this, world, maxBlocks, blockBag, player);
|
||||
}*/
|
||||
}
|
||||
|
||||
/*@Override
|
||||
public EditSession getEditSession(LocalWorld world, int maxBlocks, BlockBag blockBag) {
|
||||
return new LCEditSession(this, world, maxBlocks, blockBag, null);
|
||||
}*/
|
||||
|
||||
public static void initFactory(ModBlockStates mod) throws Exception {
|
||||
EditSessionFactory currentEditSessionFactory = WorldEdit.getInstance().getEditSessionFactory();
|
||||
if (currentEditSessionFactory instanceof LCEditSessionFactory) {
|
||||
if (mod.isDebug())
|
||||
mod.getLog().debug("WorlEdit-SessionFactory is already hooked");
|
||||
} else if (currentEditSessionFactory.getClass().equals(EditSessionFactory.class)) { // not overridden
|
||||
if (mod.isDebug())
|
||||
mod.getLog().debug("Replacing WorldEdits SessionFactory");
|
||||
WorldEdit.getInstance().setEditSessionFactory(new LCEditSessionFactory(mod, EditSessionParent.WORLDEDIT));
|
||||
} else if (currentEditSessionFactory.getClass().getName().equals("de.diddiz.worldedit.LogBlockEditSessionFactory")) {
|
||||
if (mod.isDebug())
|
||||
mod.getLog().debug("Replacing LogBlocks WorldEdit-SessionFactory");
|
||||
WorldEdit.getInstance().setEditSessionFactory(new LCEditSessionFactory(mod, EditSessionParent.LOGBLOCK));
|
||||
} else {
|
||||
throw new Exception("WorldEdit-SessionFactory is hooked by an unknown another Plugin.");
|
||||
}
|
||||
}
|
||||
|
||||
/*public void onBlockEdit(Vector pt, BaseBlock block) {
|
||||
this.onBlockEdit(null, pt, block);
|
||||
}*/
|
||||
public boolean onBlockEdit(LocalPlayer player, Vector pt, BaseBlock block) {
|
||||
if (player != null) {
|
||||
Location loc = new Location(((BukkitWorld) player.getWorld()).getWorld(), pt.getBlockX(), pt.getBlockY(), pt.getBlockZ());
|
||||
try {
|
||||
BlockState s = mod.getQueries().find(loc);
|
||||
boolean update = false;
|
||||
if (s != null) {
|
||||
// This shouldn't happen
|
||||
if (mod.isDebug())
|
||||
mod.getLog().debug("Replacing current BlockState: " + s.toString());
|
||||
update = true;
|
||||
} else {
|
||||
s = new BlockState();
|
||||
s.setLocation(loc);
|
||||
}
|
||||
s.setGameMode(null);
|
||||
s.setPlayerName(player.getName());
|
||||
s.setDate(new Date());
|
||||
s.setSource(Source.EDIT);
|
||||
if (mod.isDebug())
|
||||
mod.getLog().debug("Saving BlockState: " + s.toString());
|
||||
|
||||
if (update)
|
||||
mod.getQueries().update(s);
|
||||
else
|
||||
mod.getQueries().insert(s);
|
||||
} catch (SQLException e) {
|
||||
mod.getLog().warn("DB-Error while onBlockEdit: "+e.getMessage());
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
package de.jaschastarke.minecraft.limitedcreative.blockstate.worldedit;
|
||||
|
||||
import com.sk89q.worldedit.LocalPlayer;
|
||||
import com.sk89q.worldedit.LocalWorld;
|
||||
import com.sk89q.worldedit.Vector;
|
||||
import com.sk89q.worldedit.bags.BlockBag;
|
||||
import com.sk89q.worldedit.blocks.BaseBlock;
|
||||
|
||||
import de.diddiz.LogBlock.LogBlock;
|
||||
import de.diddiz.worldedit.LogBlockEditSession;
|
||||
|
||||
public class LCEditSession_LogBlock extends LogBlockEditSession {
|
||||
private LCEditSessionFactory factory;
|
||||
private LocalPlayer player;
|
||||
|
||||
public LCEditSession_LogBlock(LCEditSessionFactory factory, LocalWorld world, int maxBlocks, BlockBag blockBag, LocalPlayer player) {
|
||||
super(world, maxBlocks, blockBag, player, LogBlock.getInstance());
|
||||
this.factory = factory;
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
public LCEditSession_LogBlock(LCEditSessionFactory factory, LocalWorld world, int maxBlocks, LocalPlayer player) {
|
||||
super(world, maxBlocks, player, LogBlock.getInstance());
|
||||
this.factory = factory;
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean rawSetBlock(Vector pt, BaseBlock block) {
|
||||
boolean success = super.rawSetBlock(pt, block);
|
||||
if (success)
|
||||
factory.onBlockEdit(player, pt, block);
|
||||
return success;
|
||||
}
|
||||
}
|
|
@ -47,6 +47,6 @@ blocked.region.piston_in: Moving {0} block into creative area was blocked at {1}
|
|||
|
||||
block_state.tool_info.seed: This {0}-Block is generated by the god who created this world
|
||||
block_state.tool_info.player: This {0}-Block was created by ''{1}'' in {2}-mode on {3}
|
||||
block_state.tool_info.edit: This {0}-Block was modified by the tool ''{1}'' or such at {3}
|
||||
block_state.tool_info.edit: This {0}-Block was modified with WorldEdit by ''{1}'' on {3}
|
||||
block_state.tool_info.unknown: The origin of this {0}-Block is unknown
|
||||
block_state.error.sql_connection_failed: Failed to connect to Database. Check bukkit.yml
|
Loading…
Reference in a new issue