diff --git a/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java b/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java index 48430b4f14..30aa01f691 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java @@ -11,10 +11,7 @@ import net.aufdemrand.denizen.utilities.debugging.dB; import net.aufdemrand.denizen.utilities.depends.Depends; import net.aufdemrand.denizen.utilities.nbt.ImprovedOfflinePlayer; -import net.aufdemrand.denizen.utilities.packets.BossHealthBar; -import net.aufdemrand.denizen.utilities.packets.EntityEquipment; -import net.aufdemrand.denizen.utilities.packets.ItemChangeMessage; -import net.aufdemrand.denizen.utilities.packets.PlayerBars; +import net.aufdemrand.denizen.utilities.packets.*; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPC; import net.minecraft.server.v1_8_R1.PacketPlayOutGameStateChange; @@ -2197,6 +2194,20 @@ else if (split.length > 1) { .sendPacket(new PacketPlayOutGameStateChange(4, 0.0F)); } + // <--[mechanism] + // @object dPlayer + // @name spectate + // @input dEntity + // @description + // Forces the player to spectate from the entity's point of view. + // Note: They cannot cancel the spectating without a re-log -- you + // must make them spectate themselves to cancel the effect. + // (i.e. - adjust "spectate:") + // --> + if (mechanism.matches("spectate") && mechanism.requireObject(dEntity.class)) { + PlayerSpectateEntity.setSpectating(getPlayerEntity(), value.asType(dEntity.class).getBukkitEntity()); + } + // 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/PlayerSpectateEntity.java b/src/main/java/net/aufdemrand/denizen/utilities/packets/PlayerSpectateEntity.java new file mode 100644 index 0000000000..83fe3bd607 --- /dev/null +++ b/src/main/java/net/aufdemrand/denizen/utilities/packets/PlayerSpectateEntity.java @@ -0,0 +1,34 @@ +package net.aufdemrand.denizen.utilities.packets; + +import net.aufdemrand.denizen.utilities.debugging.dB; +import net.minecraft.server.v1_8_R1.PacketPlayOutCamera; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; + +import java.lang.reflect.Field; +import java.util.Map; + +public class PlayerSpectateEntity { + + private static final Field entity_id; + + static { + Map fields = PacketHelper.registerFields(PacketPlayOutCamera.class); + entity_id = fields.get("a"); + } + + public static PacketPlayOutCamera getCameraPacket(Entity entity) { + PacketPlayOutCamera cameraPacket = new PacketPlayOutCamera(); + try { + entity_id.set(cameraPacket, entity.getEntityId()); + } catch (Exception e) { + dB.echoError(e); + } + return cameraPacket; + } + + public static void setSpectating(Player player, Entity entity) { + PacketPlayOutCamera cameraPacket = getCameraPacket(entity); + PacketHelper.sendPacket(player, cameraPacket); + } +}