package com.bergerkiller.bukkit.common.reflection.classes; import java.util.List; import java.util.Set; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import com.bergerkiller.bukkit.common.conversion.Conversion; import com.bergerkiller.bukkit.common.conversion.ConversionPairs; import com.bergerkiller.bukkit.common.protocol.CommonPacket; import com.bergerkiller.bukkit.common.reflection.ClassTemplate; import com.bergerkiller.bukkit.common.reflection.FieldAccessor; import com.bergerkiller.bukkit.common.reflection.MethodAccessor; import com.bergerkiller.bukkit.common.reflection.NMSClassTemplate; import com.bergerkiller.bukkit.common.reflection.TranslatorFieldAccessor; public class EntityTrackerEntryRef { public static final ClassTemplate<?> TEMPLATE = NMSClassTemplate.create("EntityTrackerEntry"); public static final TranslatorFieldAccessor<Entity> tracker = TEMPLATE.getField("tracker").translate(ConversionPairs.entity); public static final TranslatorFieldAccessor<Entity> vehicle = TEMPLATE.getField("w").translate(ConversionPairs.entity); public static final FieldAccessor<Boolean> synched = TEMPLATE.getField("isMoving"); public static final FieldAccessor<Double> prevX = TEMPLATE.getField("q"); public static final FieldAccessor<Double> prevY = TEMPLATE.getField("r"); public static final FieldAccessor<Double> prevZ = TEMPLATE.getField("s"); public static final FieldAccessor<Integer> viewDistance = TEMPLATE.getField("b"); public static final FieldAccessor<Integer> updateInterval = TEMPLATE.getField("c"); public static final FieldAccessor<Integer> timeSinceLocationSync = TEMPLATE.getField("v"); public static final FieldAccessor<Boolean> isMobile = TEMPLATE.getField("u"); public static final TranslatorFieldAccessor<Set<Player>> viewers = TEMPLATE.getField("trackedPlayers").translate(ConversionPairs.playerSet); private static final MethodAccessor<Object> getSpawnPacket = TEMPLATE.getMethod("c"); private static final MethodAccessor<Void> scanPlayers = TEMPLATE.getMethod("scanPlayers", List.class); private static final MethodAccessor<Void> updatePlayer = TEMPLATE.getMethod("updatePlayer", EntityPlayerRef.TEMPLATE.getType()); /* * Note: isMoving is wrongly deobfuscated by CraftBukkit team! */ public static CommonPacket getSpawnPacket(Object instance) { return Conversion.toCommonPacket.convert(getSpawnPacket.invoke(instance)); } public static void scanPlayers(Object instance, List<Player> players) { scanPlayers.invoke(instance, Conversion.toPlayerHandleList.convert(players)); } public static void updatePlayer(Object instance, Player player) { updatePlayer.invoke(instance, Conversion.toEntityHandle.convert(player)); } }