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.minecraft.world.phys.Vec3;
|
||||||
import net.nuggetmc.tplus.TerminatorPlus;
|
import net.nuggetmc.tplus.TerminatorPlus;
|
||||||
import net.nuggetmc.tplus.api.Terminator;
|
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.Agent;
|
||||||
import net.nuggetmc.tplus.api.agent.legacyagent.LegacyMats;
|
import net.nuggetmc.tplus.api.agent.legacyagent.LegacyMats;
|
||||||
import net.nuggetmc.tplus.api.agent.legacyagent.ai.NeuralNetwork;
|
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.BotFallDamageEvent;
|
||||||
import net.nuggetmc.tplus.api.event.BotKilledByPlayerEvent;
|
import net.nuggetmc.tplus.api.event.BotKilledByPlayerEvent;
|
||||||
import net.nuggetmc.tplus.api.utils.*;
|
import net.nuggetmc.tplus.api.utils.*;
|
||||||
|
import net.nuggetmc.tplus.utils.NMSUtils;
|
||||||
import org.bukkit.*;
|
import org.bukkit.*;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.BlockFace;
|
import org.bukkit.block.BlockFace;
|
||||||
@@ -208,7 +208,7 @@ public class Bot extends ServerPlayer implements Terminator {
|
|||||||
new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER, this),
|
new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER, this),
|
||||||
new ClientboundAddPlayerPacket(this),
|
new ClientboundAddPlayerPacket(this),
|
||||||
//new ClientboundSetEntityDataPacket(this.getId(), this.entityData, true),
|
//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))
|
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