From 1e68eeb74dcffa6dbf1c1c86eb3ff18a8bd20281 Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Sat, 15 May 2021 16:29:09 +1200 Subject: [PATCH] Change falling block to store the combined block id to fix older versions with blockdata --- .../watchers/FallingBlockWatcher.java | 34 +++++++++---------- .../packethandlers/PacketHandlerSpawn.java | 9 +---- .../reflection/ReflectionManager.java | 12 +++++-- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java index f20b8631..4700f883 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java @@ -4,6 +4,7 @@ import com.comphenix.protocol.PacketType; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.reflect.StructureModifier; +import lombok.Getter; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; @@ -21,8 +22,7 @@ import org.bukkit.inventory.ItemStack; import java.lang.reflect.InvocationTargetException; public class FallingBlockWatcher extends FlagWatcher { - private ItemStack block = new ItemStack(Material.STONE); - private BlockData blockData; + private int blockCombinedId = 1; private boolean gridLocked; public FallingBlockWatcher(Disguise disguise) { @@ -60,8 +60,7 @@ public class FallingBlockWatcher extends FlagWatcher { relMove.getModifier().write(0, getDisguise().getEntity().getEntityId()); shorts.write(0, conRel(loc.getX(), loc.getBlockX() + 0.5)); - shorts.write(1, conRel(loc.getY(), - loc.getBlockY() + (loc.getY() % 1 >= 0.85 ? 1 : loc.getY() % 1 >= 0.35 ? .5 : 0))); + shorts.write(1, conRel(loc.getY(), loc.getBlockY() + (loc.getY() % 1 >= 0.85 ? 1 : loc.getY() % 1 >= 0.35 ? .5 : 0))); shorts.write(2, conRel(loc.getZ(), loc.getBlockZ() + 0.5)); try { @@ -86,7 +85,7 @@ public class FallingBlockWatcher extends FlagWatcher { } public ItemStack getBlock() { - return block; + return ReflectionManager.getItemStackByCombinedId(getBlockCombinedId()); } public void setBlock(ItemStack block) { @@ -94,12 +93,11 @@ public class FallingBlockWatcher extends FlagWatcher { block = new ItemStack(Material.STONE); } - this.block = block; + this.blockCombinedId = ReflectionManager.getCombinedIdByItemStack(block); if (!getDisguise().isCustomDisguiseName()) { getDisguise().setDisguiseName(TranslateType.DISGUISE_OPTIONS_PARAMETERS.get("Block") + " " + - TranslateType.DISGUISE_OPTIONS_PARAMETERS - .get(ReflectionManager.toReadable(block.getType().name(), " "))); + TranslateType.DISGUISE_OPTIONS_PARAMETERS.get(ReflectionManager.toReadable(block.getType().name(), " "))); } if (DisguiseAPI.isDisguiseInUse(getDisguise()) && getDisguise().getWatcher() == this) { @@ -109,11 +107,7 @@ public class FallingBlockWatcher extends FlagWatcher { @NmsAddedIn(NmsVersion.v1_13) public BlockData getBlockData() { - if (block != null && blockData == null) { - return block.getType().createBlockData(); - } - - return blockData; + return ReflectionManager.getBlockDataByCombinedId(getBlockCombinedId()); } @NmsAddedIn(NmsVersion.v1_13) @@ -123,17 +117,23 @@ public class FallingBlockWatcher extends FlagWatcher { return; } - this.block = new ItemStack(data.getMaterial()); - this.blockData = data; + this.blockCombinedId = ReflectionManager.getCombinedIdByBlockData(data); if (!getDisguise().isCustomDisguiseName()) { getDisguise().setDisguiseName(TranslateType.DISGUISE_OPTIONS_PARAMETERS.get("Block") + " " + - TranslateType.DISGUISE_OPTIONS_PARAMETERS - .get(ReflectionManager.toReadable(block.getType().name(), " "))); + TranslateType.DISGUISE_OPTIONS_PARAMETERS.get(ReflectionManager.toReadable(data.getMaterial().name(), " "))); } if (DisguiseAPI.isDisguiseInUse(getDisguise()) && getDisguise().getWatcher() == this) { DisguiseUtilities.refreshTrackers(getDisguise()); } } + + public int getBlockCombinedId() { + if (blockCombinedId < 1) { + blockCombinedId = 1; + } + + return blockCombinedId; + } } 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 89b2c66c..7384bf46 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 @@ -292,14 +292,7 @@ public class PacketHandlerSpawn implements IPacketHandler { double z = loc.getZ(); if (disguise.getType() == DisguiseType.FALLING_BLOCK) { - if (NmsVersion.v1_13.isSupported()) { - BlockData block = ((FallingBlockWatcher) disguise.getWatcher()).getBlockData(); - - data = ReflectionManager.getCombinedIdByBlockData(block); - } else { - ItemStack block = ((FallingBlockWatcher) disguise.getWatcher()).getBlock(); - data = ReflectionManager.getCombinedIdByItemStack(block); - } + data = ((FallingBlockWatcher) disguise.getWatcher()).getBlockCombinedId(); if (((FallingBlockWatcher) disguise.getWatcher()).isGridLocked()) { double yMod = disguise.getWatcher().getYModifier(); 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 f662bfcf..d87ab256 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManager.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManager.java @@ -26,6 +26,7 @@ import org.bukkit.entity.*; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.material.MaterialData; import org.bukkit.plugin.SimplePluginManager; import org.bukkit.potion.PotionEffect; import org.bukkit.scheduler.BukkitRunnable; @@ -94,6 +95,7 @@ public class ReflectionManager { private static Method craftBlockDataGetState; private static Method getOldItemAsBlock; private static Method magicGetBlock; + private static Method magicGetMaterial; private static Method getNmsItem; private static Method getBlockData; private static Method getBlockDataAsId; @@ -160,6 +162,7 @@ public class ReflectionManager { if (NmsVersion.v1_13.isSupported()) { craftBlockDataGetState = getCraftMethod("block.data.CraftBlockData", "getState"); magicGetBlock = getCraftMethod("util.CraftMagicNumbers", "getBlock", Material.class); + magicGetMaterial = getCraftMethod("util.CraftMagicNumbers", "getMaterial", getNmsClass("Block")); entityTypesAMethod = getNmsMethod("EntityTypes", "a", String.class); if (NmsVersion.v1_14.isSupported()) { @@ -1566,12 +1569,17 @@ public class ReflectionManager { try { Method idMethod = getNmsMethod("Block", "getByCombinedId", int.class); Object iBlockData = idMethod.invoke(null, id); + Class iBlockClass = getNmsClass("IBlockData"); - Method getBlock = getNmsMethod(iBlockClass, "getBlock"); + Method getBlock = getNmsMethod(NmsVersion.v1_16.isSupported() ? iBlockClass.getSuperclass() : iBlockClass, "getBlock"); Object block = getBlock.invoke(iBlockData); - Method getItem = getNmsMethod("Block", "t", iBlockClass); + if (NmsVersion.v1_13.isSupported()) { + return new ItemStack((Material) magicGetMaterial.invoke(null, block)); + } + + Method getItem = getNmsMethod("Block", "u", iBlockClass); return getBukkitItem(getItem.invoke(block, iBlockData)); } catch (Exception ex) {