forked from LogBlock/LogBlock
Rollback of killed entities works!
This commit is contained in:
@@ -690,14 +690,9 @@ public class CommandsHandler implements CommandExecutor {
|
|||||||
}
|
}
|
||||||
rs = executeQuery(state, params.getQuery());
|
rs = executeQuery(state, params.getQuery());
|
||||||
final WorldEditor editor = new WorldEditor(logblock, params.world, params.forceReplace);
|
final WorldEditor editor = new WorldEditor(logblock, params.world, params.forceReplace);
|
||||||
|
WorldEditorEditFactory editFactory = new WorldEditorEditFactory(editor, params, true);
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
ChestAccess chestaccess = null;
|
editFactory.processRow(rs);
|
||||||
ItemStack stack = Utils.loadItemStack(rs.getBytes("item"));
|
|
||||||
if (stack != null) {
|
|
||||||
chestaccess = new ChestAccess(stack, rs.getBoolean("itemremove"), rs.getInt("itemtype"));
|
|
||||||
}
|
|
||||||
editor.queueBlockEdit(rs.getInt("x"), rs.getInt("y"), rs.getInt("z"), rs.getInt("replaced"), rs.getInt("replacedData"), rs.getBytes("replacedState"), rs.getInt("type"), rs.getInt("typeData"), rs.getBytes("typeState"), chestaccess);
|
|
||||||
}
|
}
|
||||||
final int changes = editor.getSize();
|
final int changes = editor.getSize();
|
||||||
if (changes > 10000) {
|
if (changes > 10000) {
|
||||||
@@ -781,13 +776,9 @@ public class CommandsHandler implements CommandExecutor {
|
|||||||
sender.sendMessage(ChatColor.DARK_AQUA + "Searching " + params.getTitle() + ":");
|
sender.sendMessage(ChatColor.DARK_AQUA + "Searching " + params.getTitle() + ":");
|
||||||
}
|
}
|
||||||
final WorldEditor editor = new WorldEditor(logblock, params.world, params.forceReplace);
|
final WorldEditor editor = new WorldEditor(logblock, params.world, params.forceReplace);
|
||||||
|
WorldEditorEditFactory editFactory = new WorldEditorEditFactory(editor, params, false);
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
ChestAccess chestaccess = null;
|
editFactory.processRow(rs);
|
||||||
ItemStack stack = Utils.loadItemStack(rs.getBytes("item"));
|
|
||||||
if (stack != null) {
|
|
||||||
chestaccess = new ChestAccess(stack, !rs.getBoolean("itemremove"), rs.getInt("itemtype"));
|
|
||||||
}
|
|
||||||
editor.queueBlockEdit(rs.getInt("x"), rs.getInt("y"), rs.getInt("z"), rs.getInt("type"), rs.getInt("typeData"), rs.getBytes("typeState"), rs.getInt("replaced"), rs.getInt("replacedData"), rs.getBytes("replacedState"), chestaccess);
|
|
||||||
}
|
}
|
||||||
final int changes = editor.getSize();
|
final int changes = editor.getSize();
|
||||||
if (!params.silent) {
|
if (!params.silent) {
|
||||||
|
@@ -18,14 +18,19 @@ import org.bukkit.block.data.type.Piston;
|
|||||||
import org.bukkit.block.data.type.PistonHead;
|
import org.bukkit.block.data.type.PistonHead;
|
||||||
import org.bukkit.block.data.type.TechnicalPiston.Type;
|
import org.bukkit.block.data.type.TechnicalPiston.Type;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import de.diddiz.LogBlock.blockstate.BlockStateCodecs;
|
import de.diddiz.LogBlock.blockstate.BlockStateCodecs;
|
||||||
import de.diddiz.util.BukkitUtils;
|
import de.diddiz.util.BukkitUtils;
|
||||||
import de.diddiz.util.Utils;
|
import de.diddiz.util.Utils;
|
||||||
|
import de.diddiz.worldedit.WorldEditHelper;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -87,6 +92,10 @@ public class WorldEditor implements Runnable {
|
|||||||
edits.add(new BlockEdit(0, new Location(world, x, y, z), null, replaced, replaceData, replacedState, type, typeData, typeState, item));
|
edits.add(new BlockEdit(0, new Location(world, x, y, z), null, replaced, replaceData, replacedState, type, typeData, typeState, item));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void queueEntityEdit(ResultSet rs, QueryParams p, boolean rollback) throws SQLException {
|
||||||
|
edits.add(new EntityEdit(rs, p, rollback));
|
||||||
|
}
|
||||||
|
|
||||||
public long getElapsedTime() {
|
public long getElapsedTime() {
|
||||||
return elapsedTime;
|
return elapsedTime;
|
||||||
}
|
}
|
||||||
@@ -155,15 +164,46 @@ public class WorldEditor implements Runnable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static enum PerformResult {
|
public static enum PerformResult {
|
||||||
SUCCESS, BLACKLISTED, NO_ACTION
|
SUCCESS, BLACKLISTED, NO_ACTION
|
||||||
}
|
}
|
||||||
|
|
||||||
private interface Edit {
|
public interface Edit {
|
||||||
PerformResult perform() throws WorldEditorException;
|
PerformResult perform() throws WorldEditorException;
|
||||||
}
|
}
|
||||||
|
|
||||||
private class BlockEdit extends BlockChange implements Edit {
|
public class EntityEdit extends EntityChange implements Edit {
|
||||||
|
private boolean rollback;
|
||||||
|
|
||||||
|
public EntityEdit(ResultSet rs, QueryParams p, boolean rollback) throws SQLException {
|
||||||
|
super(rs, p);
|
||||||
|
this.rollback = rollback;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PerformResult perform() throws WorldEditorException {
|
||||||
|
if (changeType == EntityChangeType.KILL && rollback) {
|
||||||
|
YamlConfiguration deserialized = Utils.deserializeYamlConfiguration(data);
|
||||||
|
double x = deserialized.getDouble("x");
|
||||||
|
double y = deserialized.getDouble("y");
|
||||||
|
double z = deserialized.getDouble("z");
|
||||||
|
float yaw = (float) deserialized.getDouble("yaw");
|
||||||
|
float pitch = (float) deserialized.getDouble("pitch");
|
||||||
|
Location location = new Location(world, x, y, z, yaw, pitch);
|
||||||
|
byte[] serializedWorldEditEntity = (byte[]) deserialized.get("worldedit");
|
||||||
|
if (serializedWorldEditEntity != null) {
|
||||||
|
Entity result = WorldEditHelper.restoreEntity(location, type, serializedWorldEditEntity);
|
||||||
|
if (result == null) {
|
||||||
|
throw new WorldEditorException("Could not restore " + type, location);
|
||||||
|
}
|
||||||
|
return PerformResult.SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return PerformResult.NO_ACTION;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BlockEdit extends BlockChange implements Edit {
|
||||||
public BlockEdit(long time, Location loc, Actor actor, int replaced, int replaceData, byte[] replacedState, int type, int typeData, byte[] typeState, ChestAccess ca) {
|
public BlockEdit(long time, Location loc, Actor actor, int replaced, int replaceData, byte[] replacedState, int type, int typeData, byte[] typeState, ChestAccess ca) {
|
||||||
super(time, loc, actor, replaced, replaceData,replacedState , type, typeData, typeState, ca);
|
super(time, loc, actor, replaced, replaceData,replacedState , type, typeData, typeState, ca);
|
||||||
}
|
}
|
||||||
|
@@ -38,8 +38,8 @@ public class AdvancedKillLogging extends LoggingListener {
|
|||||||
Location location = entity.getLocation();
|
Location location = entity.getLocation();
|
||||||
YamlConfiguration data = new YamlConfiguration();
|
YamlConfiguration data = new YamlConfiguration();
|
||||||
data.set("x", location.getX());
|
data.set("x", location.getX());
|
||||||
data.set("y", location.getX());
|
data.set("y", location.getY());
|
||||||
data.set("z", location.getX());
|
data.set("z", location.getZ());
|
||||||
data.set("yaw", location.getYaw());
|
data.set("yaw", location.getYaw());
|
||||||
data.set("pitch", location.getPitch());
|
data.set("pitch", location.getPitch());
|
||||||
|
|
||||||
|
@@ -1,13 +1,27 @@
|
|||||||
package de.diddiz.worldedit;
|
package de.diddiz.worldedit;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.EntityType;
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
|
import com.sk89q.jnbt.CompoundTag;
|
||||||
|
import com.sk89q.jnbt.DoubleTag;
|
||||||
|
import com.sk89q.jnbt.FloatTag;
|
||||||
|
import com.sk89q.jnbt.ListTag;
|
||||||
|
import com.sk89q.jnbt.NBTInputStream;
|
||||||
import com.sk89q.jnbt.NBTOutputStream;
|
import com.sk89q.jnbt.NBTOutputStream;
|
||||||
|
import com.sk89q.jnbt.NamedTag;
|
||||||
|
import com.sk89q.jnbt.ShortTag;
|
||||||
|
import com.sk89q.jnbt.Tag;
|
||||||
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
||||||
import com.sk89q.worldedit.entity.BaseEntity;
|
import com.sk89q.worldedit.entity.BaseEntity;
|
||||||
|
|
||||||
@@ -32,6 +46,10 @@ public class WorldEditHelper {
|
|||||||
return Internal.serializeEntity(entity);
|
return Internal.serializeEntity(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Entity restoreEntity(Location location, EntityType type, byte[] serialized) {
|
||||||
|
return Internal.restoreEntity(location, type, serialized);
|
||||||
|
}
|
||||||
|
|
||||||
private static class Internal {
|
private static class Internal {
|
||||||
// private static WorldEditPlugin worldEdit;
|
// private static WorldEditPlugin worldEdit;
|
||||||
|
|
||||||
@@ -39,6 +57,33 @@ public class WorldEditHelper {
|
|||||||
// Internal.worldEdit = (WorldEditPlugin) worldEdit;
|
// Internal.worldEdit = (WorldEditPlugin) worldEdit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Entity restoreEntity(Location location, EntityType type, byte[] serialized) {
|
||||||
|
com.sk89q.worldedit.world.entity.EntityType weType = BukkitAdapter.adapt(type);
|
||||||
|
com.sk89q.worldedit.util.Location weLocation = BukkitAdapter.adapt(location);
|
||||||
|
try {
|
||||||
|
NBTInputStream nbtis = new NBTInputStream(new ByteArrayInputStream(serialized));
|
||||||
|
NamedTag namedTag = nbtis.readNamedTag();
|
||||||
|
nbtis.close();
|
||||||
|
UUID newUUID = null;
|
||||||
|
if (namedTag.getName().equals("entity") && namedTag.getTag() instanceof CompoundTag) {
|
||||||
|
CompoundTag serializedState = (CompoundTag) namedTag.getTag();
|
||||||
|
BaseEntity state = new BaseEntity(weType, serializedState);
|
||||||
|
CompoundTag oldNbt = state.getNbtData();
|
||||||
|
UUID oldUUID = new UUID(oldNbt.getLong("UUIDMost"), oldNbt.getLong("UUIDLeast"));
|
||||||
|
com.sk89q.worldedit.entity.Entity weEntity = weLocation.getExtent().createEntity(weLocation, state);
|
||||||
|
if (weEntity != null) {
|
||||||
|
CompoundTag newNbt = weEntity.getState().getNbtData();
|
||||||
|
newUUID = new UUID(newNbt.getLong("UUIDMost"), newNbt.getLong("UUIDLeast"));
|
||||||
|
System.out.println("Old UUID: " + oldUUID);
|
||||||
|
System.out.println("New UUID: " + newUUID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return newUUID == null ? null : Bukkit.getEntity(newUUID);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException("This IOException should be impossible", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static byte[] serializeEntity(Entity entity) {
|
public static byte[] serializeEntity(Entity entity) {
|
||||||
com.sk89q.worldedit.entity.Entity weEntity = BukkitAdapter.adapt(entity);
|
com.sk89q.worldedit.entity.Entity weEntity = BukkitAdapter.adapt(entity);
|
||||||
BaseEntity state = weEntity.getState();
|
BaseEntity state = weEntity.getState();
|
||||||
@@ -46,7 +91,13 @@ public class WorldEditHelper {
|
|||||||
try {
|
try {
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
NBTOutputStream nbtos = new NBTOutputStream(baos);
|
NBTOutputStream nbtos = new NBTOutputStream(baos);
|
||||||
nbtos.writeNamedTag("entity", state.getNbtData());
|
CompoundTag nbt = state.getNbtData();
|
||||||
|
LinkedHashMap<String, Tag> value = new LinkedHashMap<>(nbt.getValue());
|
||||||
|
value.put("Health", new FloatTag(20.0f));
|
||||||
|
value.put("Motion", new ListTag(DoubleTag.class, Arrays.asList(new DoubleTag[] {new DoubleTag(0),new DoubleTag(0),new DoubleTag(0)})));
|
||||||
|
value.put("Fire", new ShortTag((short) -20));
|
||||||
|
value.put("HurtTime", new ShortTag((short) 0));
|
||||||
|
nbtos.writeNamedTag("entity", new CompoundTag(value));
|
||||||
nbtos.close();
|
nbtos.close();
|
||||||
return baos.toByteArray();
|
return baos.toByteArray();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
Reference in New Issue
Block a user