From d231df701df4b22f029def9cae1cfdfcdfc64fa7 Mon Sep 17 00:00:00 2001 From: Morphan1 Date: Sun, 4 Jan 2015 10:52:42 -0500 Subject: [PATCH] Add dPlayer.edit_sign mech I love packets --- .../aufdemrand/denizen/objects/dPlayer.java | 12 +++++ .../denizen/utilities/packets/SignEditor.java | 47 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 src/main/java/net/aufdemrand/denizen/utilities/packets/SignEditor.java diff --git a/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java b/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java index 77827a8810..5c27720212 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java @@ -2221,6 +2221,18 @@ else if (split.length > 1) { OpenBook.openBook(getPlayerEntity()); } + // <--[mechanism] + // @object dPlayer + // @name edit_sign + // @input dLocation + // @description + // Allows the player to edit an existing sign. To create a + // sign, see <@link command Sign>. + // --> + if (mechanism.matches("edit_sign") && mechanism.requireObject(dLocation.class)) { + SignEditor.editSign(getPlayerEntity(), value.asType(dLocation.class)); + } + // Iterate through this object's properties' mechanisms for (Property property : PropertyParser.getProperties(this)) { property.adjust(mechanism); diff --git a/src/main/java/net/aufdemrand/denizen/utilities/packets/SignEditor.java b/src/main/java/net/aufdemrand/denizen/utilities/packets/SignEditor.java new file mode 100644 index 0000000000..29c7510495 --- /dev/null +++ b/src/main/java/net/aufdemrand/denizen/utilities/packets/SignEditor.java @@ -0,0 +1,47 @@ +package net.aufdemrand.denizen.utilities.packets; + +import net.aufdemrand.denizen.utilities.debugging.dB; +import net.minecraft.server.v1_8_R1.BlockPosition; +import net.minecraft.server.v1_8_R1.PacketPlayOutOpenSignEditor; +import net.minecraft.server.v1_8_R1.TileEntity; +import net.minecraft.server.v1_8_R1.TileEntitySign; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_8_R1.CraftWorld; +import org.bukkit.entity.Player; + +import java.lang.reflect.Field; +import java.util.Map; + +public class SignEditor { + + private static final Field sign_location; + + static { + Map fields = PacketHelper.registerFields(PacketPlayOutOpenSignEditor.class); + sign_location = fields.get("a"); + } + + public static PacketPlayOutOpenSignEditor getSignEditorPacket(Location location) { + PacketPlayOutOpenSignEditor signEditorPacket = new PacketPlayOutOpenSignEditor(); + try { + sign_location.set(signEditorPacket, new BlockPosition(location.getX(), location.getY(), location.getZ())); + } catch (Exception e) { + dB.echoError(e); + } + return signEditorPacket; + } + + public static void editSign(Player player, Location location) { + PacketPlayOutOpenSignEditor signEditorPacket = getSignEditorPacket(location); + TileEntity sign = ((CraftWorld) location.getWorld()).getTileEntityAt(location.getBlockX(), + location.getBlockY(), location.getBlockZ()); + if (sign instanceof TileEntitySign) { + ((TileEntitySign) sign).isEditable = true; + PacketHelper.sendPacket(player, signEditorPacket); + } + else { + dB.echoError("Can't edit non-sign materials!"); + } + } + +}