diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/ZombieEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/ZombieEntityMixin.java index bf3a16f2..c41ffa62 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/ZombieEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/entity/monster/ZombieEntityMixin.java @@ -77,6 +77,6 @@ public abstract class ZombieEntityMixin extends CreatureEntityMixin { @Inject(method = "onInitialSpawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/IServerWorld;addEntity(Lnet/minecraft/entity/Entity;)Z")) private void arclight$mount(IServerWorld worldIn, DifficultyInstance difficultyIn, SpawnReason reason, ILivingEntityData spawnDataIn, CompoundNBT dataTag, CallbackInfoReturnable cir) { - ((WorldBridge) worldIn).bridge$pushAddEntityReason(CreatureSpawnEvent.SpawnReason.MOUNT); + ((WorldBridge) worldIn.getWorld()).bridge$pushAddEntityReason(CreatureSpawnEvent.SpawnReason.MOUNT); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/gen/WorldGenRegionMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/gen/WorldGenRegionMixin.java index 19e82e63..858eb19d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/gen/WorldGenRegionMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/gen/WorldGenRegionMixin.java @@ -1,17 +1,21 @@ package io.izzel.arclight.common.mixin.core.world.gen; -import io.izzel.arclight.common.bridge.world.IWorldWriterBridge; +import io.izzel.arclight.common.bridge.world.WorldBridge; import net.minecraft.entity.Entity; import net.minecraft.world.gen.WorldGenRegion; +import net.minecraft.world.server.ServerWorld; +import org.bukkit.craftbukkit.v.CraftWorld; import org.bukkit.event.entity.CreatureSpawnEvent; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(WorldGenRegion.class) -public abstract class WorldGenRegionMixin implements IWorldWriterBridge { +public abstract class WorldGenRegionMixin implements WorldBridge { // @formatter:off @Shadow public abstract boolean addEntity(Entity entityIn); + @Shadow @Final private ServerWorld world; // @formatter:on public boolean addEntity(Entity entity, CreatureSpawnEvent.SpawnReason reason) { @@ -27,6 +31,11 @@ public abstract class WorldGenRegionMixin implements IWorldWriterBridge { public void bridge$pushAddEntityReason(CreatureSpawnEvent.SpawnReason reason) { } + @Override + public CraftWorld bridge$getWorld() { + return ((WorldBridge) this.world).bridge$getWorld(); + } + @Override public CreatureSpawnEvent.SpawnReason bridge$getAddEntityReason() { return CreatureSpawnEvent.SpawnReason.DEFAULT; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java index a01d5ba3..efbe089b 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ClassLoaderRemapper.java @@ -77,7 +77,7 @@ public class ClassLoaderRemapper extends JarRemapper { } // BiMap: srg -> bukkit - private final Map> cacheFields = new ConcurrentHashMap<>(); + private final Map> cacheFields = new ConcurrentHashMap<>(); private final Map, Map>> cacheMethods = new ConcurrentHashMap<>(); private final Map cacheRemap = new ConcurrentHashMap<>(); @@ -89,7 +89,6 @@ public class ClassLoaderRemapper extends JarRemapper { try { Map names = new HashMap<>(); Map types = new HashMap<>(); - ArclightReflectionHandler.remapper = this; for (Method method : cl.getMethods()) { String name = mapMethod(method); names.put(method, name); @@ -102,7 +101,6 @@ public class ClassLoaderRemapper extends JarRemapper { WrappedMethod wrapped = new WrappedMethod(name, method.getParameterTypes()); types.put(wrapped, method); } - ArclightReflectionHandler.remapper = null; return Maps.immutableEntry(names, types); } catch (NoClassDefFoundError error) { tryDefineClass(error.getMessage()); @@ -110,21 +108,19 @@ public class ClassLoaderRemapper extends JarRemapper { } } - private BiMap getFields(Class cl, String internalName) { + private BiMap getFields(Class cl, String internalName) { return cacheFields.computeIfAbsent(internalName, k -> this.tryGetFields(cl, k)); } - private BiMap tryGetFields(Class cl, String internalName) { + private BiMap tryGetFields(Class cl, String internalName) { try { - HashBiMap map = HashBiMap.create(); - ArclightReflectionHandler.remapper = this; + HashBiMap map = HashBiMap.create(); for (Field field : cl.getFields()) { - map.put(WrappedField.of(field), mapField(field)); + map.forcePut(field, mapField(field)); } for (Field field : cl.getDeclaredFields()) { - map.put(WrappedField.of(field), mapField(field)); + map.forcePut(field, mapField(field)); } - ArclightReflectionHandler.remapper = null; return map; } catch (NoClassDefFoundError error) { tryDefineClass(error.getMessage()); @@ -161,24 +157,24 @@ public class ClassLoaderRemapper extends JarRemapper { public String tryMapDecFieldToSrg(Class cl, String bukkitName) { String internalName = Type.getInternalName(cl); if (internalName.startsWith(PREFIX)) { - WrappedField field = getFields(cl, internalName).inverse().get(bukkitName); - return field == null ? bukkitName : field.name; + Field field = getFields(cl, internalName).inverse().get(bukkitName); + return field == null ? bukkitName : field.getName(); } else return bukkitName; } public String tryMapFieldToSrg(Class cl, String bukkitName) { String internalName = Type.getInternalName(cl); if (shouldRemap(internalName)) { - WrappedField field = getFields(cl, internalName).inverse().get(bukkitName); - return field == null ? bukkitName : field.name; + Field field = getFields(cl, internalName).inverse().get(bukkitName); + return field == null ? bukkitName : field.getName(); } else return bukkitName; } public String tryMapFieldToBukkit(Class cl, String srgName, Field field) { String internalName = Type.getInternalName(cl); if (internalName.startsWith(PREFIX)) { - BiMap fields = getFields(cl, internalName); - return fields.getOrDefault(WrappedField.of(field), srgName); + BiMap fields = getFields(cl, internalName); + return fields.getOrDefault(field, srgName); } else return srgName; } @@ -338,38 +334,6 @@ public class ClassLoaderRemapper extends JarRemapper { } - private static class WrappedField { - - private final Class owner; - private final String name; - private final Class type; - - private WrappedField(Class owner, String name, Class type) { - this.owner = owner; - this.name = name; - this.type = type; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - WrappedField that = (WrappedField) o; - return Objects.equals(owner, that.owner) && - Objects.equals(name, that.name) && - Objects.equals(type, that.type); - } - - @Override - public int hashCode() { - return Objects.hash(owner, name, type); - } - - private static WrappedField of(Field field) { - return new WrappedField(field.getDeclaringClass(), field.getName(), field.getType()); - } - } - private static class WrappedMethod { private final String name;