Fixup remaining critical startup issues

This commit is contained in:
Martoph 2021-12-07 16:20:15 -06:00
parent 92b741ce0a
commit bcd4ed56fc
4 changed files with 106 additions and 14 deletions

View File

@ -0,0 +1,48 @@
package me.libraryaddict.disguise.utilities.reflection;
import java.util.HashMap;
public class ClassMappings {
private static HashMap<String, String> classLocations = new HashMap<>();
private static final String[] packages = getPackages();
public static String getClass(String packageHint, String className) {
String location = classLocations.get(className);
if (location != null)
return location;
location = className;
String[] arrayOfString;
int i;
byte b;
for (arrayOfString = packages, i = arrayOfString.length, b = 0; b < i; ) {
String pack = arrayOfString[b];
if (!pack.startsWith(packageHint)) {
b++;
continue;
}
String toTry = pack + "." + className;
try {
Class.forName(toTry);
location = pack + "." + className;
break;
} catch (Throwable throwable) {
b++;
}
}
classLocations.put(className, location);
return location;
}
private static String[] getPackages() {
String[] s = {
"net.minecraft.core", "net.minecraft.core.particles", "net.minecraft.nbt", "net.minecraft.network.chat", "net.minecraft.network.protocol.game", "net.minecraft.network.syncher", "net.minecraft.resources", "net.minecraft.server.level", "net.minecraft.server", "net.minecraft.server.network",
"net.minecraft.sounds", "net.minecraft.world.damagesource", "net.minecraft.world.effect", "net.minecraft.world.entity.ambient", "net.minecraft.world.entity.animal.axolotl", "net.minecraft.world.entity.animal", "net.minecraft.world.entity.animal.goat", "net.minecraft.world.entity.animal.horse", "net.minecraft.world.entity.boss.enderdragon", "net.minecraft.world.entity.boss.wither",
"net.minecraft.world.entity.decoration", "net.minecraft.world.entity", "net.minecraft.world.entity.item", "net.minecraft.world.entity.monster", "net.minecraft.world.entity.monster.hoglin", "net.minecraft.world.entity.monster.piglin", "net.minecraft.world.entity.npc", "net.minecraft.world.entity.player", "net.minecraft.world.entity.projectile", "net.minecraft.world.entity.vehicle",
"net.minecraft.world.inventory", "net.minecraft.world.item", "net.minecraft.world.level.block", "net.minecraft.world.level.block.state", "net.minecraft.world.level", "net.minecraft.world.phys", "org.bukkit.craftbukkit.$version$.block.data", "org.bukkit.craftbukkit.$version$", "org.bukkit.craftbukkit.$version$.entity", "org.bukkit.craftbukkit.$version$.inventory",
"org.bukkit.craftbukkit.$version$.util" };
for (int i = 0; i < s.length; i++)
s[i] = s[i].replace("$version$", ReflectionManager.getBukkitVersion());
return s;
}
}

View File

@ -117,7 +117,15 @@ public class ReflectionManager {
public static void init() { public static void init() {
try { try {
// Load first because its necessary for 1.18+
if (NmsVersion.v1_14.isSupported()) {
entityPoseClass = getNmsClass("EntityPose");
}
if (NmsVersion.v1_18.isSupported()) {
v1_18ReflectionManager = getReflectionManager(NmsVersion.v1_18); v1_18ReflectionManager = getReflectionManager(NmsVersion.v1_18);
return;
}
boundingBoxConstructor = getNmsConstructor("AxisAlignedBB", double.class, double.class, double.class, double.class, double.class, double.class); boundingBoxConstructor = getNmsConstructor("AxisAlignedBB", double.class, double.class, double.class, double.class, double.class, double.class);
setBoundingBoxMethod = getNmsMethod("Entity", "a", getNmsClass("AxisAlignedBB")); setBoundingBoxMethod = getNmsMethod("Entity", "a", getNmsClass("AxisAlignedBB"));
@ -199,7 +207,6 @@ public class ReflectionManager {
entityTypesAMethod = getNmsMethod("EntityTypes", "a", String.class); entityTypesAMethod = getNmsMethod("EntityTypes", "a", String.class);
if (NmsVersion.v1_14.isSupported()) { if (NmsVersion.v1_14.isSupported()) {
entityPoseClass = getNmsClass("EntityPose");
registryBlocksGetMethod = getNmsMethod("RegistryBlocks", "get", getNmsClass("MinecraftKey")); registryBlocksGetMethod = getNmsMethod("RegistryBlocks", "get", getNmsClass("MinecraftKey"));
villagerDataConstructor = getNmsConstructor("VillagerData", getNmsClass("VillagerType"), getNmsClass("VillagerProfession"), int.class); villagerDataConstructor = getNmsConstructor("VillagerData", getNmsClass("VillagerType"), getNmsClass("VillagerProfession"), int.class);
@ -348,6 +355,7 @@ public class ReflectionManager {
if (NmsVersion.v1_18.isSupported()) { if (NmsVersion.v1_18.isSupported()) {
return v1_18ReflectionManager.getIncrementedStateId(player); return v1_18ReflectionManager.getIncrementedStateId(player);
} }
try { try {
Object container = playerInventoryContainer.get(getNmsEntity(player)); Object container = playerInventoryContainer.get(getNmsEntity(player));
@ -924,13 +932,7 @@ public class ReflectionManager {
} }
public static WrappedGameProfile getGameProfile(UUID uuid, String playerName) { public static WrappedGameProfile getGameProfile(UUID uuid, String playerName) {
try { return ReflectionManagerAbstract.getGameProfile(uuid == null ? getRandomUUID() : uuid, playerName);
return new WrappedGameProfile(uuid != null ? uuid : getRandomUUID(),
playerName == null || playerName.length() < 17 ? playerName : playerName.substring(0, 16));
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
} }
public static WrappedGameProfile getClonedProfile(WrappedGameProfile gameProfile) { public static WrappedGameProfile getClonedProfile(WrappedGameProfile gameProfile) {
@ -968,6 +970,10 @@ public class ReflectionManager {
} }
private static String getLocation(String pack, String className) { private static String getLocation(String pack, String className) {
if (NmsVersion.v1_18.isSupported()) {
return ClassMappings.getClass(pack, className);
}
String toReturn = classLocations.get(className); String toReturn = classLocations.get(className);
if (toReturn != null) { if (toReturn != null) {
@ -1677,6 +1683,10 @@ public class ReflectionManager {
public static Object createDataWatcherItem(MetaIndex id, Object value) { public static Object createDataWatcherItem(MetaIndex id, Object value) {
WrappedDataWatcherObject watcherObject = createDataWatcherObject(id, value); WrappedDataWatcherObject watcherObject = createDataWatcherObject(id, value);
if (NmsVersion.v1_18.isSupported()) {
return v1_18ReflectionManager.createDataWatcherItem(watcherObject, convertInvalidMeta(value));
}
try { try {
return dataWatcherItemConstructor.newInstance(watcherObject.getHandle(), convertInvalidMeta(value)); return dataWatcherItemConstructor.newInstance(watcherObject.getHandle(), convertInvalidMeta(value));
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
@ -2253,7 +2263,7 @@ public class ReflectionManager {
return; return;
} }
Object nmsEntity = ReflectionManager.createEntityInstance(disguiseType, nmsEntityName); Object nmsEntity = ReflectionManager.createEntityInstance(disguiseType, NmsVersion.v1_18.isSupported() ? disguiseType.getEntityType().getKey().getKey() : nmsEntityName);
if (nmsEntity == null) { if (nmsEntity == null) {
DisguiseUtilities.getLogger().warning("Entity not found! (" + nmsEntityName + ")"); DisguiseUtilities.getLogger().warning("Entity not found! (" + nmsEntityName + ")");

View File

@ -1,6 +1,7 @@
package me.libraryaddict.disguise.utilities.reflection; package me.libraryaddict.disguise.utilities.reflection;
import com.comphenix.protocol.wrappers.EnumWrappers; import com.comphenix.protocol.wrappers.EnumWrappers;
import com.comphenix.protocol.wrappers.WrappedDataWatcher;
import com.comphenix.protocol.wrappers.WrappedGameProfile; import com.comphenix.protocol.wrappers.WrappedGameProfile;
import com.mojang.authlib.ProfileLookupCallback; import com.mojang.authlib.ProfileLookupCallback;
import org.bukkit.*; import org.bukkit.*;
@ -17,6 +18,7 @@ import org.bukkit.util.Vector;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.UUID;
public interface ReflectionManagerAbstract { public interface ReflectionManagerAbstract {
boolean hasInvul(Entity entity); boolean hasInvul(Entity entity);
@ -107,6 +109,8 @@ public interface ReflectionManagerAbstract {
Object getVillagerProfession(Villager.Profession profession); Object getVillagerProfession(Villager.Profession profession);
<T> Object createDataWatcherItem(WrappedDataWatcher.WrappedDataWatcherObject wrappedDataWatcherObject, T metaItem);
@Deprecated @Deprecated
Object createSoundEffect(String minecraftKey); Object createSoundEffect(String minecraftKey);
@ -137,4 +141,13 @@ public interface ReflectionManagerAbstract {
Object getWorldServer(World w); Object getWorldServer(World w);
ItemMeta getDeserializedItemMeta(Map<String, Object> meta); ItemMeta getDeserializedItemMeta(Map<String, Object> meta);
static WrappedGameProfile getGameProfile(UUID uuid, String playerName) {
try {
return new WrappedGameProfile(uuid, playerName == null || playerName.length() < 17 ? playerName : playerName.substring(0, 16));
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
} }

View File

@ -2,6 +2,7 @@ package me.libraryaddict.disguise.v1_18.utilities.reflection;
import com.comphenix.protocol.wrappers.*; import com.comphenix.protocol.wrappers.*;
import com.comphenix.protocol.wrappers.EnumWrappers.Direction; import com.comphenix.protocol.wrappers.EnumWrappers.Direction;
import com.comphenix.protocol.wrappers.nbt.NbtWrapper;
import com.mojang.authlib.Agent; import com.mojang.authlib.Agent;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import com.mojang.authlib.ProfileLookupCallback; import com.mojang.authlib.ProfileLookupCallback;
@ -10,8 +11,11 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract; import me.libraryaddict.disguise.utilities.reflection.ReflectionManagerAbstract;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.Vector3f;
import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TextComponent;
import net.minecraft.network.protocol.game.ClientboundPlayerInfoPacket; import net.minecraft.network.protocol.game.ClientboundPlayerInfoPacket;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.server.dedicated.DedicatedServer;
import net.minecraft.server.level.*; import net.minecraft.server.level.*;
@ -26,6 +30,8 @@ import net.minecraft.world.entity.EntityDimensions;
import net.minecraft.world.entity.npc.VillagerData; import net.minecraft.world.entity.npc.VillagerData;
import net.minecraft.world.entity.npc.VillagerProfession; import net.minecraft.world.entity.npc.VillagerProfession;
import net.minecraft.world.entity.npc.VillagerType; import net.minecraft.world.entity.npc.VillagerType;
import net.minecraft.world.entity.projectile.FishingHook;
import net.minecraft.world.entity.projectile.ThrownEnderpearl;
import net.minecraft.world.level.GameType; import net.minecraft.world.level.GameType;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
@ -102,7 +108,18 @@ public class ReflectionManager implements ReflectionManagerAbstract {
if (optional.isPresent()) { if (optional.isPresent()) {
net.minecraft.world.entity.EntityType<?> entityType = optional.get(); net.minecraft.world.entity.EntityType<?> entityType = optional.get();
ServerLevel world = getWorldServer(Bukkit.getWorlds().get(0)); ServerLevel world = getWorldServer(Bukkit.getWorlds().get(0));
net.minecraft.world.entity.Entity entity = entityType.create(world); net.minecraft.world.entity.Entity entity;
if (entityType == net.minecraft.world.entity.EntityType.PLAYER) {
WrappedGameProfile gameProfile = ReflectionManagerAbstract.getGameProfile(new UUID(0, 0), "Steve");
entity = new ServerPlayer(getMinecraftServer(), world, (GameProfile) gameProfile.getHandle());
}/* else if (entityType == net.minecraft.world.entity.EntityType.ENDER_PEARL) {
entity = new ThrownEnderpearl(world, (net.minecraft.world.entity.LivingEntity) createEntityInstance("cow"));
} else if (entityType == net.minecraft.world.entity.EntityType.FISHING_BOBBER) {
entity = new FishingHook((net.minecraft.world.entity.player.Player) createEntityInstance("player"), world, 0, 0);
}*/ else {
entity = entityType.create(world);
}
// Workaround for paper being 2 smart 4 me // Workaround for paper being 2 smart 4 me
entity.setPos(1.0, 1.0, 1.0); entity.setPos(1.0, 1.0, 1.0);
entity.setPos(0.0, 0.0, 0.0); entity.setPos(0.0, 0.0, 0.0);
@ -291,13 +308,13 @@ public class ReflectionManager implements ReflectionManagerAbstract {
return Optional.empty(); return Optional.empty();
} }
public Vec3 convertVec3(Object object) { public Vector3f convertVec3(Object object) {
if (object instanceof Vector3F) { if (object instanceof Vector3F) {
Vector3F vector3F = (Vector3F) object; Vector3F vector3F = (Vector3F) object;
return new Vec3(vector3F.getX(), vector3F.getY(), vector3F.getZ()); return new Vector3f(vector3F.getX(), vector3F.getY(), vector3F.getZ());
} else if (object instanceof EulerAngle) { } else if (object instanceof EulerAngle) {
EulerAngle eulerAngle = (EulerAngle) object; EulerAngle eulerAngle = (EulerAngle) object;
return new Vec3(eulerAngle.getX(), eulerAngle.getY(), eulerAngle.getZ()); return new Vector3f((float) eulerAngle.getX(), (float) eulerAngle.getY(), (float) eulerAngle.getZ());
} }
return null; return null;
@ -334,6 +351,10 @@ public class ReflectionManager implements ReflectionManagerAbstract {
return Registry.VILLAGER_PROFESSION.get(CraftNamespacedKey.toMinecraft(profession.getKey())); return Registry.VILLAGER_PROFESSION.get(CraftNamespacedKey.toMinecraft(profession.getKey()));
} }
public <T> SynchedEntityData.DataItem<T> createDataWatcherItem(WrappedDataWatcher.WrappedDataWatcherObject wrappedDataWatcherObject, T metaItem) {
return new SynchedEntityData.DataItem<>((EntityDataAccessor<T>) wrappedDataWatcherObject.getHandle(), metaItem);
}
@Deprecated @Deprecated
public SoundEvent createSoundEffect(String minecraftKey) { public SoundEvent createSoundEffect(String minecraftKey) {
return new SoundEvent(new ResourceLocation(minecraftKey)); return new SoundEvent(new ResourceLocation(minecraftKey));