mirror of
https://github.com/amalthea-mc/ShopChest.git
synced 2024-11-26 04:12:22 +00:00
Remove useless method in Utils
This commit is contained in:
parent
b46bd953c3
commit
f4499b4cfe
@ -1,41 +1,5 @@
|
|||||||
package de.epiceric.shopchest.utils;
|
package de.epiceric.shopchest.utils;
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Base64;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.block.Chest;
|
|
||||||
import org.bukkit.block.DoubleChest;
|
|
||||||
import org.bukkit.configuration.InvalidConfigurationException;
|
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
|
||||||
import org.bukkit.entity.EntityType;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
import org.bukkit.inventory.InventoryHolder;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.bukkit.inventory.PlayerInventory;
|
|
||||||
import org.bukkit.inventory.meta.BookMeta;
|
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
|
||||||
import org.bukkit.util.Vector;
|
|
||||||
import org.inventivetalent.reflection.resolver.FieldResolver;
|
|
||||||
import org.inventivetalent.reflection.resolver.minecraft.NMSClassResolver;
|
|
||||||
|
|
||||||
import de.epiceric.shopchest.ShopChest;
|
import de.epiceric.shopchest.ShopChest;
|
||||||
import de.epiceric.shopchest.config.Placeholder;
|
import de.epiceric.shopchest.config.Placeholder;
|
||||||
import de.epiceric.shopchest.language.LanguageUtils;
|
import de.epiceric.shopchest.language.LanguageUtils;
|
||||||
@ -44,6 +8,27 @@ import de.epiceric.shopchest.language.Replacement;
|
|||||||
import de.epiceric.shopchest.nms.CustomBookMeta;
|
import de.epiceric.shopchest.nms.CustomBookMeta;
|
||||||
import de.epiceric.shopchest.nms.JsonBuilder;
|
import de.epiceric.shopchest.nms.JsonBuilder;
|
||||||
import de.epiceric.shopchest.shop.Shop;
|
import de.epiceric.shopchest.shop.Shop;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Chest;
|
||||||
|
import org.bukkit.block.DoubleChest;
|
||||||
|
import org.bukkit.configuration.InvalidConfigurationException;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.Inventory;
|
||||||
|
import org.bukkit.inventory.InventoryHolder;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.PlayerInventory;
|
||||||
|
import org.bukkit.inventory.meta.BookMeta;
|
||||||
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
|
import org.inventivetalent.reflection.resolver.FieldResolver;
|
||||||
|
import org.inventivetalent.reflection.resolver.minecraft.NMSClassResolver;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
public class Utils {
|
public class Utils {
|
||||||
static NMSClassResolver nmsClassResolver = new NMSClassResolver();
|
static NMSClassResolver nmsClassResolver = new NMSClassResolver();
|
||||||
@ -347,219 +332,6 @@ public class Utils {
|
|||||||
jb.sendJson(p);
|
jb.sendJson(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a NMS data watcher object to send via a {@code PacketPlayOutEntityMetadata} packet.
|
|
||||||
* Gravity will be disabled and the custom name will be displayed if available.
|
|
||||||
* @param customName Custom Name of the entity or {@code null}
|
|
||||||
* @param nmsItemStack NMS ItemStack or {@code null} if armor stand
|
|
||||||
*/
|
|
||||||
public static Object createDataWatcher(String customName, Object nmsItemStack) {
|
|
||||||
String version = getServerVersion();
|
|
||||||
int majorVersion = getMajorVersion();
|
|
||||||
|
|
||||||
try {
|
|
||||||
byte entityFlags = nmsItemStack == null ? (byte) 0b100000 : 0; // invisible if armor stand
|
|
||||||
byte armorStandFlags = nmsItemStack == null ? (byte) 0b10000 : 0; // marker (since 1.8_R2)
|
|
||||||
|
|
||||||
Object dataWatcher = dataWatcherClass.getConstructor(entityClass).newInstance((Object) null);
|
|
||||||
if (majorVersion < 9) {
|
|
||||||
if (getRevision() == 1) armorStandFlags = 0; // Marker not supported on 1.8_R1
|
|
||||||
|
|
||||||
Method a = dataWatcherClass.getMethod("a", int.class, Object.class);
|
|
||||||
a.invoke(dataWatcher, 0, entityFlags); // flags
|
|
||||||
a.invoke(dataWatcher, 1, (short) 300); // air ticks (?)
|
|
||||||
a.invoke(dataWatcher, 3, (byte) (customName != null ? 1 : 0)); // custom name visible
|
|
||||||
a.invoke(dataWatcher, 2, customName != null ? customName : ""); // custom name
|
|
||||||
a.invoke(dataWatcher, 4, (byte) 1); // silent
|
|
||||||
a.invoke(dataWatcher, 10, nmsItemStack == null ? armorStandFlags : nmsItemStack); // item / armor stand flags
|
|
||||||
} else {
|
|
||||||
Method register = dataWatcherClass.getMethod("register", dataWatcherObjectClass, Object.class);
|
|
||||||
String[] dataWatcherObjectFieldNames;
|
|
||||||
|
|
||||||
if ("v1_9_R1".equals(version)) {
|
|
||||||
dataWatcherObjectFieldNames = new String[] {"ax", "ay", "aA", "az", "aB", null, "c", "a"};
|
|
||||||
} else if ("v1_9_R2".equals(version)){
|
|
||||||
dataWatcherObjectFieldNames = new String[] {"ay", "az", "aB", "aA", "aC", null, "c", "a"};
|
|
||||||
} else if ("v1_10_R1".equals(version)) {
|
|
||||||
dataWatcherObjectFieldNames = new String[] {"aa", "az", "aB", "aA", "aC", "aD", "c", "a"};
|
|
||||||
} else if ("v1_11_R1".equals(version)) {
|
|
||||||
dataWatcherObjectFieldNames = new String[] {"Z", "az", "aB", "aA", "aC", "aD", "c", "a"};
|
|
||||||
} else if ("v1_12_R1".equals(version) || "v1_12_R2".equals(version)) {
|
|
||||||
dataWatcherObjectFieldNames = new String[] {"Z", "aA", "aC", "aB", "aD", "aE", "c", "a"};
|
|
||||||
} else if ("v1_13_R1".equals(version) || "v1_13_R2".equals(version)) {
|
|
||||||
dataWatcherObjectFieldNames = new String[] {"ac", "aD", "aF", "aE", "aG", "aH", "b", "a"};
|
|
||||||
} else if ("v1_14_R1".equals(version)) {
|
|
||||||
dataWatcherObjectFieldNames = new String[] {"W", "AIR_TICKS", "aA", "az", "aB", "aC", "ITEM", "b"};
|
|
||||||
} else if ("v1_15_R1".equals(version)) {
|
|
||||||
dataWatcherObjectFieldNames = new String[] {"T", "AIR_TICKS", "aA", "az", "aB", "aC", "ITEM", "b"};
|
|
||||||
} else if ("v1_16_R1".equals(version)) {
|
|
||||||
dataWatcherObjectFieldNames = new String[] {"T", "AIR_TICKS", "ay", "ax", "az", "aA", "ITEM", "b"};
|
|
||||||
} else if ("v1_16_R2".equals(version) || "v1_16_R3".equals(version)) {
|
|
||||||
dataWatcherObjectFieldNames = new String[] {"S", "AIR_TICKS", "ar", "aq", "as", "at", "ITEM", "b"};
|
|
||||||
} else if ("v1_17_R1".equals(version)) {
|
|
||||||
dataWatcherObjectFieldNames = new String[] {"Z", "aI", "aK", "aJ", "aL", "aM", "c", "bG"};
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
Field fEntityFlags = entityClass.getDeclaredField(dataWatcherObjectFieldNames[0]);
|
|
||||||
Field fAirTicks = entityClass.getDeclaredField(dataWatcherObjectFieldNames[1]);
|
|
||||||
Field fNameVisible = entityClass.getDeclaredField(dataWatcherObjectFieldNames[2]);
|
|
||||||
Field fCustomName = entityClass.getDeclaredField(dataWatcherObjectFieldNames[3]);
|
|
||||||
Field fSilent = entityClass.getDeclaredField(dataWatcherObjectFieldNames[4]);
|
|
||||||
Field fNoGravity = majorVersion >= 10 ? entityClass.getDeclaredField(dataWatcherObjectFieldNames[5]) : null;
|
|
||||||
Field fItem = entityItemClass.getDeclaredField(dataWatcherObjectFieldNames[6]);
|
|
||||||
Field fArmorStandFlags = entityArmorStandClass.getDeclaredField(dataWatcherObjectFieldNames[7]);
|
|
||||||
|
|
||||||
fEntityFlags.setAccessible(true);
|
|
||||||
fAirTicks.setAccessible(true);
|
|
||||||
fNameVisible.setAccessible(true);
|
|
||||||
fCustomName.setAccessible(true);
|
|
||||||
fSilent.setAccessible(true);
|
|
||||||
if (majorVersion >= 10) fNoGravity.setAccessible(true);
|
|
||||||
fItem.setAccessible(true);
|
|
||||||
fArmorStandFlags.setAccessible(true);
|
|
||||||
|
|
||||||
register.invoke(dataWatcher, fEntityFlags.get(null), entityFlags);
|
|
||||||
register.invoke(dataWatcher, fAirTicks.get(null), 300);
|
|
||||||
register.invoke(dataWatcher, fNameVisible.get(null), customName != null);
|
|
||||||
register.invoke(dataWatcher, fSilent.get(null), true);
|
|
||||||
if (majorVersion < 13) register.invoke(dataWatcher, fCustomName.get(null), customName != null ? customName : "");
|
|
||||||
|
|
||||||
if (nmsItemStack != null) {
|
|
||||||
register.invoke(dataWatcher, fItem.get(null), majorVersion < 11 ? com.google.common.base.Optional.of(nmsItemStack) : nmsItemStack);
|
|
||||||
} else {
|
|
||||||
register.invoke(dataWatcher, fArmorStandFlags.get(null), armorStandFlags);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (majorVersion >= 10) {
|
|
||||||
register.invoke(dataWatcher, fNoGravity.get(null), true);
|
|
||||||
if (majorVersion >= 13) {
|
|
||||||
if (customName != null) {
|
|
||||||
Object iChatBaseComponent = chatSerializerClass.getMethod("a", String.class).invoke(null, JsonBuilder.parse(customName).toString());
|
|
||||||
register.invoke(dataWatcher, fCustomName.get(null), Optional.of(iChatBaseComponent));
|
|
||||||
} else {
|
|
||||||
register.invoke(dataWatcher, fCustomName.get(null), Optional.empty());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return dataWatcher;
|
|
||||||
} catch (InstantiationException | InvocationTargetException | NoSuchFieldException | IllegalAccessException | NoSuchMethodException e) {
|
|
||||||
ShopChest.getInstance().getLogger().severe("Failed to create data watcher!");
|
|
||||||
ShopChest.getInstance().debug("Failed to create data watcher");
|
|
||||||
ShopChest.getInstance().debug(e);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a free entity ID for use in {@link #createPacketSpawnEntity(ShopChest, int, UUID, Location, Vector, EntityType)}
|
|
||||||
*
|
|
||||||
* @return The id or {@code -1} if a free entity ID could not be retrieved.
|
|
||||||
*/
|
|
||||||
public static int getFreeEntityId() {
|
|
||||||
try {
|
|
||||||
Field entityCountField = new FieldResolver(entityClass).resolve("entityCount", "b");
|
|
||||||
entityCountField.setAccessible(true);
|
|
||||||
if (entityCountField.getType() == int.class) {
|
|
||||||
int id = entityCountField.getInt(null);
|
|
||||||
entityCountField.setInt(null, id+1);
|
|
||||||
return id;
|
|
||||||
} else if (entityCountField.getType() == AtomicInteger.class) {
|
|
||||||
return ((AtomicInteger) entityCountField.get(null)).incrementAndGet();
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
} catch (Exception e) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a {@code PacketPlayOutSpawnEntity} object.
|
|
||||||
* Only {@link EntityType#ARMOR_STAND} and {@link EntityType#DROPPED_ITEM} are supported!
|
|
||||||
*/
|
|
||||||
public static Object createPacketSpawnEntity(ShopChest plugin, int id, UUID uuid, Location loc, EntityType type) {
|
|
||||||
try {
|
|
||||||
Class<?> packetPlayOutSpawnEntityClass = nmsClassResolver.resolveSilent("network.protocol.game.PacketPlayOutSpawnEntity");
|
|
||||||
Class<?> entityTypesClass = nmsClassResolver.resolveSilent("world.entity.EntityTypes");
|
|
||||||
Class<?> vec3dClass = nmsClassResolver.resolveSilent("world.phys.Vec3D");
|
|
||||||
|
|
||||||
boolean isPre9 = getMajorVersion() < 9;
|
|
||||||
boolean isPre14 = getMajorVersion() < 14;
|
|
||||||
|
|
||||||
double y = loc.getY();
|
|
||||||
if (type == EntityType.ARMOR_STAND && !getServerVersion().equals("v1_8_R1")) {
|
|
||||||
// Marker armor stand => lift by normal armor stand height
|
|
||||||
y += 1.975;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (getMajorVersion() >= 17) {
|
|
||||||
// Empty packet constructor does not exist anymore in 1.17+
|
|
||||||
Constructor<?> c = packetPlayOutSpawnEntityClass.getConstructor(int.class, UUID.class, double.class, double.class, double.class,
|
|
||||||
float.class, float.class, entityTypesClass, int.class, vec3dClass);
|
|
||||||
|
|
||||||
Object vec3d = vec3dClass.getField("a").get(null);
|
|
||||||
Object entityType = entityTypesClass.getField(type == EntityType.ARMOR_STAND ? "c" : "Q").get(null);
|
|
||||||
|
|
||||||
return c.newInstance(id, uuid, loc.getX(), y, loc.getZ(), 0f, 0f, entityType, 0, vec3d);
|
|
||||||
}
|
|
||||||
|
|
||||||
Object packet = packetPlayOutSpawnEntityClass.getConstructor().newInstance();
|
|
||||||
|
|
||||||
Field[] fields = new Field[12];
|
|
||||||
fields[0] = packetPlayOutSpawnEntityClass.getDeclaredField("a"); // ID
|
|
||||||
fields[1] = packetPlayOutSpawnEntityClass.getDeclaredField("b"); // UUID (Only 1.9+)
|
|
||||||
fields[2] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "b" : "c"); // Loc X
|
|
||||||
fields[3] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "c" : "d"); // Loc Y
|
|
||||||
fields[4] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "d" : "e"); // Loc Z
|
|
||||||
fields[5] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "e" : "f"); // Mot X
|
|
||||||
fields[6] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "f" : "g"); // Mot Y
|
|
||||||
fields[7] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "g" : "h"); // Mot Z
|
|
||||||
fields[8] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "h" : "i"); // Pitch
|
|
||||||
fields[9] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "i" : "j"); // Yaw
|
|
||||||
fields[10] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "j" : "k"); // Type
|
|
||||||
fields[11] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "k" : "l"); // Data
|
|
||||||
|
|
||||||
for (Field field : fields) {
|
|
||||||
field.setAccessible(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
Object entityType = null;
|
|
||||||
if (!isPre14) {
|
|
||||||
entityType = entityTypesClass.getField(type == EntityType.ARMOR_STAND ? "ARMOR_STAND" : "ITEM").get(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
fields[0].set(packet, id);
|
|
||||||
if (!isPre9) fields[1].set(packet, uuid);
|
|
||||||
if (isPre9) {
|
|
||||||
fields[2].set(packet, (int)(loc.getX() * 32));
|
|
||||||
fields[3].set(packet, (int)(y * 32));
|
|
||||||
fields[4].set(packet, (int)(loc.getZ() * 32));
|
|
||||||
} else {
|
|
||||||
fields[2].set(packet, loc.getX());
|
|
||||||
fields[3].set(packet, y);
|
|
||||||
fields[4].set(packet, loc.getZ());
|
|
||||||
}
|
|
||||||
fields[5].set(packet, 0);
|
|
||||||
fields[6].set(packet, 0);
|
|
||||||
fields[7].set(packet, 0);
|
|
||||||
fields[8].set(packet, 0);
|
|
||||||
fields[9].set(packet, 0);
|
|
||||||
if (isPre14) fields[10].set(packet, type == EntityType.ARMOR_STAND ? 78 : 2);
|
|
||||||
else fields[10].set(packet, entityType);
|
|
||||||
fields[11].set(packet, 0);
|
|
||||||
|
|
||||||
return packet;
|
|
||||||
} catch (NoSuchMethodException | NoSuchFieldException | IllegalAccessException | InvocationTargetException | InstantiationException e) {
|
|
||||||
plugin.getLogger().severe("Failed to create packet to spawn entity!");
|
|
||||||
plugin.debug("Failed to create packet to spawn entity!");
|
|
||||||
plugin.debug(e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a packet to a player
|
* Send a packet to a player
|
||||||
* @param plugin An instance of the {@link ShopChest} plugin
|
* @param plugin An instance of the {@link ShopChest} plugin
|
||||||
|
Loading…
Reference in New Issue
Block a user