diff --git a/nmshandler/pom.xml b/nmshandler/pom.xml
index b90e0970bc..5c42de978d 100644
--- a/nmshandler/pom.xml
+++ b/nmshandler/pom.xml
@@ -4,7 +4,7 @@
denizen-parent
net.aufdemrand
- 1.0.0-SNAPSHOT
+ 1.0.1-SNAPSHOT
4.0.0
diff --git a/nmshandler/src/main/java/net/aufdemrand/denizen/nms/NMSVersion.java b/nmshandler/src/main/java/net/aufdemrand/denizen/nms/NMSVersion.java
index fe37f93fe6..d5f63f5818 100644
--- a/nmshandler/src/main/java/net/aufdemrand/denizen/nms/NMSVersion.java
+++ b/nmshandler/src/main/java/net/aufdemrand/denizen/nms/NMSVersion.java
@@ -5,7 +5,8 @@ public enum NMSVersion {
NOT_SUPPORTED,
v1_8_R3,
v1_9_R2,
- v1_10_R1;
+ v1_10_R1,
+ v1_11_R1;
public boolean isAtLeast(NMSVersion version) {
return ordinal() >= version.ordinal();
diff --git a/plugin/pom.xml b/plugin/pom.xml
index eaec6f9d04..d29e2b3ade 100644
--- a/plugin/pom.xml
+++ b/plugin/pom.xml
@@ -4,7 +4,7 @@
denizen-parent
net.aufdemrand
- 1.0.0-SNAPSHOT
+ 1.0.1-SNAPSHOT
4.0.0
@@ -53,6 +53,12 @@
${project.version}
compile
+
+ net.aufdemrand
+ denizen-v1_11_R1
+ ${project.version}
+ compile
+
net.citizensnpcs
citizens
diff --git a/plugin/src/main/java/net/aufdemrand/denizen/events/entity/HorseJumpsScriptEvent.java b/plugin/src/main/java/net/aufdemrand/denizen/events/entity/HorseJumpsScriptEvent.java
index aa090160b5..d0128b3082 100644
--- a/plugin/src/main/java/net/aufdemrand/denizen/events/entity/HorseJumpsScriptEvent.java
+++ b/plugin/src/main/java/net/aufdemrand/denizen/events/entity/HorseJumpsScriptEvent.java
@@ -9,6 +9,7 @@
import net.aufdemrand.denizencore.scripts.containers.ScriptContainer;
import net.aufdemrand.denizencore.utilities.CoreUtilities;
import org.bukkit.Bukkit;
+import org.bukkit.entity.Horse;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.HorseJumpEvent;
@@ -120,15 +121,17 @@ else if (name.equals("power")) {
@EventHandler
public void onHorseJumps(HorseJumpEvent event) {
- entity = new dEntity(event.getEntity());
- color = new Element(event.getEntity().getColor().name());
- variant = new Element(event.getEntity().getVariant().name());
- power = event.getPower();
- cancelled = event.isCancelled();
- this.event = event;
- fire();
- event.setCancelled(cancelled);
- event.setPower(power);
+ if (event.getEntity() instanceof Horse) {
+ entity = new dEntity(event.getEntity());
+ color = new Element(((Horse) event.getEntity()).getColor().name());
+ variant = new Element(event.getEntity().getVariant().name());
+ power = event.getPower();
+ cancelled = event.isCancelled();
+ this.event = event;
+ fire();
+ event.setCancelled(cancelled);
+ event.setPower(power);
+ }
}
}
diff --git a/pom.xml b/pom.xml
index 31f3ccb876..35a5bb6332 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,11 +6,11 @@
net.aufdemrand
denizen-parent
pom
- 1.0.0-SNAPSHOT
+ 1.0.1-SNAPSHOT
UTF-8
- 1.10-R0.1-SNAPSHOT
+ 1.11-R0.1-SNAPSHOT
20090211
2.0.20-SNAPSHOT
Unknown
@@ -21,6 +21,7 @@
v1_8_R3
v1_9_R2
v1_10_R1
+ v1_11_R1
plugin
diff --git a/v1_10_R1/pom.xml b/v1_10_R1/pom.xml
index 3aa07b7488..a01a3547a4 100644
--- a/v1_10_R1/pom.xml
+++ b/v1_10_R1/pom.xml
@@ -4,7 +4,7 @@
denizen-parent
net.aufdemrand
- 1.0.0-SNAPSHOT
+ 1.0.1-SNAPSHOT
4.0.0
diff --git a/v1_11_R1/pom.xml b/v1_11_R1/pom.xml
new file mode 100644
index 0000000000..b87d25b19b
--- /dev/null
+++ b/v1_11_R1/pom.xml
@@ -0,0 +1,53 @@
+
+
+
+ denizen-parent
+ net.aufdemrand
+ 1.0.1-SNAPSHOT
+
+ 4.0.0
+
+ denizen-v1_11_R1
+
+
+
+ net.aufdemrand
+ denizen-nmshandler
+ ${project.parent.version}
+ compile
+ true
+
+
+ net.aufdemrand
+ denizencore
+ 1.05
+ provided
+
+
+ org.spigotmc
+ spigot-api
+ 1.11-R0.1-SNAPSHOT
+ provided
+
+
+ *
+ *
+
+
+
+
+ org.spigotmc
+ spigot
+ 1.11-R0.1-SNAPSHOT
+ provided
+
+
+ *
+ *
+
+
+
+
+
+
\ No newline at end of file
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/Handler_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/Handler_v1_11_R1.java
new file mode 100644
index 0000000000..4d215435de
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/Handler_v1_11_R1.java
@@ -0,0 +1,209 @@
+package net.aufdemrand.denizen.nms;
+
+import com.google.common.collect.Iterables;
+import com.mojang.authlib.GameProfile;
+import com.mojang.authlib.properties.Property;
+import net.aufdemrand.denizen.nms.abstracts.AnimationHelper;
+import net.aufdemrand.denizen.nms.abstracts.BiomeNMS;
+import net.aufdemrand.denizen.nms.abstracts.BlockLight;
+import net.aufdemrand.denizen.nms.abstracts.ParticleHelper;
+import net.aufdemrand.denizen.nms.abstracts.ProfileEditor;
+import net.aufdemrand.denizen.nms.abstracts.Sidebar;
+import net.aufdemrand.denizen.nms.helpers.*;
+import net.aufdemrand.denizen.nms.impl.BiomeNMS_v1_11_R1;
+import net.aufdemrand.denizen.nms.impl.ProfileEditor_v1_11_R1;
+import net.aufdemrand.denizen.nms.impl.Sidebar_v1_11_R1;
+import net.aufdemrand.denizen.nms.impl.blocks.BlockLight_v1_11_R1;
+import net.aufdemrand.denizen.nms.impl.jnbt.CompoundTag_v1_11_R1;
+import net.aufdemrand.denizen.nms.impl.packets.handlers.DenizenPacketListener_v1_11_R1;
+import net.aufdemrand.denizen.nms.interfaces.*;
+import net.aufdemrand.denizen.nms.interfaces.packets.PacketHandler;
+import net.aufdemrand.denizen.nms.util.PlayerProfile;
+import net.aufdemrand.denizen.nms.util.jnbt.CompoundTag;
+import net.aufdemrand.denizen.nms.util.jnbt.Tag;
+import net.aufdemrand.denizencore.utilities.debugging.dB;
+import net.minecraft.server.v1_11_R1.MinecraftServer;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.block.Biome;
+import org.bukkit.craftbukkit.v1_11_R1.CraftServer;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+
+import java.util.Map;
+
+public class Handler_v1_11_R1 extends NMSHandler {
+
+ private final AnimationHelper animationHelper = new AnimationHelper_v1_11_R1();
+ private final BlockHelper blockHelper = new BlockHelper_v1_11_R1();
+ private final ChunkHelper chunkHelper = new ChunkHelper_v1_11_R1();
+ private final CustomEntityHelper customEntityHelper = new CustomEntityHelper_v1_11_R1();
+ private final EntityHelper entityHelper = new EntityHelper_v1_11_R1();
+ private final FishingHelper fishingHelper = new FishingHelper_v1_11_R1();
+ private final ItemHelper itemHelper = new ItemHelper_v1_11_R1();
+ private final SoundHelper soundHelper = new SoundHelper_v1_11_R1();
+ private final PacketHelper packetHelper = new PacketHelper_v1_11_R1();
+ private final ParticleHelper particleHelper = new ParticleHelper_v1_11_R1();
+ private final PlayerHelper playerHelper = new PlayerHelper_v1_11_R1();
+ private final WorldHelper worldHelper = new WorldHelper_v1_11_R1();
+
+ private final ProfileEditor profileEditor = new ProfileEditor_v1_11_R1();
+
+ @Override
+ public Thread getMainThread() {
+ return ((CraftServer) Bukkit.getServer()).getServer().primaryThread;
+ }
+
+ @Override
+ public double[] getRecentTps() {
+ return ((CraftServer) Bukkit.getServer()).getServer().recentTps;
+ }
+
+ @Override
+ public AnimationHelper getAnimationHelper() {
+ return animationHelper;
+ }
+
+ @Override
+ public BlockHelper getBlockHelper() {
+ return blockHelper;
+ }
+
+ @Override
+ public ChunkHelper getChunkHelper() {
+ return chunkHelper;
+ }
+
+ @Override
+ public CustomEntityHelper getCustomEntityHelper() {
+ return customEntityHelper;
+ }
+
+ @Override
+ public EntityHelper getEntityHelper() {
+ return entityHelper;
+ }
+
+ @Override
+ public FishingHelper getFishingHelper() {
+ return fishingHelper;
+ }
+
+ @Override
+ public ItemHelper getItemHelper() {
+ return itemHelper;
+ }
+
+ @Override
+ public SoundHelper getSoundHelper() {
+ return soundHelper;
+ }
+
+ @Override
+ public PacketHelper getPacketHelper() {
+ return packetHelper;
+ }
+
+ @Override
+ public ParticleHelper getParticleHelper() {
+ return particleHelper;
+ }
+
+ @Override
+ public PlayerHelper getPlayerHelper() {
+ return playerHelper;
+ }
+
+ @Override
+ public WorldHelper getWorldHelper() {
+ return worldHelper;
+ }
+
+ @Override
+ public void enablePacketInterception(PacketHandler packetHandler) {
+ DenizenPacketListener_v1_11_R1.enable(packetHandler);
+ }
+
+ @Override
+ public CompoundTag createCompoundTag(Map value) {
+ return new CompoundTag_v1_11_R1(value);
+ }
+
+ @Override
+ public Sidebar createSidebar(Player player) {
+ return new Sidebar_v1_11_R1(player);
+ }
+
+ @Override
+ public BlockLight createBlockLight(Location location, int lightLevel, long ticks) {
+ return BlockLight_v1_11_R1.createLight(location, lightLevel, ticks);
+ }
+
+ @Override
+ public PlayerProfile fillPlayerProfile(PlayerProfile playerProfile) {
+ try {
+ if (playerProfile != null) {
+ GameProfile gameProfile = new GameProfile(playerProfile.getUniqueId(), playerProfile.getName());
+ gameProfile.getProperties().get("textures").clear();
+ if (playerProfile.getTextureSignature() != null) {
+ gameProfile.getProperties().put("textures", new Property("value", playerProfile.getTexture(), playerProfile.getTextureSignature()));
+ }
+ else {
+ gameProfile.getProperties().put("textures", new Property("value", playerProfile.getTexture()));
+ }
+ MinecraftServer minecraftServer = ((CraftServer) Bukkit.getServer()).getServer();
+ GameProfile gameProfile1 = null;
+ if (gameProfile.getId() != null) {
+ gameProfile1 = minecraftServer.getUserCache().a(gameProfile.getId());
+ }
+ if (gameProfile1 == null && gameProfile.getName() != null) {
+ gameProfile1 = minecraftServer.getUserCache().getProfile(gameProfile.getName());
+ }
+ if (gameProfile1 == null) {
+ gameProfile1 = gameProfile;
+ }
+ if (playerProfile.hasTexture()) {
+ gameProfile1.getProperties().get("textures").clear();
+ if (playerProfile.getTextureSignature() != null) {
+ gameProfile1.getProperties().put("textures", new Property("value", playerProfile.getTexture(), playerProfile.getTextureSignature()));
+ }
+ else {
+ gameProfile1.getProperties().put("textures", new Property("value", playerProfile.getTexture()));
+ }
+ }
+ if (Iterables.getFirst(gameProfile1.getProperties().get("textures"), null) == null) {
+ gameProfile1 = minecraftServer.az().fillProfileProperties(gameProfile1, true);
+ }
+ Property property = Iterables.getFirst(gameProfile1.getProperties().get("textures"), null);
+ return new PlayerProfile(gameProfile1.getName(), gameProfile1.getId(),
+ property != null ? property.getValue() : null,
+ property != null ? property.getSignature() : null);
+ }
+ }
+ catch (Exception e) {
+ if (dB.verbose) {
+ dB.echoError(e);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public PlayerProfile getPlayerProfile(Player player) {
+ GameProfile gameProfile = ((CraftPlayer) player).getProfile();
+ Property property = Iterables.getFirst(gameProfile.getProperties().get("textures"), null);
+ return new PlayerProfile(gameProfile.getName(), gameProfile.getId(),
+ property != null ? property.getValue() : null,
+ property != null ? property.getSignature() : null);
+ }
+
+ @Override
+ public ProfileEditor getProfileEditor() {
+ return profileEditor;
+ }
+
+ @Override
+ public BiomeNMS getBiomeNMS(Biome biome) {
+ return new BiomeNMS_v1_11_R1(biome);
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/AnimationHelper_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/AnimationHelper_v1_11_R1.java
new file mode 100644
index 0000000000..d44182dd12
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/AnimationHelper_v1_11_R1.java
@@ -0,0 +1,29 @@
+package net.aufdemrand.denizen.nms.helpers;
+
+import net.aufdemrand.denizen.nms.abstracts.AnimationHelper;
+import net.aufdemrand.denizen.nms.interfaces.EntityAnimation;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftSkeleton;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.EntityType;
+
+public class AnimationHelper_v1_11_R1 extends AnimationHelper {
+
+ public AnimationHelper_v1_11_R1() {
+ register("SKELETON_START_SWING_ARM", new EntityAnimation() {
+ @Override
+ public void play(Entity entity) {
+ if (entity.getType() == EntityType.SKELETON) {
+ ((CraftSkeleton) entity).getHandle().a(true);
+ }
+ }
+ });
+ register("SKELETON_STOP_SWING_ARM", new EntityAnimation() {
+ @Override
+ public void play(Entity entity) {
+ if (entity.getType() == EntityType.SKELETON) {
+ ((CraftSkeleton) entity).getHandle().a(false);
+ }
+ }
+ });
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/BlockHelper_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/BlockHelper_v1_11_R1.java
new file mode 100644
index 0000000000..0e794356c0
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/BlockHelper_v1_11_R1.java
@@ -0,0 +1,122 @@
+package net.aufdemrand.denizen.nms.helpers;
+
+import com.google.common.collect.Iterables;
+import com.mojang.authlib.GameProfile;
+import com.mojang.authlib.properties.Property;
+import net.aufdemrand.denizen.nms.impl.blocks.BlockData_v1_11_R1;
+import net.aufdemrand.denizen.nms.impl.jnbt.CompoundTag_v1_11_R1;
+import net.aufdemrand.denizen.nms.interfaces.BlockData;
+import net.aufdemrand.denizen.nms.interfaces.BlockHelper;
+import net.aufdemrand.denizen.nms.util.PlayerProfile;
+import net.aufdemrand.denizen.nms.util.jnbt.CompoundTag;
+import net.minecraft.server.v1_11_R1.TileEntity;
+import net.minecraft.server.v1_11_R1.TileEntitySkull;
+import org.bukkit.Material;
+import org.bukkit.SkullType;
+import org.bukkit.block.Block;
+import org.bukkit.block.Skull;
+import org.bukkit.craftbukkit.v1_11_R1.block.CraftBlockState;
+import org.bukkit.craftbukkit.v1_11_R1.block.CraftSkull;
+
+import java.util.UUID;
+
+public class BlockHelper_v1_11_R1 implements BlockHelper {
+
+ @Override
+ public PlayerProfile getPlayerProfile(Skull skull) {
+ GameProfile profile = ((CraftSkull) skull).getTileEntity().getGameProfile();
+ if (profile == null) {
+ return null;
+ }
+ String name = profile.getName();
+ UUID id = profile.getId();
+ com.mojang.authlib.properties.Property property = Iterables.getFirst(profile.getProperties().get("textures"), null);
+ return new PlayerProfile(name, id, property != null ? property.getValue() : null);
+ }
+
+ @Override
+ public void setPlayerProfile(Skull skull, PlayerProfile playerProfile) {
+ GameProfile gameProfile = new GameProfile(playerProfile.getUniqueId(), playerProfile.getName());
+ if (playerProfile.hasTexture()) {
+ gameProfile.getProperties().put("textures",
+ new Property("value", playerProfile.getTexture(), playerProfile.getTextureSignature()));
+ }
+ TileEntitySkull tileEntity = ((CraftSkull) skull).getTileEntity();
+ tileEntity.setSkullType(SkullType.PLAYER.ordinal());
+ tileEntity.setGameProfile(gameProfile);
+ skull.getBlock().getState().update();
+ }
+
+ @Override
+ public CompoundTag getNbtData(Block block) {
+ TileEntity tileEntity = ((CraftBlockState) block.getState()).getTileEntity();
+ if (tileEntity == null) {
+ return null;
+ }
+ return CompoundTag_v1_11_R1.fromNMSTag(tileEntity.d());
+ }
+
+ @Override
+ public void setNbtData(Block block, CompoundTag compoundTag) {
+ TileEntity tileEntity = ((CraftBlockState) block.getState()).getTileEntity();
+ if (tileEntity == null) {
+ return;
+ }
+ tileEntity.a(((CompoundTag_v1_11_R1) compoundTag).toNMSTag());
+ tileEntity.update();
+ }
+
+ @Override
+ public BlockData getBlockData(short id, byte data) {
+ return new BlockData_v1_11_R1(id, data);
+ }
+
+ @Override
+ public BlockData getBlockData(Block block) {
+ return new BlockData_v1_11_R1(block);
+ }
+
+ @Override
+ public BlockData getBlockData(String compressedString) {
+ return BlockData_v1_11_R1.fromCompressedString(compressedString);
+ }
+
+ @Override
+ public boolean isSafeBlock(Material material) {
+ // Quick util function to decide whether
+ // A block is 'safe' (Can be spawned inside of) - air, tallgrass, etc.
+ // Credit to Mythan for compiling the initial list
+ switch (material) {
+ case LEVER:
+ case WOOD_BUTTON:
+ case STONE_BUTTON:
+ case REDSTONE_WIRE:
+ case SAPLING:
+ case SIGN_POST:
+ case WALL_SIGN:
+ case SNOW:
+ case TORCH:
+ case DETECTOR_RAIL:
+ case ACTIVATOR_RAIL:
+ case RAILS:
+ case POWERED_RAIL:
+ case NETHER_WARTS:
+ case NETHER_STALK:
+ case VINE:
+ case SUGAR_CANE_BLOCK:
+ case CROPS:
+ case LONG_GRASS:
+ case RED_MUSHROOM:
+ case BROWN_MUSHROOM:
+ case DEAD_BUSH:
+ case REDSTONE_TORCH_OFF:
+ case REDSTONE_TORCH_ON:
+ case AIR:
+ case YELLOW_FLOWER:
+ case RED_ROSE:
+ return true;
+ default:
+ return false;
+ }
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/ChunkHelper_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/ChunkHelper_v1_11_R1.java
new file mode 100644
index 0000000000..98c1a535e7
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/ChunkHelper_v1_11_R1.java
@@ -0,0 +1,13 @@
+package net.aufdemrand.denizen.nms.helpers;
+
+import net.aufdemrand.denizen.nms.interfaces.ChunkHelper;
+import org.bukkit.Chunk;
+import org.bukkit.craftbukkit.v1_11_R1.CraftChunk;
+
+public class ChunkHelper_v1_11_R1 implements ChunkHelper {
+
+ @Override
+ public int[] getHeightMap(Chunk chunk) {
+ return ((CraftChunk) chunk).getHandle().heightMap;
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/CustomEntityHelper_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/CustomEntityHelper_v1_11_R1.java
new file mode 100644
index 0000000000..5857072dd6
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/CustomEntityHelper_v1_11_R1.java
@@ -0,0 +1,143 @@
+package net.aufdemrand.denizen.nms.helpers;
+
+import com.mojang.authlib.GameProfile;
+import com.mojang.authlib.properties.Property;
+import net.aufdemrand.denizen.nms.NMSHandler;
+import net.aufdemrand.denizen.nms.impl.entities.CraftFakePlayer_v1_11_R1;
+import net.aufdemrand.denizen.nms.impl.entities.EntityFakeArrow_v1_11_R1;
+import net.aufdemrand.denizen.nms.impl.entities.EntityFakePlayer_v1_11_R1;
+import net.aufdemrand.denizen.nms.impl.entities.EntityItemProjectile_v1_11_R1;
+import net.aufdemrand.denizen.nms.interfaces.CustomEntityHelper;
+import net.aufdemrand.denizen.nms.interfaces.FakeArrow;
+import net.aufdemrand.denizen.nms.interfaces.FakePlayer;
+import net.aufdemrand.denizen.nms.interfaces.ItemProjectile;
+import net.aufdemrand.denizen.nms.util.PlayerProfile;
+import net.minecraft.server.v1_11_R1.PlayerInteractManager;
+import net.minecraft.server.v1_11_R1.WorldServer;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_11_R1.CraftWorld;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.scoreboard.Scoreboard;
+import org.bukkit.scoreboard.Team;
+
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.util.UUID;
+
+public class CustomEntityHelper_v1_11_R1 implements CustomEntityHelper {
+
+ @Override
+ public FakeArrow spawnFakeArrow(Location location) {
+ CraftWorld world = (CraftWorld) location.getWorld();
+ EntityFakeArrow_v1_11_R1 arrow = new EntityFakeArrow_v1_11_R1(world, location);
+ return arrow.getBukkitEntity();
+ }
+
+ @Override
+ public ItemProjectile spawnItemProjectile(Location location, ItemStack itemStack) {
+ CraftWorld world = (CraftWorld) location.getWorld();
+ EntityItemProjectile_v1_11_R1 entity = new EntityItemProjectile_v1_11_R1(world, location, itemStack);
+ return entity.getBukkitEntity();
+ }
+
+ @Override
+ public FakePlayer spawnFakePlayer(Location location, String name, String skin) throws IllegalArgumentException {
+ String fullName = name;
+ String prefix = null;
+ String suffix = null;
+ if (name == null) {
+ return null;
+ } else if (fullName.length() > 16) {
+ prefix = fullName.substring(0, 16);
+ if (fullName.length() > 30) {
+ int len = 30;
+ name = fullName.substring(16, 30);
+ if (name.matches(".*[^A-Za-z0-9_].*")) {
+ if (fullName.length() >= 32) {
+ len = 32;
+ name = fullName.substring(16, 32);
+ } else if (fullName.length() == 31) {
+ len = 31;
+ name = fullName.substring(16, 31);
+ }
+ } else if (name.length() > 46) {
+ throw new IllegalArgumentException("You must specify a name with no more than 46 characters for FAKE_PLAYER entities!");
+ } else {
+ name = ChatColor.RESET + name;
+ }
+ suffix = fullName.substring(len);
+ } else {
+ name = fullName.substring(16);
+ if (!name.matches(".*[^A-Za-z0-9_].*")) {
+ name = ChatColor.RESET + name;
+ }
+ if (name.length() > 16) {
+ suffix = name.substring(16);
+ name = name.substring(0, 16);
+ }
+ }
+ }
+ if (skin != null && skin.length() > 16) {
+ throw new IllegalArgumentException("You must specify a name with no more than 16 characters for FAKE_PLAYER entity skins!");
+ }
+ CraftWorld world = (CraftWorld) location.getWorld();
+ WorldServer worldServer = world.getHandle();
+ PlayerProfile playerProfile = new PlayerProfile(name, null);
+ if (skin == null && !name.matches(".*[^A-Za-z0-9_].*")) {
+ playerProfile = NMSHandler.getInstance().fillPlayerProfile(playerProfile);
+ }
+ if (skin != null) {
+ PlayerProfile skinProfile = new PlayerProfile(skin, null);
+ skinProfile = NMSHandler.getInstance().fillPlayerProfile(skinProfile);
+ playerProfile.setTexture(skinProfile.getTexture());
+ playerProfile.setTextureSignature(skinProfile.getTextureSignature());
+ }
+ UUID uuid = UUID.randomUUID();
+ if (uuid.version() == 4) {
+ long msb = uuid.getMostSignificantBits();
+ msb &= ~0x0000000000004000L;
+ msb |= 0x0000000000002000L;
+ uuid = new UUID(msb, uuid.getLeastSignificantBits());
+ }
+ playerProfile.setUniqueId(uuid);
+
+ GameProfile gameProfile = new GameProfile(playerProfile.getUniqueId(), playerProfile.getName());
+ gameProfile.getProperties().put("textures",
+ new Property("value", playerProfile.getTexture(), playerProfile.getTextureSignature()));
+
+ final EntityFakePlayer_v1_11_R1 fakePlayer = new EntityFakePlayer_v1_11_R1(worldServer.getMinecraftServer(), worldServer,
+ gameProfile, new PlayerInteractManager(worldServer));
+
+ fakePlayer.setPositionRotation(location.getX(), location.getY(), location.getZ(),
+ location.getYaw(), location.getPitch());
+ CraftFakePlayer_v1_11_R1 craftFakePlayer = fakePlayer.getBukkitEntity();
+ craftFakePlayer.fullName = fullName;
+ if (prefix != null) {
+ Scoreboard scoreboard = Bukkit.getScoreboardManager().getMainScoreboard();
+ String teamName = "FAKE_PLAYER_TEAM_" + fullName;
+ String hash = null;
+ try {
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ byte[] bytes = teamName.getBytes("UTF-8");
+ md.update(bytes, 0, bytes.length);
+ hash = new BigInteger(1, md.digest()).toString(16).substring(0, 16);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ if (hash != null) {
+ Team team = scoreboard.getTeam(hash);
+ if (team == null) {
+ team = scoreboard.registerNewTeam(hash);
+ team.setPrefix(prefix);
+ if (suffix != null) {
+ team.setSuffix(suffix);
+ }
+ }
+ team.addPlayer(craftFakePlayer);
+ }
+ }
+ return craftFakePlayer;
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/EntityHelper_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/EntityHelper_v1_11_R1.java
new file mode 100644
index 0000000000..473df435c3
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/EntityHelper_v1_11_R1.java
@@ -0,0 +1,616 @@
+package net.aufdemrand.denizen.nms.helpers;
+
+import net.aufdemrand.denizen.nms.NMSHandler;
+import net.aufdemrand.denizen.nms.impl.jnbt.CompoundTag_v1_11_R1;
+import net.aufdemrand.denizen.nms.interfaces.EntityHelper;
+import net.aufdemrand.denizen.nms.util.BoundingBox;
+import net.aufdemrand.denizen.nms.util.Utilities;
+import net.aufdemrand.denizen.nms.util.jnbt.CompoundTag;
+import net.minecraft.server.v1_11_R1.*;
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.block.BlockFace;
+import org.bukkit.craftbukkit.v1_11_R1.CraftWorld;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftAnimals;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftCreature;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftLivingEntity;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
+import org.bukkit.entity.Animals;
+import org.bukkit.entity.Creature;
+import org.bukkit.entity.EnderDragon;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.entity.Player;
+import org.bukkit.event.entity.EntityTargetEvent;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.scheduler.BukkitRunnable;
+import org.bukkit.scheduler.BukkitTask;
+import org.bukkit.util.Vector;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+public class EntityHelper_v1_11_R1 implements EntityHelper {
+
+ /*
+ General Entity Methods
+ */
+
+ @Override
+ public void forceInteraction(Player player, Location location) {
+ CraftPlayer craftPlayer = (CraftPlayer) player;
+ BlockPosition pos = new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ());
+ Block.getById(location.getBlock().getType().getId())
+ .interact(((CraftWorld) location.getWorld()).getHandle(), pos,
+ ((CraftWorld) location.getWorld()).getHandle().getType(pos),
+ craftPlayer != null ? craftPlayer.getHandle() : null, EnumHand.MAIN_HAND, null, 0f, 0f, 0f);
+ }
+
+ @Override
+ public Entity getEntity(World world, UUID uuid) {
+ net.minecraft.server.v1_11_R1.Entity entity = ((CraftWorld) world).getHandle().getEntity(uuid);
+ return entity == null ? null : entity.getBukkitEntity();
+ }
+
+ @Override
+ public boolean isBreeding(Animals entity) {
+ return ((CraftAnimals) entity).getHandle().isInLove();
+ }
+
+ @Override
+ public void setBreeding(Animals entity, boolean breeding) {
+ if (breeding) {
+ ((CraftAnimals) entity).getHandle().c((EntityHuman) null);
+ }
+ else {
+ ((CraftAnimals) entity).getHandle().resetLove();
+ }
+ }
+
+ @Override
+ public void setTarget(Creature entity, LivingEntity target) {
+ EntityLiving nmsTarget = target != null ? ((CraftLivingEntity) target).getHandle() : null;
+ ((CraftCreature) entity).getHandle().setGoalTarget(nmsTarget, EntityTargetEvent.TargetReason.CUSTOM, true);
+ entity.setTarget(target);
+ }
+
+ @Override
+ public CompoundTag getNbtData(Entity entity) {
+ NBTTagCompound compound = new NBTTagCompound();
+ ((CraftEntity) entity).getHandle().c(compound);
+ return CompoundTag_v1_11_R1.fromNMSTag(compound);
+ }
+
+ @Override
+ public void setNbtData(Entity entity, CompoundTag compoundTag) {
+ ((CraftEntity) entity).getHandle().f(((CompoundTag_v1_11_R1) compoundTag).toNMSTag());
+ }
+
+ @Override
+ public void setSilent(Entity entity, boolean silent) {
+ entity.setSilent(silent);
+ }
+
+ @Override
+ public boolean isSilent(Entity entity) {
+ return entity.isSilent();
+ }
+
+ @Override
+ public ItemStack getItemInHand(LivingEntity entity) {
+ return entity.getEquipment().getItemInMainHand();
+ }
+
+ @Override
+ public void setItemInHand(LivingEntity entity, ItemStack itemStack) {
+ entity.getEquipment().setItemInMainHand(itemStack);
+ }
+
+ @Override
+ public ItemStack getItemInOffHand(LivingEntity entity) {
+ return entity.getEquipment().getItemInOffHand();
+ }
+
+ @Override
+ public void setItemInOffHand(LivingEntity entity, ItemStack itemStack) {
+ entity.getEquipment().setItemInOffHand(itemStack);
+ }
+
+ /*
+ Entity Movement
+ */
+
+ private final static Map followTasks = new HashMap();
+
+ @Override
+ public void stopFollowing(Entity follower) {
+ if (follower == null) {
+ return;
+ }
+ UUID uuid = follower.getUniqueId();
+ if (followTasks.containsKey(uuid)) {
+ followTasks.get(uuid).cancel();
+ }
+ }
+
+ @Override
+ public void stopWalking(Entity entity) {
+ net.minecraft.server.v1_11_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
+ if (!(nmsEntity instanceof EntityInsentient)) {
+ return;
+ }
+ ((EntityInsentient) nmsEntity).getNavigation().o();
+ }
+
+ @Override
+ public void toggleAI(Entity entity, boolean hasAI) {
+ net.minecraft.server.v1_11_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
+ if (!(nmsEntity instanceof EntityInsentient)) {
+ return;
+ }
+ ((EntityInsentient) nmsEntity).setAI(!hasAI);
+ }
+
+ @Override
+ public boolean isAIDisabled(Entity entity) {
+ net.minecraft.server.v1_11_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
+ if (!(nmsEntity instanceof EntityInsentient)) {
+ return true;
+ }
+ return ((EntityInsentient) nmsEntity).hasAI();
+ }
+
+ @Override
+ public double getSpeed(Entity entity) {
+ net.minecraft.server.v1_11_R1.Entity nmsEntityEntity = ((CraftEntity) entity).getHandle();
+ if (!(nmsEntityEntity instanceof EntityInsentient)) {
+ return 0.0;
+ }
+ EntityInsentient nmsEntity = (EntityInsentient) nmsEntityEntity;
+ return nmsEntity.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).b();
+ }
+
+ @Override
+ public void setSpeed(Entity entity, double speed) {
+ net.minecraft.server.v1_11_R1.Entity nmsEntityEntity = ((CraftEntity) entity).getHandle();
+ if (!(nmsEntityEntity instanceof EntityInsentient)) {
+ return;
+ }
+ EntityInsentient nmsEntity = (EntityInsentient) nmsEntityEntity;
+ nmsEntity.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(speed);
+ }
+
+ @Override
+ public void follow(final Entity target, final Entity follower, final double speed, final double lead,
+ final double maxRange, final boolean allowWander) {
+ if (target == null || follower == null) {
+ return;
+ }
+
+ final net.minecraft.server.v1_11_R1.Entity nmsEntityFollower = ((CraftEntity) follower).getHandle();
+ if (!(nmsEntityFollower instanceof EntityInsentient)) {
+ return;
+ }
+ final EntityInsentient nmsFollower = (EntityInsentient) nmsEntityFollower;
+ final NavigationAbstract followerNavigation = nmsFollower.getNavigation();
+
+ UUID uuid = follower.getUniqueId();
+
+ if (followTasks.containsKey(uuid)) {
+ followTasks.get(uuid).cancel();
+ }
+
+ final int locationNearInt = (int) Math.floor(lead);
+ final boolean hasMax = maxRange > lead;
+
+ followTasks.put(follower.getUniqueId(), new BukkitRunnable() {
+
+ private boolean inRadius = false;
+
+ public void run() {
+ if (!target.isValid() || !follower.isValid()) {
+ this.cancel();
+ }
+ followerNavigation.a(2F);
+ Location targetLocation = target.getLocation();
+ PathEntity path;
+
+ if (hasMax && !Utilities.checkLocation(targetLocation, follower.getLocation(), maxRange)
+ && !target.isDead() && target.isOnGround()) {
+ if (!inRadius) {
+ follower.teleport(Utilities.getWalkableLocationNear(targetLocation, locationNearInt));
+ }
+ else {
+ inRadius = false;
+ path = followerNavigation.a(targetLocation.getX(), targetLocation.getY(), targetLocation.getZ());
+ if (path != null) {
+ followerNavigation.a(path, 1D);
+ followerNavigation.a(2D);
+ }
+ }
+ }
+ else if (!inRadius && !Utilities.checkLocation(targetLocation, follower.getLocation(), lead)) {
+ path = followerNavigation.a(targetLocation.getX(), targetLocation.getY(), targetLocation.getZ());
+ if (path != null) {
+ followerNavigation.a(path, 1D);
+ followerNavigation.a(2D);
+ }
+ }
+ else {
+ inRadius = true;
+ }
+ if (inRadius && !allowWander) {
+ followerNavigation.o();
+ }
+ nmsFollower.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(speed);
+ }
+ }.runTaskTimer(NMSHandler.getJavaPlugin(), 0, 10));
+ }
+
+ @Override
+ public void walkTo(final Entity entity, Location location, double speed, final Runnable callback) {
+ if (entity == null || location == null) {
+ return;
+ }
+
+ net.minecraft.server.v1_11_R1.Entity nmsEntityEntity = ((CraftEntity) entity).getHandle();
+ if (!(nmsEntityEntity instanceof EntityInsentient)) {
+ return;
+ }
+ final EntityInsentient nmsEntity = (EntityInsentient) nmsEntityEntity;
+ final NavigationAbstract entityNavigation = nmsEntity.getNavigation();
+
+ final PathEntity path;
+ final boolean aiDisabled = isAIDisabled(entity);
+ if (aiDisabled) {
+ toggleAI(entity, true);
+ nmsEntity.onGround = true;
+ }
+ path = entityNavigation.a(location.getX(), location.getY(), location.getZ());
+ if (path != null) {
+ entityNavigation.a(path, 1D);
+ entityNavigation.a(2D);
+ final double oldSpeed = nmsEntity.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).b();
+ nmsEntity.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(speed);
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ if (entityNavigation.n() || path.b()) {
+ if (callback != null) {
+ callback.run();
+ }
+ nmsEntity.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(oldSpeed);
+ if (aiDisabled) {
+ toggleAI(entity, false);
+ }
+ cancel();
+ }
+ }
+ }.runTaskTimer(NMSHandler.getJavaPlugin(), 1, 1);
+ }
+ //if (!Utilities.checkLocation(location, entity.getLocation(), 20)) {
+ // TODO: generate waypoints to the target location?
+ else {
+ entity.teleport(location);
+ }
+ }
+
+ /*
+ Hide Entity
+ */
+
+ public static Map> hiddenEntities = new HashMap>();
+
+ @Override
+ public void hideEntity(Player player, Entity entity, boolean keepInTabList) {
+ CraftPlayer craftPlayer = (CraftPlayer)player;
+ EntityPlayer entityPlayer = craftPlayer.getHandle();
+ UUID playerUUID = player.getUniqueId();
+ if (entityPlayer.playerConnection != null && !craftPlayer.equals(entity)) {
+ if (!hiddenEntities.containsKey(playerUUID)) {
+ hiddenEntities.put(playerUUID, new HashSet());
+ }
+ Set hidden = hiddenEntities.get(playerUUID);
+ UUID entityUUID = entity.getUniqueId();
+ if (!hidden.contains(entityUUID)) {
+ hidden.add(entityUUID);
+ EntityTracker tracker = ((WorldServer)craftPlayer.getHandle().world).tracker;
+ net.minecraft.server.v1_11_R1.Entity other = ((CraftEntity)entity).getHandle();
+ EntityTrackerEntry entry = tracker.trackedEntities.get(other.getId());
+ if (entry != null) {
+ entry.clear(entityPlayer);
+ }
+ if (entity instanceof Player && !entity.hasMetadata("NPC") && !keepInTabList) {
+ entityPlayer.playerConnection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, (EntityPlayer) other));
+ }
+ }
+ }
+ }
+
+ @Override
+ public void unhideEntity(Player player, Entity entity) {
+ CraftPlayer craftPlayer = (CraftPlayer)player;
+ EntityPlayer entityPlayer = craftPlayer.getHandle();
+ UUID playerUUID = player.getUniqueId();
+ if (entityPlayer.playerConnection != null && !craftPlayer.equals(entity) && hiddenEntities.containsKey(playerUUID)) {
+ Set hidden = hiddenEntities.get(playerUUID);
+ UUID entityUUID = entity.getUniqueId();
+ if (hidden.contains(entityUUID)) {
+ hidden.remove(entityUUID);
+ EntityTracker tracker = ((WorldServer)craftPlayer.getHandle().world).tracker;
+ net.minecraft.server.v1_11_R1.Entity other = ((CraftEntity)entity).getHandle();
+ if (entity instanceof Player && !entity.hasMetadata("NPC")) {
+ entityPlayer.playerConnection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, (EntityPlayer) other));
+ }
+ EntityTrackerEntry entry = tracker.trackedEntities.get(other.getId());
+ if(entry != null && !entry.trackedPlayers.contains(entityPlayer)) {
+ entry.updatePlayer(entityPlayer);
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean isHidden(Player player, UUID entity) {
+ UUID uuid = player.getUniqueId();
+ return hiddenEntities.containsKey(uuid) && hiddenEntities.get(uuid).contains(entity);
+ }
+
+ @Override
+ public void rotate(Entity entity, float yaw, float pitch) {
+ // If this entity is a real player instead of a player type NPC,
+ // it will appear to be online
+ if (entity instanceof Player && ((Player) entity).isOnline()) {
+ Location location = entity.getLocation();
+ location.setYaw(yaw);
+ location.setPitch(pitch);
+ entity.teleport(location);
+ }
+ else if (entity instanceof LivingEntity) {
+ if (entity instanceof EnderDragon) {
+ yaw = normalizeYaw(yaw - 180);
+ }
+ look(entity, yaw, pitch);
+ }
+ else {
+ net.minecraft.server.v1_11_R1.Entity handle = ((CraftEntity) entity).getHandle();
+ handle.yaw = yaw;
+ handle.pitch = pitch;
+ }
+ }
+
+ @Override
+ public void look(Entity entity, float yaw, float pitch) {
+ net.minecraft.server.v1_11_R1.Entity handle = ((CraftEntity) entity).getHandle();
+ if (handle != null) {
+ handle.yaw = yaw;
+ if (handle instanceof EntityLiving) {
+ EntityLiving livingHandle = (EntityLiving) handle;
+ while (yaw < -180.0F) {
+ yaw += 360.0F;
+ }
+ while (yaw >= 180.0F) {
+ yaw -= 360.0F;
+ }
+ livingHandle.aN = yaw;
+ if (!(handle instanceof EntityHuman)) {
+ livingHandle.aL = yaw;
+ }
+ livingHandle.aO = yaw;
+ }
+ handle.pitch = pitch;
+ }
+ }
+
+ private static MovingObjectPosition rayTrace(World world, Vector start, Vector end) {
+ return ((CraftWorld) world).getHandle().rayTrace(new Vec3D(start.getX(), start.getY(), start.getZ()),
+ new Vec3D(end.getX(), end.getY(), end.getZ()));
+ }
+
+ @Override
+ public boolean canTrace(World world, Vector start, Vector end) {
+ return rayTrace(world, start, end) == null;
+ }
+
+ @Override
+ public MapTraceResult mapTrace(LivingEntity from, double range) {
+ Location start = from.getEyeLocation();
+ Vector startVec = start.toVector();
+ double xzLen = Math.cos((start.getPitch() % 360) * (Math.PI / 180));
+ double nx = xzLen * Math.sin(-start.getYaw() * (Math.PI / 180));
+ double ny = Math.sin(start.getPitch() * (Math.PI / 180));
+ double nz = xzLen * Math.cos(start.getYaw() * (Math.PI / 180));
+ Vector endVec = startVec.clone().add(new Vector(nx, -ny, nz).multiply(range));
+ MovingObjectPosition l = rayTrace(start.getWorld(), startVec, endVec);
+ if (l == null || l.pos == null) {
+ return null;
+ }
+ Vector finalVec = new Vector(l.pos.x, l.pos.y, l.pos.z);
+ MapTraceResult mtr = new MapTraceResult();
+ switch (l.direction) {
+ case NORTH:
+ mtr.angle = BlockFace.NORTH;
+ break;
+ case SOUTH:
+ mtr.angle = BlockFace.SOUTH;
+ break;
+ case EAST:
+ mtr.angle = BlockFace.EAST;
+ break;
+ case WEST:
+ mtr.angle = BlockFace.WEST;
+ break;
+ }
+ // wallPosition - ((end - start).normalize() * 0.072)
+ Vector hit = finalVec.clone().subtract((endVec.clone().subtract(startVec)).normalize().multiply(0.072));
+ mtr.hitLocation = new Location(start.getWorld(), hit.getX(), hit.getY(), hit.getZ());
+ return mtr;
+ }
+
+ @Override
+ public Location rayTrace(Location start, Vector direction, double range) {
+ Vector startVec = start.toVector();
+ MovingObjectPosition l = rayTrace(start.getWorld(), startVec, startVec.clone().add(direction.multiply(range)));
+ if (l != null && l.pos != null) {
+ return new Location(start.getWorld(), l.pos.x, l.pos.y, l.pos.z);
+ }
+ return null;
+ }
+
+ @Override
+ public Location getImpactNormal(Location start, Vector direction, double range) {
+ Vector startVec = start.toVector();
+ MovingObjectPosition l = rayTrace(start.getWorld(), startVec, startVec.clone().add(direction.multiply(range)));
+ if (l != null && l.direction != null) {
+ return new Location(start.getWorld(), l.direction.getAdjacentX(), l.direction.getAdjacentY(), l.direction.getAdjacentZ());
+ }
+ return null;
+ }
+
+ @Override
+ public Location eyeTrace(LivingEntity from, double range) {
+ Location start = from.getEyeLocation();
+ double xzLen = Math.cos((start.getPitch() % 360) * (Math.PI / 180));
+ double nx = xzLen * Math.sin(-start.getYaw() * (Math.PI / 180));
+ double ny = Math.sin(start.getPitch() * (Math.PI / 180));
+ double nz = xzLen * Math.cos(start.getYaw() * (Math.PI / 180));
+ return rayTrace(start, new Vector(nx, -ny, nz), range);
+ }
+
+ @Override
+ public Location faceLocation(Location from, Location at) {
+ Vector direction = from.toVector().subtract(at.toVector()).normalize();
+ Location newLocation = from.clone();
+ newLocation.setYaw(180 - (float) Math.toDegrees(Math.atan2(direction.getX(), direction.getZ())));
+ newLocation.setPitch(90 - (float) Math.toDegrees(Math.acos(direction.getY())));
+ return newLocation;
+ }
+
+ @Override
+ public void faceLocation(Entity from, Location at) {
+ if (from.getWorld() != at.getWorld()) {
+ return;
+ }
+ Location origin = from instanceof LivingEntity ? ((LivingEntity) from).getEyeLocation()
+ : from.getLocation().getBlock().getLocation().add(0.5, 0.5, 0.5);
+ Location rotated = faceLocation(origin, at);
+ rotate(from, rotated.getYaw(), rotated.getPitch());
+ }
+
+ @Override
+ public void faceEntity(Entity entity, Entity target) {
+ faceLocation(entity, target.getLocation());
+ }
+
+ @Override
+ public boolean isFacingLocation(Location from, Location at, float degreeLimit) {
+ double currentYaw = normalizeYaw(from.getYaw());
+ double requiredYaw = normalizeYaw(getYaw(at.toVector().subtract(
+ from.toVector()).normalize()));
+ return (Math.abs(requiredYaw - currentYaw) < degreeLimit ||
+ Math.abs(requiredYaw + 360 - currentYaw) < degreeLimit ||
+ Math.abs(currentYaw + 360 - requiredYaw) < degreeLimit);
+ }
+
+ @Override
+ public boolean isFacingLocation(Entity from, Location at, float degreeLimit) {
+ return isFacingLocation(from.getLocation(), at, degreeLimit);
+ }
+
+ @Override
+ public boolean isFacingEntity(Entity from, Entity at, float degreeLimit) {
+ return isFacingLocation(from.getLocation(), at.getLocation(), degreeLimit);
+ }
+
+ @Override
+ public float normalizeYaw(float yaw) {
+ yaw = yaw % 360;
+ if (yaw < 0) {
+ yaw += 360.0;
+ }
+ return yaw;
+ }
+
+ @Override
+ public float getYaw(Vector vector) {
+ double dx = vector.getX();
+ double dz = vector.getZ();
+ double yaw = 0;
+ // Set yaw
+ if (dx != 0) {
+ // Set yaw start value based on dx
+ if (dx < 0) {
+ yaw = 1.5 * Math.PI;
+ }
+ else {
+ yaw = 0.5 * Math.PI;
+ }
+ yaw -= Math.atan(dz / dx);
+ }
+ else if (dz < 0) {
+ yaw = Math.PI;
+ }
+ return (float) (-yaw * 180 / Math.PI);
+ }
+
+ @Override
+ public String getCardinal(float yaw) {
+ yaw = normalizeYaw(yaw);
+ // Compare yaws, return closest direction.
+ if (0 <= yaw && yaw < 22.5) {
+ return "south";
+ }
+ else if (22.5 <= yaw && yaw < 67.5) {
+ return "southwest";
+ }
+ else if (67.5 <= yaw && yaw < 112.5) {
+ return "west";
+ }
+ else if (112.5 <= yaw && yaw < 157.5) {
+ return "northwest";
+ }
+ else if (157.5 <= yaw && yaw < 202.5) {
+ return "north";
+ }
+ else if (202.5 <= yaw && yaw < 247.5) {
+ return "northeast";
+ }
+ else if (247.5 <= yaw && yaw < 292.5) {
+ return "east";
+ }
+ else if (292.5 <= yaw && yaw < 337.5) {
+ return "southeast";
+ }
+ else if (337.5 <= yaw && yaw < 360.0) {
+ return "south";
+ }
+ else {
+ return null;
+ }
+ }
+
+ @Override
+ public void move(Entity entity, Vector vector) {
+ ((CraftEntity) entity).getHandle().move(EnumMoveType.SELF, vector.getX(), vector.getY(), vector.getZ());
+ }
+
+ @Override
+ public BoundingBox getBoundingBox(Entity entity) {
+ AxisAlignedBB boundingBox = ((CraftEntity) entity).getHandle().getBoundingBox();
+ Vector position = new Vector(boundingBox.a, boundingBox.b, boundingBox.c);
+ Vector size = new Vector(boundingBox.d, boundingBox.e, boundingBox.f);
+ return new BoundingBox(position, size);
+ }
+
+ @Override
+ public void setBoundingBox(Entity entity, BoundingBox boundingBox) {
+ Vector low = boundingBox.getLow();
+ Vector high = boundingBox.getHigh();
+ ((CraftEntity) entity).getHandle().a(new AxisAlignedBB(low.getX(), low.getY(), low.getZ(),
+ high.getX(), high.getY(), high.getZ()));
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/FishingHelper_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/FishingHelper_v1_11_R1.java
new file mode 100644
index 0000000000..23bfbe72ec
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/FishingHelper_v1_11_R1.java
@@ -0,0 +1,95 @@
+package net.aufdemrand.denizen.nms.helpers;
+
+import net.aufdemrand.denizen.nms.interfaces.FishingHelper;
+import net.minecraft.server.v1_11_R1.*;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_11_R1.CraftWorld;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftFish;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftItemStack;
+import org.bukkit.entity.FishHook;
+import org.bukkit.entity.Player;
+
+import java.util.List;
+
+public class FishingHelper_v1_11_R1 implements FishingHelper {
+
+ @Override
+ public org.bukkit.inventory.ItemStack getResult(FishHook fishHook, CatchType catchType) {
+ ItemStack result = null;
+ EntityFishingHook nmsHook = ((CraftFish) fishHook).getHandle();
+ if (catchType == CatchType.DEFAULT) {
+ float f = ((CraftWorld) fishHook.getWorld()).getHandle().random.nextFloat();
+ int i = EnchantmentManager.g(nmsHook.owner);
+ int j = EnchantmentManager.h(nmsHook.owner);
+ float f1 = 0.1F - (float) i * 0.025F - (float) j * 0.01F;
+ float f2 = 0.05F + (float) i * 0.01F - (float) j * 0.01F;
+
+ f1 = MathHelper.a(f1, 0.0F, 1.0F);
+ f2 = MathHelper.a(f2, 0.0F, 1.0F);
+ if (f < f1) {
+ result = catchRandomJunk(nmsHook);
+ }
+ else {
+ f -= f1;
+ if (f < f2) {
+ result = catchRandomTreasure(nmsHook);
+ }
+ else {
+ result = catchRandomFish(nmsHook);
+ }
+ }
+ }
+ else if (catchType == CatchType.JUNK) {
+ result = catchRandomJunk(nmsHook);
+ }
+ else if (catchType == CatchType.TREASURE) {
+ result = catchRandomTreasure(nmsHook);
+ }
+ else if (catchType == CatchType.FISH) {
+ result = catchRandomFish(nmsHook);
+ }
+ if (result != null) {
+ return CraftItemStack.asBukkitCopy(result);
+ }
+ else {
+ return null;
+ }
+ }
+
+ @Override
+ public FishHook spawnHook(Location location, Player player) {
+ WorldServer nmsWorld = ((CraftWorld) location.getWorld()).getHandle();
+ EntityFishingHook hook = new EntityFishingHook(nmsWorld, ((CraftPlayer) player).getHandle());
+ nmsWorld.addEntity(hook);
+ return (FishHook) hook.getBukkitEntity();
+ }
+
+ private ItemStack catchRandomJunk(EntityFishingHook fishHook) {
+ fishHook.owner.a(StatisticList.F, 1);
+ WorldServer worldServer = (WorldServer) fishHook.getWorld();
+ LootTableInfo.a playerFishEvent2 = new LootTableInfo.a(worldServer);
+ playerFishEvent2.a((float)EnchantmentManager.f(fishHook.owner) + fishHook.owner.dj());
+ List itemStacks = fishHook.getWorld().ak().a(LootTables.aA).a(worldServer.random, playerFishEvent2.a());
+ return itemStacks.get(worldServer.random.nextInt(itemStacks.size()));
+ }
+
+ private ItemStack catchRandomTreasure(EntityFishingHook fishHook) {
+ fishHook.owner.a(StatisticList.G, 1);
+ WorldServer worldServer = (WorldServer) fishHook.getWorld();
+ LootTableInfo.a playerFishEvent2 = new LootTableInfo.a((WorldServer)fishHook.getWorld());
+ playerFishEvent2.a((float)EnchantmentManager.f(fishHook.owner) + fishHook.owner.dj());
+ List itemStacks = fishHook.getWorld().ak().a(LootTables.aB).a(worldServer.random, playerFishEvent2.a());
+ return itemStacks.get(worldServer.random.nextInt(itemStacks.size()));
+ }
+
+ private ItemStack catchRandomFish(EntityFishingHook fishHook) {
+ //float f3 = f - f2;
+ fishHook.owner.a(StatisticList.E, 1);
+ WorldServer worldServer = (WorldServer) fishHook.getWorld();
+ LootTableInfo.a playerFishEvent2 = new LootTableInfo.a((WorldServer)fishHook.getWorld());
+ playerFishEvent2.a((float)EnchantmentManager.f(fishHook.owner) + fishHook.owner.dj());
+ List itemStacks = fishHook.getWorld().ak().a(LootTables.aC).a(worldServer.random, playerFishEvent2.a());
+ return itemStacks.get(worldServer.random.nextInt(itemStacks.size()));
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_11_R1.java
new file mode 100644
index 0000000000..704e3d8579
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/ItemHelper_v1_11_R1.java
@@ -0,0 +1,140 @@
+package net.aufdemrand.denizen.nms.helpers;
+
+import com.google.common.collect.Iterables;
+import com.mojang.authlib.GameProfile;
+import com.mojang.authlib.properties.Property;
+import net.aufdemrand.denizen.nms.enums.EntityAttribute;
+import net.aufdemrand.denizen.nms.impl.jnbt.CompoundTag_v1_11_R1;
+import net.aufdemrand.denizen.nms.interfaces.ItemHelper;
+import net.aufdemrand.denizen.nms.util.EntityAttributeModifier;
+import net.aufdemrand.denizen.nms.util.PlayerProfile;
+import net.aufdemrand.denizen.nms.util.jnbt.*;
+import net.minecraft.server.v1_11_R1.GameProfileSerializer;
+import net.minecraft.server.v1_11_R1.NBTTagCompound;
+import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftItemStack;
+import org.bukkit.inventory.ItemStack;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+public class ItemHelper_v1_11_R1 implements ItemHelper {
+
+ @Override
+ public String getJsonString(ItemStack itemStack) {
+ String json = CraftItemStack.asNMSCopy(itemStack).C().getChatModifier().toString().replace("\"", "\\\"");
+ return json.substring(176, json.length() - 185);
+ }
+
+ @Override
+ public PlayerProfile getSkullSkin(ItemStack is) {
+ net.minecraft.server.v1_11_R1.ItemStack itemStack = CraftItemStack.asNMSCopy(is);
+ if (itemStack.hasTag()) {
+ NBTTagCompound tag = itemStack.getTag();
+ if (tag.hasKeyOfType("SkullOwner", 10)) {
+ GameProfile profile = GameProfileSerializer.deserialize(tag.getCompound("SkullOwner"));
+ if (profile != null) {
+ Property property = Iterables.getFirst(profile.getProperties().get("textures"), null);
+ return new PlayerProfile(profile.getName(), profile.getId(),
+ property != null ? property.getValue() : null,
+ property != null ? property.getSignature() : null);
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public ItemStack setSkullSkin(ItemStack itemStack, PlayerProfile playerProfile) {
+ GameProfile gameProfile = new GameProfile(playerProfile.getUniqueId(), playerProfile.getName());
+ if (playerProfile.hasTexture()) {
+ gameProfile.getProperties().get("textures").clear();
+ if (playerProfile.getTextureSignature() != null) {
+ gameProfile.getProperties().put("textures", new Property("value", playerProfile.getTexture(), playerProfile.getTextureSignature()));
+ }
+ else {
+ gameProfile.getProperties().put("textures", new Property("value", playerProfile.getTexture()));
+ }
+ }
+ net.minecraft.server.v1_11_R1.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack);
+ NBTTagCompound tag = nmsItemStack.hasTag() ? nmsItemStack.getTag() : new NBTTagCompound();
+ tag.set("SkullOwner", GameProfileSerializer.serialize(new NBTTagCompound(), gameProfile));
+ nmsItemStack.setTag(tag);
+ return CraftItemStack.asBukkitCopy(nmsItemStack);
+ }
+
+ @Override
+ public ItemStack addNbtData(ItemStack itemStack, String key, Tag value) {
+ net.minecraft.server.v1_11_R1.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack);
+ NBTTagCompound tag = nmsItemStack.hasTag() ? nmsItemStack.getTag() : new NBTTagCompound();
+ CompoundTag compound = CompoundTag_v1_11_R1.fromNMSTag(tag).createBuilder().put(key, value).build();
+ nmsItemStack.setTag(((CompoundTag_v1_11_R1) compound).toNMSTag());
+ return CraftItemStack.asBukkitCopy(nmsItemStack);
+ }
+
+ @Override
+ public CompoundTag getNbtData(ItemStack itemStack) {
+ net.minecraft.server.v1_11_R1.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack);
+ if (nmsItemStack != null && nmsItemStack.hasTag()) {
+ return CompoundTag_v1_11_R1.fromNMSTag(nmsItemStack.getTag());
+ }
+ return new CompoundTag_v1_11_R1(new HashMap());
+ }
+
+ @Override
+ public ItemStack setNbtData(ItemStack itemStack, CompoundTag compoundTag) {
+ net.minecraft.server.v1_11_R1.ItemStack nmsItemStack = CraftItemStack.asNMSCopy(itemStack);
+ nmsItemStack.setTag(((CompoundTag_v1_11_R1) compoundTag).toNMSTag());
+ return CraftItemStack.asBukkitCopy(nmsItemStack);
+ }
+
+ @Override
+ public Map> getAttributeModifiers(ItemStack itemStack) {
+ Map> modifiers = new HashMap>();
+ List modifierList = getNbtData(itemStack).getList("AttributeModifiers");
+ for (Tag tag : modifierList) {
+ if (!(tag instanceof CompoundTag)) {
+ continue;
+ }
+ CompoundTag modifier = (CompoundTag) tag;
+ EntityAttribute attribute = EntityAttribute.getByName(modifier.getString("AttributeName"));
+ if (attribute == null) {
+ continue;
+ }
+ if (!modifiers.containsKey(attribute)) {
+ modifiers.put(attribute, new ArrayList());
+ }
+ UUID uuid = new UUID(modifier.getLong("UUIDMost"), modifier.getLong("UUIDLeast"));
+ String name = modifier.getString("Name");
+ EntityAttributeModifier.Operation operation = EntityAttributeModifier.Operation.values()[modifier.getInt("Operation")];
+ if (operation == null) {
+ continue;
+ }
+ double amount = modifier.getDouble("Amount");
+ modifiers.get(attribute).add(new EntityAttributeModifier(uuid, name, operation, amount));
+ }
+ return modifiers;
+ }
+
+ @Override
+ public ItemStack setAttributeModifiers(ItemStack itemStack, Map> modifiers) {
+ List modifierList = new ArrayList(getNbtData(itemStack).getList("AttributeModifiers"));
+ for (Map.Entry> entry : modifiers.entrySet()) {
+ EntityAttribute attribute = entry.getKey();
+ for (EntityAttributeModifier modifier : entry.getValue()) {
+ Map compound = new HashMap();
+ compound.put("AttributeName", new StringTag(attribute.getName()));
+ UUID uuid = modifier.getUniqueId();
+ compound.put("UUIDMost", new LongTag(uuid.getMostSignificantBits()));
+ compound.put("UUIDLeast", new LongTag(uuid.getLeastSignificantBits()));
+ compound.put("Name", new StringTag(modifier.getName()));
+ compound.put("Operation", new IntTag(modifier.getOperation().ordinal()));
+ compound.put("Amount", new DoubleTag(modifier.getAmount()));
+ modifierList.add(new CompoundTag_v1_11_R1(compound));
+ }
+ }
+ return addNbtData(itemStack, "AttributeModifiers", new ListTag(CompoundTag.class, modifierList));
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_11_R1.java
new file mode 100644
index 0000000000..2c2f1f6d6d
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/PacketHelper_v1_11_R1.java
@@ -0,0 +1,175 @@
+package net.aufdemrand.denizen.nms.helpers;
+
+import io.netty.buffer.Unpooled;
+import net.aufdemrand.denizen.nms.NMSHandler;
+import net.aufdemrand.denizen.nms.impl.jnbt.CompoundTag_v1_11_R1;
+import net.aufdemrand.denizen.nms.interfaces.PacketHelper;
+import net.aufdemrand.denizen.nms.util.ReflectionHelper;
+import net.aufdemrand.denizen.nms.util.jnbt.CompoundTag;
+import net.aufdemrand.denizen.nms.util.jnbt.ListTag;
+import net.aufdemrand.denizen.nms.util.jnbt.Tag;
+import net.md_5.bungee.api.ChatMessageType;
+import net.md_5.bungee.api.chat.TextComponent;
+import net.minecraft.server.v1_11_R1.*;
+import org.bukkit.DyeColor;
+import org.bukkit.Location;
+import org.bukkit.block.banner.Pattern;
+import org.bukkit.craftbukkit.v1_11_R1.CraftEquipmentSlot;
+import org.bukkit.craftbukkit.v1_11_R1.CraftWorld;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
+import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftItemStack;
+import org.bukkit.entity.*;
+import org.bukkit.entity.Entity;
+import org.bukkit.inventory.EntityEquipment;
+import org.bukkit.inventory.EquipmentSlot;
+import org.bukkit.inventory.ItemStack;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class PacketHelper_v1_11_R1 implements PacketHelper {
+
+ @Override
+ public void setSlot(Player player, int slot, ItemStack itemStack, boolean playerOnly) {
+ int windowId = playerOnly ? 0 : ((CraftPlayer) player).getHandle().activeContainer.windowId;
+ sendPacket(player, new PacketPlayOutSetSlot(windowId, slot, CraftItemStack.asNMSCopy(itemStack)));
+ }
+
+ @Override
+ public void showBlockAction(Player player, Location location, int action, int state) {
+ BlockPosition position = new BlockPosition(location.getX(), location.getY(), location.getZ());
+ Block block = ((CraftWorld) location.getWorld()).getHandle().getType(position).getBlock();
+ sendPacket(player, new PacketPlayOutBlockAction(position, block, action, state));
+ }
+
+ @Override
+ public void showBlockCrack(Player player, int id, Location location, int progress) {
+ BlockPosition position = new BlockPosition(location.getX(), location.getY(), location.getZ());
+ sendPacket(player, new PacketPlayOutBlockBreakAnimation(id, position, progress));
+ }
+
+ @Override
+ public void showTileEntityData(Player player, Location location, int action, CompoundTag compoundTag) {
+ BlockPosition position = new BlockPosition(location.getX(), location.getY(), location.getZ());
+ sendPacket(player, new PacketPlayOutTileEntityData(position, action, ((CompoundTag_v1_11_R1) compoundTag).toNMSTag()));
+ }
+
+ @Override
+ public void showBannerUpdate(Player player, Location location, DyeColor base, List patterns) {
+ List nbtPatterns = new ArrayList();
+ for (Pattern pattern : patterns) {
+ nbtPatterns.add(NMSHandler.getInstance()
+ .createCompoundTag(new HashMap())
+ .createBuilder()
+ .putInt("Color", pattern.getColor().getDyeData())
+ .putString("Pattern", pattern.getPattern().getIdentifier())
+ .build());
+ }
+ CompoundTag compoundTag = NMSHandler.getInstance().getBlockHelper().getNbtData(location.getBlock())
+ .createBuilder()
+ .putInt("Base", base.getDyeData())
+ .put("Patterns", new ListTag(CompoundTag.class, nbtPatterns))
+ .build();
+ showTileEntityData(player, location, 3, compoundTag);
+ }
+
+ @Override
+ public void showTabListHeaderFooter(Player player, String header, String footer) {
+ PacketPlayOutPlayerListHeaderFooter packet = new PacketPlayOutPlayerListHeaderFooter(new ChatComponentText(header));
+ ReflectionHelper.setFieldValue(packet.getClass(), "b", packet, new ChatComponentText(footer));
+ sendPacket(player, packet);
+ }
+
+ @Override
+ public void resetTabListHeaderFooter(Player player) {
+ showTabListHeaderFooter(player, "", "");
+ }
+
+ @Override
+ public void showTitle(Player player, String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTicks) {
+ sendPacket(player, new PacketPlayOutTitle(fadeInTicks, stayTicks, fadeOutTicks));
+ if (title != null) {
+ sendPacket(player, new PacketPlayOutTitle(PacketPlayOutTitle.EnumTitleAction.TITLE, new ChatComponentText(title)));
+ }
+ if (subtitle != null) {
+ sendPacket(player, new PacketPlayOutTitle(PacketPlayOutTitle.EnumTitleAction.SUBTITLE, new ChatComponentText(subtitle)));
+ }
+ }
+
+ @Override
+ public void sendActionBarMessage(Player player, String message) {
+ player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(message));
+ }
+
+ @Override
+ public void showEquipment(Player player, LivingEntity entity, EquipmentSlot equipmentSlot, ItemStack itemStack) {
+ sendPacket(player, new PacketPlayOutEntityEquipment(entity.getEntityId(), CraftEquipmentSlot.getNMS(equipmentSlot), CraftItemStack.asNMSCopy(itemStack)));
+ }
+
+ @Override
+ public void resetEquipment(Player player, LivingEntity entity) {
+ EntityEquipment equipment = entity.getEquipment();
+ showEquipment(player, entity, EquipmentSlot.HAND, equipment.getItemInMainHand());
+ showEquipment(player, entity, EquipmentSlot.OFF_HAND, equipment.getItemInOffHand());
+ showEquipment(player, entity, EquipmentSlot.HEAD, equipment.getHelmet());
+ showEquipment(player, entity, EquipmentSlot.CHEST, equipment.getChestplate());
+ showEquipment(player, entity, EquipmentSlot.LEGS, equipment.getLeggings());
+ showEquipment(player, entity, EquipmentSlot.FEET, equipment.getBoots());
+ }
+
+ @Override
+ public void openBook(Player player, EquipmentSlot hand) {
+ PacketDataSerializer serializer = new PacketDataSerializer(Unpooled.buffer());
+ serializer.a(hand == EquipmentSlot.OFF_HAND ? EnumHand.OFF_HAND : EnumHand.MAIN_HAND);
+ sendPacket(player, new PacketPlayOutCustomPayload("MC|BOpen", serializer));
+ }
+
+ @Override
+ public void showHealth(Player player, float health, int food, float saturation) {
+ sendPacket(player, new PacketPlayOutUpdateHealth(health, food, saturation));
+ }
+
+ @Override
+ public void resetHealth(Player player) {
+ showHealth(player, (float) player.getHealth(), player.getFoodLevel(), player.getSaturation());
+ }
+
+ @Override
+ public void showExperience(Player player, float experience, int level) {
+ sendPacket(player, new PacketPlayOutExperience(experience, 0, level));
+ }
+
+ @Override
+ public void resetExperience(Player player) {
+ showExperience(player, player.getExp(), player.getLevel());
+ }
+
+ @Override
+ public boolean showSignEditor(Player player, Location location) {
+ TileEntity tileEntity = ((CraftWorld) location.getWorld()).getTileEntityAt(location.getBlockX(),
+ location.getBlockY(), location.getBlockZ());
+ if (tileEntity instanceof TileEntitySign) {
+ TileEntitySign sign = (TileEntitySign) tileEntity;
+ // Prevent client crashing by sending current state of the sign
+ sendPacket(player, sign.getUpdatePacket());
+ sign.isEditable = true;
+ sign.a(((CraftPlayer) player).getHandle());
+ sendPacket(player, new PacketPlayOutOpenSignEditor(sign.getPosition()));
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+
+ @Override
+ public void forceSpectate(Player player, Entity entity) {
+ sendPacket(player, new PacketPlayOutCamera(((CraftEntity) entity).getHandle()));
+ }
+
+ public static void sendPacket(Player player, Packet packet) {
+ ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/ParticleHelper_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/ParticleHelper_v1_11_R1.java
new file mode 100644
index 0000000000..52000d2d4e
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/ParticleHelper_v1_11_R1.java
@@ -0,0 +1,41 @@
+package net.aufdemrand.denizen.nms.helpers;
+
+import net.aufdemrand.denizen.nms.abstracts.ParticleHelper;
+import net.aufdemrand.denizen.nms.impl.effects.Effect_v1_11_R1;
+import net.aufdemrand.denizen.nms.impl.effects.Particle_v1_11_R1;
+import org.bukkit.Effect;
+import org.bukkit.Particle;
+
+public class ParticleHelper_v1_11_R1 extends ParticleHelper {
+
+ public ParticleHelper_v1_11_R1() {
+ for (Particle particle : Particle.values()) {
+ register(particle.name(), new Particle_v1_11_R1(particle));
+ }
+ for (Effect effect : Effect.values()) {
+ register(effect.name(), new Effect_v1_11_R1(effect));
+ }
+ register("DRIP_WATER", new Effect_v1_11_R1(Effect.WATERDRIP));
+ register("DRIP_LAVA", new Effect_v1_11_R1(Effect.LAVADRIP));
+ register("SMOKE", new Particle_v1_11_R1(Particle.SMOKE_NORMAL));
+ register("HUGE_EXPLOSION", new Particle_v1_11_R1(Particle.EXPLOSION_HUGE));
+ register("LARGE_EXPLODE", new Particle_v1_11_R1(Particle.EXPLOSION_LARGE));
+ register("BUBBLE", new Particle_v1_11_R1(Particle.WATER_BUBBLE));
+ register("SUSPEND", new Particle_v1_11_R1(Particle.SUSPENDED));
+ register("DEPTH_SUSPEND", new Particle_v1_11_R1(Particle.SUSPENDED_DEPTH));
+ register("CRIT", new Particle_v1_11_R1(Particle.CRIT));
+ register("MAGIC_CRIT", new Particle_v1_11_R1(Particle.CRIT_MAGIC));
+ register("MOB_SPELL", new Particle_v1_11_R1(Particle.SPELL_MOB));
+ register("MOB_SPELL_AMBIENT", new Particle_v1_11_R1(Particle.SPELL_MOB_AMBIENT));
+ register("INSTANT_SPELL", new Particle_v1_11_R1(Particle.SPELL_INSTANT));
+ register("WITCH_MAGIC", new Particle_v1_11_R1(Particle.SPELL_WITCH));
+ register("STEP_SOUND", new Particle_v1_11_R1(Particle.HEART));
+ register("EXPLODE", new Particle_v1_11_R1(Particle.EXPLOSION_NORMAL));
+ register("SPLASH", new Particle_v1_11_R1(Particle.WATER_SPLASH));
+ register("LARGE_SMOKE", new Particle_v1_11_R1(Particle.SMOKE_LARGE));
+ register("RED_DUST", new Particle_v1_11_R1(Particle.REDSTONE));
+ register("SNOWBALL_POOF", new Particle_v1_11_R1(Particle.SNOWBALL));
+ register("ANGRY_VILLAGER", new Particle_v1_11_R1(Particle.VILLAGER_ANGRY));
+ register("HAPPY_VILLAGER", new Particle_v1_11_R1(Particle.VILLAGER_HAPPY));
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/PlayerHelper_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/PlayerHelper_v1_11_R1.java
new file mode 100644
index 0000000000..7a2042d9a6
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/PlayerHelper_v1_11_R1.java
@@ -0,0 +1,114 @@
+package net.aufdemrand.denizen.nms.helpers;
+
+import com.mojang.authlib.GameProfile;
+import net.aufdemrand.denizen.nms.abstracts.ImprovedOfflinePlayer;
+import net.aufdemrand.denizen.nms.impl.ImprovedOfflinePlayer_v1_11_R1;
+import net.aufdemrand.denizen.nms.interfaces.PlayerHelper;
+import net.minecraft.server.v1_11_R1.MinecraftServer;
+import net.minecraft.server.v1_11_R1.OpList;
+import net.minecraft.server.v1_11_R1.OpListEntry;
+import net.minecraft.server.v1_11_R1.PacketPlayOutGameStateChange;
+import org.bukkit.Bukkit;
+import org.bukkit.Chunk;
+import org.bukkit.OfflinePlayer;
+import org.bukkit.boss.BarColor;
+import org.bukkit.boss.BarStyle;
+import org.bukkit.boss.BossBar;
+import org.bukkit.craftbukkit.v1_11_R1.CraftServer;
+import org.bukkit.craftbukkit.v1_11_R1.CraftWorld;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+public class PlayerHelper_v1_11_R1 implements PlayerHelper {
+
+ @Override
+ public boolean hasChunkLoaded(Player player, Chunk chunk) {
+ return ((CraftWorld) chunk.getWorld()).getHandle().getPlayerChunkMap()
+ .a(((CraftPlayer) player).getHandle(), chunk.getX(), chunk.getZ());
+ }
+
+ @Override
+ public int getPing(Player player) {
+ return ((CraftPlayer) player).getHandle().ping;
+ }
+
+ @Override
+ public void setTemporaryOp(Player player, boolean op) {
+ MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
+ GameProfile profile = ((CraftPlayer) player).getProfile();
+ OpList opList = server.getPlayerList().getOPs();
+ if (op) {
+ int permLevel = server.q();
+ opList.add(new OpListEntry(profile, permLevel, opList.b(profile)));
+ }
+ else {
+ opList.remove(profile);
+ }
+ player.recalculatePermissions();
+ }
+
+ @Override
+ public void showEndCredits(Player player) {
+ ((CraftPlayer) player).getHandle().viewingCredits = true;
+ ((CraftPlayer) player).getHandle().playerConnection
+ .sendPacket(new PacketPlayOutGameStateChange(4, 0.0F));
+ }
+
+ @Override
+ public ImprovedOfflinePlayer getOfflineData(UUID uuid) {
+ return new ImprovedOfflinePlayer_v1_11_R1(uuid);
+ }
+
+ @Override
+ public ImprovedOfflinePlayer getOfflineData(OfflinePlayer offlinePlayer) {
+ return new ImprovedOfflinePlayer_v1_11_R1(offlinePlayer.getUniqueId());
+ }
+
+ /*
+ Boss Bars
+ */
+
+ private static final Map> bossBars = new HashMap>();
+
+ @Override
+ public void showSimpleBossBar(Player player, String title, double progress) {
+ UUID uuid = player.getUniqueId();
+ if (!bossBars.containsKey(uuid)) {
+ bossBars.put(uuid, new ArrayList());
+ }
+ List playerBars = bossBars.get(uuid);
+ if (!playerBars.isEmpty()) {
+ Iterator iterator = playerBars.iterator();
+ while (iterator.hasNext()) {
+ BossBar bossBar = iterator.next();
+ bossBar.removePlayer(player);
+ iterator.remove();
+ }
+ }
+ BossBar bossBar = Bukkit.createBossBar(title, BarColor.PURPLE, BarStyle.SOLID);
+ bossBar.setProgress(progress);
+ bossBar.addPlayer(player);
+ bossBar.setVisible(true);
+ playerBars.add(bossBar);
+ }
+
+ @Override
+ public void removeSimpleBossBar(Player player) {
+ UUID uuid = player.getUniqueId();
+ if (bossBars.containsKey(uuid) && !bossBars.get(uuid).isEmpty()) {
+ Iterator iterator = bossBars.get(uuid).iterator();
+ while (iterator.hasNext()) {
+ BossBar bossBar = iterator.next();
+ bossBar.removePlayer(player);
+ iterator.remove();
+ }
+ }
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/SoundHelper_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/SoundHelper_v1_11_R1.java
new file mode 100644
index 0000000000..6bfc257062
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/SoundHelper_v1_11_R1.java
@@ -0,0 +1,42 @@
+package net.aufdemrand.denizen.nms.helpers;
+
+import net.aufdemrand.denizen.nms.interfaces.SoundHelper;
+import org.bukkit.Sound;
+
+public class SoundHelper_v1_11_R1 implements SoundHelper {
+
+ @Override
+ public Sound getMidiInstrumentFromPatch(int patch) {
+ // look up the instrument matching the patch
+ switch (instruments[patch]) {
+ case 1:
+ return Sound.BLOCK_NOTE_BASS;
+ case 2:
+ return Sound.BLOCK_NOTE_SNARE;
+ case 3:
+ return Sound.BLOCK_NOTE_HARP;
+ case 4:
+ return Sound.BLOCK_NOTE_HAT;
+ case 5:
+ return Sound.BLOCK_NOTE_PLING;
+ case 6:
+ return Sound.BLOCK_NOTE_BASEDRUM;
+ }
+ return getDefaultMidiInstrument();
+ }
+
+ @Override
+ public Sound getDefaultMidiInstrument() {
+ return Sound.BLOCK_NOTE_HAT;
+ }
+
+ @Override
+ public Sound getChestOpen() {
+ return Sound.BLOCK_CHEST_OPEN;
+ }
+
+ @Override
+ public Sound getChestClose() {
+ return Sound.BLOCK_CHEST_CLOSE;
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/WorldHelper_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/WorldHelper_v1_11_R1.java
new file mode 100644
index 0000000000..58ebb3d06a
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/WorldHelper_v1_11_R1.java
@@ -0,0 +1,101 @@
+package net.aufdemrand.denizen.nms.helpers;
+
+import net.aufdemrand.denizen.nms.interfaces.WorldAccess;
+import net.aufdemrand.denizen.nms.interfaces.WorldHelper;
+import net.aufdemrand.denizen.nms.util.ReflectionHelper;
+import net.minecraft.server.v1_11_R1.*;
+import org.bukkit.World;
+import org.bukkit.craftbukkit.v1_11_R1.CraftWorld;
+
+import javax.annotation.Nullable;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class WorldHelper_v1_11_R1 implements WorldHelper {
+
+ private final Map worldAccessMap = new HashMap();
+
+ @Override
+ public boolean isStatic(World world) {
+ return ((CraftWorld) world).getHandle().isClientSide;
+ }
+
+ @Override
+ public void setStatic(World world, boolean isStatic) {
+ WorldServer worldServer = ((CraftWorld) world).getHandle();
+ ReflectionHelper.setFieldValue(net.minecraft.server.v1_11_R1.World.class, "isClientSide", worldServer, isStatic);
+ }
+
+ @Override
+ public void setWorldAccess(World world, final WorldAccess worldAccess) {
+ if (worldAccessMap.containsKey(world)) {
+ removeWorldAccess(world);
+ }
+ IWorldAccess nmsWorldAccess = new IWorldAccess() {
+ @Override
+ public void a(net.minecraft.server.v1_11_R1.World world, BlockPosition blockPosition, IBlockData iBlockData, IBlockData iBlockData1, int i) {
+ }
+
+ @Override
+ public void a(BlockPosition blockPosition) {
+ }
+
+ @Override
+ public void a(int i, int i1, int i2, int i3, int i4, int i5) {
+ }
+
+ @Override
+ public void a(@Nullable EntityHuman entityHuman, SoundEffect soundEffect, SoundCategory soundCategory, double v, double v1, double v2, float v3, float v4) {
+ }
+
+ @Override
+ public void a(SoundEffect soundEffect, BlockPosition blockPosition) {
+ }
+
+ @Override
+ public void a(int i, boolean b, double v, double v1, double v2, double v3, double v4, double v5, int... ints) {
+ }
+
+ @Override
+ public void a(int i, boolean b, boolean b1, double v, double v1, double v2, double v3, double v4, double v5, int... ints) {
+ }
+
+ @Override
+ public void a(Entity entity) {
+ }
+
+ @Override
+ public void b(Entity entity) {
+ worldAccess.despawn(entity.getBukkitEntity());
+ }
+
+ @Override
+ public void a(int i, BlockPosition blockPosition, int i1) {
+ }
+
+ @Override
+ public void a(EntityHuman entityHuman, int i, BlockPosition blockPosition, int i1) {
+ }
+
+ @Override
+ public void b(int i, BlockPosition blockPosition, int i1) {
+ }
+ };
+ worldAccessMap.put(world, nmsWorldAccess);
+ ((CraftWorld) world).getHandle().addIWorldAccess(nmsWorldAccess);
+ }
+
+ @Override
+ public void removeWorldAccess(World world) {
+ if (!worldAccessMap.containsKey(world)) {
+ return;
+ }
+ net.minecraft.server.v1_11_R1.World nmsWorld = ((CraftWorld) world).getHandle();
+ List list = ReflectionHelper.getFieldValue(net.minecraft.server.v1_11_R1.World.class, "u", nmsWorld);
+ if (list != null) {
+ list.remove(worldAccessMap.get(world));
+ }
+ worldAccessMap.remove(world);
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/BiomeNMS_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/BiomeNMS_v1_11_R1.java
new file mode 100644
index 0000000000..8429c5b641
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/BiomeNMS_v1_11_R1.java
@@ -0,0 +1,111 @@
+package net.aufdemrand.denizen.nms.impl;
+
+import net.aufdemrand.denizen.nms.abstracts.BiomeNMS;
+import net.aufdemrand.denizen.nms.util.ReflectionHelper;
+import net.minecraft.server.v1_11_R1.*;
+import org.bukkit.Location;
+import org.bukkit.block.Biome;
+import org.bukkit.craftbukkit.v1_11_R1.CraftWorld;
+import org.bukkit.craftbukkit.v1_11_R1.block.CraftBlock;
+import org.bukkit.entity.EntityType;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class BiomeNMS_v1_11_R1 extends BiomeNMS {
+
+ private final BiomeBase biomeBase;
+
+ public BiomeNMS_v1_11_R1(Biome biome) {
+ super(biome);
+ this.biomeBase = CraftBlock.biomeToBiomeBase(biome);
+ }
+
+ @Override
+ public float getHumidity() {
+ return biomeBase.getHumidity();
+ }
+
+ @Override
+ public float getTemperature() {
+ return biomeBase.getTemperature();
+ }
+
+ @Override
+ public List getAmbientEntities() {
+ return getSpawnableEntities(EnumCreatureType.AMBIENT);
+ }
+
+ @Override
+ public List getCreatureEntities() {
+ return getSpawnableEntities(EnumCreatureType.CREATURE);
+ }
+
+ @Override
+ public List getMonsterEntities() {
+ return getSpawnableEntities(EnumCreatureType.MONSTER);
+ }
+
+ @Override
+ public List getWaterEntities() {
+ return getSpawnableEntities(EnumCreatureType.WATER_CREATURE);
+ }
+
+ @Override
+ public void setHumidity(float humidity) {
+ ReflectionHelper.setFieldValue(BiomeBase.class, "D", biomeBase, humidity);
+ }
+
+ @Override
+ public void setTemperature(float temperature) {
+ ReflectionHelper.setFieldValue(BiomeBase.class, "C", biomeBase, temperature);
+ }
+
+ @Override
+ public void changeBlockBiome(Location location) {
+ int x = location.getBlockX();
+ int z = location.getBlockZ();
+ WorldServer world = ((CraftWorld) location.getWorld()).getHandle();
+ if (world.isLoaded(new BlockPosition(x, 0, z))) {
+ Chunk chunk = world.getChunkAtWorldCoords(new BlockPosition(x, 0, z));
+
+ if (chunk != null) {
+ byte[] biomevals = chunk.getBiomeIndex();
+ biomevals[((z & 0xF) << 4) | (x & 0xF)] = (byte) BiomeBase.a(biomeBase);
+ }
+ }
+ }
+
+ @Override
+ protected boolean getDoesRain() {
+ Boolean rains = ReflectionHelper.getFieldValue(BiomeBase.class, "G", biomeBase);
+ if (rains != null) {
+ return rains;
+ }
+ return false;
+ }
+
+ @Override
+ protected boolean getDoesSnow() {
+ Boolean rains = ReflectionHelper.getFieldValue(BiomeBase.class, "F", biomeBase);
+ if (rains != null) {
+ return rains;
+ }
+ return false;
+ }
+
+ private List getSpawnableEntities(EnumCreatureType creatureType) {
+ List entityTypes = new ArrayList();
+ for (BiomeBase.BiomeMeta meta : biomeBase.getMobs(creatureType)) {
+ entityTypes.add(EntityType.fromId(ENTITY_CLASS_ID_MAP.get(meta.b)));
+ }
+ return entityTypes;
+ }
+
+ private static final Map, Integer> ENTITY_CLASS_ID_MAP;
+
+ static {
+ ENTITY_CLASS_ID_MAP = ReflectionHelper.getFieldValue(EntityTypes.class, "f", null);
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/ImprovedOfflinePlayer_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/ImprovedOfflinePlayer_v1_11_R1.java
new file mode 100644
index 0000000000..b15c07944c
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/ImprovedOfflinePlayer_v1_11_R1.java
@@ -0,0 +1,123 @@
+package net.aufdemrand.denizen.nms.impl;
+
+import net.aufdemrand.denizen.nms.abstracts.ImprovedOfflinePlayer;
+import net.aufdemrand.denizen.nms.impl.jnbt.CompoundTag_v1_11_R1;
+import net.minecraft.server.v1_11_R1.*;
+import org.bukkit.Bukkit;
+import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventory;
+import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventoryPlayer;
+import org.bukkit.inventory.Inventory;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.UUID;
+
+public class ImprovedOfflinePlayer_v1_11_R1 extends ImprovedOfflinePlayer {
+
+ public ImprovedOfflinePlayer_v1_11_R1(UUID playeruuid) {
+ super(playeruuid);
+ }
+
+ @Override
+ public org.bukkit.inventory.PlayerInventory getInventory() {
+ if (offlineInventories.containsKey(getUniqueId())) {
+ return offlineInventories.get(getUniqueId());
+ }
+ PlayerInventory inventory = new PlayerInventory(null);
+ inventory.b(((CompoundTag_v1_11_R1) this.compound).toNMSTag().getList("Inventory", 10));
+ org.bukkit.inventory.PlayerInventory inv = new CraftInventoryPlayer(inventory);
+ offlineInventories.put(getUniqueId(), inv);
+ return inv;
+ }
+
+ @Override
+ public void setInventory(org.bukkit.inventory.PlayerInventory inventory) {
+ CraftInventoryPlayer inv = (CraftInventoryPlayer) inventory;
+ NBTTagCompound nbtTagCompound = ((CompoundTag_v1_11_R1) compound).toNMSTag();
+ nbtTagCompound.set("Inventory", inv.getInventory().a(new NBTTagList()));
+ this.compound = CompoundTag_v1_11_R1.fromNMSTag(nbtTagCompound);
+ if (this.autosave) {
+ savePlayerData();
+ }
+ }
+
+ @Override
+ public Inventory getEnderChest() {
+ if (offlineEnderChests.containsKey(getUniqueId())) {
+ return offlineEnderChests.get(getUniqueId());
+ }
+ InventoryEnderChest endchest = new InventoryEnderChest(null);
+ endchest.a(((CompoundTag_v1_11_R1) this.compound).toNMSTag().getList("EnderItems", 10));
+ org.bukkit.inventory.Inventory inv = new CraftInventory(endchest);
+ offlineEnderChests.put(getUniqueId(), inv);
+ return inv;
+ }
+
+ @Override
+ public void setEnderChest(Inventory inventory) {
+ NBTTagCompound nbtTagCompound = ((CompoundTag_v1_11_R1) compound).toNMSTag();
+ nbtTagCompound.set("EnderItems", ((InventoryEnderChest) ((CraftInventory) inventory).getInventory()).i());
+ this.compound = CompoundTag_v1_11_R1.fromNMSTag(nbtTagCompound);
+ if (this.autosave) {
+ savePlayerData();
+ }
+ }
+
+ @Override
+ public double getMaxHealth() {
+ return getAttributes().a("generic.maxHealth").getValue();
+ }
+
+ @Override
+ public void setMaxHealth(double input) {
+ AttributeMapBase attributes = getAttributes();
+ attributes.a("generic.maxHealth").setValue(input);
+ setAttributes(attributes);
+ }
+
+ private AttributeMapBase getAttributes() {
+ AttributeMapBase amb = new AttributeMapServer();
+ GenericAttributes.a(amb, ((CompoundTag_v1_11_R1) this.compound).toNMSTag().getList("Attributes", 0));
+ return amb;
+ }
+
+ public void setAttributes(AttributeMapBase attributes) {
+ NBTTagCompound nbtTagCompound = ((CompoundTag_v1_11_R1) compound).toNMSTag();
+ nbtTagCompound.set("Attributes", GenericAttributes.a(attributes));
+ this.compound = CompoundTag_v1_11_R1.fromNMSTag(nbtTagCompound);
+ if (this.autosave) {
+ savePlayerData();
+ }
+ }
+
+ @Override
+ protected boolean loadPlayerData(UUID uuid) {
+ try {
+ this.player = uuid;
+ for (org.bukkit.World w : Bukkit.getWorlds()) {
+ this.file = new File(w.getWorldFolder(), "playerdata" + File.separator + this.player + ".dat");
+ if (this.file.exists()) {
+ this.compound = CompoundTag_v1_11_R1.fromNMSTag(NBTCompressedStreamTools.a(new FileInputStream(this.file)));
+ return true;
+ }
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+ @Override
+ public void savePlayerData() {
+ if (this.exists) {
+ try {
+ NBTCompressedStreamTools.a(((CompoundTag_v1_11_R1) this.compound).toNMSTag(), new FileOutputStream(this.file));
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/ProfileEditor_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/ProfileEditor_v1_11_R1.java
new file mode 100644
index 0000000000..39b6bd671e
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/ProfileEditor_v1_11_R1.java
@@ -0,0 +1,111 @@
+package net.aufdemrand.denizen.nms.impl;
+
+import com.mojang.authlib.GameProfile;
+import com.mojang.authlib.properties.Property;
+import net.aufdemrand.denizen.nms.NMSHandler;
+import net.aufdemrand.denizen.nms.abstracts.ProfileEditor;
+import net.aufdemrand.denizen.nms.helpers.PacketHelper_v1_11_R1;
+import net.aufdemrand.denizen.nms.util.PlayerProfile;
+import net.aufdemrand.denizen.nms.util.ReflectionHelper;
+import net.minecraft.server.v1_11_R1.EntityPlayer;
+import net.minecraft.server.v1_11_R1.PacketPlayOutEntityDestroy;
+import net.minecraft.server.v1_11_R1.PacketPlayOutNamedEntitySpawn;
+import net.minecraft.server.v1_11_R1.PacketPlayOutPlayerInfo;
+import net.minecraft.server.v1_11_R1.PacketPlayOutRespawn;
+import org.bukkit.Bukkit;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.bukkit.event.player.PlayerTeleportEvent;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import java.lang.reflect.Field;
+import java.util.List;
+import java.util.UUID;
+
+public class ProfileEditor_v1_11_R1 extends ProfileEditor {
+
+ @Override
+ protected void updatePlayer(Player player, final boolean isSkinChanging) {
+ final EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
+ final UUID uuid = player.getUniqueId();
+ PacketPlayOutEntityDestroy destroyPacket = new PacketPlayOutEntityDestroy(entityPlayer.getId());
+ for (Player p : Bukkit.getServer().getOnlinePlayers()) {
+ if (!p.getUniqueId().equals(uuid)) {
+ PacketHelper_v1_11_R1.sendPacket(p, destroyPacket);
+ }
+ }
+ new BukkitRunnable() {
+ @Override
+ public void run() {
+ PacketPlayOutPlayerInfo playerInfo = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, entityPlayer);
+ PacketPlayOutNamedEntitySpawn spawnPacket = new PacketPlayOutNamedEntitySpawn(entityPlayer);
+ for (Player player : Bukkit.getServer().getOnlinePlayers()) {
+ PacketHelper_v1_11_R1.sendPacket(player, playerInfo);
+ if (!player.getUniqueId().equals(uuid)) {
+ PacketHelper_v1_11_R1.sendPacket(player, spawnPacket);
+ }
+ else {
+ if (isSkinChanging) {
+ boolean isFlying = player.isFlying();
+ PacketHelper_v1_11_R1.sendPacket(player, new PacketPlayOutRespawn(
+ player.getWorld().getEnvironment().getId(),
+ entityPlayer.getWorld().getDifficulty(),
+ entityPlayer.getWorld().worldData.getType(),
+ entityPlayer.playerInteractManager.getGameMode()));
+ player.teleport(player.getLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN);
+ player.setFlying(isFlying);
+ }
+ player.updateInventory();
+ }
+ }
+ }
+ }.runTaskLater(NMSHandler.getJavaPlugin(), 5);
+ }
+
+ public static void updatePlayerProfiles(PacketPlayOutPlayerInfo packet) {
+ PacketPlayOutPlayerInfo.EnumPlayerInfoAction action = ReflectionHelper.getFieldValue(PacketPlayOutPlayerInfo.class, "a", packet);
+ if (action != PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER) {
+ return;
+ }
+ List> dataList = ReflectionHelper.getFieldValue(PacketPlayOutPlayerInfo.class, "b", packet);
+ if (dataList != null) {
+ try {
+ for (Object data : dataList) {
+ GameProfile gameProfile = (GameProfile) playerInfoData_gameProfile.get(data);
+ if (fakeProfiles.containsKey(gameProfile.getId())) {
+ playerInfoData_gameProfile.set(data, getGameProfile(fakeProfiles.get(gameProfile.getId())));
+ }
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private static GameProfile getGameProfile(PlayerProfile playerProfile) {
+ GameProfile gameProfile = new GameProfile(playerProfile.getUniqueId(), playerProfile.getName());
+ gameProfile.getProperties().put("textures",
+ new Property("value", playerProfile.getTexture(), playerProfile.getTextureSignature()));
+ return gameProfile;
+ }
+
+ private static final Field playerInfoData_gameProfile;
+
+ static {
+ Field pidGameProfile = null;
+ try {
+ for (Class clzz : PacketPlayOutPlayerInfo.class.getDeclaredClasses()) {
+ if (clzz.getName().toLowerCase().contains("infodata")) {
+ pidGameProfile = clzz.getDeclaredField("d"); // PlayerInfoData.
+ pidGameProfile.setAccessible(true);
+ break;
+ }
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ playerInfoData_gameProfile = pidGameProfile;
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/Sidebar_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/Sidebar_v1_11_R1.java
new file mode 100644
index 0000000000..43548a5083
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/Sidebar_v1_11_R1.java
@@ -0,0 +1,54 @@
+package net.aufdemrand.denizen.nms.impl;
+
+import net.aufdemrand.denizen.nms.abstracts.Sidebar;
+import net.aufdemrand.denizen.nms.helpers.PacketHelper_v1_11_R1;
+import net.minecraft.server.v1_11_R1.*;
+import org.bukkit.entity.Player;
+
+public class Sidebar_v1_11_R1 extends Sidebar {
+
+ private static final Scoreboard dummyScoreboard = new Scoreboard();
+ private static final IScoreboardCriteria dummyCriteria = new ScoreboardBaseCriteria("dummy");
+
+ private ScoreboardObjective obj1;
+ private ScoreboardObjective obj2;
+
+ public Sidebar_v1_11_R1(Player player) {
+ super(player);
+ this.obj1 = new ScoreboardObjective(dummyScoreboard, "dummy_1", dummyCriteria);
+ this.obj2 = new ScoreboardObjective(dummyScoreboard, "dummy_2", dummyCriteria);
+ setDisplayName(title);
+ }
+
+ @Override
+ protected void setDisplayName(String title) {
+ if (this.obj1 != null) {
+ this.obj1.setDisplayName(title);
+ this.obj2.setDisplayName(title);
+ }
+ }
+
+ @Override
+ public void sendUpdate() {
+ PacketHelper_v1_11_R1.sendPacket(player, new PacketPlayOutScoreboardObjective(this.obj1, 0));
+ for (int i = 0; i < this.lines.length; i++) {
+ String line = this.lines[i];
+ if (line == null) {
+ break;
+ }
+ ScoreboardScore score = new ScoreboardScore(dummyScoreboard, this.obj1, line);
+ score.setScore(this.scores[i]);
+ PacketHelper_v1_11_R1.sendPacket(player, new PacketPlayOutScoreboardScore(score));
+ }
+ PacketHelper_v1_11_R1.sendPacket(player, new PacketPlayOutScoreboardDisplayObjective(1, this.obj1));
+ PacketHelper_v1_11_R1.sendPacket(player, new PacketPlayOutScoreboardObjective(this.obj2, 1));
+ ScoreboardObjective temp = this.obj2;
+ this.obj2 = this.obj1;
+ this.obj1 = temp;
+ }
+
+ @Override
+ public void remove() {
+ PacketHelper_v1_11_R1.sendPacket(player, new PacketPlayOutScoreboardObjective(this.obj2, 1));
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/blocks/BlockData_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/blocks/BlockData_v1_11_R1.java
new file mode 100644
index 0000000000..2e6ebd798c
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/blocks/BlockData_v1_11_R1.java
@@ -0,0 +1,101 @@
+package net.aufdemrand.denizen.nms.impl.blocks;
+
+import net.aufdemrand.denizen.nms.impl.jnbt.CompoundTag_v1_11_R1;
+import net.aufdemrand.denizen.nms.interfaces.BlockData;
+import net.aufdemrand.denizen.nms.util.jnbt.CompoundTag;
+import net.aufdemrand.denizen.nms.util.jnbt.CompoundTagBuilder;
+import net.minecraft.server.v1_11_R1.BlockPosition;
+import net.minecraft.server.v1_11_R1.NBTTagCompound;
+import net.minecraft.server.v1_11_R1.TileEntity;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.craftbukkit.v1_11_R1.CraftWorld;
+
+public class BlockData_v1_11_R1 implements BlockData {
+
+ private Material material;
+ private byte data;
+
+ public BlockData_v1_11_R1() {
+ }
+
+ public BlockData_v1_11_R1(short mat, byte dat) {
+ material = Material.getMaterial(mat);
+ data = dat;
+ }
+
+ public BlockData_v1_11_R1(Block block) {
+ material = block.getType();
+ data = block.getData();
+ TileEntity te = ((CraftWorld) block.getWorld()).getHandle().getTileEntity(
+ new BlockPosition(block.getX(), block.getY(), block.getZ()));
+ if (te != null) {
+ NBTTagCompound compound = new NBTTagCompound();
+ te.save(compound);
+ ctag = (CompoundTag_v1_11_R1) CompoundTag_v1_11_R1.fromNMSTag(compound);
+ }
+ }
+
+ public void setBlock(Block block) {
+ block.setTypeIdAndData(material.getId(), (byte) data, false);
+ if (ctag != null) {
+ CompoundTagBuilder builder = ctag.createBuilder();
+ builder.putInt("x", block.getX());
+ builder.putInt("y", block.getY());
+ builder.putInt("z", block.getZ());
+ ctag = (CompoundTag_v1_11_R1) builder.build();
+ // TODO: make this work!
+ BlockPosition blockPos = new BlockPosition(block.getX(), block.getY(), block.getZ());
+ TileEntity te = ((CraftWorld) block.getWorld()).getHandle().getTileEntity(blockPos);
+ te.a(ctag.toNMSTag());
+ }
+ }
+
+ public String toCompressedFormat() {
+ return "{" + material.getId() + ":" + data + "}";
+ }
+
+ public static BlockData fromCompressedString(String str) {
+ BlockData data = new BlockData_v1_11_R1();
+ String inner = str.substring(1, str.length() - 1);
+ String[] datas = inner.split(":");
+ data.setMaterial(Material.getMaterial(Integer.parseInt(datas[0])));
+ data.setData(Byte.parseByte(datas[1]));
+ if (data.getMaterial() == null) {
+ throw new RuntimeException("Null material: " + datas[0]);
+ }
+ return data;
+ }
+
+ CompoundTag_v1_11_R1 ctag = null;
+
+ @Override
+ public CompoundTag getCompoundTag() {
+ return ctag;
+ }
+
+ @Override
+ public void setCompoundTag(CompoundTag tag) {
+ ctag = (CompoundTag_v1_11_R1) tag;
+ }
+
+ @Override
+ public Material getMaterial() {
+ return material;
+ }
+
+ @Override
+ public void setMaterial(Material material) {
+ this.material = material;
+ }
+
+ @Override
+ public byte getData() {
+ return data;
+ }
+
+ @Override
+ public void setData(byte data) {
+ this.data = data;
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/blocks/BlockLight_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/blocks/BlockLight_v1_11_R1.java
new file mode 100644
index 0000000000..c5bf3e1d07
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/blocks/BlockLight_v1_11_R1.java
@@ -0,0 +1,234 @@
+package net.aufdemrand.denizen.nms.impl.blocks;
+
+import net.aufdemrand.denizen.nms.NMSHandler;
+import net.aufdemrand.denizen.nms.abstracts.BlockLight;
+import net.minecraft.server.v1_11_R1.*;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.World;
+import org.bukkit.block.Block;
+import org.bukkit.block.BlockFace;
+import org.bukkit.craftbukkit.v1_11_R1.CraftWorld;
+import org.bukkit.scheduler.BukkitRunnable;
+import org.bukkit.scheduler.BukkitTask;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+public class BlockLight_v1_11_R1 extends BlockLight {
+
+ private static final Method playerChunkMethod;
+ private static final Field dirtyCountField;
+ private static final BukkitTask bukkitTask;
+
+ private static final Set worlds = new HashSet();
+
+ static {
+ Method pcm = null;
+ Field dcf = null;
+ try {
+ pcm = PlayerChunkMap.class.getDeclaredMethod("c", int.class, int.class);
+ pcm.setAccessible(true);
+ dcf = pcm.getReturnType().getDeclaredField("dirtyCount");
+ dcf.setAccessible(true);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ playerChunkMethod = pcm;
+ dirtyCountField = dcf;
+ bukkitTask = new BukkitRunnable() {
+ @Override
+ public void run() {
+ for (Map.Entry> entry : lightsByChunk.entrySet()) {
+ org.bukkit.Chunk chunk = entry.getKey();
+ if (chunk.isLoaded()) {
+ List blockLights = entry.getValue();
+ if (blockLights.isEmpty()) {
+ continue;
+ }
+ PlayerChunkMap playerChunkMap = ((BlockLight_v1_11_R1) blockLights.get(0)).worldServer.getPlayerChunkMap();
+ for (BlockLight light : blockLights) {
+ light.reset(false);
+ }
+ updateChunk(chunk, playerChunkMap);
+ for (BlockLight light : blockLights) {
+ light.update(light.cachedLight, false);
+ }
+ updateChunk(chunk, playerChunkMap);
+ }
+ }
+ }
+ }.runTaskTimer(NMSHandler.getJavaPlugin(), 5, 5);
+ }
+
+ private final CraftWorld craftWorld;
+ private final WorldServer worldServer;
+ private final BlockPosition position;
+
+ private BlockLight_v1_11_R1(Location location, long ticks) {
+ super(location, ticks);
+ this.craftWorld = (CraftWorld) location.getWorld();
+ this.worldServer = craftWorld.getHandle();
+ if (!worlds.contains(craftWorld.getUID())) {
+ IWorldAccess access = getIWorldAccess(craftWorld);
+ worldServer.addIWorldAccess(access);
+ }
+ this.position = new BlockPosition(block.getX(), block.getY(), block.getZ());
+ }
+
+ public static BlockLight createLight(Location location, int lightLevel, long ticks) {
+ location = location.getBlock().getLocation();
+ BlockLight blockLight;
+ if (lightsByLocation.containsKey(location)) {
+ blockLight = lightsByLocation.get(location);
+ if (blockLight.removeTask != null) {
+ blockLight.removeTask.cancel();
+ blockLight.removeTask = null;
+ }
+ blockLight.reset(true);
+ blockLight.removeLater(ticks);
+ }
+ else {
+ blockLight = new BlockLight_v1_11_R1(location, ticks);
+ lightsByLocation.put(location, blockLight);
+ if (!lightsByChunk.containsKey(blockLight.chunk)) {
+ lightsByChunk.put(blockLight.chunk, new ArrayList());
+ }
+ lightsByChunk.get(blockLight.chunk).add(blockLight);
+ }
+ blockLight.update(lightLevel, true);
+ return blockLight;
+ }
+
+ @Override
+ public void update(int lightLevel, boolean updateChunk) {
+ if (this.currentLight == lightLevel) {
+ return;
+ }
+ else if (this.originalLight == lightLevel) {
+ worldServer.c(EnumSkyBlock.BLOCK, position);
+ }
+ else {
+ worldServer.a(EnumSkyBlock.BLOCK, position, lightLevel);
+ Block adjacentAir = null;
+ for (BlockFace face : adjacentFaces) {
+ if (position.getY() == 0 && face == BlockFace.DOWN) {
+ continue;
+ }
+ if (position.getY() == (craftWorld.getMaxHeight() - 1) && face == BlockFace.UP) {
+ continue;
+ }
+ Block possible = block.getRelative(face);
+ if (possible.getType() == Material.AIR) {
+ adjacentAir = possible;
+ break;
+ }
+ }
+ if (adjacentAir != null) {
+ worldServer.w(new BlockPosition(adjacentAir.getX(), adjacentAir.getY(), adjacentAir.getZ()));
+ }
+ this.cachedLight = lightLevel;
+ }
+ if (updateChunk) {
+ updateChunk(chunk, worldServer.getPlayerChunkMap());
+ }
+ this.currentLight = lightLevel;
+ }
+
+ private static void updateChunk(org.bukkit.Chunk chunk, PlayerChunkMap playerChunkMap) {
+ int cX = chunk.getX();
+ int cZ = chunk.getZ();
+ for (int x = -1; x <= 1; x++) {
+ for (int z = -1; z <= 1; z++) {
+ Object pChunk = getPlayerChunk(playerChunkMap, cX + x, cZ + z);
+ if (pChunk == null) {
+ continue;
+ }
+ setDirtyCount(pChunk);
+ }
+ }
+ }
+
+ private static Object getPlayerChunk(PlayerChunkMap map, int x, int z) {
+ try {
+ return playerChunkMethod.invoke(map, x, z);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ private static void setDirtyCount(Object playerChunk) {
+ try {
+ int dirtyCount = dirtyCountField.getInt(playerChunk);
+ if (dirtyCount > 0 && dirtyCount < 64) {
+ dirtyCountField.set(playerChunk, 64);
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private static IWorldAccess getIWorldAccess(World world) {
+ final PlayerChunkMap map = ((CraftWorld) world).getHandle().getPlayerChunkMap();
+ return new IWorldAccess() {
+ @Override
+ public void a(net.minecraft.server.v1_11_R1.World world, BlockPosition blockPosition, IBlockData iBlockData, IBlockData iBlockData1, int i) {
+ }
+
+ @Override
+ public void a(BlockPosition position) {
+ map.flagDirty(position);
+ }
+
+ @Override
+ public void b(int arg0, BlockPosition arg1, int arg2) {
+ }
+
+ @Override
+ public void a(EntityHuman arg0, int arg1, BlockPosition arg2, int arg3) {
+ }
+
+ @Override
+ public void a(int minX, int minY, int minZ, int maxX, int maxY, int maxZ) {
+ }
+
+ @Override
+ public void a(EntityHuman entityHuman, SoundEffect soundEffect, SoundCategory soundCategory, double v, double v1, double v2, float v3, float v4) {
+ }
+
+ @Override
+ public void a(SoundEffect soundEffect, BlockPosition blockPosition) {
+ }
+
+ @Override
+ public void a(int arg0, BlockPosition arg1, int arg2) {
+ }
+
+ @Override
+ public void a(int arg0, boolean arg1, double arg2, double arg3, double arg4, double arg5, double arg6, double arg7, int... arg8) {
+ }
+
+ @Override
+ public void a(int i, boolean b, boolean b1, double v, double v1, double v2, double v3, double v4, double v5, int... ints) {
+ }
+
+ @Override
+ public void a(Entity arg0) {
+ }
+
+ @Override
+ public void b(Entity arg0) {
+ }
+ };
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/effects/Effect_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/effects/Effect_v1_11_R1.java
new file mode 100644
index 0000000000..90a2ec8bfd
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/effects/Effect_v1_11_R1.java
@@ -0,0 +1,34 @@
+package net.aufdemrand.denizen.nms.impl.effects;
+
+import net.aufdemrand.denizen.nms.interfaces.Effect;
+import org.bukkit.Location;
+import org.bukkit.entity.Player;
+
+public class Effect_v1_11_R1 implements Effect {
+
+ private org.bukkit.Effect effect;
+
+ public Effect_v1_11_R1(org.bukkit.Effect effect) {
+ this.effect = effect;
+ }
+
+ @Override
+ public void play(Location location, int data, int radius) {
+ location.getWorld().playEffect(location, effect, data, radius);
+ }
+
+ @Override
+ public void playFor(Player player, Location location, int data) {
+ player.playEffect(location, effect, data);
+ }
+
+ @Override
+ public boolean isVisual() {
+ return effect.getType() == org.bukkit.Effect.Type.VISUAL;
+ }
+
+ @Override
+ public String getName() {
+ return effect.name();
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/effects/Particle_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/effects/Particle_v1_11_R1.java
new file mode 100644
index 0000000000..6f4e61bd09
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/effects/Particle_v1_11_R1.java
@@ -0,0 +1,36 @@
+package net.aufdemrand.denizen.nms.impl.effects;
+
+import net.aufdemrand.denizen.nms.interfaces.Particle;
+import org.bukkit.Location;
+import org.bukkit.entity.Player;
+import org.bukkit.util.Vector;
+
+public class Particle_v1_11_R1 implements Particle {
+
+ private org.bukkit.Particle particle;
+
+ public Particle_v1_11_R1(org.bukkit.Particle particle) {
+ this.particle = particle;
+ }
+
+ @Override
+ public void playFor(Player player, Location location, int count, Vector offset, double extra) {
+ player.spawnParticle(particle, location, count, offset.getX(), offset.getY(), offset.getZ(), extra);
+ }
+
+ @Override
+ public void playFor(Player player, Location location, int count, Vector offset, double extra, T data) {
+ player.spawnParticle(particle, location, count, offset.getX(), offset.getY(), offset.getZ(), extra, data);
+ }
+
+ @Override
+ public boolean isVisible() {
+ return particle != org.bukkit.Particle.SUSPENDED && particle != org.bukkit.Particle.SUSPENDED_DEPTH
+ && particle != org.bukkit.Particle.WATER_BUBBLE;
+ }
+
+ @Override
+ public String getName() {
+ return particle.name();
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/entities/CraftFakeArrow_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/entities/CraftFakeArrow_v1_11_R1.java
new file mode 100644
index 0000000000..0ac4f2cd5e
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/entities/CraftFakeArrow_v1_11_R1.java
@@ -0,0 +1,26 @@
+package net.aufdemrand.denizen.nms.impl.entities;
+
+import net.aufdemrand.denizen.nms.interfaces.FakeArrow;
+import net.minecraft.server.v1_11_R1.EntityArrow;
+import org.bukkit.craftbukkit.v1_11_R1.CraftServer;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftArrow;
+
+public class CraftFakeArrow_v1_11_R1 extends CraftArrow implements FakeArrow {
+
+ public CraftFakeArrow_v1_11_R1(CraftServer craftServer, EntityArrow entityArrow) {
+ super(craftServer, entityArrow);
+ }
+
+ @Override
+ public void remove() {
+ if (getPassenger() != null) {
+ return;
+ }
+ super.remove();
+ }
+
+ @Override
+ public String getEntityTypeName() {
+ return "FAKE_ARROW";
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/entities/CraftFakePlayer_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/entities/CraftFakePlayer_v1_11_R1.java
new file mode 100644
index 0000000000..70bb3615ea
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/entities/CraftFakePlayer_v1_11_R1.java
@@ -0,0 +1,53 @@
+package net.aufdemrand.denizen.nms.impl.entities;
+
+import net.aufdemrand.denizen.nms.NMSHandler;
+import net.aufdemrand.denizen.nms.interfaces.FakePlayer;
+import org.bukkit.craftbukkit.v1_11_R1.CraftServer;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
+import org.bukkit.metadata.FixedMetadataValue;
+import org.bukkit.metadata.MetadataValue;
+import org.bukkit.plugin.Plugin;
+
+import java.util.List;
+
+public class CraftFakePlayer_v1_11_R1 extends CraftPlayer implements FakePlayer {
+
+ private final CraftServer server;
+ public String fullName;
+
+ public CraftFakePlayer_v1_11_R1(CraftServer server, EntityFakePlayer_v1_11_R1 entity) {
+ super(server, entity);
+ this.server = server;
+ setMetadata("NPC", new FixedMetadataValue(NMSHandler.getJavaPlugin(), true));
+ }
+
+ @Override
+ public void setMetadata(String metadataKey, MetadataValue newMetadataValue) {
+ this.server.getEntityMetadata().setMetadata(this, metadataKey, newMetadataValue);
+ }
+
+ @Override
+ public List getMetadata(String metadataKey) {
+ return this.server.getEntityMetadata().getMetadata(this, metadataKey);
+ }
+
+ @Override
+ public boolean hasMetadata(String metadataKey) {
+ return this.server.getEntityMetadata().hasMetadata(this, metadataKey);
+ }
+
+ @Override
+ public void removeMetadata(String metadataKey, Plugin owningPlugin) {
+ this.server.getEntityMetadata().removeMetadata(this, metadataKey, owningPlugin);
+ }
+
+ @Override
+ public String getEntityTypeName() {
+ return "FAKE_PLAYER";
+ }
+
+ @Override
+ public String getFullName() {
+ return fullName;
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/entities/CraftItemProjectile_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/entities/CraftItemProjectile_v1_11_R1.java
new file mode 100644
index 0000000000..4243bb7ac2
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/entities/CraftItemProjectile_v1_11_R1.java
@@ -0,0 +1,73 @@
+package net.aufdemrand.denizen.nms.impl.entities;
+
+import net.aufdemrand.denizen.nms.interfaces.ItemProjectile;
+import org.bukkit.craftbukkit.v1_11_R1.CraftServer;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftHumanEntity;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftItem;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftLivingEntity;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.projectiles.ProjectileSource;
+
+public class CraftItemProjectile_v1_11_R1 extends CraftItem implements ItemProjectile {
+
+ private boolean doesBounce;
+
+ public CraftItemProjectile_v1_11_R1(CraftServer server, EntityItemProjectile_v1_11_R1 entity) {
+ super(server, entity);
+ }
+
+ /*
+ public static ItemProjectile createItemProjectile(Location location, ArrayList mechanisms) {
+ }*/
+
+ @Override
+ public EntityItemProjectile_v1_11_R1 getHandle() {
+ return (EntityItemProjectile_v1_11_R1) super.getHandle();
+ }
+
+ @Override
+ public String getEntityTypeName() {
+ return "ITEM_PROJECTILE";
+ }
+
+ @Override
+ public ProjectileSource getShooter() {
+ return getHandle().projectileSource;
+ }
+
+ @Override
+ public void setShooter(ProjectileSource shooter) {
+ if (shooter instanceof CraftLivingEntity) {
+ getHandle().shooter = ((CraftLivingEntity) shooter).getHandle();
+ if (shooter instanceof CraftHumanEntity) {
+ getHandle().shooterName = ((CraftHumanEntity) shooter).getName();
+ }
+ }
+ else {
+ getHandle().shooter = null;
+ getHandle().shooterName = null;
+ }
+ getHandle().projectileSource = shooter;
+ }
+
+ @Override
+ public boolean doesBounce() {
+ return doesBounce;
+ }
+
+ @Override
+ public void setBounce(boolean doesBounce) {
+ this.doesBounce = doesBounce;
+ }
+
+
+ @Override
+ public void _INVALID_setShooter(LivingEntity livingEntity) {
+ // Do nothing
+ }
+
+ @Override
+ public LivingEntity _INVALID_getShooter() {
+ return null;
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/entities/EntityFakeArrow_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/entities/EntityFakeArrow_v1_11_R1.java
new file mode 100644
index 0000000000..168edfe3c4
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/entities/EntityFakeArrow_v1_11_R1.java
@@ -0,0 +1,34 @@
+package net.aufdemrand.denizen.nms.impl.entities;
+
+import net.minecraft.server.v1_11_R1.EntitySpectralArrow;
+import net.minecraft.server.v1_11_R1.ItemStack;
+import net.minecraft.server.v1_11_R1.Items;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_11_R1.CraftServer;
+import org.bukkit.craftbukkit.v1_11_R1.CraftWorld;
+
+public class EntityFakeArrow_v1_11_R1 extends EntitySpectralArrow {
+
+ public EntityFakeArrow_v1_11_R1(CraftWorld craftWorld, Location location) {
+ super(craftWorld.getHandle());
+ bukkitEntity = new CraftFakeArrow_v1_11_R1((CraftServer) Bukkit.getServer(), this);
+ setPositionRotation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
+ world.addEntity(this);
+ }
+
+ @Override
+ public void A_() {
+ // Do nothing
+ }
+
+ @Override
+ protected ItemStack j() {
+ return new ItemStack(Items.ARROW);
+ }
+
+ @Override
+ public CraftFakeArrow_v1_11_R1 getBukkitEntity() {
+ return (CraftFakeArrow_v1_11_R1) bukkitEntity;
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/entities/EntityFakePlayer_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/entities/EntityFakePlayer_v1_11_R1.java
new file mode 100644
index 0000000000..789fbed8ee
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/entities/EntityFakePlayer_v1_11_R1.java
@@ -0,0 +1,29 @@
+package net.aufdemrand.denizen.nms.impl.entities;
+
+import com.mojang.authlib.GameProfile;
+import net.aufdemrand.denizen.nms.impl.network.FakeNetworkManager_v1_11_R1;
+import net.aufdemrand.denizen.nms.impl.network.FakePlayerConnection_v1_11_R1;
+import net.minecraft.server.v1_11_R1.*;
+import org.bukkit.Bukkit;
+import org.bukkit.craftbukkit.v1_11_R1.CraftServer;
+import org.bukkit.event.entity.CreatureSpawnEvent;
+import org.bukkit.plugin.java.JavaPlugin;
+
+public class EntityFakePlayer_v1_11_R1 extends EntityPlayer {
+
+ public EntityFakePlayer_v1_11_R1(MinecraftServer minecraftserver, WorldServer worldserver, GameProfile gameprofile, PlayerInteractManager playerinteractmanager) {
+ super(minecraftserver, worldserver, gameprofile, playerinteractmanager);
+ this.bukkitEntity = new CraftFakePlayer_v1_11_R1((CraftServer) Bukkit.getServer(), this);
+ playerinteractmanager.setGameMode(EnumGamemode.SURVIVAL);
+ NetworkManager networkManager = new FakeNetworkManager_v1_11_R1(EnumProtocolDirection.CLIENTBOUND);
+ playerConnection = new FakePlayerConnection_v1_11_R1(minecraftserver, networkManager, this);
+ networkManager.setPacketListener(playerConnection);
+ datawatcher.set(EntityHuman.br, (byte) 127);
+ worldserver.addEntity(this, CreatureSpawnEvent.SpawnReason.CUSTOM);
+ }
+
+ @Override
+ public CraftFakePlayer_v1_11_R1 getBukkitEntity() {
+ return (CraftFakePlayer_v1_11_R1) bukkitEntity;
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/entities/EntityItemProjectile_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/entities/EntityItemProjectile_v1_11_R1.java
new file mode 100644
index 0000000000..0727478a2a
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/entities/EntityItemProjectile_v1_11_R1.java
@@ -0,0 +1,152 @@
+package net.aufdemrand.denizen.nms.impl.entities;
+
+import net.minecraft.server.v1_11_R1.*;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_11_R1.CraftServer;
+import org.bukkit.craftbukkit.v1_11_R1.CraftWorld;
+import org.bukkit.craftbukkit.v1_11_R1.event.CraftEventFactory;
+import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftItemStack;
+
+import java.util.List;
+
+public class EntityItemProjectile_v1_11_R1 extends EntityItem implements IProjectile {
+
+ public Entity shooter;
+ public String shooterName;
+ private int age;
+
+ public EntityItemProjectile_v1_11_R1(CraftWorld craftWorld, Location location, org.bukkit.inventory.ItemStack itemStack) {
+ super(craftWorld.getHandle());
+ bukkitEntity = new CraftItemProjectile_v1_11_R1((CraftServer) Bukkit.getServer(), this);
+ this.pickupDelay = Integer.MAX_VALUE;
+ setPositionRotation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
+ this.setSize(0.25F, 0.25F);
+ this.setItemStack(CraftItemStack.asNMSCopy(itemStack));
+ world.addEntity(this);
+ }
+
+ @Override
+ public void A_() {
+ this.U();
+ BlockPosition blockposition = new BlockPosition(locX, locY, locZ);
+ IBlockData iblockdata = world.getType(blockposition);
+ Block block = iblockdata.getBlock();
+
+ if (block.getBlockData().getMaterial() != Material.AIR) {
+ AxisAlignedBB axisalignedbb = iblockdata.c(world, blockposition);
+ if ((axisalignedbb != Block.k) && (axisalignedbb.b(new Vec3D(locX, locY, locZ)))) {
+ CraftEventFactory.callProjectileHitEvent(this);
+ this.die();
+ }
+ }
+ age += 1;
+ Vec3D vec3d = new Vec3D(locX, locY, locZ);
+ Vec3D vec3d1 = new Vec3D(locX + motX, locY + motY, locZ + motZ);
+ MovingObjectPosition movingobjectposition = world.rayTrace(vec3d, vec3d1, false, true, false);
+
+ vec3d = new Vec3D(locX, locY, locZ);
+ vec3d1 = new Vec3D(locX + motX, locY + motY, locZ + motZ);
+ if (movingobjectposition != null) {
+ vec3d1 = new Vec3D(movingobjectposition.pos.x, movingobjectposition.pos.y, movingobjectposition.pos.z);
+ }
+
+ Entity entity = null;
+ List list = world.getEntities(this, getBoundingBox().a(motX, motY, motZ).grow(1.0D, 1.0D, 1.0D));
+ double d0 = 0.0D;
+
+ for (Object aList : list) {
+ Entity entity1 = (Entity) aList;
+
+ if ((entity1.isInteractable()) && ((entity1 != shooter) || (age >= 5))) {
+ float f1 = 0.3F;
+ AxisAlignedBB axisalignedbb1 = entity1.getBoundingBox().grow(f1, f1, f1);
+ MovingObjectPosition movingobjectposition1 = axisalignedbb1.b(vec3d, vec3d1);
+
+ if (movingobjectposition1 != null) {
+ double d1 = vec3d.distanceSquared(movingobjectposition1.pos);
+
+ if ((d1 < d0) || (d0 == 0.0D)) {
+ entity = entity1;
+ d0 = d1;
+ }
+ }
+ }
+ }
+ if (entity != null) {
+ movingobjectposition = new MovingObjectPosition(entity);
+ }
+ if ((movingobjectposition != null) && (movingobjectposition.entity != null) && ((movingobjectposition.entity instanceof EntityHuman))) {
+ EntityHuman entityhuman = (EntityHuman) movingobjectposition.entity;
+ if ((entityhuman.abilities.isInvulnerable) || (((shooter instanceof EntityHuman)) && (!((EntityHuman) shooter).a(entityhuman)))) {
+ movingobjectposition = null;
+ }
+ }
+ if (movingobjectposition != null) {
+ if (movingobjectposition.entity != null && movingobjectposition.entity instanceof EntityLiving) {
+ movingobjectposition.entity.damageEntity(DamageSource.projectile(this, this.getShooter()), 0F);
+ this.die();
+ }
+ else if (movingobjectposition.a() != null) {
+ if (block.getBlockData().getMaterial() != Material.AIR) {
+ motX = ((float) (movingobjectposition.pos.x - locX));
+ motY = ((float) (movingobjectposition.pos.y - locY));
+ motZ = ((float) (movingobjectposition.pos.z - locZ));
+ float f3 = MathHelper.sqrt(motX * motX + motY * motY + motZ * motZ);
+ locX -= motX / f3 * 0.0500000007450581D;
+ locY -= motY / f3 * 0.0500000007450581D;
+ locZ -= motZ / f3 * 0.0500000007450581D;
+ CraftEventFactory.callProjectileHitEvent(this);
+ this.die();
+ }
+ }
+ }
+
+ locX += motX;
+ locY += motY;
+ locZ += motZ;
+ float f3 = 0.99F;
+ float f1 = 0.05F;
+ motX *= f3;
+ motY *= f3;
+ motZ *= f3;
+ motY -= f1;
+ setPosition(locX, locY, locZ);
+ checkBlockCollisions();
+ }
+
+ @Override
+ public void shoot(double d0, double d1, double d2, float f, float f1) {
+ float f2 = MathHelper.sqrt(d0 * d0 + d1 * d1 + d2 * d2);
+
+ d0 /= f2;
+ d1 /= f2;
+ d2 /= f2;
+ d0 += random.nextGaussian() * 0.007499999832361937D * f1;
+ d1 += random.nextGaussian() * 0.007499999832361937D * f1;
+ d2 += random.nextGaussian() * 0.007499999832361937D * f1;
+ d0 *= f;
+ d1 *= f;
+ d2 *= f;
+ motX = d0;
+ motY = d1;
+ motZ = d2;
+ float f3 = MathHelper.sqrt(d0 * d0 + d2 * d2);
+
+ lastYaw = yaw = (float) (Math.atan2(d0, d2) * 180.0D / 3.1415927410125732D);
+ lastPitch = pitch = (float) (Math.atan2(d1, f3) * 180.0D / 3.1415927410125732D);
+ }
+
+ public Entity getShooter() {
+ if (this.shooter == null && this.shooterName != null && this.shooterName.length() > 0) {
+ this.shooter = this.world.a(this.shooterName);
+ }
+
+ return this.shooter;
+ }
+
+ @Override
+ public CraftItemProjectile_v1_11_R1 getBukkitEntity() {
+ return (CraftItemProjectile_v1_11_R1) bukkitEntity;
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/jnbt/CompoundTag_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/jnbt/CompoundTag_v1_11_R1.java
new file mode 100644
index 0000000000..6fa1b090b1
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/jnbt/CompoundTag_v1_11_R1.java
@@ -0,0 +1,125 @@
+package net.aufdemrand.denizen.nms.impl.jnbt;
+
+import net.aufdemrand.denizen.nms.util.jnbt.*;
+import net.minecraft.server.v1_11_R1.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class CompoundTag_v1_11_R1 extends CompoundTag {
+
+ /**
+ * Creates the tag with an empty name.
+ *
+ * @param value the value of the tag
+ */
+ public CompoundTag_v1_11_R1(Map value) {
+ super(value);
+ }
+
+ public NBTTagCompound toNMSTag() {
+ NBTTagCompound tag = new NBTTagCompound();
+ for (Map.Entry entry: value.entrySet()) {
+ if (entry.getValue() instanceof IntTag) {
+ tag.setInt(entry.getKey(), ((IntTag) entry.getValue()).getValue());
+ }
+ else if (entry.getValue() instanceof ByteTag) {
+ tag.setByte(entry.getKey(), ((ByteTag) entry.getValue()).getValue());
+ }
+ else if (entry.getValue() instanceof ByteArrayTag) {
+ tag.setByteArray(entry.getKey(), ((ByteArrayTag) entry.getValue()).getValue());
+ }
+ else if (entry.getValue() instanceof CompoundTag) {
+ tag.set(entry.getKey(), ((CompoundTag_v1_11_R1) entry.getValue()).toNMSTag());
+ }
+ else if (entry.getValue() instanceof DoubleTag) {
+ tag.setDouble(entry.getKey(), ((DoubleTag) entry.getValue()).getValue());
+ }
+ else if (entry.getValue() instanceof FloatTag) {
+ tag.setFloat(entry.getKey(), ((FloatTag) entry.getValue()).getValue());
+ }
+ else if (entry.getValue() instanceof IntArrayTag) {
+ tag.setIntArray(entry.getKey(), ((IntArrayTag) entry.getValue()).getValue());
+ }
+ else if (entry.getValue() instanceof ListTag) {
+ NBTTagList list = new NBTTagList();
+ List tags = ((ListTag) entry.getValue()).getValue();
+ for (Tag btag : tags) {
+ HashMap btags = new HashMap();
+ btags.put("test", btag);
+ CompoundTag_v1_11_R1 comp = new CompoundTag_v1_11_R1(btags);
+ list.add(comp.toNMSTag().get("test"));
+ }
+ tag.set(entry.getKey(), list);
+ }
+ else if (entry.getValue() instanceof LongTag) {
+ tag.setLong(entry.getKey(), ((LongTag) entry.getValue()).getValue());
+ }
+ else if (entry.getValue() instanceof ShortTag) {
+ tag.setShort(entry.getKey(), ((ShortTag) entry.getValue()).getValue());
+ }
+ else if (entry.getValue() instanceof StringTag) {
+ tag.setString(entry.getKey(), ((StringTag) entry.getValue()).getValue());
+ }
+ }
+ return tag;
+ }
+
+ public static CompoundTag fromNMSTag(NBTTagCompound tag) {
+ HashMap tags = new HashMap();
+ for (String key: tag.c()) {
+ NBTBase base = tag.get(key);
+ if (base instanceof NBTTagInt) {
+ tags.put(key, new IntTag(((NBTTagInt) base).e()));
+ }
+ else if (base instanceof NBTTagByte) {
+ tags.put(key, new ByteTag(((NBTTagByte) base).g()));
+ }
+ else if (base instanceof NBTTagFloat) {
+ tags.put(key, new FloatTag(((NBTTagFloat) base).i()));
+ }
+ else if (base instanceof NBTTagDouble) {
+ tags.put(key, new DoubleTag(((NBTTagDouble) base).asDouble()));
+ }
+ else if (base instanceof NBTTagByteArray) {
+ tags.put(key, new ByteArrayTag(((NBTTagByteArray) base).c()));
+ }
+ else if (base instanceof NBTTagIntArray) {
+ tags.put(key, new IntArrayTag(((NBTTagIntArray) base).d()));
+ }
+ else if (base instanceof NBTTagCompound) {
+ tags.put(key, fromNMSTag(((NBTTagCompound) base)));
+ }
+ else if (base instanceof NBTTagEnd) {
+ tags.put(key, new EndTag());
+ }
+ else if (base instanceof NBTTagLong) {
+ tags.put(key, new LongTag(((NBTTagLong) base).d()));
+ }
+ else if (base instanceof NBTTagShort) {
+ tags.put(key, new ShortTag(((NBTTagShort) base).f()));
+ }
+ else if (base instanceof NBTTagString) {
+ tags.put(key, new StringTag(((NBTTagString) base).c_()));
+ }
+ else if (base instanceof NBTTagList) {
+ NBTTagList list = (NBTTagList) base;
+ if (list.size() > 0) {
+ NBTBase nbase = list.h(0);
+ NBTTagCompound comp = new NBTTagCompound();
+ comp.set("test", nbase);
+ ListTagBuilder ltb = new ListTagBuilder(fromNMSTag(comp).getValue().get("test").getClass());
+ for (int i = 0 ; i < list.size(); i++) {
+ NBTBase nbase2 = list.h(i);
+ NBTTagCompound comp2 = new NBTTagCompound();
+ comp2.set("test", nbase2);
+ ltb.add(fromNMSTag(comp2).getValue().get("test"));
+ }
+ tags.put(key, ltb.build());
+ }
+ }
+ }
+ return new CompoundTag_v1_11_R1(tags);
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/network/FakeChannel_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/network/FakeChannel_v1_11_R1.java
new file mode 100644
index 0000000000..88315cc52a
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/network/FakeChannel_v1_11_R1.java
@@ -0,0 +1,80 @@
+package net.aufdemrand.denizen.nms.impl.network;
+
+import io.netty.channel.*;
+
+import java.net.SocketAddress;
+
+public class FakeChannel_v1_11_R1 extends AbstractChannel {
+
+ private final ChannelConfig config = new DefaultChannelConfig(this);
+
+ protected FakeChannel_v1_11_R1(Channel parent) {
+ super(parent);
+ }
+
+ @Override
+ public ChannelConfig config() {
+ config.setAutoRead(true);
+ return config;
+ }
+
+ @Override
+ protected AbstractUnsafe newUnsafe() {
+ return null;
+ }
+
+ @Override
+ protected boolean isCompatible(EventLoop eventLoop) {
+ return false;
+ }
+
+ @Override
+ protected SocketAddress localAddress0() {
+ return null;
+ }
+
+ @Override
+ protected SocketAddress remoteAddress0() {
+ return null;
+ }
+
+ @Override
+ protected void doBind(SocketAddress socketAddress) throws Exception {
+
+ }
+
+ @Override
+ protected void doDisconnect() throws Exception {
+
+ }
+
+ @Override
+ protected void doClose() throws Exception {
+
+ }
+
+ @Override
+ protected void doBeginRead() throws Exception {
+
+ }
+
+ @Override
+ protected void doWrite(ChannelOutboundBuffer channelOutboundBuffer) throws Exception {
+
+ }
+
+ @Override
+ public boolean isOpen() {
+ return false;
+ }
+
+ @Override
+ public boolean isActive() {
+ return false;
+ }
+
+ @Override
+ public ChannelMetadata metadata() {
+ return null;
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/network/FakeNetworkManager_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/network/FakeNetworkManager_v1_11_R1.java
new file mode 100644
index 0000000000..120a99958a
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/network/FakeNetworkManager_v1_11_R1.java
@@ -0,0 +1,41 @@
+package net.aufdemrand.denizen.nms.impl.network;
+
+import net.minecraft.server.v1_11_R1.EnumProtocolDirection;
+import net.minecraft.server.v1_11_R1.NetworkManager;
+
+import java.lang.reflect.Field;
+import java.net.SocketAddress;
+
+public class FakeNetworkManager_v1_11_R1 extends NetworkManager {
+
+ private static final Field networkChannelField;
+ private static final Field networkAddressField;
+
+ static {
+ Field chan = null;
+ Field addr = null;
+ try {
+ chan = NetworkManager.class.getDeclaredField("channel");
+ chan.setAccessible(true);
+ addr = NetworkManager.class.getDeclaredField("l");
+ addr.setAccessible(true);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ networkChannelField = chan;
+ networkAddressField = addr;
+ }
+
+ public FakeNetworkManager_v1_11_R1(EnumProtocolDirection enumprotocoldirection) {
+ super(enumprotocoldirection);
+ try {
+ networkChannelField.set(this, new FakeChannel_v1_11_R1(null));
+ networkAddressField.set(this, new SocketAddress() {
+ });
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/network/FakePlayerConnection_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/network/FakePlayerConnection_v1_11_R1.java
new file mode 100644
index 0000000000..c48f33a1b6
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/network/FakePlayerConnection_v1_11_R1.java
@@ -0,0 +1,19 @@
+package net.aufdemrand.denizen.nms.impl.network;
+
+import net.minecraft.server.v1_11_R1.EntityPlayer;
+import net.minecraft.server.v1_11_R1.MinecraftServer;
+import net.minecraft.server.v1_11_R1.NetworkManager;
+import net.minecraft.server.v1_11_R1.Packet;
+import net.minecraft.server.v1_11_R1.PlayerConnection;
+
+public class FakePlayerConnection_v1_11_R1 extends PlayerConnection {
+
+ public FakePlayerConnection_v1_11_R1(MinecraftServer minecraftserver, NetworkManager networkmanager, EntityPlayer entityplayer) {
+ super(minecraftserver, networkmanager, entityplayer);
+ }
+
+ @Override
+ public void sendPacket(Packet packet) {
+ // Do nothing
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketInResourcePackStatus_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketInResourcePackStatus_v1_11_R1.java
new file mode 100644
index 0000000000..d7a95f4535
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketInResourcePackStatus_v1_11_R1.java
@@ -0,0 +1,18 @@
+package net.aufdemrand.denizen.nms.impl.packets;
+
+import net.aufdemrand.denizen.nms.interfaces.packets.PacketInResourcePackStatus;
+import net.minecraft.server.v1_11_R1.PacketPlayInResourcePackStatus;
+
+public class PacketInResourcePackStatus_v1_11_R1 implements PacketInResourcePackStatus {
+
+ private PacketPlayInResourcePackStatus internal;
+
+ public PacketInResourcePackStatus_v1_11_R1(PacketPlayInResourcePackStatus internal) {
+ this.internal = internal;
+ }
+
+ @Override
+ public String getStatus() {
+ return internal.status.name();
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketInSteerVehicle_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketInSteerVehicle_v1_11_R1.java
new file mode 100644
index 0000000000..4c423df2fc
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketInSteerVehicle_v1_11_R1.java
@@ -0,0 +1,33 @@
+package net.aufdemrand.denizen.nms.impl.packets;
+
+import net.aufdemrand.denizen.nms.interfaces.packets.PacketInSteerVehicle;
+import net.minecraft.server.v1_11_R1.PacketPlayInSteerVehicle;
+
+public class PacketInSteerVehicle_v1_11_R1 implements PacketInSteerVehicle {
+
+ private PacketPlayInSteerVehicle internal;
+
+ public PacketInSteerVehicle_v1_11_R1(PacketPlayInSteerVehicle internal) {
+ this.internal = internal;
+ }
+
+ @Override
+ public float getLeftwardInput() {
+ return internal.a();
+ }
+
+ @Override
+ public float getForwardInput() {
+ return internal.b();
+ }
+
+ @Override
+ public boolean getJumpInput() {
+ return internal.c();
+ }
+
+ @Override
+ public boolean getDismountInput() {
+ return internal.d();
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketOutChat_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketOutChat_v1_11_R1.java
new file mode 100644
index 0000000000..649009ffa7
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketOutChat_v1_11_R1.java
@@ -0,0 +1,105 @@
+package net.aufdemrand.denizen.nms.impl.packets;
+
+import net.aufdemrand.denizen.nms.interfaces.packets.PacketOutChat;
+import net.aufdemrand.denizen.nms.util.ReflectionHelper;
+import net.md_5.bungee.api.chat.BaseComponent;
+import net.md_5.bungee.api.chat.TextComponent;
+import net.md_5.bungee.chat.ComponentSerializer;
+import net.minecraft.server.v1_11_R1.ChatComponentText;
+import net.minecraft.server.v1_11_R1.IChatBaseComponent;
+import net.minecraft.server.v1_11_R1.PacketPlayOutChat;
+
+import java.lang.reflect.Field;
+import java.util.Map;
+
+public class PacketOutChat_v1_11_R1 implements PacketOutChat {
+
+ private PacketPlayOutChat internal;
+ private String message;
+ private String rawJson;
+ private boolean bungee;
+ private int position;
+
+ public PacketOutChat_v1_11_R1(PacketPlayOutChat internal) {
+ this.internal = internal;
+ try {
+ IChatBaseComponent baseComponent = (IChatBaseComponent) MESSAGE.get(internal);
+ if (baseComponent != null) {
+ message = baseComponent.toPlainText();
+ rawJson = IChatBaseComponent.ChatSerializer.a(baseComponent);
+ }
+ else {
+ message = BaseComponent.toPlainText(internal.components);
+ rawJson = ComponentSerializer.toString(internal.components);
+ bungee = true;
+ }
+ position = POSITION.getInt(internal);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public int getPosition() {
+ return position;
+ }
+
+ @Override
+ public String getMessage() {
+ return message;
+ }
+
+ @Override
+ public String getRawJson() {
+ return rawJson;
+ }
+
+ @Override
+ public void setPosition(int position) {
+ try {
+ POSITION.set(internal, position);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void setMessage(String message) {
+ try {
+ if (!bungee) {
+ MESSAGE.set(internal, new ChatComponentText(message));
+ }
+ else {
+ internal.components = new BaseComponent[]{new TextComponent(message)};
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void setRawJson(String rawJson) {
+ try {
+ if (!bungee) {
+ MESSAGE.set(internal, IChatBaseComponent.ChatSerializer.a(rawJson));
+ }
+ else {
+ internal.components = ComponentSerializer.parse(rawJson);
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private static final Field MESSAGE, POSITION;
+
+ static {
+ Map fields = ReflectionHelper.getFields(PacketPlayOutChat.class);
+ MESSAGE = fields.get("a");
+ POSITION = fields.get("b");
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketOutEntityMetadata_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketOutEntityMetadata_v1_11_R1.java
new file mode 100644
index 0000000000..6e844a79e2
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketOutEntityMetadata_v1_11_R1.java
@@ -0,0 +1,52 @@
+package net.aufdemrand.denizen.nms.impl.packets;
+
+import net.aufdemrand.denizen.nms.interfaces.packets.PacketOutEntityMetadata;
+import net.aufdemrand.denizen.nms.util.ReflectionHelper;
+import net.minecraft.server.v1_11_R1.DataWatcher;
+import net.minecraft.server.v1_11_R1.PacketPlayOutEntityMetadata;
+
+import java.lang.reflect.Field;
+import java.util.List;
+import java.util.Map;
+
+public class PacketOutEntityMetadata_v1_11_R1 implements PacketOutEntityMetadata {
+
+ private PacketPlayOutEntityMetadata internal;
+ private int entityId;
+ private List> metadata;
+
+ public PacketOutEntityMetadata_v1_11_R1(PacketPlayOutEntityMetadata internal) {
+ this.internal = internal;
+ try {
+ entityId = ENTITY_ID.getInt(internal);
+ metadata = (List>) METADATA.get(internal);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public int getEntityId() {
+ return entityId;
+ }
+
+ @Override
+ public boolean checkForGlow() {
+ for (DataWatcher.Item> data : metadata) {
+ if (data.a().a() == 0) {
+ // TODO: Instead of cancelling, casually strip out the 0x40 "Glowing" metadata rather than cancelling entirely?
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static final Field ENTITY_ID, METADATA;
+
+ static {
+ Map fields = ReflectionHelper.getFields(PacketPlayOutEntityMetadata.class);
+ ENTITY_ID = fields.get("a");
+ METADATA = fields.get("b");
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketOutSetSlot_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketOutSetSlot_v1_11_R1.java
new file mode 100644
index 0000000000..3aa4195c46
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketOutSetSlot_v1_11_R1.java
@@ -0,0 +1,49 @@
+package net.aufdemrand.denizen.nms.impl.packets;
+
+import net.aufdemrand.denizen.nms.interfaces.packets.PacketOutSetSlot;
+import net.aufdemrand.denizen.nms.util.ReflectionHelper;
+import net.minecraft.server.v1_11_R1.ItemStack;
+import net.minecraft.server.v1_11_R1.PacketPlayOutSetSlot;
+import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftItemStack;
+
+import java.lang.reflect.Field;
+import java.util.Map;
+
+public class PacketOutSetSlot_v1_11_R1 implements PacketOutSetSlot {
+
+ private PacketPlayOutSetSlot internal;
+ private org.bukkit.inventory.ItemStack itemStack;
+
+ public PacketOutSetSlot_v1_11_R1(PacketPlayOutSetSlot internal) {
+ this.internal = internal;
+ try {
+ ItemStack nms = (ItemStack) ITEM_STACK.get(internal);
+ itemStack = CraftItemStack.asBukkitCopy(nms);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack getItemStack() {
+ return itemStack;
+ }
+
+ @Override
+ public void setItemStack(org.bukkit.inventory.ItemStack itemStack) {
+ try {
+ ITEM_STACK.set(internal, CraftItemStack.asNMSCopy(itemStack));
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private static final Field ITEM_STACK;
+
+ static {
+ Map fields = ReflectionHelper.getFields(PacketPlayOutSetSlot.class);
+ ITEM_STACK = fields.get("c");
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketOutSpawnEntity_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketOutSpawnEntity_v1_11_R1.java
new file mode 100644
index 0000000000..3b6d34b11c
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketOutSpawnEntity_v1_11_R1.java
@@ -0,0 +1,43 @@
+package net.aufdemrand.denizen.nms.impl.packets;
+
+import net.aufdemrand.denizen.nms.interfaces.packets.PacketOutSpawnEntity;
+import net.aufdemrand.denizen.nms.util.ReflectionHelper;
+import net.minecraft.server.v1_11_R1.EntityPlayer;
+import net.minecraft.server.v1_11_R1.EntityTracker;
+import net.minecraft.server.v1_11_R1.EntityTrackerEntry;
+import net.minecraft.server.v1_11_R1.Packet;
+import net.minecraft.server.v1_11_R1.PacketPlayOutSpawnEntityExperienceOrb;
+import net.minecraft.server.v1_11_R1.WorldServer;
+
+import java.util.UUID;
+
+public class PacketOutSpawnEntity_v1_11_R1 implements PacketOutSpawnEntity {
+
+ private Packet internal;
+ private int entityId;
+ private UUID entityUuid;
+
+ public PacketOutSpawnEntity_v1_11_R1(EntityPlayer player, Packet internal) {
+ this.internal = internal;
+ Integer integer = ReflectionHelper.getFieldValue(internal.getClass(), "a", internal);
+ entityId = integer != null ? integer : -1;
+ if (!(internal instanceof PacketPlayOutSpawnEntityExperienceOrb)) {
+ entityUuid = ReflectionHelper.getFieldValue(internal.getClass(), "b", internal);
+ }
+ else {
+ EntityTracker tracker = ((WorldServer) player.world).tracker;
+ EntityTrackerEntry entry = tracker.trackedEntities.get(entityId);
+ entityUuid = entry != null ? entry.b().getUniqueID() : null;
+ }
+ }
+
+ @Override
+ public int getEntityId() {
+ return entityId;
+ }
+
+ @Override
+ public UUID getEntityUuid() {
+ return entityUuid;
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketOutTradeList_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketOutTradeList_v1_11_R1.java
new file mode 100644
index 0000000000..d05d33f0dd
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketOutTradeList_v1_11_R1.java
@@ -0,0 +1,72 @@
+package net.aufdemrand.denizen.nms.impl.packets;
+
+import io.netty.buffer.Unpooled;
+import net.aufdemrand.denizen.nms.interfaces.packets.PacketOutTradeList;
+import net.aufdemrand.denizen.nms.util.TradeOffer;
+import net.minecraft.server.v1_11_R1.PacketDataSerializer;
+import net.minecraft.server.v1_11_R1.PacketPlayOutCustomPayload;
+import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftItemStack;
+import org.bukkit.inventory.ItemStack;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PacketOutTradeList_v1_11_R1 implements PacketOutTradeList {
+
+ private PacketPlayOutCustomPayload internal;
+ private int container;
+ private List tradeOffers;
+
+ public PacketOutTradeList_v1_11_R1(PacketPlayOutCustomPayload internal, PacketDataSerializer serializer) {
+ this.internal = internal;
+ try {
+ container = serializer.readInt();
+ tradeOffers = new ArrayList();
+ byte tradeCount = serializer.readByte();
+ for (byte i = 0; i < tradeCount; i++) {
+ ItemStack firstCost = CraftItemStack.asBukkitCopy(serializer.k());
+ ItemStack product = CraftItemStack.asBukkitCopy(serializer.k());
+ boolean hasSecondCost = serializer.readBoolean();
+ ItemStack secondCost = hasSecondCost ? CraftItemStack.asBukkitCopy(serializer.k()) : null;
+ boolean usedMaxTimes = serializer.readBoolean();
+ int currentUses = serializer.readInt();
+ int maxUses = serializer.readInt();
+ tradeOffers.add(new TradeOffer(product, firstCost, secondCost, usedMaxTimes, currentUses, maxUses));
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public List getTradeOffers() {
+ return tradeOffers;
+ }
+
+ @Override
+ public void setTradeOffers(List tradeOffers) {
+ try {
+ PacketDataSerializer serializer = new PacketDataSerializer(Unpooled.buffer());
+ serializer.a("MC|TrList");
+ serializer.writeInt(container);
+ serializer.writeByte((byte)(tradeOffers.size() & 255));
+ for (TradeOffer tradeOffer : tradeOffers) {
+ serializer.a(CraftItemStack.asNMSCopy(tradeOffer.getFirstCost()));
+ serializer.a(CraftItemStack.asNMSCopy(tradeOffer.getProduct()));
+ boolean hasSecondCost = tradeOffer.hasSecondCost();
+ serializer.writeBoolean(hasSecondCost);
+ if (hasSecondCost) {
+ serializer.a(CraftItemStack.asNMSCopy(tradeOffer.getSecondCost()));
+ }
+ serializer.writeBoolean(tradeOffer.isUsedMaxTimes());
+ serializer.writeInt(tradeOffer.getCurrentUses());
+ serializer.writeInt(tradeOffer.getMaxUses());
+ }
+ internal.a(serializer);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketOutWindowItems_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketOutWindowItems_v1_11_R1.java
new file mode 100644
index 0000000000..50a4cf634c
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/PacketOutWindowItems_v1_11_R1.java
@@ -0,0 +1,58 @@
+package net.aufdemrand.denizen.nms.impl.packets;
+
+import net.aufdemrand.denizen.nms.interfaces.packets.PacketOutWindowItems;
+import net.aufdemrand.denizen.nms.util.ReflectionHelper;
+import net.minecraft.server.v1_11_R1.ItemStack;
+import net.minecraft.server.v1_11_R1.NonNullList;
+import net.minecraft.server.v1_11_R1.PacketPlayOutWindowItems;
+import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftItemStack;
+
+import java.lang.reflect.Field;
+import java.util.List;
+import java.util.Map;
+
+public class PacketOutWindowItems_v1_11_R1 implements PacketOutWindowItems {
+
+ private PacketPlayOutWindowItems internal;
+ private List contents;
+
+ public PacketOutWindowItems_v1_11_R1(PacketPlayOutWindowItems internal) {
+ this.internal = internal;
+ try {
+ List nms = (List) CONTENTS.get(internal);
+ contents = NonNullList.a();
+ for (ItemStack itemStack : nms) {
+ contents.add(CraftItemStack.asBukkitCopy(itemStack));
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public org.bukkit.inventory.ItemStack[] getContents() {
+ return contents.toArray(new org.bukkit.inventory.ItemStack[contents.size()]);
+ }
+
+ @Override
+ public void setContents(org.bukkit.inventory.ItemStack[] contents) {
+ List nms = NonNullList.a();
+ for (org.bukkit.inventory.ItemStack content : contents) {
+ nms.add(CraftItemStack.asNMSCopy(content));
+ }
+ try {
+ CONTENTS.set(internal, nms);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private static final Field CONTENTS;
+
+ static {
+ Map fields = ReflectionHelper.getFields(PacketPlayOutWindowItems.class);
+ CONTENTS = fields.get("b");
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/handlers/AbstractListenerPlayIn_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/handlers/AbstractListenerPlayIn_v1_11_R1.java
new file mode 100644
index 0000000000..38ffef7740
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/handlers/AbstractListenerPlayIn_v1_11_R1.java
@@ -0,0 +1,218 @@
+package net.aufdemrand.denizen.nms.impl.packets.handlers;
+
+import net.aufdemrand.denizen.nms.util.DenizenAtomicIntegerFieldUpdater;
+import net.minecraft.server.v1_11_R1.*;
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.Set;
+
+public class AbstractListenerPlayIn_v1_11_R1 extends PlayerConnection {
+
+ protected final PlayerConnection oldListener;
+
+ public AbstractListenerPlayIn_v1_11_R1(NetworkManager networkManager, EntityPlayer entityPlayer, PlayerConnection oldListener) {
+ super(MinecraftServer.getServer(), networkManager, entityPlayer);
+ this.oldListener = oldListener;
+ try {
+ Field chatSpamField = PlayerConnection.class.getDeclaredField("chatSpamField");
+ chatSpamField.setAccessible(true);
+ Field modifiersField = Field.class.getDeclaredField("modifiers");
+ modifiersField.setAccessible(true);
+ modifiersField.setInt(chatSpamField, chatSpamField.getModifiers() & ~Modifier.FINAL);
+ Field chatThrottle = PlayerConnection.class.getDeclaredField("chatThrottle");
+ chatThrottle.setAccessible(true);
+ chatSpamField.set(null, new DenizenAtomicIntegerFieldUpdater(chatThrottle));
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public CraftPlayer getPlayer() {
+ return oldListener.getPlayer();
+ }
+
+ @Override
+ public NetworkManager a() {
+ return this.networkManager;
+ }
+
+ @Override
+ public void disconnect(String s) {
+ oldListener.disconnect(s);
+ }
+
+ @Override
+ public void a(double d0, double d1, double d2, float f, float f1) {
+ oldListener.a(d0, d1, d2, f, f1);
+ }
+
+ @Override
+ public void a(double d0, double d1, double d2, float f, float f1, Set set) {
+ oldListener.a(d0, d1, d2, f, f1, set);
+ }
+
+ @Override
+ public void teleport(Location dest) {
+ oldListener.teleport(dest);
+ }
+
+ @Override
+ public void sendPacket(final Packet packet) {
+ oldListener.sendPacket(packet);
+ }
+
+ @Override
+ public void chat(String s, boolean async) {
+ oldListener.chat(s, async);
+ }
+
+ @Override
+ public void F_() {
+ oldListener.F_();
+ }
+
+ @Override
+ public void a(PacketPlayInChat packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInKeepAlive packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInArmAnimation packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInTabComplete packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInClientCommand packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInSettings packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInTransaction packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInEnchantItem packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInWindowClick packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInCloseWindow packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInCustomPayload packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInUseEntity packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInFlying packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInAbilities packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInBlockDig packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInEntityAction packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInSteerVehicle packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInHeldItemSlot packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInSetCreativeSlot packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInUpdateSign packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInBlockPlace packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInSpectate packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInResourcePackStatus packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInBoatMove packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInTeleportAccept packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInUseItem packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(PacketPlayInVehicleMove packet) {
+ oldListener.a(packet);
+ }
+
+ @Override
+ public void a(IChatBaseComponent iChatBaseComponent) {
+ oldListener.a(iChatBaseComponent);
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/handlers/DenizenNetworkManager_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/handlers/DenizenNetworkManager_v1_11_R1.java
new file mode 100644
index 0000000000..ed3ad3570b
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/handlers/DenizenNetworkManager_v1_11_R1.java
@@ -0,0 +1,268 @@
+package net.aufdemrand.denizen.nms.impl.packets.handlers;
+
+import io.netty.buffer.Unpooled;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.util.concurrent.Future;
+import io.netty.util.concurrent.GenericFutureListener;
+import net.aufdemrand.denizen.nms.NMSHandler;
+import net.aufdemrand.denizen.nms.impl.entities.EntityFakePlayer_v1_11_R1;
+import net.aufdemrand.denizen.nms.impl.packets.PacketOutChat_v1_11_R1;
+import net.aufdemrand.denizen.nms.impl.packets.PacketOutEntityMetadata_v1_11_R1;
+import net.aufdemrand.denizen.nms.impl.packets.PacketOutSetSlot_v1_11_R1;
+import net.aufdemrand.denizen.nms.impl.packets.PacketOutSpawnEntity_v1_11_R1;
+import net.aufdemrand.denizen.nms.impl.packets.PacketOutTradeList_v1_11_R1;
+import net.aufdemrand.denizen.nms.impl.packets.PacketOutWindowItems_v1_11_R1;
+import net.aufdemrand.denizen.nms.interfaces.packets.PacketHandler;
+import net.aufdemrand.denizen.nms.interfaces.packets.PacketOutSpawnEntity;
+import net.minecraft.server.v1_11_R1.*;
+import net.minecraft.server.v1_11_R1.PacketPlayOutPlayerInfo.EnumPlayerInfoAction;
+import org.bukkit.Bukkit;
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+
+import javax.crypto.SecretKey;
+import java.lang.reflect.Field;
+import java.net.SocketAddress;
+import java.util.UUID;
+
+public class DenizenNetworkManager_v1_11_R1 extends NetworkManager {
+
+ private final NetworkManager oldManager;
+ private final DenizenPacketListener_v1_11_R1 packetListener;
+ private final EntityPlayer player;
+ private final PacketHandler packetHandler;
+
+ public DenizenNetworkManager_v1_11_R1(EntityPlayer entityPlayer, NetworkManager oldManager, PacketHandler packetHandler) {
+ super(getProtocolDirection(oldManager));
+ this.oldManager = oldManager;
+ this.channel = oldManager.channel;
+ this.packetListener = new DenizenPacketListener_v1_11_R1(this, entityPlayer);
+ oldManager.setPacketListener(packetListener);
+ this.player = this.packetListener.player;
+ this.packetHandler = packetHandler;
+ }
+
+ public static void setNetworkManager(Player player, PacketHandler packetHandler) {
+ EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
+ PlayerConnection playerConnection = entityPlayer.playerConnection;
+ setNetworkManager(playerConnection, new DenizenNetworkManager_v1_11_R1(entityPlayer, playerConnection.networkManager, packetHandler));
+ }
+
+ public void channelActive(ChannelHandlerContext channelhandlercontext) throws Exception {
+ oldManager.channelActive(channelhandlercontext);
+ }
+
+ public void setProtocol(EnumProtocol enumprotocol) {
+ oldManager.setProtocol(enumprotocol);
+ }
+
+ public void channelInactive(ChannelHandlerContext channelhandlercontext) throws Exception {
+ oldManager.channelInactive(channelhandlercontext);
+ }
+
+ public void exceptionCaught(ChannelHandlerContext channelhandlercontext, Throwable throwable) throws Exception {
+ oldManager.exceptionCaught(channelhandlercontext, throwable);
+ }
+
+ protected void a(ChannelHandlerContext channelhandlercontext, Packet packet) throws Exception {
+ if (oldManager.channel.isOpen()) {
+ try {
+ packet.a(this.packetListener);
+ }
+ catch (Exception e) {
+ // Do nothing
+ //dB.echoError(e);
+ }
+ }
+ }
+
+ public void setPacketListener(PacketListener packetlistener) {
+ oldManager.setPacketListener(packetlistener);
+ }
+
+ public void sendPacket(Packet packet) {
+ // If the packet sending isn't cancelled, allow normal sending
+ if (packet instanceof PacketPlayOutChat) {
+ if (!packetHandler.sendPacket(player.getBukkitEntity(), new PacketOutChat_v1_11_R1((PacketPlayOutChat) packet))) {
+ oldManager.sendPacket(packet);
+ }
+ }
+ else if (packet instanceof PacketPlayOutNamedEntitySpawn
+ || packet instanceof PacketPlayOutSpawnEntity
+ || packet instanceof PacketPlayOutSpawnEntityLiving
+ || packet instanceof PacketPlayOutSpawnEntityPainting
+ || packet instanceof PacketPlayOutSpawnEntityExperienceOrb) {
+ PacketOutSpawnEntity spawnEntity = new PacketOutSpawnEntity_v1_11_R1(player, packet);
+ UUID uuid = spawnEntity.getEntityUuid();
+ if (!NMSHandler.getInstance().getEntityHelper().isHidden(player.getBukkitEntity(), uuid)) {
+ final Entity entity = ((WorldServer) player.getWorld()).getEntity(uuid);
+ if (entity != null) {
+ if (entity instanceof EntityFakePlayer_v1_11_R1) {
+ final EntityFakePlayer_v1_11_R1 fakePlayer = (EntityFakePlayer_v1_11_R1) entity;
+ sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, fakePlayer));
+ Bukkit.getScheduler().runTaskLater(NMSHandler.getJavaPlugin(), new Runnable() {
+ @Override
+ public void run() {
+ sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, fakePlayer));
+ }
+ }, 5);
+ }
+ if (entity.isPassenger()) {
+ Bukkit.getScheduler().runTaskLater(NMSHandler.getJavaPlugin(), new Runnable() {
+ @Override
+ public void run() {
+ sendPacket(new PacketPlayOutMount(entity.getVehicle()));
+ }
+ }, 1);
+ }
+ }
+ oldManager.sendPacket(packet);
+ }
+ }
+ else if (packet instanceof PacketPlayOutEntityMetadata) {
+ if (!packetHandler.sendPacket(player.getBukkitEntity(), new PacketOutEntityMetadata_v1_11_R1((PacketPlayOutEntityMetadata) packet))) {
+ oldManager.sendPacket(packet);
+ }
+ }
+ else if (packet instanceof PacketPlayOutSetSlot) {
+ if (!packetHandler.sendPacket(player.getBukkitEntity(), new PacketOutSetSlot_v1_11_R1((PacketPlayOutSetSlot) packet))) {
+ oldManager.sendPacket(packet);
+ }
+ }
+ else if (packet instanceof PacketPlayOutWindowItems) {
+ if (!packetHandler.sendPacket(player.getBukkitEntity(), new PacketOutWindowItems_v1_11_R1((PacketPlayOutWindowItems) packet))) {
+ oldManager.sendPacket(packet);
+ }
+ }
+ else if (packet instanceof PacketPlayOutCustomPayload) {
+ PacketPlayOutCustomPayload payload = (PacketPlayOutCustomPayload) packet;
+ PacketDataSerializer original = new PacketDataSerializer(Unpooled.buffer());
+ try {
+ payload.b(original);
+ // Copy the data without removing it from the original
+ PacketDataSerializer serializer = new PacketDataSerializer(original.getBytes(original.readerIndex(),
+ new byte[original.readableBytes()]));
+ // Write the original back to avoid odd errors
+ payload.a(original);
+ String name = serializer.e(20);
+ if (name != null && name.equals("MC|TrList")) {
+ if (!packetHandler.sendPacket(player.getBukkitEntity(), new PacketOutTradeList_v1_11_R1(payload, serializer))) {
+ oldManager.sendPacket(packet);
+ }
+ }
+ else {
+ oldManager.sendPacket(packet);
+ }
+ }
+ catch (Exception e) {
+ oldManager.sendPacket(packet);
+ }
+ }
+ else {
+ oldManager.sendPacket(packet);
+ }
+ }
+
+ public void sendPacket(Packet> packet, GenericFutureListener extends Future super Void>> genericfuturelistener, GenericFutureListener extends Future super Void>>... agenericfuturelistener) {
+ oldManager.sendPacket(packet, genericfuturelistener, agenericfuturelistener);
+ }
+
+ public void a() {
+ oldManager.a();
+ }
+
+ public SocketAddress getSocketAddress() {
+ return oldManager.getSocketAddress();
+ }
+
+ public void close(IChatBaseComponent ichatbasecomponent) {
+ oldManager.close(ichatbasecomponent);
+ }
+
+ public boolean isLocal() {
+ return oldManager.isLocal();
+ }
+
+ public void a(SecretKey secretkey) {
+ oldManager.a(secretkey);
+ }
+
+ public boolean isConnected() {
+ return oldManager.isConnected();
+ }
+
+ public boolean h() {
+ return oldManager.h();
+ }
+
+ public PacketListener i() {
+ return oldManager.i();
+ }
+
+ public IChatBaseComponent j() {
+ return oldManager.j();
+ }
+
+ public void stopReading() {
+ oldManager.stopReading();
+ }
+
+ public void setCompressionLevel(int i) {
+ oldManager.setCompressionLevel(i);
+ }
+
+ public void handleDisconnection() {
+ oldManager.handleDisconnection();
+ }
+
+ protected void channelRead0(ChannelHandlerContext channelhandlercontext, Packet object) throws Exception {
+ this.a(channelhandlercontext, object);
+ }
+
+ public SocketAddress getRawAddress() {
+ return oldManager.getRawAddress();
+ }
+
+ //////////////////////////////////
+ //// Reflection Methods/Fields
+ ///////////
+
+ private static final Field protocolDirectionField;
+ private static final Field networkManagerField;
+
+ static {
+ Field directionField = null;
+ Field managerField = null;
+ try {
+ directionField = NetworkManager.class.getDeclaredField("h");
+ directionField.setAccessible(true);
+ managerField = PlayerConnection.class.getDeclaredField("networkManager");
+ managerField.setAccessible(true);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ protocolDirectionField = directionField;
+ networkManagerField = managerField;
+ }
+
+ private static EnumProtocolDirection getProtocolDirection(NetworkManager networkManager) {
+ EnumProtocolDirection direction = null;
+ try {
+ direction = (EnumProtocolDirection) protocolDirectionField.get(networkManager);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ return direction;
+ }
+
+ private static void setNetworkManager(PlayerConnection playerConnection, NetworkManager networkManager) {
+ try {
+ networkManagerField.set(playerConnection, networkManager);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/handlers/DenizenPacketListener_v1_11_R1.java b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/handlers/DenizenPacketListener_v1_11_R1.java
new file mode 100644
index 0000000000..19db9e9016
--- /dev/null
+++ b/v1_11_R1/src/main/java/net/aufdemrand/denizen/nms/impl/packets/handlers/DenizenPacketListener_v1_11_R1.java
@@ -0,0 +1,56 @@
+package net.aufdemrand.denizen.nms.impl.packets.handlers;
+
+import net.aufdemrand.denizen.nms.NMSHandler;
+import net.aufdemrand.denizen.nms.impl.packets.PacketInResourcePackStatus_v1_11_R1;
+import net.aufdemrand.denizen.nms.impl.packets.PacketInSteerVehicle_v1_11_R1;
+import net.aufdemrand.denizen.nms.interfaces.packets.PacketHandler;
+import net.minecraft.server.v1_11_R1.EntityPlayer;
+import net.minecraft.server.v1_11_R1.NetworkManager;
+import net.minecraft.server.v1_11_R1.Packet;
+import net.minecraft.server.v1_11_R1.PacketPlayInResourcePackStatus;
+import net.minecraft.server.v1_11_R1.PacketPlayInSteerVehicle;
+import org.bukkit.Bukkit;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerJoinEvent;
+
+public class DenizenPacketListener_v1_11_R1 extends AbstractListenerPlayIn_v1_11_R1 {
+
+ private static PacketHandler packetHandler;
+
+ public DenizenPacketListener_v1_11_R1(NetworkManager networkManager, EntityPlayer entityPlayer) {
+ super(networkManager, entityPlayer, entityPlayer.playerConnection);
+ }
+
+ public static void enable(PacketHandler handler) {
+ packetHandler = handler;
+ Bukkit.getServer().getPluginManager().registerEvents(new PlayerEventListener(), NMSHandler.getJavaPlugin());
+ }
+
+ @Override
+ public void a(final PacketPlayInSteerVehicle packet) {
+ if (!packetHandler.receivePacket(player.getBukkitEntity(), new PacketInSteerVehicle_v1_11_R1(packet))) {
+ super.a(packet);
+ }
+ }
+
+ @Override
+ public void a(PacketPlayInResourcePackStatus packet) {
+ packetHandler.receivePacket(player.getBukkitEntity(), new PacketInResourcePackStatus_v1_11_R1(packet));
+ super.a(packet);
+ }
+
+ // For compatibility with other plugins using Reflection weirdly...
+ @Override
+ public void sendPacket(Packet packet) {
+ super.sendPacket(packet);
+ }
+
+ public static class PlayerEventListener implements Listener {
+ @EventHandler(priority = EventPriority.LOWEST)
+ public void onPlayerJoin(PlayerJoinEvent event) {
+ DenizenNetworkManager_v1_11_R1.setNetworkManager(event.getPlayer(), packetHandler);
+ }
+ }
+}
diff --git a/v1_8_R3/pom.xml b/v1_8_R3/pom.xml
index a23f1ebec7..f3f0f5297c 100644
--- a/v1_8_R3/pom.xml
+++ b/v1_8_R3/pom.xml
@@ -4,7 +4,7 @@
denizen-parent
net.aufdemrand
- 1.0.0-SNAPSHOT
+ 1.0.1-SNAPSHOT
4.0.0
diff --git a/v1_9_R2/pom.xml b/v1_9_R2/pom.xml
index b4dc7e2de3..36e91c8e68 100644
--- a/v1_9_R2/pom.xml
+++ b/v1_9_R2/pom.xml
@@ -4,7 +4,7 @@
denizen-parent
net.aufdemrand
- 1.0.0-SNAPSHOT
+ 1.0.1-SNAPSHOT
4.0.0