fix potential injection fail, more refactoring, some documentation

This commit is contained in:
Pyrbu 2023-04-21 14:35:39 +01:00
parent 8440795597
commit 895a4ea937
23 changed files with 212 additions and 188 deletions

@ -5,7 +5,7 @@ import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property; import com.mojang.authlib.properties.Property;
import com.mojang.authlib.properties.PropertyMap; import com.mojang.authlib.properties.PropertyMap;
import io.github.znetworkw.znpcservers.UnexpectedCallException; import io.github.znetworkw.znpcservers.UnexpectedCallException;
import io.github.znetworkw.znpcservers.reflection.ReflectionCache; import io.github.znetworkw.znpcservers.reflection.Reflections;
import io.github.znetworkw.znpcservers.npc.conversation.ConversationModel; import io.github.znetworkw.znpcservers.npc.conversation.ConversationModel;
import io.github.znetworkw.znpcservers.npc.hologram.Hologram; import io.github.znetworkw.znpcservers.npc.hologram.Hologram;
import io.github.znetworkw.znpcservers.npc.packet.PacketCache; import io.github.znetworkw.znpcservers.npc.packet.PacketCache;
@ -137,8 +137,8 @@ public class NPC {
if (updateTime) this.lastMove = System.nanoTime(); if (updateTime) this.lastMove = System.nanoTime();
this.npcPojo.setLocation(new ZLocation(location = new Location(location.getWorld(), location.getBlockX() + 0.5D, location.getY(), location.getBlockZ() + 0.5D, location.getYaw(), location.getPitch()))); this.npcPojo.setLocation(new ZLocation(location = new Location(location.getWorld(), location.getBlockX() + 0.5D, location.getY(), location.getBlockZ() + 0.5D, location.getYaw(), location.getPitch())));
} }
ReflectionCache.SET_LOCATION_METHOD.get().invoke(this.nmsEntity, location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); Reflections.SET_LOCATION_METHOD.get().invoke(this.nmsEntity, location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
Object npcTeleportPacket = ReflectionCache.PACKET_PLAY_OUT_ENTITY_TELEPORT_CONSTRUCTOR.get().newInstance(this.nmsEntity); Object npcTeleportPacket = Reflections.PACKET_PLAY_OUT_ENTITY_TELEPORT_CONSTRUCTOR.get().newInstance(this.nmsEntity);
this.viewers.forEach(player -> Utils.sendPackets(player, npcTeleportPacket)); this.viewers.forEach(player -> Utils.sendPackets(player, npcTeleportPacket));
this.hologram.setLocation(location, this.npcPojo.getNpcType().getHoloHeight()); this.hologram.setLocation(location, this.npcPojo.getNpcType().getHoloHeight());
} catch (ReflectiveOperationException operationException) { } catch (ReflectiveOperationException operationException) {
@ -157,13 +157,13 @@ public class NPC {
public void setSecondLayerSkin() { public void setSecondLayerSkin() {
try { try {
Object dataWatcherObject = ReflectionCache.GET_DATA_WATCHER_METHOD.get().invoke(this.nmsEntity); Object dataWatcherObject = Reflections.GET_DATA_WATCHER_METHOD.get().invoke(this.nmsEntity);
if (Utils.versionNewer(9)) { if (Utils.versionNewer(9)) {
ReflectionCache.SET_DATA_WATCHER_METHOD.get().invoke(dataWatcherObject, Reflections.SET_DATA_WATCHER_METHOD.get().invoke(dataWatcherObject,
ReflectionCache.DATA_WATCHER_OBJECT_CONSTRUCTOR.get() Reflections.DATA_WATCHER_OBJECT_CONSTRUCTOR.get()
.newInstance(this.npcSkin.getLayerIndex(), ReflectionCache.DATA_WATCHER_REGISTER_FIELD.get()), (byte) 127); .newInstance(this.npcSkin.getLayerIndex(), Reflections.DATA_WATCHER_REGISTER_FIELD.get()), (byte) 127);
} else { } else {
ReflectionCache.WATCH_DATA_WATCHER_METHOD.get().invoke(dataWatcherObject, 10, (byte) 127); Reflections.WATCH_DATA_WATCHER_METHOD.get().invoke(dataWatcherObject, 10, (byte) 127);
} }
} catch (ReflectiveOperationException operationException) { } catch (ReflectiveOperationException operationException) {
throw new UnexpectedCallException(operationException); throw new UnexpectedCallException(operationException);
@ -173,24 +173,24 @@ public class NPC {
public synchronized void changeType(NPCType npcType) { public synchronized void changeType(NPCType npcType) {
deleteViewers(); deleteViewers();
try { try {
Object nmsWorld = ReflectionCache.GET_HANDLE_WORLD_METHOD.get().invoke(getLocation().getWorld()); Object nmsWorld = Reflections.GET_HANDLE_WORLD_METHOD.get().invoke(getLocation().getWorld());
boolean isPlayer = (npcType == NPCType.PLAYER); boolean isPlayer = (npcType == NPCType.PLAYER);
this.nmsEntity = isPlayer ? this.packets.getProxyInstance().getPlayerPacket(nmsWorld, this.gameProfile) : (Utils.versionNewer(14) ? npcType.getConstructor().newInstance(npcType.getNmsEntityType(), nmsWorld) : npcType.getConstructor().newInstance(nmsWorld)); this.nmsEntity = isPlayer ? this.packets.getProxyInstance().getPlayerPacket(nmsWorld, this.gameProfile) : (Utils.versionNewer(14) ? npcType.getConstructor().newInstance(npcType.getNmsEntityType(), nmsWorld) : npcType.getConstructor().newInstance(nmsWorld));
this.bukkitEntity = ReflectionCache.GET_BUKKIT_ENTITY_METHOD.get().invoke(this.nmsEntity); this.bukkitEntity = Reflections.GET_BUKKIT_ENTITY_METHOD.get().invoke(this.nmsEntity);
this.uuid = (UUID) ReflectionCache.GET_UNIQUE_ID_METHOD.get().invoke(this.nmsEntity, new Object[0]); this.uuid = (UUID) Reflections.GET_UNIQUE_ID_METHOD.get().invoke(this.nmsEntity, new Object[0]);
if (isPlayer) { if (isPlayer) {
try { try {
this.tabConstructor = ReflectionCache.PACKET_PLAY_OUT_PLAYER_INFO_CONSTRUCTOR.get().newInstance(ReflectionCache.ADD_PLAYER_FIELD.get(), Collections.singletonList(this.nmsEntity)); this.tabConstructor = Reflections.PACKET_PLAY_OUT_PLAYER_INFO_CONSTRUCTOR.get().newInstance(Reflections.ADD_PLAYER_FIELD.get(), Collections.singletonList(this.nmsEntity));
} catch (Throwable e) { } catch (Throwable e) {
this.tabConstructor = ReflectionCache.PACKET_PLAY_OUT_PLAYER_INFO_CONSTRUCTOR.get().newInstance(ReflectionCache.ADD_PLAYER_FIELD.get(), this.nmsEntity); this.tabConstructor = Reflections.PACKET_PLAY_OUT_PLAYER_INFO_CONSTRUCTOR.get().newInstance(Reflections.ADD_PLAYER_FIELD.get(), this.nmsEntity);
this.updateTabConstructor = ReflectionCache.PACKET_PLAY_OUT_PLAYER_INFO_CONSTRUCTOR.get().newInstance(ReflectionCache.UPDATE_LISTED_FIELD.get(), this.nmsEntity); this.updateTabConstructor = Reflections.PACKET_PLAY_OUT_PLAYER_INFO_CONSTRUCTOR.get().newInstance(Reflections.UPDATE_LISTED_FIELD.get(), this.nmsEntity);
} }
setSecondLayerSkin(); setSecondLayerSkin();
} }
this.npcPojo.setNpcType(npcType); this.npcPojo.setNpcType(npcType);
setLocation(getLocation(), false); setLocation(getLocation(), false);
this.packets.flushCache("spawnPacket", "removeTab"); this.packets.flushCache("spawnPacket", "removeTab");
this.entityID = (Integer) ReflectionCache.GET_ENTITY_ID.get().invoke(this.nmsEntity, new Object[0]); this.entityID = (Integer) Reflections.GET_ENTITY_ID.get().invoke(this.nmsEntity, new Object[0]);
FunctionFactory.findFunctionsForNpc(this).forEach(function -> function.resolve(this)); FunctionFactory.findFunctionsForNpc(this).forEach(function -> function.resolve(this));
getPackets().getProxyInstance().update(this.packets); getPackets().getProxyInstance().update(this.packets);
this.hologram.createHologram(); this.hologram.createHologram();
@ -248,8 +248,8 @@ public class NPC {
if (this.lastMove > 1L && lastMoveNanos < 1000000000L) return; if (this.lastMove > 1L && lastMoveNanos < 1000000000L) return;
Location direction = rotation ? location : this.npcPojo.getLocation().bukkitLocation().clone().setDirection(location.clone().subtract(this.npcPojo.getLocation().bukkitLocation().clone()).toVector()); Location direction = rotation ? location : this.npcPojo.getLocation().bukkitLocation().clone().setDirection(location.clone().subtract(this.npcPojo.getLocation().bukkitLocation().clone()).toVector());
try { try {
Object lookPacket = ReflectionCache.PACKET_PLAY_OUT_ENTITY_LOOK_CONSTRUCTOR.get().newInstance(this.entityID, (byte) (int) (direction.getYaw() * 256.0F / 360.0F), (byte) (int) (direction.getPitch() * 256.0F / 360.0F), true); Object lookPacket = Reflections.PACKET_PLAY_OUT_ENTITY_LOOK_CONSTRUCTOR.get().newInstance(this.entityID, (byte) (int) (direction.getYaw() * 256.0F / 360.0F), (byte) (int) (direction.getPitch() * 256.0F / 360.0F), true);
Object headRotationPacket = ReflectionCache.PACKET_PLAY_OUT_ENTITY_HEAD_ROTATION_CONSTRUCTOR.get().newInstance(this.nmsEntity, (byte) (int) (direction.getYaw() * 256.0F / 360.0F)); Object headRotationPacket = Reflections.PACKET_PLAY_OUT_ENTITY_HEAD_ROTATION_CONSTRUCTOR.get().newInstance(this.nmsEntity, (byte) (int) (direction.getYaw() * 256.0F / 360.0F));
if (player != null) Utils.sendPackets(player, lookPacket, headRotationPacket); if (player != null) Utils.sendPackets(player, lookPacket, headRotationPacket);
else this.viewers.forEach(players -> Utils.sendPackets(players, headRotationPacket)); else this.viewers.forEach(players -> Utils.sendPackets(players, headRotationPacket));
} catch (ReflectiveOperationException operationException) { } catch (ReflectiveOperationException operationException) {
@ -275,7 +275,7 @@ public class NPC {
public void updateProfile(PropertyMap propertyMap) { public void updateProfile(PropertyMap propertyMap) {
if (this.npcPojo.getNpcType() != NPCType.PLAYER) return; if (this.npcPojo.getNpcType() != NPCType.PLAYER) return;
try { try {
Object gameProfileObj = ReflectionCache.GET_PROFILE_METHOD.get().invoke(this.nmsEntity); Object gameProfileObj = Reflections.GET_PROFILE_METHOD.get().invoke(this.nmsEntity);
Utils.setValue(gameProfileObj, "name", this.gameProfile.getName()); Utils.setValue(gameProfileObj, "name", this.gameProfile.getName());
Utils.setValue(gameProfileObj, "id", this.gameProfile.getId()); Utils.setValue(gameProfileObj, "id", this.gameProfile.getId());
Utils.setValue(gameProfileObj, "properties", propertyMap); Utils.setValue(gameProfileObj, "properties", propertyMap);

@ -1,7 +1,7 @@
package io.github.znetworkw.znpcservers.npc; package io.github.znetworkw.znpcservers.npc;
import io.github.znetworkw.znpcservers.UnexpectedCallException; import io.github.znetworkw.znpcservers.UnexpectedCallException;
import io.github.znetworkw.znpcservers.reflection.ClassCache; import io.github.znetworkw.znpcservers.reflection.EnumPropertyCache;
import io.github.znetworkw.znpcservers.utility.Utils; import io.github.znetworkw.znpcservers.utility.Utils;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
@ -11,7 +11,7 @@ import java.lang.reflect.Method;
import java.util.Arrays; import java.util.Arrays;
import java.util.Optional; import java.util.Optional;
import static io.github.znetworkw.znpcservers.reflection.ReflectionCache.*; import static io.github.znetworkw.znpcservers.reflection.Reflections.*;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public enum NPCType { public enum NPCType {
@ -112,12 +112,12 @@ public enum NPCType {
return this.customizationLoader; return this.customizationLoader;
} }
public static Object[] arrayToPrimitive(String[] strings, Method method) { public static Object[] collectArguments(String[] strings, Method method) {
Class<?>[] methodParameterTypes = method.getParameterTypes(); Class<?>[] methodParameterTypes = method.getParameterTypes();
Object[] newArray = new Object[methodParameterTypes.length]; Object[] newArray = new Object[methodParameterTypes.length];
for (int i = 0; i < methodParameterTypes.length; ++i) { for (int i = 0; i < methodParameterTypes.length; ++i) {
TypeProperty typeProperty = TypeProperty.forType(methodParameterTypes[i]); TypeProperty typeProperty = TypeProperty.forType(methodParameterTypes[i]);
newArray[i] = typeProperty != null ? typeProperty.getFunction().apply(strings[i]) : ClassCache.find(strings[i], methodParameterTypes[i]); newArray[i] = typeProperty != null ? typeProperty.getFunction().apply(strings[i]) : EnumPropertyCache.find(strings[i], methodParameterTypes[i]);
} }
return newArray; return newArray;
} }
@ -128,7 +128,7 @@ public enum NPCType {
} }
try { try {
Method method = this.customizationLoader.getMethods().get(name); Method method = this.customizationLoader.getMethods().get(name);
method.invoke(npc.getBukkitEntity(), NPCType.arrayToPrimitive(values, method)); method.invoke(npc.getBukkitEntity(), NPCType.collectArguments(values, method));
npc.updateMetadata(npc.getViewers()); npc.updateMetadata(npc.getViewers());
} }
catch (IllegalAccessException | InvocationTargetException e) { catch (IllegalAccessException | InvocationTargetException e) {

@ -1,6 +1,6 @@
package io.github.znetworkw.znpcservers.npc.function; package io.github.znetworkw.znpcservers.npc.function;
import io.github.znetworkw.znpcservers.reflection.ReflectionCache; import io.github.znetworkw.znpcservers.reflection.Reflections;
import io.github.znetworkw.znpcservers.npc.FunctionContext; import io.github.znetworkw.znpcservers.npc.FunctionContext;
import io.github.znetworkw.znpcservers.npc.FunctionFactory; import io.github.znetworkw.znpcservers.npc.FunctionFactory;
import io.github.znetworkw.znpcservers.npc.NPC; import io.github.znetworkw.znpcservers.npc.NPC;
@ -16,15 +16,15 @@ public class GlowFunction extends NPCFunction {
throw new IllegalStateException("invalid context type, " + functionContext.getClass().getSimpleName() + ", expected ContextWithValue."); throw new IllegalStateException("invalid context type, " + functionContext.getClass().getSimpleName() + ", expected ContextWithValue.");
String glowColorName = ((FunctionContext.ContextWithValue) functionContext).getValue(); String glowColorName = ((FunctionContext.ContextWithValue) functionContext).getValue();
try { try {
Object glowColor = ReflectionCache.ENUM_CHAT_FORMAT_FIND.get().invoke(null, ( Object glowColor = Reflections.ENUM_CHAT_FORMAT_FIND.get().invoke(null, (
glowColorName == null || glowColorName.length() == 0) ? "WHITE" : glowColorName); glowColorName == null || glowColorName.length() == 0) ? "WHITE" : glowColorName);
if (glowColor == null) if (glowColor == null)
return NPCFunction.ResultType.FAIL; return NPCFunction.ResultType.FAIL;
npc.getNpcPojo().setGlowName(glowColorName); npc.getNpcPojo().setGlowName(glowColorName);
npc.setGlowColor(glowColor); npc.setGlowColor(glowColor);
ReflectionCache.SET_DATA_WATCHER_METHOD.get().invoke(ReflectionCache.GET_DATA_WATCHER_METHOD Reflections.SET_DATA_WATCHER_METHOD.get().invoke(Reflections.GET_DATA_WATCHER_METHOD
.get().invoke(npc.getNmsEntity()), ReflectionCache.DATA_WATCHER_OBJECT_CONSTRUCTOR .get().invoke(npc.getNmsEntity()), Reflections.DATA_WATCHER_OBJECT_CONSTRUCTOR
.get().newInstance(0, ReflectionCache.DATA_WATCHER_REGISTER_FIELD .get().newInstance(0, Reflections.DATA_WATCHER_REGISTER_FIELD
.get()), (byte) (!FunctionFactory.isTrue(npc, this) ? 64 : 0)); .get()), (byte) (!FunctionFactory.isTrue(npc, this) ? 64 : 0));
npc.getPackets().getProxyInstance().update(npc.getPackets()); npc.getPackets().getProxyInstance().update(npc.getPackets());
npc.deleteViewers(); npc.deleteViewers();

@ -1,7 +1,7 @@
package io.github.znetworkw.znpcservers.npc.hologram; package io.github.znetworkw.znpcservers.npc.hologram;
import io.github.znetworkw.znpcservers.UnexpectedCallException; import io.github.znetworkw.znpcservers.UnexpectedCallException;
import io.github.znetworkw.znpcservers.reflection.ReflectionCache; import io.github.znetworkw.znpcservers.reflection.Reflections;
import io.github.znetworkw.znpcservers.configuration.Configuration; import io.github.znetworkw.znpcservers.configuration.Configuration;
import io.github.znetworkw.znpcservers.configuration.ConfigurationConstants; import io.github.znetworkw.znpcservers.configuration.ConfigurationConstants;
import io.github.znetworkw.znpcservers.configuration.ConfigurationValue; import io.github.znetworkw.znpcservers.configuration.ConfigurationValue;
@ -37,14 +37,14 @@ public class Hologram {
Location location = this.npc.getLocation(); Location location = this.npc.getLocation();
for (String line : this.npc.getNpcPojo().getHologramLines()) { for (String line : this.npc.getNpcPojo().getHologramLines()) {
boolean visible = !line.equalsIgnoreCase("%space%"); boolean visible = !line.equalsIgnoreCase("%space%");
Object armorStand = ReflectionCache.ENTITY_CONSTRUCTOR.get().newInstance(ReflectionCache.GET_HANDLE_WORLD_METHOD.get().invoke(location.getWorld()), Object armorStand = Reflections.ENTITY_CONSTRUCTOR.get().newInstance(Reflections.GET_HANDLE_WORLD_METHOD.get().invoke(location.getWorld()),
location.getX(), location.getY() - 0.15D + y, location.getZ()); location.getX(), location.getY() - 0.15D + y, location.getZ());
if (visible) { if (visible) {
ReflectionCache.SET_CUSTOM_NAME_VISIBLE_METHOD.get().invoke(armorStand, true); Reflections.SET_CUSTOM_NAME_VISIBLE_METHOD.get().invoke(armorStand, true);
updateLine(line, armorStand, null); updateLine(line, armorStand, null);
} }
ReflectionCache.SET_INVISIBLE_METHOD.get().invoke(armorStand, true); Reflections.SET_INVISIBLE_METHOD.get().invoke(armorStand, true);
this.hologramLines.add(new HologramLine(line.replace(ConfigurationConstants.SPACE_SYMBOL, " "), armorStand, (Integer) ReflectionCache.GET_ENTITY_ID this.hologramLines.add(new HologramLine(line.replace(ConfigurationConstants.SPACE_SYMBOL, " "), armorStand, (Integer) Reflections.GET_ENTITY_ID
.get().invoke(armorStand))); .get().invoke(armorStand)));
y += LINE_SPACING; y += LINE_SPACING;
} }
@ -92,7 +92,7 @@ public class Hologram {
public void updateLocation() { public void updateLocation() {
this.hologramLines.forEach(hologramLine -> { this.hologramLines.forEach(hologramLine -> {
try { try {
Object packet = ReflectionCache.PACKET_PLAY_OUT_ENTITY_TELEPORT_CONSTRUCTOR.get().newInstance(hologramLine.armorStand); Object packet = Reflections.PACKET_PLAY_OUT_ENTITY_TELEPORT_CONSTRUCTOR.get().newInstance(hologramLine.armorStand);
this.npc.getViewers().forEach(player -> Utils.sendPackets(player, packet)); this.npc.getViewers().forEach(player -> Utils.sendPackets(player, packet));
} }
catch (ReflectiveOperationException operationException) { catch (ReflectiveOperationException operationException) {
@ -106,7 +106,7 @@ public class Hologram {
try { try {
double y = this.npc.getNpcPojo().getHologramHeight(); double y = this.npc.getNpcPojo().getHologramHeight();
for (HologramLine hologramLine : this.hologramLines) { for (HologramLine hologramLine : this.hologramLines) {
ReflectionCache.SET_LOCATION_METHOD.get().invoke(hologramLine.armorStand, location.getX(), location.getY() - 0.15 + y, location.getZ(), location.getYaw(), location.getPitch()); Reflections.SET_LOCATION_METHOD.get().invoke(hologramLine.armorStand, location.getX(), location.getY() - 0.15 + y, location.getZ(), location.getYaw(), location.getPitch());
y += LINE_SPACING; y += LINE_SPACING;
} }
this.updateLocation(); this.updateLocation();
@ -118,9 +118,9 @@ public class Hologram {
private void updateLine(String line, Object armorStand, @Nullable ZUser user) throws InvocationTargetException, IllegalAccessException { private void updateLine(String line, Object armorStand, @Nullable ZUser user) throws InvocationTargetException, IllegalAccessException {
if (NEW_METHOD) { if (NEW_METHOD) {
ReflectionCache.SET_CUSTOM_NAME_NEW_METHOD.get().invoke(armorStand, ReflectionCache.CRAFT_CHAT_MESSAGE_METHOD.get().invoke(null, LineReplacer.makeAll(user, line))); Reflections.SET_CUSTOM_NAME_NEW_METHOD.get().invoke(armorStand, Reflections.CRAFT_CHAT_MESSAGE_METHOD.get().invoke(null, LineReplacer.makeAll(user, line)));
} else { } else {
ReflectionCache.SET_CUSTOM_NAME_OLD_METHOD.get().invoke(armorStand, LineReplacer.makeAll(user, line)); Reflections.SET_CUSTOM_NAME_OLD_METHOD.get().invoke(armorStand, LineReplacer.makeAll(user, line));
} }
} }

@ -2,7 +2,7 @@ package io.github.znetworkw.znpcservers.npc.packet;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import io.github.znetworkw.znpcservers.reflection.ReflectionCache; import io.github.znetworkw.znpcservers.reflection.Reflections;
import io.github.znetworkw.znpcservers.npc.FunctionFactory; import io.github.znetworkw.znpcservers.npc.FunctionFactory;
import io.github.znetworkw.znpcservers.npc.ItemSlot; import io.github.znetworkw.znpcservers.npc.ItemSlot;
import io.github.znetworkw.znpcservers.npc.NPC; import io.github.znetworkw.znpcservers.npc.NPC;
@ -35,22 +35,22 @@ public interface Packet {
@SuppressWarnings("SuspiciousTernaryOperatorInVarargsCall") @SuppressWarnings("SuspiciousTernaryOperatorInVarargsCall")
@PacketValue(keyName = "destroyPacket", valueType = ValueType.ARGUMENTS) @PacketValue(keyName = "destroyPacket", valueType = ValueType.ARGUMENTS)
default Object getDestroyPacket(int entityId) throws ReflectiveOperationException { default Object getDestroyPacket(int entityId) throws ReflectiveOperationException {
return ReflectionCache.PACKET_PLAY_OUT_ENTITY_DESTROY_CONSTRUCTOR.get().newInstance(ReflectionCache.PACKET_PLAY_OUT_ENTITY_DESTROY_CONSTRUCTOR.get().getParameterTypes()[0].isArray() ? new int[] {entityId} : entityId); return Reflections.PACKET_PLAY_OUT_ENTITY_DESTROY_CONSTRUCTOR.get().newInstance(Reflections.PACKET_PLAY_OUT_ENTITY_DESTROY_CONSTRUCTOR.get().getParameterTypes()[0].isArray() ? new int[] {entityId} : entityId);
} }
@PacketValue(keyName = "enumSlot", valueType = ValueType.ARGUMENTS) @PacketValue(keyName = "enumSlot", valueType = ValueType.ARGUMENTS)
default Object getItemSlot(int slot) { default Object getItemSlot(int slot) {
return ReflectionCache.ENUM_ITEM_SLOT.getEnumConstants()[slot]; return Reflections.ENUM_ITEM_SLOT.getEnumConstants()[slot];
} }
@PacketValue(keyName = "removeTab") @PacketValue(keyName = "removeTab")
default Object getTabRemovePacket(Object nmsEntity) throws ReflectiveOperationException { default Object getTabRemovePacket(Object nmsEntity) throws ReflectiveOperationException {
try { try {
return ReflectionCache.PACKET_PLAY_OUT_PLAYER_INFO_CONSTRUCTOR.get().newInstance(ReflectionCache.REMOVE_PLAYER_FIELD.get(), Collections.singletonList(nmsEntity)); return Reflections.PACKET_PLAY_OUT_PLAYER_INFO_CONSTRUCTOR.get().newInstance(Reflections.REMOVE_PLAYER_FIELD.get(), Collections.singletonList(nmsEntity));
} catch (Throwable throwable) { } catch (Throwable throwable) {
boolean useOldMethod = (ReflectionCache.PACKET_PLAY_OUT_PLAYER_INFO_REMOVE_CLASS != null); boolean useOldMethod = (Reflections.PACKET_PLAY_OUT_PLAYER_INFO_REMOVE_CLASS != null);
if (useOldMethod) return ReflectionCache.PACKET_PLAY_OUT_PLAYER_INFO_REMOVE_CONSTRUCTOR.get().newInstance(Collections.singletonList(ReflectionCache.GET_UNIQUE_ID_METHOD.get().invoke(nmsEntity))); if (useOldMethod) return Reflections.PACKET_PLAY_OUT_PLAYER_INFO_REMOVE_CONSTRUCTOR.get().newInstance(Collections.singletonList(Reflections.GET_UNIQUE_ID_METHOD.get().invoke(nmsEntity)));
return ReflectionCache.PACKET_PLAY_OUT_PLAYER_INFO_CONSTRUCTOR.get().newInstance(ReflectionCache.REMOVE_PLAYER_FIELD.get(), nmsEntity); return Reflections.PACKET_PLAY_OUT_PLAYER_INFO_CONSTRUCTOR.get().newInstance(Reflections.REMOVE_PLAYER_FIELD.get(), nmsEntity);
} }
} }
@ -63,29 +63,29 @@ public interface Packet {
ImmutableList.Builder<Object> builder = ImmutableList.builder(); ImmutableList.Builder<Object> builder = ImmutableList.builder();
boolean isVersion17 = (Utils.BUKKIT_VERSION > 16); boolean isVersion17 = (Utils.BUKKIT_VERSION > 16);
boolean isVersion9 = (Utils.BUKKIT_VERSION > 8); boolean isVersion9 = (Utils.BUKKIT_VERSION > 8);
Object scoreboardTeamPacket = isVersion17 ? ReflectionCache.SCOREBOARD_TEAM_CONSTRUCTOR.get().newInstance(null, npc.getGameProfile().getName()) : ReflectionCache.PACKET_PLAY_OUT_SCOREBOARD_TEAM_CONSTRUCTOR_OLD.get().newInstance(); Object scoreboardTeamPacket = isVersion17 ? Reflections.SCOREBOARD_TEAM_CONSTRUCTOR.get().newInstance(null, npc.getGameProfile().getName()) : Reflections.PACKET_PLAY_OUT_SCOREBOARD_TEAM_CONSTRUCTOR_OLD.get().newInstance();
if (!isVersion17) { if (!isVersion17) {
Utils.setValue(scoreboardTeamPacket, "a", npc.getGameProfile().getName()); Utils.setValue(scoreboardTeamPacket, "a", npc.getGameProfile().getName());
Utils.setValue(scoreboardTeamPacket, isVersion9 ? "i" : "h", 1); Utils.setValue(scoreboardTeamPacket, isVersion9 ? "i" : "h", 1);
} }
builder.add(isVersion17 ? ReflectionCache.PACKET_PLAY_OUT_SCOREBOARD_TEAM_CREATE_V1.get().invoke(null, scoreboardTeamPacket) : scoreboardTeamPacket); builder.add(isVersion17 ? Reflections.PACKET_PLAY_OUT_SCOREBOARD_TEAM_CREATE_V1.get().invoke(null, scoreboardTeamPacket) : scoreboardTeamPacket);
if (isVersion17) { if (isVersion17) {
scoreboardTeamPacket = ReflectionCache.SCOREBOARD_TEAM_CONSTRUCTOR.get().newInstance(null, npc.getGameProfile().getName()); scoreboardTeamPacket = Reflections.SCOREBOARD_TEAM_CONSTRUCTOR.get().newInstance(null, npc.getGameProfile().getName());
if (Utils.BUKKIT_VERSION > 17) { if (Utils.BUKKIT_VERSION > 17) {
Utils.setValue(scoreboardTeamPacket, "d", npc.getGameProfile().getName()); Utils.setValue(scoreboardTeamPacket, "d", npc.getGameProfile().getName());
ReflectionUtils.findFieldForClassAndSet(scoreboardTeamPacket, ReflectionCache.ENUM_TAG_VISIBILITY, ReflectionCache.ENUM_TAG_VISIBILITY_NEVER_FIELD.get()); ReflectionUtils.findFieldForClassAndSet(scoreboardTeamPacket, Reflections.ENUM_TAG_VISIBILITY, Reflections.ENUM_TAG_VISIBILITY_NEVER_FIELD.get());
Utils.setValue(scoreboardTeamPacket, "m", ReflectionCache.ENUM_CHAT_FORMAT_FIND.get().invoke(null, "DARK_GRAY")); Utils.setValue(scoreboardTeamPacket, "m", Reflections.ENUM_CHAT_FORMAT_FIND.get().invoke(null, "DARK_GRAY"));
} else { } else {
Utils.setValue(scoreboardTeamPacket, "e", npc.getGameProfile().getName()); Utils.setValue(scoreboardTeamPacket, "e", npc.getGameProfile().getName());
Utils.setValue(scoreboardTeamPacket, "l", ReflectionCache.ENUM_TAG_VISIBILITY_NEVER_FIELD.get()); Utils.setValue(scoreboardTeamPacket, "l", Reflections.ENUM_TAG_VISIBILITY_NEVER_FIELD.get());
} }
} else { } else {
scoreboardTeamPacket = ReflectionCache.PACKET_PLAY_OUT_SCOREBOARD_TEAM_CONSTRUCTOR_OLD.get().newInstance(); scoreboardTeamPacket = Reflections.PACKET_PLAY_OUT_SCOREBOARD_TEAM_CONSTRUCTOR_OLD.get().newInstance();
Utils.setValue(scoreboardTeamPacket, "a", npc.getGameProfile().getName()); Utils.setValue(scoreboardTeamPacket, "a", npc.getGameProfile().getName());
Utils.setValue(scoreboardTeamPacket, "e", "never"); Utils.setValue(scoreboardTeamPacket, "e", "never");
Utils.setValue(scoreboardTeamPacket, isVersion9 ? "i" : "h", 0); Utils.setValue(scoreboardTeamPacket, isVersion9 ? "i" : "h", 0);
} }
Collection<String> collection = isVersion17 ? (Collection<String>) ReflectionCache.SCOREBOARD_PLAYER_LIST.get().invoke(scoreboardTeamPacket) : (Collection<String>) Utils.getValue(scoreboardTeamPacket, isVersion9 ? "h" : "g"); Collection<String> collection = isVersion17 ? (Collection<String>) Reflections.SCOREBOARD_PLAYER_LIST.get().invoke(scoreboardTeamPacket) : (Collection<String>) Utils.getValue(scoreboardTeamPacket, isVersion9 ? "h" : "g");
if (npc.getNpcPojo().getNpcType() == NPCType.PLAYER) { if (npc.getNpcPojo().getNpcType() == NPCType.PLAYER) {
collection.add(npc.getGameProfile().getName()); collection.add(npc.getGameProfile().getName());
} else { } else {
@ -93,7 +93,7 @@ public interface Packet {
} }
if (allowGlowColor() && FunctionFactory.isTrue(npc, "glow")) if (allowGlowColor() && FunctionFactory.isTrue(npc, "glow"))
updateGlowPacket(npc, scoreboardTeamPacket); updateGlowPacket(npc, scoreboardTeamPacket);
builder.add(isVersion17 ? ReflectionCache.PACKET_PLAY_OUT_SCOREBOARD_TEAM_CREATE.get().invoke(null, scoreboardTeamPacket, Boolean.TRUE) : scoreboardTeamPacket); builder.add(isVersion17 ? Reflections.PACKET_PLAY_OUT_SCOREBOARD_TEAM_CREATE.get().invoke(null, scoreboardTeamPacket, Boolean.TRUE) : scoreboardTeamPacket);
return builder.build(); return builder.build();
} }

@ -3,7 +3,7 @@ package io.github.znetworkw.znpcservers.npc.packet;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.mojang.datafixers.util.Pair; import com.mojang.datafixers.util.Pair;
import io.github.znetworkw.znpcservers.reflection.ReflectionCache; import io.github.znetworkw.znpcservers.reflection.Reflections;
import io.github.znetworkw.znpcservers.npc.ItemSlot; import io.github.znetworkw.znpcservers.npc.ItemSlot;
import io.github.znetworkw.znpcservers.npc.NPC; import io.github.znetworkw.znpcservers.npc.NPC;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@ -22,6 +22,6 @@ public class PacketV16 extends PacketV9 {
pairs.add(new Pair<>(getItemSlot(entry pairs.add(new Pair<>(getItemSlot(entry
.getKey().getSlot()), .getKey().getSlot()),
convertItemStack(npc.getEntityID(), entry.getKey(), entry.getValue()))); convertItemStack(npc.getEntityID(), entry.getKey(), entry.getValue())));
return ImmutableList.of(ReflectionCache.PACKET_PLAY_OUT_ENTITY_EQUIPMENT_CONSTRUCTOR_V1.get().newInstance(npc.getEntityID(), pairs)); return ImmutableList.of(Reflections.PACKET_PLAY_OUT_ENTITY_EQUIPMENT_CONSTRUCTOR_V1.get().newInstance(npc.getEntityID(), pairs));
} }
} }

@ -1,7 +1,7 @@
package io.github.znetworkw.znpcservers.npc.packet; package io.github.znetworkw.znpcservers.npc.packet;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import io.github.znetworkw.znpcservers.reflection.ReflectionCache; import io.github.znetworkw.znpcservers.reflection.Reflections;
import io.github.znetworkw.znpcservers.npc.NPC; import io.github.znetworkw.znpcservers.npc.NPC;
import io.github.znetworkw.znpcservers.utility.Utils; import io.github.znetworkw.znpcservers.utility.Utils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -12,11 +12,11 @@ public class PacketV17 extends PacketV16 {
} }
public Object getPlayerPacket(Object nmsWorld, GameProfile gameProfile) throws ReflectiveOperationException { public Object getPlayerPacket(Object nmsWorld, GameProfile gameProfile) throws ReflectiveOperationException {
return ReflectionCache.PLAYER_CONSTRUCTOR_NEW.get().newInstance(ReflectionCache.GET_SERVER_METHOD.get().invoke(Bukkit.getServer()), nmsWorld, gameProfile); return Reflections.PLAYER_CONSTRUCTOR_NEW.get().newInstance(Reflections.GET_SERVER_METHOD.get().invoke(Bukkit.getServer()), nmsWorld, gameProfile);
} }
public void updateGlowPacket(NPC npc, Object packet) throws ReflectiveOperationException { public void updateGlowPacket(NPC npc, Object packet) throws ReflectiveOperationException {
Utils.setValue(packet, "n", ReflectionCache.ENUM_CHAT_FORMAT_FIND.get().invoke(null, npc.getNpcPojo().getGlowName())); Utils.setValue(packet, "n", Reflections.ENUM_CHAT_FORMAT_FIND.get().invoke(null, npc.getNpcPojo().getGlowName()));
} }
public Object getClickType(Object interactPacket) { public Object getClickType(Object interactPacket) {

@ -1,6 +1,6 @@
package io.github.znetworkw.znpcservers.npc.packet; package io.github.znetworkw.znpcservers.npc.packet;
import io.github.znetworkw.znpcservers.reflection.ReflectionCache; import io.github.znetworkw.znpcservers.reflection.Reflections;
import io.github.znetworkw.znpcservers.npc.NPC; import io.github.znetworkw.znpcservers.npc.NPC;
import io.github.znetworkw.znpcservers.utility.Utils; import io.github.znetworkw.znpcservers.utility.Utils;
@ -10,6 +10,6 @@ public class PacketV18 extends PacketV17 {
} }
public void updateGlowPacket(NPC npc, Object packet) throws ReflectiveOperationException { public void updateGlowPacket(NPC npc, Object packet) throws ReflectiveOperationException {
Utils.setValue(packet, "m", ReflectionCache.ENUM_CHAT_FORMAT_FIND.get().invoke(null, npc.getNpcPojo().getGlowName())); Utils.setValue(packet, "m", Reflections.ENUM_CHAT_FORMAT_FIND.get().invoke(null, npc.getNpcPojo().getGlowName()));
} }
} }

@ -1,7 +1,7 @@
package io.github.znetworkw.znpcservers.npc.packet; package io.github.znetworkw.znpcservers.npc.packet;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import io.github.znetworkw.znpcservers.reflection.ReflectionCache; import io.github.znetworkw.znpcservers.reflection.Reflections;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
public class PacketV19 extends PacketV18 { public class PacketV19 extends PacketV18 {
@ -11,9 +11,9 @@ public class PacketV19 extends PacketV18 {
public Object getPlayerPacket(Object nmsWorld, GameProfile gameProfile) throws ReflectiveOperationException { public Object getPlayerPacket(Object nmsWorld, GameProfile gameProfile) throws ReflectiveOperationException {
try { try {
return ReflectionCache.PLAYER_CONSTRUCTOR_NEW_1.get(true).newInstance(ReflectionCache.GET_SERVER_METHOD.get().invoke(Bukkit.getServer()), nmsWorld, gameProfile, null); return Reflections.PLAYER_CONSTRUCTOR_NEW_1.get(true).newInstance(Reflections.GET_SERVER_METHOD.get().invoke(Bukkit.getServer()), nmsWorld, gameProfile, null);
} catch (Throwable e) { } catch (Throwable e) {
return ReflectionCache.PLAYER_CONSTRUCTOR_NEW_2.get().newInstance(ReflectionCache.GET_SERVER_METHOD.get().invoke(Bukkit.getServer()), nmsWorld, gameProfile); return Reflections.PLAYER_CONSTRUCTOR_NEW_2.get().newInstance(Reflections.GET_SERVER_METHOD.get().invoke(Bukkit.getServer()), nmsWorld, gameProfile);
} }
} }
} }

@ -2,7 +2,7 @@ package io.github.znetworkw.znpcservers.npc.packet;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import io.github.znetworkw.znpcservers.reflection.ReflectionCache; import io.github.znetworkw.znpcservers.reflection.Reflections;
import io.github.znetworkw.znpcservers.npc.ItemSlot; import io.github.znetworkw.znpcservers.npc.ItemSlot;
import io.github.znetworkw.znpcservers.npc.NPC; import io.github.znetworkw.znpcservers.npc.NPC;
import io.github.znetworkw.znpcservers.utility.Utils; import io.github.znetworkw.znpcservers.utility.Utils;
@ -18,18 +18,18 @@ public class PacketV8 implements Packet {
} }
public Object getPlayerPacket(Object nmsWorld, GameProfile gameProfile) throws ReflectiveOperationException { public Object getPlayerPacket(Object nmsWorld, GameProfile gameProfile) throws ReflectiveOperationException {
Constructor<?> constructor = (Utils.BUKKIT_VERSION > 13) ? ReflectionCache.PLAYER_INTERACT_MANAGER_NEW_CONSTRUCTOR.get() : ReflectionCache.PLAYER_INTERACT_MANAGER_OLD_CONSTRUCTOR.get(); Constructor<?> constructor = (Utils.BUKKIT_VERSION > 13) ? Reflections.PLAYER_INTERACT_MANAGER_NEW_CONSTRUCTOR.get() : Reflections.PLAYER_INTERACT_MANAGER_OLD_CONSTRUCTOR.get();
return ReflectionCache.PLAYER_CONSTRUCTOR_OLD.get().newInstance(ReflectionCache.GET_SERVER_METHOD return Reflections.PLAYER_CONSTRUCTOR_OLD.get().newInstance(Reflections.GET_SERVER_METHOD
.get().invoke(Bukkit.getServer()), nmsWorld, gameProfile, constructor.newInstance(nmsWorld)); .get().invoke(Bukkit.getServer()), nmsWorld, gameProfile, constructor.newInstance(nmsWorld));
} }
public Object getSpawnPacket(Object nmsEntity, boolean isPlayer) throws ReflectiveOperationException { public Object getSpawnPacket(Object nmsEntity, boolean isPlayer) throws ReflectiveOperationException {
return isPlayer ? ReflectionCache.PACKET_PLAY_OUT_NAMED_ENTITY_CONSTRUCTOR.get().newInstance(nmsEntity) : ReflectionCache.PACKET_PLAY_OUT_SPAWN_ENTITY_CONSTRUCTOR.get().newInstance(nmsEntity); return isPlayer ? Reflections.PACKET_PLAY_OUT_NAMED_ENTITY_CONSTRUCTOR.get().newInstance(nmsEntity) : Reflections.PACKET_PLAY_OUT_SPAWN_ENTITY_CONSTRUCTOR.get().newInstance(nmsEntity);
} }
public Object convertItemStack(int entityId, ItemSlot itemSlot, ItemStack itemStack) throws ReflectiveOperationException { public Object convertItemStack(int entityId, ItemSlot itemSlot, ItemStack itemStack) throws ReflectiveOperationException {
return ReflectionCache.PACKET_PLAY_OUT_ENTITY_EQUIPMENT_CONSTRUCTOR_OLD.get().newInstance(entityId, return Reflections.PACKET_PLAY_OUT_ENTITY_EQUIPMENT_CONSTRUCTOR_OLD.get().newInstance(entityId,
itemSlot.getSlotOld(), ReflectionCache.AS_NMS_COPY_METHOD.get().invoke(ReflectionCache.CRAFT_ITEM_STACK_CLASS, itemStack)); itemSlot.getSlotOld(), Reflections.AS_NMS_COPY_METHOD.get().invoke(Reflections.CRAFT_ITEM_STACK_CLASS, itemStack));
} }
public Object getClickType(Object interactPacket) throws ReflectiveOperationException { public Object getClickType(Object interactPacket) throws ReflectiveOperationException {
@ -37,22 +37,22 @@ public class PacketV8 implements Packet {
} }
public Object getMetadataPacket(int entityId, Object nmsEntity) throws ReflectiveOperationException { public Object getMetadataPacket(int entityId, Object nmsEntity) throws ReflectiveOperationException {
Object dataWatcher = ReflectionCache.GET_DATA_WATCHER_METHOD.get().invoke(nmsEntity); Object dataWatcher = Reflections.GET_DATA_WATCHER_METHOD.get().invoke(nmsEntity);
try { try {
return ReflectionCache.PACKET_PLAY_OUT_ENTITY_META_DATA_CONSTRUCTOR.get(true).newInstance(entityId, dataWatcher, true); return Reflections.PACKET_PLAY_OUT_ENTITY_META_DATA_CONSTRUCTOR.get(true).newInstance(entityId, dataWatcher, true);
} catch (Exception e2) { } catch (Exception e2) {
return ReflectionCache.PACKET_PLAY_OUT_ENTITY_META_DATA_CONSTRUCTOR_V1.get().newInstance(entityId, ReflectionCache.GET_DATAWATCHER_B_LIST.get().invoke(dataWatcher)); return Reflections.PACKET_PLAY_OUT_ENTITY_META_DATA_CONSTRUCTOR_V1.get().newInstance(entityId, Reflections.GET_DATAWATCHER_B_LIST.get().invoke(dataWatcher));
} }
} }
public Object getHologramSpawnPacket(Object armorStand) throws ReflectiveOperationException { public Object getHologramSpawnPacket(Object armorStand) throws ReflectiveOperationException {
return ReflectionCache.PACKET_PLAY_OUT_SPAWN_ENTITY_CONSTRUCTOR.get().newInstance(armorStand); return Reflections.PACKET_PLAY_OUT_SPAWN_ENTITY_CONSTRUCTOR.get().newInstance(armorStand);
} }
public ImmutableList<Object> getEquipPackets(NPC npc) throws ReflectiveOperationException { public ImmutableList<Object> getEquipPackets(NPC npc) throws ReflectiveOperationException {
ImmutableList.Builder<Object> builder = ImmutableList.builder(); ImmutableList.Builder<Object> builder = ImmutableList.builder();
for (Map.Entry<ItemSlot, ItemStack> stackEntry : npc.getNpcPojo().getNpcEquip().entrySet()) { for (Map.Entry<ItemSlot, ItemStack> stackEntry : npc.getNpcPojo().getNpcEquip().entrySet()) {
builder.add(ReflectionCache.PACKET_PLAY_OUT_ENTITY_EQUIPMENT_CONSTRUCTOR_OLD.get().newInstance(npc.getEntityID(), stackEntry.getKey().getSlotOld(), builder.add(Reflections.PACKET_PLAY_OUT_ENTITY_EQUIPMENT_CONSTRUCTOR_OLD.get().newInstance(npc.getEntityID(), stackEntry.getKey().getSlotOld(),
convertItemStack(npc.getEntityID(), stackEntry.getKey(), stackEntry.getValue()))); convertItemStack(npc.getEntityID(), stackEntry.getKey(), stackEntry.getValue())));
} }
return builder.build(); return builder.build();

@ -1,7 +1,7 @@
package io.github.znetworkw.znpcservers.npc.packet; package io.github.znetworkw.znpcservers.npc.packet;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import io.github.znetworkw.znpcservers.reflection.ReflectionCache; import io.github.znetworkw.znpcservers.reflection.Reflections;
import io.github.znetworkw.znpcservers.npc.ItemSlot; import io.github.znetworkw.znpcservers.npc.ItemSlot;
import io.github.znetworkw.znpcservers.npc.NPC; import io.github.znetworkw.znpcservers.npc.NPC;
import io.github.znetworkw.znpcservers.utility.Utils; import io.github.znetworkw.znpcservers.utility.Utils;
@ -15,13 +15,13 @@ public class PacketV9 extends PacketV8 {
} }
public Object convertItemStack(int entityId, ItemSlot itemSlot, ItemStack itemStack) throws ReflectiveOperationException { public Object convertItemStack(int entityId, ItemSlot itemSlot, ItemStack itemStack) throws ReflectiveOperationException {
return ReflectionCache.AS_NMS_COPY_METHOD.get().invoke(ReflectionCache.CRAFT_ITEM_STACK_CLASS, itemStack); return Reflections.AS_NMS_COPY_METHOD.get().invoke(Reflections.CRAFT_ITEM_STACK_CLASS, itemStack);
} }
public ImmutableList<Object> getEquipPackets(NPC npc) throws ReflectiveOperationException { public ImmutableList<Object> getEquipPackets(NPC npc) throws ReflectiveOperationException {
ImmutableList.Builder<Object> builder = ImmutableList.builder(); ImmutableList.Builder<Object> builder = ImmutableList.builder();
for (Map.Entry<ItemSlot, ItemStack> stackEntry : npc.getNpcPojo().getNpcEquip().entrySet()) { for (Map.Entry<ItemSlot, ItemStack> stackEntry : npc.getNpcPojo().getNpcEquip().entrySet()) {
builder.add(ReflectionCache.PACKET_PLAY_OUT_ENTITY_EQUIPMENT_CONSTRUCTOR_NEWEST_OLD.get().newInstance(npc.getEntityID(), builder.add(Reflections.PACKET_PLAY_OUT_ENTITY_EQUIPMENT_CONSTRUCTOR_NEWEST_OLD.get().newInstance(npc.getEntityID(),
getItemSlot(stackEntry.getKey().getSlot()), getItemSlot(stackEntry.getKey().getSlot()),
convertItemStack(npc.getEntityID(), stackEntry.getKey(), stackEntry.getValue()))); convertItemStack(npc.getEntityID(), stackEntry.getKey(), stackEntry.getValue())));
} }
@ -29,12 +29,12 @@ public class PacketV9 extends PacketV8 {
} }
public void updateGlowPacket(NPC npc, Object packet) throws ReflectiveOperationException { public void updateGlowPacket(NPC npc, Object packet) throws ReflectiveOperationException {
Object enumChatString = ReflectionCache.ENUM_CHAT_TO_STRING_METHOD.get().invoke(npc.getGlowColor()); Object enumChatString = Reflections.ENUM_CHAT_TO_STRING_METHOD.get().invoke(npc.getGlowColor());
if (Utils.BUKKIT_VERSION > 12) { if (Utils.BUKKIT_VERSION > 12) {
Utils.setValue(packet, npc.getGlowColor(), ReflectionCache.ENUM_CHAT_CLASS); Utils.setValue(packet, npc.getGlowColor(), Reflections.ENUM_CHAT_CLASS);
Utils.setValue(packet, "c", ReflectionCache.I_CHAT_BASE_COMPONENT_A_CONSTRUCTOR.get().newInstance(enumChatString)); Utils.setValue(packet, "c", Reflections.I_CHAT_BASE_COMPONENT_A_CONSTRUCTOR.get().newInstance(enumChatString));
} else { } else {
Utils.setValue(packet, "g", ReflectionCache.GET_ENUM_CHAT_ID_METHOD.get().invoke(npc.getGlowColor())); Utils.setValue(packet, "g", Reflections.GET_ENUM_CHAT_ID_METHOD.get().invoke(npc.getGlowColor()));
Utils.setValue(packet, "c", enumChatString); Utils.setValue(packet, "c", enumChatString);
} }
} }

@ -4,7 +4,12 @@ import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
public class ClassCache { /**
* Gonalez decided to make every single enum we load be stored in this map
* to make NPC property application easier however this is terribly inefficient
* for memory. The entire NPC property system will most likely need a rewrite.
*/
public class EnumPropertyCache {
protected static final ConcurrentMap<CacheKey, Object> CACHE = new ConcurrentHashMap<>(); protected static final ConcurrentMap<CacheKey, Object> CACHE = new ConcurrentHashMap<>();
public static Object find(String name, Class<?> objectClass) { public static Object find(String name, Class<?> objectClass) {

@ -68,7 +68,7 @@ public class ReflectionBuilder {
return ImmutableList.copyOf(this.parameterTypes); return ImmutableList.copyOf(this.parameterTypes);
} }
public ImmutableList<String> getClassName() { public ImmutableList<String> getClassNames() {
return ImmutableList.copyOf(this.className); return ImmutableList.copyOf(this.className);
} }

@ -5,24 +5,24 @@ import lol.pyr.znpcsplus.ZNPCsPlus;
import java.util.List; import java.util.List;
public abstract class BaseReflection <T> { public abstract class ReflectionLazyLoader<T> {
protected final List<String> className; protected final List<String> possibleClassNames;
protected Class<?> BUILDER_CLASS; protected Class<?> reflectionClass;
private T cached; private T cached;
private boolean loaded = false; private boolean loaded = false;
protected BaseReflection(ReflectionBuilder builder) { protected ReflectionLazyLoader(ReflectionBuilder builder) {
this(builder.getClassName()); this(builder.getClassNames());
} }
protected BaseReflection(List<String> className) { protected ReflectionLazyLoader(List<String> possibleClassNames) {
this.className = className; this.possibleClassNames = possibleClassNames;
for (String classes : className) { for (String classes : possibleClassNames) {
try { try {
this.BUILDER_CLASS = Class.forName(classes); this.reflectionClass = Class.forName(classes);
break; break;
} catch (ClassNotFoundException ignored) { } catch (ClassNotFoundException ignored) {
} }
@ -36,13 +36,13 @@ public abstract class BaseReflection <T> {
public T get(boolean missAllowed) { public T get(boolean missAllowed) {
if (this.loaded) return this.cached; if (this.loaded) return this.cached;
try { try {
if (this.BUILDER_CLASS == null) throw new ClassNotFoundException("No class found: " + className); if (this.reflectionClass == null) throw new ClassNotFoundException("No class found: " + possibleClassNames);
T eval = (this.cached != null) ? this.cached : (this.cached = load()); T eval = (this.cached != null) ? this.cached : (this.cached = load());
if (eval == null) throw new NullPointerException(); if (eval == null) throw new NullPointerException();
} catch (Throwable throwable) { } catch (Throwable throwable) {
if (!missAllowed) { if (!missAllowed) {
warn(getClass().getSimpleName() + " get failed!"); warn(getClass().getSimpleName() + " get failed!");
warn("Class Names: " + className); warn("Class Names: " + possibleClassNames);
warn("Loader Type: " + getClass().getCanonicalName()); warn("Loader Type: " + getClass().getCanonicalName());
warn("Bukkit Version: " + Utils.BUKKIT_VERSION + " (" + Utils.getBukkitPackage() + ")"); warn("Bukkit Version: " + Utils.BUKKIT_VERSION + " (" + Utils.getBukkitPackage() + ")");
warn("Exception:"); warn("Exception:");

@ -6,10 +6,20 @@ import java.util.Arrays;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**
* A class containing all of the packages of the server jar that we import classes from.
* Every line has a check for the "flattened" variable due to the fact that server jars
* pre-1.17 had all of their classes "flattened" into one package.
*/
public class ReflectionPackage { public class ReflectionPackage {
private static final boolean flattened = !Utils.versionNewer(17); private static final boolean flattened = !Utils.versionNewer(17);
public static final String BUKKIT = "org.bukkit.craftbukkit." + Utils.getBukkitPackage(); public static final String BUKKIT = "org.bukkit.craftbukkit." + Utils.getBukkitPackage();
/**
* Check if the classes are flattened, if so we need to add the version string into the
* package string which is another quirk of the old server jars.
*/
public static final String MINECRAFT = join("net.minecraft", flattened ? "server." + Utils.getBukkitPackage() : ""); public static final String MINECRAFT = join("net.minecraft", flattened ? "server." + Utils.getBukkitPackage() : "");
public static final String NETWORK = flattened ? MINECRAFT : join(MINECRAFT, "network"); public static final String NETWORK = flattened ? MINECRAFT : join(MINECRAFT, "network");
@ -26,6 +36,7 @@ public class ReflectionPackage {
public static final String SERVER_NETWORK = flattened ? MINECRAFT : join(MINECRAFT, "server.network"); public static final String SERVER_NETWORK = flattened ? MINECRAFT : join(MINECRAFT, "server.network");
public static final String SERVER = flattened ? MINECRAFT : join(MINECRAFT, "server"); public static final String SERVER = flattened ? MINECRAFT : join(MINECRAFT, "server");
// Simple method that joins all the non-null & non-empty arguments with a dot and returns the result
public static String join(String... parts) { public static String join(String... parts) {
return Arrays.stream(parts) return Arrays.stream(parts)
.filter(Objects::nonNull) .filter(Objects::nonNull)

@ -13,7 +13,11 @@ import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
public final class ReflectionCache { /**
* Class containing all of the lazy-loaded reflections that the plugin uses to access
* inaccessible things from the server jar like packets, raw entity classes, etc.
*/
public final class Reflections {
public static final Class<?> PACKET_PLAY_IN_USE_ENTITY_CLASS = new ClassReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final Class<?> PACKET_PLAY_IN_USE_ENTITY_CLASS = new ClassReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName("PacketPlayInUseEntity")).get(); .withClassName("PacketPlayInUseEntity")).get();
@ -288,112 +292,112 @@ public final class ReflectionCache {
public static final Class<?> PROFILE_PUBLIC_KEY_CLASS = new ClassReflection(new ReflectionBuilder(ReflectionPackage.WORLD_ENTITY_PLAYER) public static final Class<?> PROFILE_PUBLIC_KEY_CLASS = new ClassReflection(new ReflectionBuilder(ReflectionPackage.WORLD_ENTITY_PLAYER)
.withClassName("ProfilePublicKey")).get(!Utils.versionNewer(19)); .withClassName("ProfilePublicKey")).get(!Utils.versionNewer(19));
public static final BaseReflection<Constructor<?>> SCOREBOARD_TEAM_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> SCOREBOARD_TEAM_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(SCOREBOARD_TEAM_CLASS) .withClassName(SCOREBOARD_TEAM_CLASS)
.withParameterTypes(SCOREBOARD_CLASS, String.class)); .withParameterTypes(SCOREBOARD_CLASS, String.class));
public static final BaseReflection<Constructor<?>> PLAYER_CONSTRUCTOR_OLD = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PLAYER_CONSTRUCTOR_OLD = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(ENTITY_PLAYER_CLASS) .withClassName(ENTITY_PLAYER_CLASS)
.withParameterTypes(MINECRAFT_SERVER_CLASS, WORLD_SERVER_CLASS, GameProfile.class, PLAYER_INTERACT_MANAGER_CLASS)); .withParameterTypes(MINECRAFT_SERVER_CLASS, WORLD_SERVER_CLASS, GameProfile.class, PLAYER_INTERACT_MANAGER_CLASS));
public static final BaseReflection<Constructor<?>> PLAYER_CONSTRUCTOR_NEW = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PLAYER_CONSTRUCTOR_NEW = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(ENTITY_PLAYER_CLASS) .withClassName(ENTITY_PLAYER_CLASS)
.withParameterTypes(MINECRAFT_SERVER_CLASS, WORLD_SERVER_CLASS, GameProfile.class)); .withParameterTypes(MINECRAFT_SERVER_CLASS, WORLD_SERVER_CLASS, GameProfile.class));
public static final BaseReflection<Constructor<?>> PLAYER_CONSTRUCTOR_NEW_1 = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PLAYER_CONSTRUCTOR_NEW_1 = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(ENTITY_PLAYER_CLASS) .withClassName(ENTITY_PLAYER_CLASS)
.withParameterTypes(MINECRAFT_SERVER_CLASS, WORLD_SERVER_CLASS, GameProfile.class, PROFILE_PUBLIC_KEY_CLASS)); .withParameterTypes(MINECRAFT_SERVER_CLASS, WORLD_SERVER_CLASS, GameProfile.class, PROFILE_PUBLIC_KEY_CLASS));
public static final BaseReflection<Constructor<?>> PLAYER_CONSTRUCTOR_NEW_2 = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PLAYER_CONSTRUCTOR_NEW_2 = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(ENTITY_PLAYER_CLASS) .withClassName(ENTITY_PLAYER_CLASS)
.withParameterTypes(MINECRAFT_SERVER_CLASS, WORLD_SERVER_CLASS, GameProfile.class)); .withParameterTypes(MINECRAFT_SERVER_CLASS, WORLD_SERVER_CLASS, GameProfile.class));
public static final BaseReflection<Constructor<?>> PACKET_PLAY_OUT_PLAYER_INFO_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PACKET_PLAY_OUT_PLAYER_INFO_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(PACKET_PLAY_OUT_PLAYER_INFO_CLASS) .withClassName(PACKET_PLAY_OUT_PLAYER_INFO_CLASS)
.withParameterTypes(ENUM_PLAYER_INFO_CLASS, (Utils.BUKKIT_VERSION > 16) ? Collection.class : Iterable.class).withParameterTypes(ENUM_PLAYER_INFO_CLASS, ENTITY_PLAYER_CLASS)); .withParameterTypes(ENUM_PLAYER_INFO_CLASS, (Utils.BUKKIT_VERSION > 16) ? Collection.class : Iterable.class).withParameterTypes(ENUM_PLAYER_INFO_CLASS, ENTITY_PLAYER_CLASS));
public static final BaseReflection<Constructor<?>> PACKET_PLAY_OUT_PLAYER_INFO_REMOVE_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PACKET_PLAY_OUT_PLAYER_INFO_REMOVE_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(PACKET_PLAY_OUT_PLAYER_INFO_REMOVE_CLASS) .withClassName(PACKET_PLAY_OUT_PLAYER_INFO_REMOVE_CLASS)
.withParameterTypes(List.class)); .withParameterTypes(List.class));
public static final BaseReflection<Constructor<?>> PACKET_PLAY_OUT_ENTITY_LOOK_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PACKET_PLAY_OUT_ENTITY_LOOK_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName("PacketPlayOutEntity$PacketPlayOutEntityLook") .withClassName("PacketPlayOutEntity$PacketPlayOutEntityLook")
.withParameterTypes(int.class, byte.class, byte.class, boolean.class)); .withParameterTypes(int.class, byte.class, byte.class, boolean.class));
public static final BaseReflection<Constructor<?>> PACKET_PLAY_OUT_ENTITY_HEAD_ROTATION_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PACKET_PLAY_OUT_ENTITY_HEAD_ROTATION_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName("PacketPlayOutEntityHeadRotation") .withClassName("PacketPlayOutEntityHeadRotation")
.withParameterTypes(ENTITY_CLASS, byte.class)); .withParameterTypes(ENTITY_CLASS, byte.class));
public static final BaseReflection<Constructor<?>> PACKET_PLAY_OUT_ENTITY_TELEPORT_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PACKET_PLAY_OUT_ENTITY_TELEPORT_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName("PacketPlayOutEntityTeleport") .withClassName("PacketPlayOutEntityTeleport")
.withParameterTypes(ENTITY_CLASS)); .withParameterTypes(ENTITY_CLASS));
public static final BaseReflection<Constructor<?>> PACKET_PLAY_OUT_ENTITY_META_DATA_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PACKET_PLAY_OUT_ENTITY_META_DATA_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName("PacketPlayOutEntityMetadata") .withClassName("PacketPlayOutEntityMetadata")
.withParameterTypes(int.class, DATA_WATCHER_CLASS, boolean.class)); .withParameterTypes(int.class, DATA_WATCHER_CLASS, boolean.class));
public static final BaseReflection<Constructor<?>> PACKET_PLAY_OUT_ENTITY_META_DATA_CONSTRUCTOR_V1 = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PACKET_PLAY_OUT_ENTITY_META_DATA_CONSTRUCTOR_V1 = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName("PacketPlayOutEntityMetadata") .withClassName("PacketPlayOutEntityMetadata")
.withParameterTypes(int.class, List.class)); .withParameterTypes(int.class, List.class));
public static final BaseReflection<Constructor<?>> PACKET_PLAY_OUT_NAMED_ENTITY_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PACKET_PLAY_OUT_NAMED_ENTITY_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName("PacketPlayOutNamedEntitySpawn") .withClassName("PacketPlayOutNamedEntitySpawn")
.withParameterTypes(ENTITY_HUMAN_CLASS)); .withParameterTypes(ENTITY_HUMAN_CLASS));
public static final BaseReflection<Constructor<?>> PACKET_PLAY_OUT_ENTITY_DESTROY_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PACKET_PLAY_OUT_ENTITY_DESTROY_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(PACKET_PLAY_OUT_ENTITY_DESTROY_CLASS) .withClassName(PACKET_PLAY_OUT_ENTITY_DESTROY_CLASS)
.withParameterTypes(int.class).withParameterTypes(int[].class)); .withParameterTypes(int.class).withParameterTypes(int[].class));
public static final BaseReflection<Constructor<?>> PACKET_PLAY_OUT_SPAWN_ENTITY_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PACKET_PLAY_OUT_SPAWN_ENTITY_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName("PacketPlayOutSpawnEntity") .withClassName("PacketPlayOutSpawnEntity")
.withClassName("PacketPlayOutSpawnEntityLiving") .withClassName("PacketPlayOutSpawnEntityLiving")
.withParameterTypes(ENTITY_LIVING).withParameterTypes(ENTITY_CLASS)); .withParameterTypes(ENTITY_LIVING).withParameterTypes(ENTITY_CLASS));
public static final BaseReflection<Constructor<?>> PLAYER_INTERACT_MANAGER_OLD_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PLAYER_INTERACT_MANAGER_OLD_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName("PlayerInteractManager") .withClassName("PlayerInteractManager")
.withParameterTypes(WORLD_CLASS)); .withParameterTypes(WORLD_CLASS));
public static final BaseReflection<Constructor<?>> PLAYER_INTERACT_MANAGER_NEW_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PLAYER_INTERACT_MANAGER_NEW_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName("PlayerInteractManager") .withClassName("PlayerInteractManager")
.withParameterTypes(WORLD_SERVER_CLASS)); .withParameterTypes(WORLD_SERVER_CLASS));
public static final BaseReflection<Constructor<?>> PACKET_PLAY_OUT_SCOREBOARD_TEAM_CONSTRUCTOR_OLD = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PACKET_PLAY_OUT_SCOREBOARD_TEAM_CONSTRUCTOR_OLD = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(PACKET_PLAY_OUT_SCOREBOARD_TEAM_CLASS)); .withClassName(PACKET_PLAY_OUT_SCOREBOARD_TEAM_CLASS));
public static final BaseReflection<Constructor<?>> PACKET_PLAY_OUT_ENTITY_EQUIPMENT_CONSTRUCTOR_OLD = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PACKET_PLAY_OUT_ENTITY_EQUIPMENT_CONSTRUCTOR_OLD = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName("PacketPlayOutEntityEquipment") .withClassName("PacketPlayOutEntityEquipment")
.withParameterTypes(int.class, int.class, ITEM_STACK_CLASS)); .withParameterTypes(int.class, int.class, ITEM_STACK_CLASS));
public static final BaseReflection<Constructor<?>> PACKET_PLAY_OUT_ENTITY_EQUIPMENT_CONSTRUCTOR_NEWEST_OLD = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PACKET_PLAY_OUT_ENTITY_EQUIPMENT_CONSTRUCTOR_NEWEST_OLD = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName("PacketPlayOutEntityEquipment") .withClassName("PacketPlayOutEntityEquipment")
.withParameterTypes(int.class, ENUM_ITEM_SLOT, ITEM_STACK_CLASS)); .withParameterTypes(int.class, ENUM_ITEM_SLOT, ITEM_STACK_CLASS));
public static final BaseReflection<Constructor<?>> PACKET_PLAY_OUT_ENTITY_EQUIPMENT_CONSTRUCTOR_V1 = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> PACKET_PLAY_OUT_ENTITY_EQUIPMENT_CONSTRUCTOR_V1 = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName("PacketPlayOutEntityEquipment") .withClassName("PacketPlayOutEntityEquipment")
.withParameterTypes(int.class, List.class)); .withParameterTypes(int.class, List.class));
public static final BaseReflection<Constructor<?>> I_CHAT_BASE_COMPONENT_A_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.CHAT) public static final ReflectionLazyLoader<Constructor<?>> I_CHAT_BASE_COMPONENT_A_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.CHAT)
.withClassName("ChatComponentText") .withClassName("ChatComponentText")
.withParameterTypes(String.class)); .withParameterTypes(String.class));
public static final BaseReflection<Constructor<?>> ENTITY_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> ENTITY_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(ENTITY_ARMOR_STAND_CLASS) .withClassName(ENTITY_ARMOR_STAND_CLASS)
.withParameterTypes(WORLD_CLASS, double.class, double.class, double.class)); .withParameterTypes(WORLD_CLASS, double.class, double.class, double.class));
public static final BaseReflection<Constructor<?>> DATA_WATCHER_OBJECT_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Constructor<?>> DATA_WATCHER_OBJECT_CONSTRUCTOR = new ConstructorReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(DATA_WATCHER_OBJECT) .withClassName(DATA_WATCHER_OBJECT)
.withParameterTypes(int.class, DATA_WATCHER_SERIALIZER)); .withParameterTypes(int.class, DATA_WATCHER_SERIALIZER));
public static final BaseReflection<Method> AS_NMS_COPY_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.BUKKIT) public static final ReflectionLazyLoader<Method> AS_NMS_COPY_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.BUKKIT)
.withClassName("inventory.CraftItemStack") .withClassName("inventory.CraftItemStack")
.withMethodName("asNMSCopy") .withMethodName("asNMSCopy")
.withParameterTypes(ItemStack.class)); .withParameterTypes(ItemStack.class));
public static final BaseReflection<Method> GET_PROFILE_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.ENTITY) public static final ReflectionLazyLoader<Method> GET_PROFILE_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.ENTITY)
.withClassName(ENTITY_HUMAN_CLASS) .withClassName(ENTITY_HUMAN_CLASS)
.withExpectResult(GameProfile.class)); .withExpectResult(GameProfile.class));
public static final BaseReflection<Method> GET_ENTITY_ID = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Method> GET_ENTITY_ID = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(ENTITY_CLASS) .withClassName(ENTITY_CLASS)
.withMethodName("getId") .withMethodName("getId")
.withMethodName("ae") .withMethodName("ae")
@ -401,63 +405,63 @@ public final class ReflectionCache {
.withMethodName("af") .withMethodName("af")
.withExpectResult(int.class)); .withExpectResult(int.class));
public static final BaseReflection<Method> GET_HANDLE_PLAYER_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.BUKKIT) public static final ReflectionLazyLoader<Method> GET_HANDLE_PLAYER_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.BUKKIT)
.withClassName("entity.CraftPlayer").withClassName("entity.CraftHumanEntity") .withClassName("entity.CraftPlayer").withClassName("entity.CraftHumanEntity")
.withMethodName("getHandle")); .withMethodName("getHandle"));
public static final BaseReflection<Method> GET_HANDLE_WORLD_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.BUKKIT) public static final ReflectionLazyLoader<Method> GET_HANDLE_WORLD_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.BUKKIT)
.withClassName("CraftWorld") .withClassName("CraftWorld")
.withMethodName("getHandle")); .withMethodName("getHandle"));
public static final BaseReflection<Method> GET_SERVER_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.BUKKIT) public static final ReflectionLazyLoader<Method> GET_SERVER_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.BUKKIT)
.withClassName("CraftServer") .withClassName("CraftServer")
.withMethodName("getServer")); .withMethodName("getServer"));
public static final BaseReflection<Method> SEND_PACKET_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Method> SEND_PACKET_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(PLAYER_CONNECTION_CLASS) .withClassName(PLAYER_CONNECTION_CLASS)
.withMethodName("sendPacket").withMethodName("a") .withMethodName("sendPacket").withMethodName("a")
.withParameterTypes(PACKET_CLASS)); .withParameterTypes(PACKET_CLASS));
public static final BaseReflection<Method> SET_CUSTOM_NAME_OLD_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Method> SET_CUSTOM_NAME_OLD_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(ENTITY_CLASS) .withClassName(ENTITY_CLASS)
.withMethodName("setCustomName") .withMethodName("setCustomName")
.withParameterTypes(String.class)); .withParameterTypes(String.class));
public static final BaseReflection<Method> SET_CUSTOM_NAME_NEW_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Method> SET_CUSTOM_NAME_NEW_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(ENTITY_CLASS) .withClassName(ENTITY_CLASS)
.withMethodName("setCustomName") .withMethodName("setCustomName")
.withMethodName("a") .withMethodName("a")
.withMethodName("b") .withMethodName("b")
.withParameterTypes(I_CHAT_BASE_COMPONENT).withExpectResult(void.class)); .withParameterTypes(I_CHAT_BASE_COMPONENT).withExpectResult(void.class));
public static final BaseReflection<Method> SET_CUSTOM_NAME_VISIBLE_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Method> SET_CUSTOM_NAME_VISIBLE_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(ENTITY_CLASS) .withClassName(ENTITY_CLASS)
.withMethodName("setCustomNameVisible") .withMethodName("setCustomNameVisible")
.withMethodName("n") .withMethodName("n")
.withParameterTypes(boolean.class)); .withParameterTypes(boolean.class));
public static final BaseReflection<Method> SET_INVISIBLE_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Method> SET_INVISIBLE_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(ENTITY_ARMOR_STAND_CLASS) .withClassName(ENTITY_ARMOR_STAND_CLASS)
.withMethodName("setInvisible").withMethodName("j") .withMethodName("setInvisible").withMethodName("j")
.withParameterTypes(boolean.class)); .withParameterTypes(boolean.class));
public static final BaseReflection<Method> SET_LOCATION_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Method> SET_LOCATION_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(ENTITY_CLASS) .withClassName(ENTITY_CLASS)
.withMethodName("setPositionRotation") .withMethodName("setPositionRotation")
.withMethodName("a") .withMethodName("a")
.withParameterTypes(double.class, double.class, double.class, float.class, float.class)); .withParameterTypes(double.class, double.class, double.class, float.class, float.class));
public static final BaseReflection<Method> SET_DATA_WATCHER_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Method> SET_DATA_WATCHER_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(DATA_WATCHER_CLASS) .withClassName(DATA_WATCHER_CLASS)
.withMethodName("set").withMethodName("b") .withMethodName("set").withMethodName("b")
.withParameterTypes(DATA_WATCHER_OBJECT, Object.class)); .withParameterTypes(DATA_WATCHER_OBJECT, Object.class));
public static final BaseReflection<Method> WATCH_DATA_WATCHER_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Method> WATCH_DATA_WATCHER_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(DATA_WATCHER_CLASS) .withClassName(DATA_WATCHER_CLASS)
.withMethodName("watch") .withMethodName("watch")
.withParameterTypes(int.class, Object.class)); .withParameterTypes(int.class, Object.class));
public static final BaseReflection<Method> GET_DATA_WATCHER_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Method> GET_DATA_WATCHER_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(ENTITY_CLASS) .withClassName(ENTITY_CLASS)
.withMethodName("getDataWatcher") .withMethodName("getDataWatcher")
.withMethodName("ai") .withMethodName("ai")
@ -465,91 +469,91 @@ public final class ReflectionCache {
.withMethodName("aj") .withMethodName("aj")
.withExpectResult(DATA_WATCHER_CLASS)); .withExpectResult(DATA_WATCHER_CLASS));
public static final BaseReflection<Method> GET_BUKKIT_ENTITY_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Method> GET_BUKKIT_ENTITY_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(ENTITY_CLASS) .withClassName(ENTITY_CLASS)
.withMethodName("getBukkitEntity")); .withMethodName("getBukkitEntity"));
public static final BaseReflection<Method> GET_ENUM_CHAT_ID_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Method> GET_ENUM_CHAT_ID_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(ENUM_CHAT_CLASS) .withClassName(ENUM_CHAT_CLASS)
.withMethodName("b")); .withMethodName("b"));
public static final BaseReflection<Method> ENUM_CHAT_TO_STRING_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Method> ENUM_CHAT_TO_STRING_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(ENUM_CHAT_CLASS) .withClassName(ENUM_CHAT_CLASS)
.withExpectResult(String.class) .withExpectResult(String.class)
.withMethodName("toString")); .withMethodName("toString"));
public static final BaseReflection<Method> ENTITY_TYPES_A_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.ENTITY) public static final ReflectionLazyLoader<Method> ENTITY_TYPES_A_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.ENTITY)
.withClassName(ENTITY_TYPES_CLASS) .withClassName(ENTITY_TYPES_CLASS)
.withMethodName("a") .withMethodName("a")
.withParameterTypes(String.class)); .withParameterTypes(String.class));
public static final BaseReflection<Method> PACKET_PLAY_OUT_SCOREBOARD_TEAM_CREATE_V1 = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Method> PACKET_PLAY_OUT_SCOREBOARD_TEAM_CREATE_V1 = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(PACKET_PLAY_OUT_SCOREBOARD_TEAM_CLASS) .withClassName(PACKET_PLAY_OUT_SCOREBOARD_TEAM_CLASS)
.withMethodName("a") .withMethodName("a")
.withParameterTypes(SCOREBOARD_TEAM_CLASS)); .withParameterTypes(SCOREBOARD_TEAM_CLASS));
public static final BaseReflection<Method> PACKET_PLAY_OUT_SCOREBOARD_TEAM_CREATE = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Method> PACKET_PLAY_OUT_SCOREBOARD_TEAM_CREATE = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(PACKET_PLAY_OUT_SCOREBOARD_TEAM_CLASS) .withClassName(PACKET_PLAY_OUT_SCOREBOARD_TEAM_CLASS)
.withMethodName("a") .withMethodName("a")
.withParameterTypes(SCOREBOARD_TEAM_CLASS, boolean.class)); .withParameterTypes(SCOREBOARD_TEAM_CLASS, boolean.class));
public static final BaseReflection<Method> SCOREBOARD_PLAYER_LIST = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Method> SCOREBOARD_PLAYER_LIST = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(SCOREBOARD_TEAM_CLASS) .withClassName(SCOREBOARD_TEAM_CLASS)
.withMethodName("getPlayerNameSet").withMethodName("g")); .withMethodName("getPlayerNameSet").withMethodName("g"));
public static final BaseReflection<Method> ENUM_CHAT_FORMAT_FIND = new MethodReflection(new ReflectionBuilder(ReflectionPackage.MINECRAFT) public static final ReflectionLazyLoader<Method> ENUM_CHAT_FORMAT_FIND = new MethodReflection(new ReflectionBuilder(ReflectionPackage.MINECRAFT)
.withClassName(ENUM_CHAT_CLASS) .withClassName(ENUM_CHAT_CLASS)
.withParameterTypes(String.class).withExpectResult(ENUM_CHAT_CLASS)); .withParameterTypes(String.class).withExpectResult(ENUM_CHAT_CLASS));
public static final BaseReflection<Method> CRAFT_CHAT_MESSAGE_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.BUKKIT) public static final ReflectionLazyLoader<Method> CRAFT_CHAT_MESSAGE_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.BUKKIT)
.withClassName(CRAFT_CHAT_MESSAGE_CLASS) .withClassName(CRAFT_CHAT_MESSAGE_CLASS)
.withMethodName("fromStringOrNull") .withMethodName("fromStringOrNull")
.withParameterTypes(String.class)); .withParameterTypes(String.class));
public static final BaseReflection<Method> GET_UNIQUE_ID_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.MINECRAFT) public static final ReflectionLazyLoader<Method> GET_UNIQUE_ID_METHOD = new MethodReflection(new ReflectionBuilder(ReflectionPackage.MINECRAFT)
.withClassName(ENTITY_CLASS) .withClassName(ENTITY_CLASS)
.withExpectResult(UUID.class)); .withExpectResult(UUID.class));
public static final BaseReflection<Method> GET_DATAWATCHER_B_LIST = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Method> GET_DATAWATCHER_B_LIST = new MethodReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withMethodName("c") .withMethodName("c")
.withClassName(DATA_WATCHER_CLASS)); .withClassName(DATA_WATCHER_CLASS));
public static final BaseReflection<Field> PLAYER_CONNECTION_FIELD = new FieldReflection(new ReflectionBuilder(ReflectionPackage.SERVER_LEVEL) public static final ReflectionLazyLoader<Field> PLAYER_CONNECTION_FIELD = new FieldReflection(new ReflectionBuilder(ReflectionPackage.SERVER_LEVEL)
.withClassName(ENTITY_PLAYER_CLASS) .withClassName(ENTITY_PLAYER_CLASS)
.withFieldName((Utils.BUKKIT_VERSION > 16) ? "b" : "playerConnection")); .withFieldName((Utils.BUKKIT_VERSION > 16) ? "b" : "playerConnection"));
public static final BaseReflection<Field> NETWORK_MANAGER_FIELD = new FieldReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Field> NETWORK_MANAGER_FIELD = new FieldReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(PLAYER_CONNECTION_CLASS) .withClassName(PLAYER_CONNECTION_CLASS)
.withFieldName((Utils.BUKKIT_VERSION > 16) ? "a" : "networkManager") .withFieldName((Utils.BUKKIT_VERSION > 16) ? "a" : "networkManager")
.withExpectResult(NETWORK_MANAGER_CLASS)); .withExpectResult(NETWORK_MANAGER_CLASS));
public static final BaseReflection<Field> CHANNEL_FIELD = new FieldReflection(new ReflectionBuilder(ReflectionPackage.SERVER_NETWORK) public static final ReflectionLazyLoader<Field> CHANNEL_FIELD = new FieldReflection(new ReflectionBuilder(ReflectionPackage.SERVER_NETWORK)
.withClassName(NETWORK_MANAGER_CLASS) .withClassName(NETWORK_MANAGER_CLASS)
.withExpectResult(Channel.class)); .withExpectResult(Channel.class));
public static final BaseReflection<Field> PACKET_IN_USE_ENTITY_ID_FIELD = new FieldReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Field> PACKET_IN_USE_ENTITY_ID_FIELD = new FieldReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName("PacketPlayInUseEntity") .withClassName("PacketPlayInUseEntity")
.withFieldName("a")); .withFieldName("a"));
public static final BaseReflection<Object> ADD_PLAYER_FIELD = new FieldReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Object> ADD_PLAYER_FIELD = new FieldReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName("PacketPlayOutPlayerInfo$EnumPlayerInfoAction") .withClassName("PacketPlayOutPlayerInfo$EnumPlayerInfoAction")
.withClassName("ClientboundPlayerInfoUpdatePacket$a") .withClassName("ClientboundPlayerInfoUpdatePacket$a")
.withFieldName((Utils.BUKKIT_VERSION > 16) ? "a" : "ADD_PLAYER")).asValueField(); .withFieldName((Utils.BUKKIT_VERSION > 16) ? "a" : "ADD_PLAYER")).asValueField();
public static final BaseReflection<Object> UPDATE_LISTED_FIELD = new FieldReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Object> UPDATE_LISTED_FIELD = new FieldReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName("ClientboundPlayerInfoUpdatePacket$a") .withClassName("ClientboundPlayerInfoUpdatePacket$a")
.withFieldName("d")).asValueField(); .withFieldName("d")).asValueField();
public static final BaseReflection<Object> REMOVE_PLAYER_FIELD = new FieldReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Object> REMOVE_PLAYER_FIELD = new FieldReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName("PacketPlayOutPlayerInfo$EnumPlayerInfoAction") .withClassName("PacketPlayOutPlayerInfo$EnumPlayerInfoAction")
.withClassName("ClientboundPlayerInfoUpdatePacket$a") .withClassName("ClientboundPlayerInfoUpdatePacket$a")
.withFieldName((Utils.BUKKIT_VERSION > 16) ? "e" : "REMOVE_PLAYER")).asValueField(); .withFieldName((Utils.BUKKIT_VERSION > 16) ? "e" : "REMOVE_PLAYER")).asValueField();
public static final BaseReflection<Object> DATA_WATCHER_REGISTER_FIELD = new FieldReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Object> DATA_WATCHER_REGISTER_FIELD = new FieldReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(DATA_WATCHER_REGISTRY) .withClassName(DATA_WATCHER_REGISTRY)
.withFieldName("a")).asValueField(); .withFieldName("a")).asValueField();
public static final BaseReflection<Object> ENUM_TAG_VISIBILITY_NEVER_FIELD = new FieldReflection(new ReflectionBuilder(ReflectionPackage.PACKET) public static final ReflectionLazyLoader<Object> ENUM_TAG_VISIBILITY_NEVER_FIELD = new FieldReflection(new ReflectionBuilder(ReflectionPackage.PACKET)
.withClassName(ENUM_TAG_VISIBILITY) .withClassName(ENUM_TAG_VISIBILITY)
.withFieldName("b")).asValueField(); .withFieldName("b")).asValueField();
} }

@ -1,14 +1,14 @@
package io.github.znetworkw.znpcservers.reflection.types; package io.github.znetworkw.znpcservers.reflection.types;
import io.github.znetworkw.znpcservers.reflection.BaseReflection; import io.github.znetworkw.znpcservers.reflection.ReflectionLazyLoader;
import io.github.znetworkw.znpcservers.reflection.ReflectionBuilder; import io.github.znetworkw.znpcservers.reflection.ReflectionBuilder;
public class ClassReflection extends BaseReflection<Class<?>> { public class ClassReflection extends ReflectionLazyLoader<Class<?>> {
public ClassReflection(ReflectionBuilder reflectionBuilder) { public ClassReflection(ReflectionBuilder reflectionBuilder) {
super(reflectionBuilder); super(reflectionBuilder);
} }
protected Class<?> load() { protected Class<?> load() {
return this.BUILDER_CLASS; return this.reflectionClass;
} }
} }

@ -2,12 +2,12 @@ package io.github.znetworkw.znpcservers.reflection.types;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import io.github.znetworkw.znpcservers.reflection.BaseReflection; import io.github.znetworkw.znpcservers.reflection.ReflectionLazyLoader;
import io.github.znetworkw.znpcservers.reflection.ReflectionBuilder; import io.github.znetworkw.znpcservers.reflection.ReflectionBuilder;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
public class ConstructorReflection extends BaseReflection<Constructor<?>> { public class ConstructorReflection extends ReflectionLazyLoader<Constructor<?>> {
private final ImmutableList<Class<?>[]> parameterTypes; private final ImmutableList<Class<?>[]> parameterTypes;
public ConstructorReflection(ReflectionBuilder reflectionBuilder) { public ConstructorReflection(ReflectionBuilder reflectionBuilder) {
@ -19,9 +19,9 @@ public class ConstructorReflection extends BaseReflection<Constructor<?>> {
Constructor<?> constructor = null; Constructor<?> constructor = null;
if (Iterables.size(parameterTypes) > 1) { if (Iterables.size(parameterTypes) > 1) {
for (Class<?>[] keyParameters : parameterTypes) try { for (Class<?>[] keyParameters : parameterTypes) try {
constructor = this.BUILDER_CLASS.getDeclaredConstructor(keyParameters); constructor = this.reflectionClass.getDeclaredConstructor(keyParameters);
} catch (NoSuchMethodException ignored) {} } catch (NoSuchMethodException ignored) {}
} else constructor = (Iterables.size(parameterTypes) > 0) ? this.BUILDER_CLASS.getDeclaredConstructor(Iterables.get(parameterTypes, 0)) : this.BUILDER_CLASS.getDeclaredConstructor(); } else constructor = (Iterables.size(parameterTypes) > 0) ? this.reflectionClass.getDeclaredConstructor(Iterables.get(parameterTypes, 0)) : this.reflectionClass.getDeclaredConstructor();
if (constructor != null) constructor.setAccessible(true); if (constructor != null) constructor.setAccessible(true);
return constructor; return constructor;
} }

@ -1,17 +1,17 @@
package io.github.znetworkw.znpcservers.reflection.types; package io.github.znetworkw.znpcservers.reflection.types;
import io.github.znetworkw.znpcservers.reflection.BaseReflection; import io.github.znetworkw.znpcservers.reflection.ReflectionLazyLoader;
import io.github.znetworkw.znpcservers.reflection.ClassCache; import io.github.znetworkw.znpcservers.reflection.EnumPropertyCache;
import io.github.znetworkw.znpcservers.reflection.ReflectionBuilder; import io.github.znetworkw.znpcservers.reflection.ReflectionBuilder;
public class EnumReflection extends BaseReflection<Enum<?>[]> { public class EnumReflection extends ReflectionLazyLoader<Enum<?>[]> {
public EnumReflection(ReflectionBuilder reflectionBuilder) { public EnumReflection(ReflectionBuilder reflectionBuilder) {
super(reflectionBuilder); super(reflectionBuilder);
} }
protected Enum<?>[] load() { protected Enum<?>[] load() {
Enum<?>[] arrayOfEnum = (Enum<?>[]) this.BUILDER_CLASS.getEnumConstants(); Enum<?>[] enums = (Enum<?>[]) this.reflectionClass.getEnumConstants();
for (Enum<?> enumConstant : arrayOfEnum) ClassCache.register(enumConstant.name(), enumConstant, this.BUILDER_CLASS); for (Enum<?> enumConstant : enums) EnumPropertyCache.register(enumConstant.name(), enumConstant, this.reflectionClass);
return arrayOfEnum; return enums;
} }
} }

@ -1,12 +1,12 @@
package io.github.znetworkw.znpcservers.reflection.types; package io.github.znetworkw.znpcservers.reflection.types;
import io.github.znetworkw.znpcservers.reflection.BaseReflection; import io.github.znetworkw.znpcservers.reflection.ReflectionLazyLoader;
import io.github.znetworkw.znpcservers.reflection.ReflectionBuilder; import io.github.znetworkw.znpcservers.reflection.ReflectionBuilder;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.List; import java.util.List;
public class FieldReflection extends BaseReflection<Field> { public class FieldReflection extends ReflectionLazyLoader<Field> {
private final String fieldName; private final String fieldName;
private final Class<?> expectType; private final Class<?> expectType;
@ -18,22 +18,22 @@ public class FieldReflection extends BaseReflection<Field> {
protected Field load() throws NoSuchFieldException { protected Field load() throws NoSuchFieldException {
if (expectType != null) if (expectType != null)
for (Field field1 : this.BUILDER_CLASS.getDeclaredFields()) { for (Field field1 : this.reflectionClass.getDeclaredFields()) {
if (field1.getType() == expectType) { if (field1.getType() == expectType) {
field1.setAccessible(true); field1.setAccessible(true);
return field1; return field1;
} }
} }
Field field = this.BUILDER_CLASS.getDeclaredField(fieldName); Field field = this.reflectionClass.getDeclaredField(fieldName);
field.setAccessible(true); field.setAccessible(true);
return field; return field;
} }
public AsValueField asValueField() { public AsValueField asValueField() {
return new AsValueField(this, className); return new AsValueField(this, possibleClassNames);
} }
private static class AsValueField extends BaseReflection<Object> { private static class AsValueField extends ReflectionLazyLoader<Object> {
private final FieldReflection fieldReflection; private final FieldReflection fieldReflection;
public AsValueField(FieldReflection fieldReflection, List<String> className) { public AsValueField(FieldReflection fieldReflection, List<String> className) {

@ -2,12 +2,12 @@ package io.github.znetworkw.znpcservers.reflection.types;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import io.github.znetworkw.znpcservers.reflection.BaseReflection; import io.github.znetworkw.znpcservers.reflection.ReflectionLazyLoader;
import io.github.znetworkw.znpcservers.reflection.ReflectionBuilder; import io.github.znetworkw.znpcservers.reflection.ReflectionBuilder;
import java.lang.reflect.Method; import java.lang.reflect.Method;
public class MethodReflection extends BaseReflection<Method> { public class MethodReflection extends ReflectionLazyLoader<Method> {
private final ImmutableList<String> methods; private final ImmutableList<String> methods;
private final ImmutableList<Class<?>[]> parameterTypes; private final ImmutableList<Class<?>[]> parameterTypes;
private final Class<?> expectType; private final Class<?> expectType;
@ -22,11 +22,11 @@ public class MethodReflection extends BaseReflection<Method> {
protected Method load() { protected Method load() {
Method methodThis = null; Method methodThis = null;
boolean hasExpectedType = (expectType != null); boolean hasExpectedType = (expectType != null);
if (methods.isEmpty() && hasExpectedType) for (Method method : this.BUILDER_CLASS.getDeclaredMethods()) if (method.getReturnType() == expectType) return method; if (methods.isEmpty() && hasExpectedType) for (Method method : this.reflectionClass.getDeclaredMethods()) if (method.getReturnType() == expectType) return method;
for (String methodName : methods) try { for (String methodName : methods) try {
Method maybeGet; Method maybeGet;
if (!Iterables.isEmpty(parameterTypes)) maybeGet = this.BUILDER_CLASS.getDeclaredMethod(methodName, Iterables.get(parameterTypes, 0)); if (!Iterables.isEmpty(parameterTypes)) maybeGet = this.reflectionClass.getDeclaredMethod(methodName, Iterables.get(parameterTypes, 0));
else maybeGet = this.BUILDER_CLASS.getDeclaredMethod(methodName); else maybeGet = this.reflectionClass.getDeclaredMethod(methodName);
if (expectType != null && expectType != maybeGet.getReturnType()) continue; if (expectType != null && expectType != maybeGet.getReturnType()) continue;
maybeGet.setAccessible(true); maybeGet.setAccessible(true);
methodThis = maybeGet; methodThis = maybeGet;

@ -1,7 +1,7 @@
package io.github.znetworkw.znpcservers.user; package io.github.znetworkw.znpcservers.user;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import io.github.znetworkw.znpcservers.reflection.ReflectionCache; import io.github.znetworkw.znpcservers.reflection.Reflections;
import io.github.znetworkw.znpcservers.npc.NPC; import io.github.znetworkw.znpcservers.npc.NPC;
import io.github.znetworkw.znpcservers.npc.NPCAction; import io.github.znetworkw.znpcservers.npc.NPCAction;
import io.github.znetworkw.znpcservers.npc.event.ClickType; import io.github.znetworkw.znpcservers.npc.event.ClickType;
@ -41,9 +41,9 @@ public class ZUser {
this.lastClicked = new HashMap<>(); this.lastClicked = new HashMap<>();
this.eventServices = new ArrayList<>(); this.eventServices = new ArrayList<>();
try { try {
Object playerHandle = ReflectionCache.GET_HANDLE_PLAYER_METHOD.get().invoke(toPlayer()); Object playerHandle = Reflections.GET_HANDLE_PLAYER_METHOD.get().invoke(toPlayer());
this.gameProfile = (GameProfile) ReflectionCache.GET_PROFILE_METHOD.get().invoke(playerHandle, new Object[0]); this.gameProfile = (GameProfile) Reflections.GET_PROFILE_METHOD.get().invoke(playerHandle, new Object[0]);
this.playerConnection = ReflectionCache.PLAYER_CONNECTION_FIELD.get().get(playerHandle); this.playerConnection = Reflections.PLAYER_CONNECTION_FIELD.get().get(playerHandle);
} catch (IllegalAccessException | InvocationTargetException e) { } catch (IllegalAccessException | InvocationTargetException e) {
throw new IllegalStateException("can't create user for player " + uuid.toString(), e.getCause()); throw new IllegalStateException("can't create user for player " + uuid.toString(), e.getCause());
} }
@ -62,7 +62,11 @@ public class ZUser {
public void run() { public void run() {
Exception ex = user.tryRegisterChannel(); Exception ex = user.tryRegisterChannel();
Player player = user.toPlayer(); Player player = user.toPlayer();
if (player == null || !player.isOnline() || ex == null) { if (player == null) {
tries--;
return;
}
else if (!player.isOnline() || ex == null) {
cancel(); cancel();
return; return;
} }
@ -78,7 +82,7 @@ public class ZUser {
private Exception tryRegisterChannel() { private Exception tryRegisterChannel() {
try { try {
Channel channel = (Channel) ReflectionCache.CHANNEL_FIELD.get().get(ReflectionCache.NETWORK_MANAGER_FIELD.get().get(this.playerConnection)); Channel channel = (Channel) Reflections.CHANNEL_FIELD.get().get(Reflections.NETWORK_MANAGER_FIELD.get().get(this.playerConnection));
if (channel.pipeline().names().contains("npc_interact")) channel.pipeline().remove("npc_interact"); if (channel.pipeline().names().contains("npc_interact")) channel.pipeline().remove("npc_interact");
channel.pipeline().addAfter("decoder", "npc_interact", new ZNPCSocketDecoder()); channel.pipeline().addAfter("decoder", "npc_interact", new ZNPCSocketDecoder());
return null; return null;
@ -138,11 +142,11 @@ public class ZUser {
class ZNPCSocketDecoder extends MessageToMessageDecoder<Object> { class ZNPCSocketDecoder extends MessageToMessageDecoder<Object> {
protected void decode(ChannelHandlerContext channelHandlerContext, Object packet, List<Object> out) throws Exception { protected void decode(ChannelHandlerContext channelHandlerContext, Object packet, List<Object> out) throws Exception {
out.add(packet); out.add(packet);
if (packet.getClass() == ReflectionCache.PACKET_PLAY_IN_USE_ENTITY_CLASS) { if (packet.getClass() == Reflections.PACKET_PLAY_IN_USE_ENTITY_CLASS) {
long lastInteractNanos = System.nanoTime() - ZUser.this.lastInteract; long lastInteractNanos = System.nanoTime() - ZUser.this.lastInteract;
if (ZUser.this.lastInteract != 0L && lastInteractNanos < 1000000000L) if (ZUser.this.lastInteract != 0L && lastInteractNanos < 1000000000L)
return; return;
int entityId = ReflectionCache.PACKET_IN_USE_ENTITY_ID_FIELD.get().getInt(packet); int entityId = Reflections.PACKET_IN_USE_ENTITY_ID_FIELD.get().getInt(packet);
NPC npc = NPC.all().stream().filter(npc1 -> (npc1.getEntityID() == entityId)).findFirst().orElse(null); NPC npc = NPC.all().stream().filter(npc1 -> (npc1.getEntityID() == entityId)).findFirst().orElse(null);
if (npc == null) if (npc == null)
return; return;

@ -1,6 +1,6 @@
package io.github.znetworkw.znpcservers.utility; package io.github.znetworkw.znpcservers.utility;
import io.github.znetworkw.znpcservers.reflection.ReflectionCache; import io.github.znetworkw.znpcservers.reflection.Reflections;
import io.github.znetworkw.znpcservers.configuration.ConfigurationConstants; import io.github.znetworkw.znpcservers.configuration.ConfigurationConstants;
import io.github.znetworkw.znpcservers.user.ZUser; import io.github.znetworkw.znpcservers.user.ZUser;
import me.clip.placeholderapi.PlaceholderAPI; import me.clip.placeholderapi.PlaceholderAPI;
@ -76,7 +76,7 @@ public final class Utils {
try { try {
for (Object packet : packets) { for (Object packet : packets) {
if (packet != null) if (packet != null)
ReflectionCache.SEND_PACKET_METHOD.get().invoke(user.getPlayerConnection(), packet); Reflections.SEND_PACKET_METHOD.get().invoke(user.getPlayerConnection(), packet);
} }
} catch (IllegalAccessException | java.lang.reflect.InvocationTargetException e) { } catch (IllegalAccessException | java.lang.reflect.InvocationTargetException e) {
e.printStackTrace(); e.printStackTrace();