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> genericfuturelistener, GenericFutureListener>... 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