From e0744cb7360c4874e42c6b1f375487da3b40c5c6 Mon Sep 17 00:00:00 2001 From: Badbird5907 <50347938+Badbird5907@users.noreply.github.com> Date: Tue, 20 Jun 2023 18:49:29 -0400 Subject: [PATCH] Fix some packet entity data crap, fixes #61 --- .../main/java/net/nuggetmc/tplus/bot/Bot.java | 4 +- .../net/nuggetmc/tplus/utils/NMSUtils.java | 42 +++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/utils/NMSUtils.java diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/Bot.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/Bot.java index 505a72f..d7a71ca 100644 --- a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/Bot.java +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/bot/Bot.java @@ -26,7 +26,6 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import net.nuggetmc.tplus.TerminatorPlus; import net.nuggetmc.tplus.api.Terminator; -import net.nuggetmc.tplus.api.TerminatorPlusAPI; import net.nuggetmc.tplus.api.agent.Agent; import net.nuggetmc.tplus.api.agent.legacyagent.LegacyMats; import net.nuggetmc.tplus.api.agent.legacyagent.ai.NeuralNetwork; @@ -34,6 +33,7 @@ import net.nuggetmc.tplus.api.event.BotDamageByPlayerEvent; import net.nuggetmc.tplus.api.event.BotFallDamageEvent; import net.nuggetmc.tplus.api.event.BotKilledByPlayerEvent; import net.nuggetmc.tplus.api.utils.*; +import net.nuggetmc.tplus.utils.NMSUtils; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; @@ -208,7 +208,7 @@ public class Bot extends ServerPlayer implements Terminator { new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER, this), new ClientboundAddPlayerPacket(this), //new ClientboundSetEntityDataPacket(this.getId(), this.entityData, true), - new ClientboundSetEntityDataPacket(this.getId(), this.entityData.packDirty()), + new ClientboundSetEntityDataPacket(this.getId(), NMSUtils.getEntityData(this.entityData)), new ClientboundRotateHeadPacket(this, (byte) ((this.yHeadRot * 256f) / 360f)) }; } diff --git a/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/utils/NMSUtils.java b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/utils/NMSUtils.java new file mode 100644 index 0000000..8c9a49b --- /dev/null +++ b/TerminatorPlus-Plugin/src/main/java/net/nuggetmc/tplus/utils/NMSUtils.java @@ -0,0 +1,42 @@ +package net.nuggetmc.tplus.utils; + +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import net.minecraft.network.syncher.SynchedEntityData; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.List; + +public class NMSUtils { + private static String itemsByIdFieldName; + static { + // find a private final field in SynchedEntityData that is an Int2ObjectMap + Class clazz = SynchedEntityData.class; + Field[] fields = clazz.getDeclaredFields(); + for (Field field : fields) { + if (field.getType().equals(Int2ObjectMap.class) && Modifier.isPrivate(field.getModifiers()) && Modifier.isFinal(field.getModifiers())) { + itemsByIdFieldName = field.getName(); + break; + } + } + if (itemsByIdFieldName == null) { + throw new RuntimeException("Could not find itemsById field in SynchedEntityData"); + } + } + public static List> getEntityData(SynchedEntityData synchedEntityData) { + Int2ObjectMap map = null; + try { + Field field = synchedEntityData.getClass().getDeclaredField(itemsByIdFieldName); + field.setAccessible(true); + map = (Int2ObjectMap) field.get(synchedEntityData); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + List> entityData = new ArrayList<>(); + for (SynchedEntityData.DataItem dataItem : map.values()) { + entityData.add(dataItem .value()); + } + return entityData; + } +}