diff --git a/pom.xml b/pom.xml index 17da4eb3..32a3f40c 100644 --- a/pom.xml +++ b/pom.xml @@ -83,17 +83,12 @@ org.spigotmc spigot-api - 1.15-R0.1-SNAPSHOT + 1.16.1-R0.1-SNAPSHOT org.spigotmc spigot - 1.15.2-R0.1-SNAPSHOT - - - org.spigotmc - spigot - 1.15.2-R0.1-SNAPSHOT + 1.16.1-R0.1-SNAPSHOT diff --git a/src/main/java/me/libraryaddict/disguise/LibsDisguises.java b/src/main/java/me/libraryaddict/disguise/LibsDisguises.java index 18a31759..6702238e 100644 --- a/src/main/java/me/libraryaddict/disguise/LibsDisguises.java +++ b/src/main/java/me/libraryaddict/disguise/LibsDisguises.java @@ -60,6 +60,14 @@ public class LibsDisguises extends JavaPlugin { return; } + try { + Class cl = Class.forName("org.bukkit.Server$Spigot"); + } + catch (ClassNotFoundException e) { + getLogger().severe("Oh dear, you seem to be using CraftBukkit. Please use Spigot or Paper instead! This " + + "plugin will continue to load, but it will look like a mugging victim"); + } + WatcherSanitizer.init(); } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/DisguiseType.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/DisguiseType.java index f2ec1053..e5f396b9 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/DisguiseType.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/DisguiseType.java @@ -7,6 +7,7 @@ import me.libraryaddict.disguise.utilities.translations.TranslateType; import org.apache.commons.lang.StringUtils; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.omg.CORBA.UNKNOWN; public enum DisguiseType { AREA_EFFECT_CLOUD(3, 0), @@ -83,6 +84,8 @@ public enum DisguiseType { GUARDIAN, + @NmsAddedIn(val = NmsVersion.v1_16) HOGLIN, + HORSE, HUSK, @@ -135,7 +138,9 @@ public enum DisguiseType { PIG, - PIG_ZOMBIE, + @NmsRemovedIn(val = NmsVersion.v1_16) PIG_ZOMBIE, + + @NmsAddedIn(val = NmsVersion.v1_16) PIGLIN, @NmsAddedIn(val = NmsVersion.v1_14) PILLAGER, @@ -183,6 +188,8 @@ public enum DisguiseType { STRAY, + @NmsAddedIn(val = NmsVersion.v1_16) STRIDER, + THROWN_EXP_BOTTLE(75), @NmsRemovedIn(val = NmsVersion.v1_14) TIPPED_ARROW(60), @@ -215,11 +222,15 @@ public enum DisguiseType { WOLF, + @NmsAddedIn(val = NmsVersion.v1_16) ZOGLIN, + ZOMBIE, ZOMBIE_HORSE, - ZOMBIE_VILLAGER; + ZOMBIE_VILLAGER, + + @NmsAddedIn(val = NmsVersion.v1_16) ZOMBIFIED_PIGLIN; public static DisguiseType getType(Entity entity) { DisguiseType disguiseType = getType(entity.getType()); diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/MetaIndex.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/MetaIndex.java index 6354835b..a64fa964 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/MetaIndex.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/MetaIndex.java @@ -115,6 +115,7 @@ public class MetaIndex { * The shooter of the arrow, no visible effect if set */ @NmsAddedIn(val = NmsVersion.v1_13) + @NmsRemovedIn(val = NmsVersion.v1_16) public static MetaIndex> ARROW_UUID = new MetaIndex<>(ArrowWatcher.class, 1, Optional.empty()); @NmsAddedIn(val = NmsVersion.v1_14) @@ -296,7 +297,10 @@ public class MetaIndex { @NmsAddedIn(val = NmsVersion.v1_14) public static MetaIndex FIREWORK_SHOT_AT_ANGLE = new MetaIndex<>(FireworkWatcher.class, 2, false); - public static MetaIndex FISHING_HOOK_HOOKED = new MetaIndex<>(FishingHookWatcher.class, 0, 0); + public static MetaIndex FISHING_HOOK_HOOKED_ID = new MetaIndex<>(FishingHookWatcher.class, 0, 0); + + @NmsAddedIn(val = NmsVersion.v1_16) + public static MetaIndex FISHING_HOOK_HOOKED = new MetaIndex<>(FishingHookWatcher.class, 1, false); /** * The type of fox, its coloring @@ -328,6 +332,9 @@ public class MetaIndex { */ public static MetaIndex GUARDIAN_TARGET = new MetaIndex<>(GuardianWatcher.class, 1, 0); + @NmsAddedIn(val = NmsVersion.v1_16) + public static MetaIndex HOGLIN_SHAKING = new MetaIndex<>(HoglinWatcher.class, 0, false); + /** * If horse has chest, set for donkey */ @@ -495,6 +502,18 @@ public class MetaIndex { */ public static MetaIndex PIG_BOOST = new MetaIndex<>(PigWatcher.class, 1, 0); + @NmsAddedIn(val = NmsVersion.v1_16) + public static MetaIndex PIGLIN_BABY = new MetaIndex<>(PiglinWatcher.class, 0, false); + + @NmsAddedIn(val = NmsVersion.v1_16) + public static MetaIndex PIGLIN_SHAKING = new MetaIndex<>(PiglinWatcher.class, 1, false); + + @NmsAddedIn(val = NmsVersion.v1_16) + public static MetaIndex PIGLIN_CROSSBOW = new MetaIndex<>(PiglinWatcher.class, 2, false); + + @NmsAddedIn(val = NmsVersion.v1_16) + public static MetaIndex PIGLIN_DANCING = new MetaIndex<>(PiglinWatcher.class, 3, false); + @NmsAddedIn(val = NmsVersion.v1_14) public static MetaIndex PILLAGER_AIMING_BOW = new MetaIndex<>(PillagerWatcher.class, 0, false); @@ -539,6 +558,15 @@ public class MetaIndex { public static MetaIndex SNOWMAN_DERP = new MetaIndex<>(SnowmanWatcher.class, 0, (byte) 16); + @NmsAddedIn(val = NmsVersion.v1_16) + public static MetaIndex STRIDER_SADDLE_UNKNOWN = new MetaIndex<>(StriderWatcher.class, 0, 0); + + @NmsAddedIn(val = NmsVersion.v1_16) + public static MetaIndex STRIDER_WARM = new MetaIndex<>(StriderWatcher.class, 1, false); + + @NmsAddedIn(val = NmsVersion.v1_16) + public static MetaIndex STRIDER_SADDLED = new MetaIndex<>(StriderWatcher.class, 2, false); + public static MetaIndex SPIDER_CLIMB = new MetaIndex<>(SpiderWatcher.class, 0, (byte) 0); public static MetaIndex SPLASH_POTION_ITEM = new MetaIndex<>(SplashPotionWatcher.class, 0, @@ -610,6 +638,12 @@ public class MetaIndex { public static MetaIndex WOLF_COLLAR = new MetaIndex<>(WolfWatcher.class, 2, 14); + @NmsAddedIn(val = NmsVersion.v1_16) + public static MetaIndex WOLF_ANGER = new MetaIndex<>(WolfWatcher.class, 3, 0); + + @NmsAddedIn(val = NmsVersion.v1_16) + public static MetaIndex ZOGLIN_BABY = new MetaIndex<>(ZoglinWatcher.class, 0, false); + @NmsRemovedIn(val = NmsVersion.v1_14) public static MetaIndex ZOMBIE_AGGRESSIVE = new MetaIndex<>(ZombieWatcher.class, 2, false); diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FishingHookWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FishingHookWatcher.java index d16e861c..f679e05f 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FishingHookWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FishingHookWatcher.java @@ -4,26 +4,31 @@ import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; import me.libraryaddict.disguise.disguisetypes.MetaIndex; -public class FishingHookWatcher extends FlagWatcher -{ - public FishingHookWatcher(Disguise disguise) - { +public class FishingHookWatcher extends FlagWatcher { + public FishingHookWatcher(Disguise disguise) { super(disguise); } - public void setHooked(int hookedId) - { - setData(MetaIndex.FISHING_HOOK_HOOKED, hookedId + 1); - sendData(MetaIndex.FISHING_HOOK_HOOKED); - } - - public int getHooked() - { - int hooked = getData(MetaIndex.FISHING_HOOK_HOOKED); + public int getHookedId() { + int hooked = getData(MetaIndex.FISHING_HOOK_HOOKED_ID); if (hooked > 0) hooked--; return hooked; } + + public void setHookedId(int hookedId) { + setData(MetaIndex.FISHING_HOOK_HOOKED_ID, hookedId + 1); + sendData(MetaIndex.FISHING_HOOK_HOOKED_ID); + } + + public boolean isHooked() { + return getData(MetaIndex.FISHING_HOOK_HOOKED); + } + + public void setHooked(boolean hooked) { + setData(MetaIndex.FISHING_HOOK_HOOKED, hooked); + sendData(MetaIndex.FISHING_HOOK_HOOKED); + } } diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/HoglinWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/HoglinWatcher.java new file mode 100644 index 00000000..8985af8e --- /dev/null +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/HoglinWatcher.java @@ -0,0 +1,24 @@ +package me.libraryaddict.disguise.disguisetypes.watchers; + +import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.MetaIndex; + +/** + * Created by libraryaddict on 25/06/2020. + */ +public class HoglinWatcher extends AgeableWatcher { + public HoglinWatcher(Disguise disguise) { + super(disguise); + + setShaking(false); + } + + public boolean isShaking() { + return !getData(MetaIndex.HOGLIN_SHAKING); + } + + public void setShaking(boolean shaking) { + setData(MetaIndex.HOGLIN_SHAKING, !shaking); + sendData(MetaIndex.HOGLIN_SHAKING); + } +} diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PiglinWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PiglinWatcher.java new file mode 100644 index 00000000..b01d61fe --- /dev/null +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/PiglinWatcher.java @@ -0,0 +1,51 @@ +package me.libraryaddict.disguise.disguisetypes.watchers; + +import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.MetaIndex; + +/** + * Created by libraryaddict on 25/06/2020. + */ +public class PiglinWatcher extends InsentientWatcher { + public PiglinWatcher(Disguise disguise) { + super(disguise); + + setShaking(false); + } + + public boolean isBaby() { + return getData(MetaIndex.PIGLIN_BABY); + } + + public void setBaby(boolean baby) { + setData(MetaIndex.PIGLIN_BABY, baby); + sendData(MetaIndex.PIGLIN_BABY); + } + + public boolean isDancing() { + return getData(MetaIndex.PIGLIN_DANCING); + } + + public void setDancing(boolean dancing) { + setData(MetaIndex.PIGLIN_DANCING, dancing); + sendData(MetaIndex.PIGLIN_DANCING); + } + + public boolean isUsingCrossbow() { + return getData(MetaIndex.PIGLIN_CROSSBOW); + } + + public void setUsingCrossbow(boolean crossbow) { + setData(MetaIndex.PIGLIN_CROSSBOW, crossbow); + sendData(MetaIndex.PIGLIN_CROSSBOW); + } + + public boolean isShaking() { + return !getData(MetaIndex.PIGLIN_SHAKING); + } + + public void setShaking(boolean shaking) { + setData(MetaIndex.PIGLIN_SHAKING, !shaking); + sendData(MetaIndex.PIGLIN_SHAKING); + } +} diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/StriderWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/StriderWatcher.java new file mode 100644 index 00000000..3609002d --- /dev/null +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/StriderWatcher.java @@ -0,0 +1,22 @@ +package me.libraryaddict.disguise.disguisetypes.watchers; + +import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.MetaIndex; + +/** + * Created by libraryaddict on 25/06/2020. + */ +public class StriderWatcher extends AgeableWatcher { + public StriderWatcher(Disguise disguise) { + super(disguise); + } + + public boolean isSaddled() { + return getData(MetaIndex.STRIDER_SADDLED); + } + + public void setSaddled(boolean saddled) { + setData(MetaIndex.STRIDER_SADDLED, saddled); + sendData(MetaIndex.STRIDER_SADDLED); + } +} diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.java index ad63765f..0884e0d9 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/WolfWatcher.java @@ -52,6 +52,15 @@ public class WolfWatcher extends TameableWatcher { setTameableFlag(2, angry); } + public int getAnger() { + return getData(MetaIndex.WOLF_ANGER); + } + + public void setAnger(int anger) { + setData(MetaIndex.WOLF_ANGER, anger); + sendData(MetaIndex.WOLF_ANGER); + } + /** * Used for tail rotation. * diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ZoglinWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ZoglinWatcher.java new file mode 100644 index 00000000..7d5bb372 --- /dev/null +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/ZoglinWatcher.java @@ -0,0 +1,22 @@ +package me.libraryaddict.disguise.disguisetypes.watchers; + +import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.disguisetypes.MetaIndex; + +/** + * Created by libraryaddict on 25/06/2020. + */ +public class ZoglinWatcher extends InsentientWatcher { + public ZoglinWatcher(Disguise disguise) { + super(disguise); + } + + public boolean isBaby() { + return getData(MetaIndex.ZOGLIN_BABY); + } + + public void setBaby(boolean baby) { + setData(MetaIndex.ZOGLIN_BABY, baby); + sendData(MetaIndex.ZOGLIN_BABY); + } +} diff --git a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index dd7d8547..545eddaf 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -13,6 +13,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonSyntaxException; import com.mojang.authlib.properties.PropertyMap; +import com.mojang.datafixers.util.Pair; import lombok.Getter; import lombok.Setter; import me.libraryaddict.disguise.DisguiseAPI; @@ -1988,36 +1989,25 @@ public class DisguiseUtilities { .createPacket(0, player.getPassenger(), player)); } - sendSelfPacket(player, manager.createPacketConstructor(Server.ENTITY_EQUIPMENT, 0, - ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), - ReflectionManager.getNmsItem(new ItemStack(Material.STONE))) - .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), - ReflectionManager.getNmsItem(player.getInventory().getHelmet()))); - sendSelfPacket(player, manager.createPacketConstructor(Server.ENTITY_EQUIPMENT, 0, - ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), - ReflectionManager.getNmsItem(new ItemStack(Material.STONE))) - .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(EquipmentSlot.CHEST), - ReflectionManager.getNmsItem(player.getInventory().getChestplate()))); - sendSelfPacket(player, manager.createPacketConstructor(Server.ENTITY_EQUIPMENT, 0, - ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), - ReflectionManager.getNmsItem(new ItemStack(Material.STONE))) - .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(EquipmentSlot.LEGS), - ReflectionManager.getNmsItem(player.getInventory().getLeggings()))); - sendSelfPacket(player, manager.createPacketConstructor(Server.ENTITY_EQUIPMENT, 0, - ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), - ReflectionManager.getNmsItem(new ItemStack(Material.STONE))) - .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(EquipmentSlot.FEET), - ReflectionManager.getNmsItem(player.getInventory().getBoots()))); - sendSelfPacket(player, manager.createPacketConstructor(Server.ENTITY_EQUIPMENT, 0, - ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), - ReflectionManager.getNmsItem(new ItemStack(Material.STONE))) - .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(EquipmentSlot.HAND), - ReflectionManager.getNmsItem(player.getInventory().getItemInMainHand()))); - sendSelfPacket(player, manager.createPacketConstructor(Server.ENTITY_EQUIPMENT, 0, - ReflectionManager.createEnumItemSlot(EquipmentSlot.HEAD), - ReflectionManager.getNmsItem(new ItemStack(Material.STONE))) - .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(EquipmentSlot.OFF_HAND), - ReflectionManager.getNmsItem(player.getInventory().getItemInOffHand()))); + if (NmsVersion.v1_16.isSupported()) { + List> list = new ArrayList<>(); + + for (EquipmentSlot slot : EquipmentSlot.values()) { + list.add(Pair.of(ReflectionManager.createEnumItemSlot(slot), + ReflectionManager.getNmsItem(player.getInventory().getItem(slot)))); + } + + sendSelfPacket(player, + manager.createPacketConstructor(Server.ENTITY_EQUIPMENT, 0, list).createPacket(0, list)); + } else { + for (EquipmentSlot slot : EquipmentSlot.values()) { + sendSelfPacket(player, manager.createPacketConstructor(Server.ENTITY_EQUIPMENT, 0, + ReflectionManager.createEnumItemSlot(slot), + ReflectionManager.getNmsItem(player.getInventory().getItem(slot))) + .createPacket(player.getEntityId(), ReflectionManager.createEnumItemSlot(slot), + ReflectionManager.getNmsItem(player.getInventory().getItem(slot)))); + } + } Location loc = player.getLocation(); diff --git a/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerAttributes.java b/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerAttributes.java index a9bbbd9e..71661f14 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerAttributes.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerAttributes.java @@ -50,7 +50,8 @@ public class PacketHandlerAttributes implements IPacketHandler { return; } - if (disguise.isMiscDisguise()) { + // Skip if its 1.16, PL can't handle it atm + if (disguise.isMiscDisguise() || NmsVersion.v1_16.isSupported()) { return; } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerEquipment.java b/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerEquipment.java index 1f0c93ac..59ccc78a 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerEquipment.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerEquipment.java @@ -4,12 +4,14 @@ import com.comphenix.protocol.PacketType; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.wrappers.WrappedDataWatcher; import com.comphenix.protocol.wrappers.WrappedWatchableObject; +import com.mojang.datafixers.util.Pair; import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.MetaIndex; import me.libraryaddict.disguise.utilities.packets.IPacketHandler; import me.libraryaddict.disguise.utilities.packets.LibsPackets; import me.libraryaddict.disguise.utilities.packets.PacketsHandler; +import me.libraryaddict.disguise.utilities.reflection.NmsVersion; import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; import org.bukkit.Material; import org.bukkit.entity.Entity; @@ -38,6 +40,107 @@ public class PacketHandlerEquipment implements IPacketHandler { @Override public void handle(Disguise disguise, PacketContainer sentPacket, LibsPackets packets, Player observer, Entity entity) { + if (NmsVersion.v1_16.isSupported()) { + handleNew(disguise, sentPacket, packets, observer, entity); + } else { + handleOld(disguise, sentPacket, packets, observer, entity); + } + } + + public void handleNew(Disguise disguise, PacketContainer sentPacket, LibsPackets packets, Player observer, + Entity entity) { + // Else if the disguise is updating equipment + + List> slots = (List>) packets.getPackets().get(0).getModifier() + .read(1); + List> newSlots = new ArrayList<>(); + boolean constructed = false; + + for (Pair pair : slots) { + EquipmentSlot slot = ReflectionManager.createEquipmentSlot(pair.getFirst()); + + org.bukkit.inventory.ItemStack itemStack = disguise.getWatcher().getItemStack(slot); + + if (itemStack != null) { + if (!constructed) { + constructed = true; + + if (packets.getPackets().size() > 1) { + packets.getPackets().remove(1); + } else { + packets.clear(); + } + + PacketContainer equipPacket = sentPacket.shallowClone(); + + packets.getPackets().add(1, equipPacket); + + equipPacket.getModifier().write(1, newSlots); + } + + newSlots.add(Pair.of(pair.getFirst(), + ReflectionManager.getNmsItem(itemStack.getType() == Material.AIR ? null : itemStack))); + } else { + newSlots.add(pair); + } + + if (disguise.getWatcher().isRightClicking() && slot == EquipmentSlot.HAND) { + ItemStack heldItem = packets.getPackets().get(0).getItemModifier().read(0); + + if (heldItem != null && heldItem.getType() != Material.AIR) { + // Convert the datawatcher + List list = new ArrayList<>(); + + if (DisguiseConfig.isMetaPacketsEnabled()) { + WrappedWatchableObject watch = ReflectionManager.createWatchable(MetaIndex.ENTITY_META, + WrappedDataWatcher.getEntityWatcher(entity).getByte(0)); + + if (watch != null) + list.add(watch); + + list = disguise.getWatcher().convert(list); + } else { + for (WrappedWatchableObject obj : disguise.getWatcher().getWatchableObjects()) { + if (obj.getIndex() == 0) { + list.add(obj); + break; + } + } + } + + // Construct the packets to return + PacketContainer packetBlock = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); + + packetBlock.getModifier().write(0, entity.getEntityId()); + packetBlock.getWatchableCollectionModifier().write(0, list); + + PacketContainer packetUnblock = packetBlock.deepClone(); + // Make a packet to send the 'unblock' + for (WrappedWatchableObject watcher : packetUnblock.getWatchableCollectionModifier().read(0)) { + watcher.setValue((byte) ((byte) watcher.getValue() & ~(1 << 4))); + } + + // Send the unblock before the itemstack change so that the 2nd metadata packet works. Why? + // Scheduler + // delay. + + PacketContainer packet1 = packets.getPackets().get(0); + + packets.clear(); + + packets.addPacket(packetUnblock); + packets.addPacket(packet1); + packets.addPacket(packetBlock); + // Silly mojang made the right clicking datawatcher value only valid for one use. So I have + // to reset + // it. + } + } + } + } + + public void handleOld(Disguise disguise, PacketContainer sentPacket, LibsPackets packets, Player observer, + Entity entity) { // Else if the disguise is updating equipment EquipmentSlot slot = ReflectionManager.createEquipmentSlot(packets.getPackets().get(0).getModifier().read(1)); diff --git a/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerSpawn.java b/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerSpawn.java index 68eb555a..6ff310fe 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerSpawn.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerSpawn.java @@ -74,8 +74,7 @@ public class PacketHandlerSpawn implements IPacketHandler { Disguise disguise = packets.getDisguise(); if (DisguiseConfig.isMiscDisguisesForLivingEnabled()) { - if (disguise.getWatcher() instanceof LivingWatcher) { - + if (disguise.getWatcher() instanceof LivingWatcher && !NmsVersion.v1_16.isSupported()) { ArrayList attributes = new ArrayList<>(); WrappedAttribute.Builder builder = WrappedAttribute.newBuilder().attributeKey("generic.maxHealth"); diff --git a/src/main/java/me/libraryaddict/disguise/utilities/packets/packetlisteners/PacketListenerModdedClient.java b/src/main/java/me/libraryaddict/disguise/utilities/packets/packetlisteners/PacketListenerModdedClient.java index 70db4a97..8f45a65d 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/packets/packetlisteners/PacketListenerModdedClient.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/packets/packetlisteners/PacketListenerModdedClient.java @@ -14,7 +14,6 @@ import io.netty.buffer.Unpooled; import io.netty.handler.codec.DecoderException; import me.libraryaddict.disguise.LibsDisguises; import me.libraryaddict.disguise.utilities.modded.ModdedManager; -import net.minecraft.server.v1_15_R1.PacketDataSerializer; import org.bukkit.entity.Player; import java.lang.reflect.InvocationTargetException; @@ -141,15 +140,16 @@ public class PacketListenerModdedClient extends PacketAdapter { PacketContainer packet1 = new PacketContainer(PacketType.Login.Server.CUSTOM_PAYLOAD); packet1.getIntegers().write(0, packetId1); packet1.getMinecraftKeys().write(0, new com.comphenix.protocol.wrappers.MinecraftKey("fml", "handshake")); - packet1.getModifier() - .write(2, new PacketDataSerializer(Unpooled.wrappedBuffer(ModdedManager.getFmlHandshake()))); + // packet1.getModifier() + // .write(2, new PacketDataSerializer(Unpooled.wrappedBuffer(ModdedManager.getFmlHandshake()))); PacketContainer packet2 = new PacketContainer(PacketType.Login.Server.CUSTOM_PAYLOAD); packet2.getIntegers().write(0, packetId2); packet2.getMinecraftKeys().write(0, new MinecraftKey("fml", "handshake")); - packet2.getModifier() - .write(2, new PacketDataSerializer(Unpooled.wrappedBuffer(ModdedManager.getFmlRegistries()))); + // packet2.getModifier() + // .write(2, new PacketDataSerializer(Unpooled.wrappedBuffer(ModdedManager.getFmlRegistries()))); + //TODO try { ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet1); ProtocolLibrary.getProtocolManager().sendServerPacket(event.getPlayer(), packet2); diff --git a/src/main/java/me/libraryaddict/disguise/utilities/reflection/NmsVersion.java b/src/main/java/me/libraryaddict/disguise/utilities/reflection/NmsVersion.java index d0d92be5..2118f0c3 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/reflection/NmsVersion.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/reflection/NmsVersion.java @@ -7,7 +7,8 @@ public enum NmsVersion { v1_12, v1_13, v1_14, - v1_15; + v1_15, + v1_16; /** * If this nms version isn't newer than the running version diff --git a/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManager.java b/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManager.java index eb4ea2cb..b4702f84 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManager.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManager.java @@ -100,10 +100,15 @@ public class ReflectionManager { pingField = getNmsField("EntityPlayer", "ping"); if (NmsVersion.v1_14.isSupported()) { - chunkProviderField = getNmsField("World", "chunkProvider"); chunkMapField = getNmsField("ChunkProviderServer", "playerChunkMap"); trackedEntitiesField = getNmsField("PlayerChunkMap", "trackedEntities"); entityTrackerField = getNmsField("PlayerChunkMap$EntityTracker", "trackerEntry"); + + if (NmsVersion.v1_16.isSupported()) { + chunkProviderField = getNmsField("WorldServer", "chunkProvider"); + } else { + chunkProviderField = getNmsField("World", "chunkProvider"); + } } else { trackerField = getNmsField("WorldServer", "tracker"); entitiesField = getNmsField("EntityTracker", "trackedEntities"); @@ -1348,8 +1353,14 @@ public class ReflectionManager { Constructor c = getNmsClass("EntityTypes").getConstructors()[0]; + Object entityType; + // UGLY :D - Object entityType = c.newInstance(null, null, false, false, false, false, null); + if (NmsVersion.v1_16.isSupported()) { + entityType = c.newInstance(null, null, false, false, false, false, null, null, 0, 0); + } else { + entityType = c.newInstance(null, null, false, false, false, false, null); + } for (Field f : entityType.getClass().getDeclaredFields()) { if (f.getType() != String.class) { @@ -1564,6 +1575,7 @@ public class ReflectionManager { case PIG_ZOMBIE: case HUSK: case DROWNED: + case ZOMBIFIED_PIGLIN: watcherClass = ZombieWatcher.class; break; case MAGMA_CUBE: @@ -1735,6 +1747,9 @@ public class ReflectionManager { case TRADER_LLAMA: nmsEntityName = "LLamaTrader"; // Interesting capitalization break; + case ZOMBIFIED_PIGLIN: + nmsEntityName = "PigZombie"; + break; default: break; } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/sounds/DisguiseSoundEnums.java b/src/main/java/me/libraryaddict/disguise/utilities/sounds/DisguiseSoundEnums.java index 5ac94199..b7f2ef96 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/sounds/DisguiseSoundEnums.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/sounds/DisguiseSoundEnums.java @@ -91,6 +91,9 @@ public enum DisguiseSoundEnums { new Sound[]{Sound.ENTITY_GUARDIAN_DEATH, Sound.ENTITY_GUARDIAN_DEATH_LAND}, new Sound[]{Sound.ENTITY_GUARDIAN_AMBIENT, Sound.ENTITY_GUARDIAN_AMBIENT_LAND}, Sound.ENTITY_GUARDIAN_FLOP), + HOGLIN(Sound.ENTITY_HOGLIN_HURT, Sound.ENTITY_HOGLIN_STEP, Sound.ENTITY_HOGLIN_DEATH, Sound.ENTITY_HOGLIN_AMBIENT, + Sound.ENTITY_HOGLIN_CONVERTED_TO_ZOMBIFIED, Sound.ENTITY_HOGLIN_ANGRY, Sound.ENTITY_HOGLIN_RETREAT), + HORSE(Sound.ENTITY_HORSE_HURT, new Sound[]{Sound.ENTITY_HORSE_STEP, Sound.ENTITY_HORSE_STEP_WOOD}, Sound.ENTITY_HORSE_DEATH, Sound.ENTITY_HORSE_AMBIENT, Sound.ENTITY_HORSE_GALLOP, Sound.ENTITY_HORSE_SADDLE, Sound.ENTITY_DONKEY_ANGRY, Sound.ENTITY_HORSE_ARMOR, Sound.ENTITY_HORSE_LAND, Sound.ENTITY_HORSE_JUMP, @@ -129,8 +132,12 @@ public enum DisguiseSoundEnums { PIG(Sound.ENTITY_PIG_HURT, Sound.ENTITY_PIG_STEP, Sound.ENTITY_PIG_DEATH, Sound.ENTITY_PIG_AMBIENT), - PIG_ZOMBIE(Sound.ENTITY_ZOMBIE_PIGMAN_HURT, null, Sound.ENTITY_ZOMBIE_PIGMAN_DEATH, - Sound.ENTITY_ZOMBIE_PIGMAN_AMBIENT, Sound.ENTITY_ZOMBIE_PIGMAN_ANGRY), + PIGLIN(Sound.ENTITY_PIGLIN_HURT, Sound.ENTITY_PIGLIN_STEP, Sound.ENTITY_PIGLIN_DEATH, Sound.ENTITY_PIGLIN_AMBIENT, + Sound.ENTITY_PIGLIN_RETREAT, Sound.ENTITY_PIGLIN_JEALOUS, Sound.ENTITY_PIGLIN_ADMIRING_ITEM, + Sound.ENTITY_PIGLIN_CELEBRATE), + + PIG_ZOMBIE("ENTITY_ZOMBIE_PIGMAN_HURT", null, "ENTITY_ZOMBIE_PIGMAN_DEATH", "ENTITY_ZOMBIE_PIGMAN_AMBIENT", + "ENTITY_ZOMBIE_PIGMAN_ANGRY"), PLAYER(Sound.ENTITY_PLAYER_HURT, Arrays.stream(Sound.values()) .filter(sound -> sound.name().startsWith("BLOCK_") && sound.name().endsWith("_STEP")).toArray(Sound[]::new), @@ -185,15 +192,21 @@ public enum DisguiseSoundEnums { STRAY(Sound.ENTITY_STRAY_HURT, Sound.ENTITY_STRAY_STEP, Sound.ENTITY_STRAY_DEATH, Sound.ENTITY_STRAY_AMBIENT), + STRIDER(Sound.ENTITY_STRIDER_HURT, new Sound[]{Sound.ENTITY_STRIDER_STEP, Sound.ENTITY_STRIDER_STEP_LAVA}, + Sound.ENTITY_STRIDER_DEATH, Sound.ENTITY_STRIDER_AMBIENT, Sound.ENTITY_STRIDER_EAT, + Sound.ENTITY_STRIDER_HAPPY, Sound.ENTITY_STRIDER_RETREAT, Sound.ENTITY_STRIDER_SADDLE), + SQUID(Sound.ENTITY_SQUID_HURT, null, Sound.ENTITY_SQUID_DEATH, Sound.ENTITY_SQUID_AMBIENT, Sound.ENTITY_SQUID_SQUIRT, Sound.ENTITY_FISH_SWIM), TROPICAL_FISH(Sound.ENTITY_TROPICAL_FISH_HURT, null, Sound.ENTITY_TROPICAL_FISH_DEATH, Sound.ENTITY_TROPICAL_FISH_AMBIENT, Sound.ENTITY_TROPICAL_FISH_FLOP, Sound.ENTITY_FISH_SWIM), - TURTLE(new Sound[]{Sound.ENTITY_TURTLE_HURT, Sound.ENTITY_TURTLE_HURT_BABY}, - new Sound[]{Sound.ENTITY_TURTLE_SHAMBLE, Sound.ENTITY_TURTLE_SHAMBLE_BABY}, - new Sound[]{Sound.ENTITY_TURTLE_DEATH, Sound.ENTITY_TURTLE_DEATH_BABY}, Sound.ENTITY_TURTLE_AMBIENT_LAND, + TURTLE(new Sound[]{Sound.ENTITY_TURTLE_HURT, Sound.ENTITY_TURTLE_HURT_BABY}, new Sound[] + + {Sound.ENTITY_TURTLE_SHAMBLE, Sound.ENTITY_TURTLE_SHAMBLE_BABY}, new Sound[] + + {Sound.ENTITY_TURTLE_DEATH, Sound.ENTITY_TURTLE_DEATH_BABY}, Sound.ENTITY_TURTLE_AMBIENT_LAND, Sound.ENTITY_TURTLE_LAY_EGG), VEX(Sound.ENTITY_VEX_HURT, null, Sound.ENTITY_VEX_DEATH, Sound.ENTITY_VEX_AMBIENT, Sound.ENTITY_VEX_CHARGE), @@ -216,6 +229,9 @@ public enum DisguiseSoundEnums { Sound.ENTITY_WOLF_GROWL, Sound.ENTITY_WOLF_PANT, Sound.ENTITY_WOLF_HOWL, Sound.ENTITY_WOLF_SHAKE, Sound.ENTITY_WOLF_WHINE), + ZOGLIN(Sound.ENTITY_ZOGLIN_HURT, Sound.ENTITY_ZOGLIN_STEP, Sound.ENTITY_ZOGLIN_DEATH, Sound.ENTITY_ZOGLIN_AMBIENT, + Sound.ENTITY_ZOGLIN_ANGRY, Sound.ENTITY_ZOGLIN_ATTACK), + ZOMBIE(Sound.ENTITY_ZOMBIE_HURT, Sound.ENTITY_ZOMBIE_STEP, Sound.ENTITY_ZOMBIE_DEATH, Sound.ENTITY_ZOMBIE_AMBIENT, Sound.ENTITY_ZOMBIE_INFECT, Sound.ENTITY_ZOMBIE_ATTACK_WOODEN_DOOR, Sound.ENTITY_ZOMBIE_BREAK_WOODEN_DOOR, Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR), @@ -228,9 +244,14 @@ public enum DisguiseSoundEnums { ZOMBIE_VILLAGER(Sound.ENTITY_ZOMBIE_VILLAGER_HURT, Sound.ENTITY_ZOMBIE_VILLAGER_STEP, Sound.ENTITY_ZOMBIE_VILLAGER_DEATH, Sound.ENTITY_ZOMBIE_VILLAGER_AMBIENT, Sound.ENTITY_ZOMBIE_INFECT, Sound.ENTITY_ZOMBIE_ATTACK_WOODEN_DOOR, Sound.ENTITY_ZOMBIE_BREAK_WOODEN_DOOR, - Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR); + Sound.ENTITY_ZOMBIE_ATTACK_IRON_DOOR), + + ZOMBIIFIED_PIGLIN(Sound.ENTITY_ZOMBIFIED_PIGLIN_HURT, null, Sound.ENTITY_ZOMBIFIED_PIGLIN_DEATH, + Sound.ENTITY_ZOMBIFIED_PIGLIN_AMBIENT, Sound.ENTITY_ZOMBIFIED_PIGLIN_ANGRY, + Sound.ENTITY_PIGLIN_CONVERTED_TO_ZOMBIFIED); + @Getter - private HashMap sounds = new HashMap<>(); + private HashMap sounds = new HashMap<>(); DisguiseSoundEnums(Object hurt, Object step, Object death, Object idle, Object... sounds) { if (LibsDisguises.getInstance() != null) { @@ -262,12 +283,26 @@ public enum DisguiseSoundEnums { } } else if (sound instanceof Sound) { addSound((Sound) sound, type); + } else if (sound instanceof String[]) { + for (String s : (String[]) sound) { + if (s == null) { + continue; + } + + addSound(s, type); + } + } else if (sound instanceof String) { + addSound((String) sound, type); } else { throw new IllegalArgumentException("Was given an unknown object " + sound); } } private void addSound(Sound sound, SoundType type) { + addSound(sound.name(), type); + } + + private void addSound(String sound, SoundType type) { sounds.put(sound, type); } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/watchers/CompileMethods.java b/src/main/java/me/libraryaddict/disguise/utilities/watchers/CompileMethods.java index db5d5c15..2576b23c 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/watchers/CompileMethods.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/watchers/CompileMethods.java @@ -46,7 +46,7 @@ public class CompileMethods { int i = 0; - for (Map.Entry entry : e.getSounds().entrySet()) { + for (Map.Entry entry : e.getSounds().entrySet()) { if (entry.getValue() != type) { continue; } @@ -55,7 +55,7 @@ public class CompileMethods { sound.append(","); } - sound.append(entry.getKey().name()); + sound.append(entry.getKey()); } }