Fix some packet entity data crap, fixes #61
This commit is contained in:
@@ -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))
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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<SynchedEntityData.DataItem>
|
||||
Class<SynchedEntityData> 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<SynchedEntityData.DataValue<?>> getEntityData(SynchedEntityData synchedEntityData) {
|
||||
Int2ObjectMap<SynchedEntityData.DataItem> map = null;
|
||||
try {
|
||||
Field field = synchedEntityData.getClass().getDeclaredField(itemsByIdFieldName);
|
||||
field.setAccessible(true);
|
||||
map = (Int2ObjectMap<SynchedEntityData.DataItem>) field.get(synchedEntityData);
|
||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
List<SynchedEntityData.DataValue<?>> entityData = new ArrayList<>();
|
||||
for (SynchedEntityData.DataItem<?> dataItem : map.values()) {
|
||||
entityData.add(dataItem .value());
|
||||
}
|
||||
return entityData;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user