From b0cbf622df6aa733c6405aca1efece0af0e9d989 Mon Sep 17 00:00:00 2001 From: Lixfel Date: Tue, 28 Sep 2021 18:25:45 +0200 Subject: [PATCH] Full TinyProtocol implementation (it initializes on 1.15, further untested) Signed-off-by: Lixfel --- .../fightsystem/utils/BlockIdWrapper8.java | 2 +- .../fightsystem/utils/BountifulWrapper9.java | 8 +++--- .../de/steamwar/fightsystem/FightSystem.java | 2 ++ .../de/steamwar/fightsystem/fight/Fight.java | 19 ++++++-------- .../steamwar/fightsystem/record/REntity.java | 25 +++++++++++-------- .../steamwar/fightsystem/utils/TechHider.java | 4 +-- FightSystem_Core/src/plugin.yml | 2 +- 7 files changed, 33 insertions(+), 29 deletions(-) diff --git a/FightSystem_8/src/de/steamwar/fightsystem/utils/BlockIdWrapper8.java b/FightSystem_8/src/de/steamwar/fightsystem/utils/BlockIdWrapper8.java index 41d95f0..e338878 100644 --- a/FightSystem_8/src/de/steamwar/fightsystem/utils/BlockIdWrapper8.java +++ b/FightSystem_8/src/de/steamwar/fightsystem/utils/BlockIdWrapper8.java @@ -54,6 +54,6 @@ public class BlockIdWrapper8 implements BlockIdWrapper.IBlockIdWrapper { @Override public Object getPose(boolean sneaking) { - return sneaking ? (byte) 2 : (byte) 0; + return Byte.valueOf((byte)(sneaking ? 2 : 0)); } } diff --git a/FightSystem_9/src/de/steamwar/fightsystem/utils/BountifulWrapper9.java b/FightSystem_9/src/de/steamwar/fightsystem/utils/BountifulWrapper9.java index 476e04c..dc7dbee 100644 --- a/FightSystem_9/src/de/steamwar/fightsystem/utils/BountifulWrapper9.java +++ b/FightSystem_9/src/de/steamwar/fightsystem/utils/BountifulWrapper9.java @@ -132,8 +132,8 @@ public class BountifulWrapper9 implements BountifulWrapper.IBountifulWrapper { private static final Reflection.ConstructorInvoker dataWatcherObjectConstructor = Reflection.getConstructor(dataWatcherObject, int.class, dataWatcherSerializer); @Override public Object getDataWatcherObject(int index, Class type) { - for(Field field : dataWatcherSerializer.getFields()) { - if(type.isAssignableFrom(field.getType()) && type.equals(((ParameterizedType) field.getType().getGenericSuperclass()).getActualTypeArguments()[0])) { + for(Field field : dataWatcherRegistry.getFields()) { + if(dataWatcherSerializer.isAssignableFrom(field.getType()) && type.equals(((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0])) { try { return dataWatcherObjectConstructor.invoke(index, field.get(null)); } catch (IllegalAccessException e) { @@ -144,7 +144,7 @@ public class BountifulWrapper9 implements BountifulWrapper.IBountifulWrapper { throw new SecurityException("Could not find Serializer for " + type.getName()); } - private static final Class item = Reflection.getClass("{nms}.DataWatcher.Item"); + private static final Class item = Reflection.getClass("{nms}.DataWatcher$Item"); private static final Reflection.ConstructorInvoker itemConstructor = Reflection.getConstructor(item, dataWatcherObject, Object.class); @Override public Object getDataWatcherItem(Object dwo, Object value) { @@ -168,7 +168,7 @@ public class BountifulWrapper9 implements BountifulWrapper.IBountifulWrapper { } private static final Class enumItemSlot = Reflection.getClass("{nms}.EnumItemSlot"); - private static final Reflection.FieldAccessor equipmentSlot = Reflection.getField(REntity.equipmentPacket, enumItemSlot, 1); + private static final Reflection.FieldAccessor equipmentSlot = Reflection.getField(REntity.equipmentPacket, enumItemSlot, 0); private static final Object[] itemSlots = enumItemSlot.getEnumConstants(); @Override public void setEquipmentPacketSlot(Object packet, String slot) { diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java index 12c713d..8c977c4 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/FightSystem.java @@ -140,6 +140,8 @@ public class FightSystem extends JavaPlugin { getLogger().log(Level.SEVERE, "Failed to replace commands", e); } + REntity.initWatchers(); + if(Config.mode == ArenaMode.EVENT) { setPreSchemState(); }else if(Config.mode == ArenaMode.CHECK){ diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java b/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java index b08c3f6..80129fb 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/fight/Fight.java @@ -132,30 +132,27 @@ public class Fight { private static final Class playerInfoPacket = Reflection.getClass("{nms}.PacketPlayOutPlayerInfo"); private static final Reflection.ConstructorInvoker playerInfoConstructor = Reflection.getConstructor(playerInfoPacket); - private static final Class playerInfoActionClass = Reflection.getClass("{nms}.PacketPlayOutPlayerInfo.PlayerInfoAction"); + private static final Class playerInfoActionClass = Reflection.getClass("{nms}.PacketPlayOutPlayerInfo$EnumPlayerInfoAction"); public static final Object addPlayer = playerInfoActionClass.getEnumConstants()[0]; private static final Reflection.FieldAccessor playerInfoAction = Reflection.getField(playerInfoPacket, playerInfoActionClass, 0); private static final Object updateGamemode = playerInfoActionClass.getEnumConstants()[1]; public static final Object removePlayer = playerInfoActionClass.getEnumConstants()[4]; private static final Reflection.FieldAccessor playerInfoData = Reflection.getField(playerInfoPacket, List.class, 0); - private static final Class playerInfoDataClass = Reflection.getClass("{nms}.PacketPlayOutPlayerInfo.PlayerInfoData"); - private static final Class enumGamemode = Reflection.getClass(Core.getVersion() > 9 ? "{nms}.EnumGamemode" : "{nms}.WorldSettings.EnumGamemode"); + private static final Class playerInfoDataClass = Reflection.getClass("{nms}.PacketPlayOutPlayerInfo$PlayerInfoData"); + private static final Class enumGamemode = Reflection.getClass(Core.getVersion() > 9 ? "{nms}.EnumGamemode" : "{nms}.WorldSettings$EnumGamemode"); public static final Object creative = enumGamemode.getEnumConstants()[2]; private static final Object spectator = enumGamemode.getEnumConstants()[4]; private static final Class iChatBaseComponent = Reflection.getClass("{nms}.IChatBaseComponent"); - private static final Reflection.ConstructorInvoker playerInfoDataConstructor = Reflection.getConstructor(playerInfoDataClass, GameProfile.class, int.class, enumGamemode, iChatBaseComponent); + + private static final Reflection.ConstructorInvoker playerInfoDataConstructor = Reflection.getConstructor(playerInfoDataClass, playerInfoPacket, GameProfile.class, int.class, enumGamemode, iChatBaseComponent); public static void pseudoSpectator(Player player, boolean enable) { - ProtocolAPI.tinyProtocol.sendPacket(player, playerInfoPacket(updateGamemode, playerInfoData(new GameProfile(player.getUniqueId(), player.getName()), enable ? creative : spectator))); + ProtocolAPI.tinyProtocol.sendPacket(player, playerInfoPacket(updateGamemode, new GameProfile(player.getUniqueId(), player.getName()), enable ? creative : spectator)); } - public static Object playerInfoData(GameProfile profile, Object mode) { - return playerInfoDataConstructor.invoke(profile, 0, mode, null); - } - - public static Object playerInfoPacket(Object action, Object info) { + public static Object playerInfoPacket(Object action, GameProfile profile, Object mode) { Object packet = playerInfoConstructor.invoke(); playerInfoAction.set(packet, action); - playerInfoData.set(packet, Collections.singletonList(info)); + playerInfoData.set(packet, Collections.singletonList(playerInfoDataConstructor.invoke(packet, profile, 0, mode, null))); return packet; } diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/record/REntity.java b/FightSystem_Core/src/de/steamwar/fightsystem/record/REntity.java index fde6d68..e78bff9 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/record/REntity.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/record/REntity.java @@ -47,7 +47,17 @@ public class REntity { return entities.get(internalId); } - private static final Object entityStatusWatcher = BountifulWrapper.impl.getDataWatcherObject(0, byte.class); + private static Object entityStatusWatcher; + private static Object sneakingDataWatcher; + private static Object bowDrawnWatcher; + public static void initWatchers() { + // not during to prevent cyclic class init. + entityStatusWatcher = BountifulWrapper.impl.getDataWatcherObject(0, Byte.class); + sneakingDataWatcher = BountifulWrapper.impl.getDataWatcherObject(Core.getVersion() > 12 ? 6 : 0, BlockIdWrapper.impl.getPose(true).getClass()); + bowDrawnWatcher = BountifulWrapper.impl.getDataWatcherObject(Core.getVersion() > 12 ? 7 : 6, Byte.class); + } + + public static void tickFire() { entities.forEach((integer, entity) -> { if(entity.fireTick > 0) { @@ -59,7 +69,6 @@ public class REntity { }); } - private static final Object sneakingDataWatcher = BountifulWrapper.impl.getDataWatcherObject(Core.getVersion() > 12 ? 6 : 0, BlockIdWrapper.impl.getPose(true).getClass()); public static void playerJoins(Player player) { for(REntity entity : entities.values()){ if(entity.entityType == EntityType.PLAYER){ @@ -106,7 +115,6 @@ public class REntity { private final int entityId; private final UUID uuid; private final EntityType entityType; - private final Object playerInfoData; private final String name; private final Map itemSlots = new HashMap<>(); @@ -127,7 +135,6 @@ public class REntity { SteamwarUser user = SteamwarUser.get(userId); this.uuid = user.getUUID(); this.name = user.getUserName(); - this.playerInfoData = Fight.playerInfoData(new GameProfile(uuid, name), Fight.creative); entities.put(internalId, this); ProtocolAPI.broadcastPacket(getPlayerInfoPacket()); @@ -140,7 +147,6 @@ public class REntity { this.entityType = entityType; this.entityId = entityCount--; this.name = null; - this.playerInfoData = null; this.uuid = new UUID(random.nextLong() & -61441L | 16384L, random.nextLong() & 4611686018427387903L | -9223372036854775808L); entities.put(internalId, this); @@ -210,7 +216,6 @@ public class REntity { ProtocolAPI.broadcastPacket(getDataWatcherPacket(entityStatusWatcher, (byte) 1)); } - private static final Object bowDrawnWatcher = BountifulWrapper.impl.getDataWatcherObject(Core.getVersion() > 12 ? 7 : 6, byte.class); public void setBowDrawn(boolean drawn, boolean offHand) { if(Core.getVersion() > 8){ ProtocolAPI.broadcastPacket(getDataWatcherPacket(bowDrawnWatcher, (byte) ((drawn ? 1 : 0) + (offHand ? 2 : 0)))); @@ -238,7 +243,7 @@ public class REntity { private static final Reflection.FieldAccessor destroyEntities = Reflection.getField(destroyPacket, int[].class, 0); private void broadcastDeath(){ if(entityType == EntityType.PLAYER){ - ProtocolAPI.broadcastPacket(Fight.playerInfoPacket(Fight.removePlayer, playerInfoData)); + ProtocolAPI.broadcastPacket(Fight.playerInfoPacket(Fight.removePlayer, new GameProfile(uuid, name), Fight.creative)); team.removeEntry(name); } @@ -303,8 +308,8 @@ public class REntity { private static final Reflection.FieldAccessor equipmentEntity = Reflection.getField(equipmentPacket, int.class, 0); private static final Class itemStack = Reflection.getClass("{nms}.ItemStack"); private static final Reflection.FieldAccessor equipmentStack = Reflection.getField(equipmentPacket, itemStack, 0); - private static final Class craftItemStack = Reflection.getClass("{obc}.CraftItemStack"); - private static final Reflection.MethodInvoker asNMSCopy = Reflection.getTypedMethod(craftItemStack, "asNMSCopy", itemStack, craftItemStack); + private static final Class craftItemStack = Reflection.getClass("{obc}.inventory.CraftItemStack"); + private static final Reflection.MethodInvoker asNMSCopy = Reflection.getTypedMethod(craftItemStack, "asNMSCopy", itemStack, ItemStack.class); private Object getEquipmentPacket(String slot, ItemStack stack){ Object packet = equipmentConstructor.invoke(); equipmentEntity.set(0, entityId); @@ -314,7 +319,7 @@ public class REntity { } private Object getPlayerInfoPacket(){ - return Fight.playerInfoPacket(Fight.addPlayer, playerInfoData); + return Fight.playerInfoPacket(Fight.addPlayer, new GameProfile(uuid, name), Fight.creative); } public static final Class namedSpawnPacket = Reflection.getClass("{nms}.PacketPlayOutNamedEntitySpawn"); diff --git a/FightSystem_Core/src/de/steamwar/fightsystem/utils/TechHider.java b/FightSystem_Core/src/de/steamwar/fightsystem/utils/TechHider.java index 085ffc7..ae5a6ef 100644 --- a/FightSystem_Core/src/de/steamwar/fightsystem/utils/TechHider.java +++ b/FightSystem_Core/src/de/steamwar/fightsystem/utils/TechHider.java @@ -145,11 +145,11 @@ public class TechHider extends StateDependent { private static final Reflection.FieldAccessor multiBlockChangeChunk = Reflection.getField(multiBlockChangePacket, chunkCoordinateIntPair, 0); private static final Reflection.FieldAccessor chunkCoordinateX = Reflection.getField(baseBlockPosition, int.class, 0); private static final Reflection.FieldAccessor chunkCoordinateZ = Reflection.getField(baseBlockPosition, int.class, 1); - private static final Class multiBlockChangeInfo = Reflection.getClass("{nms}.PacketPlayOutMultiBlockChange.MultiBlockChangeInfo"); + private static final Class multiBlockChangeInfo = Reflection.getClass("{nms}.PacketPlayOutMultiBlockChange$MultiBlockChangeInfo"); private static final UnaryOperator multiBlockChangeInfoCloner = ProtocolAPI.shallowCloneGenerator(multiBlockChangeInfo); private static final BiFunction, Object> multiBlockChangeInfoArrayCloner = ProtocolAPI.arrayCloneGenerator(multiBlockChangeInfo); private static final Reflection.FieldAccessor multiBlockChangeInfoBlock = Reflection.getField(multiBlockChangeInfo, iBlockData, 0); - private static final Class multiBlockChangeInfoArray = Reflection.getClass("[L{nms}.PacketPlayOutMultiBlockChange.MultiBlockChangeInfo;"); + private static final Class multiBlockChangeInfoArray = Reflection.getClass("[L{nms}.PacketPlayOutMultiBlockChange$MultiBlockChangeInfo;"); private static final Reflection.FieldAccessor multiBlockChangeInfos = Reflection.getField(multiBlockChangePacket, multiBlockChangeInfoArray, 0); private Object multiBlockChangeHider(Player p, Object packet) { Object chunkCoords = multiBlockChangeChunk.get(packet); diff --git a/FightSystem_Core/src/plugin.yml b/FightSystem_Core/src/plugin.yml index 88fbbec..066b5aa 100644 --- a/FightSystem_Core/src/plugin.yml +++ b/FightSystem_Core/src/plugin.yml @@ -4,7 +4,7 @@ authors: - Yaruma3341 - Lixfel main: de.steamwar.fightsystem.FightSystem -depend: [SpigotCore, WorldEdit, ProtocolLib] +depend: [SpigotCore, WorldEdit] api-version: "1.13" commands: