Pick fixes for #42, #43 from 1.15.

This commit is contained in:
IzzelAliz 2020-09-03 12:47:25 +08:00
parent 2b5f9b69c1
commit c5b9b05132
3 changed files with 24 additions and 51 deletions

View File

@ -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<ILivingEntityData> cir) {
((WorldBridge) worldIn).bridge$pushAddEntityReason(CreatureSpawnEvent.SpawnReason.MOUNT);
((WorldBridge) worldIn.getWorld()).bridge$pushAddEntityReason(CreatureSpawnEvent.SpawnReason.MOUNT);
}
}

View File

@ -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;

View File

@ -77,7 +77,7 @@ public class ClassLoaderRemapper extends JarRemapper {
}
// BiMap: srg -> bukkit
private final Map<String, BiMap<WrappedField, String>> cacheFields = new ConcurrentHashMap<>();
private final Map<String, BiMap<Field, String>> cacheFields = new ConcurrentHashMap<>();
private final Map<String, Map.Entry<Map<Method, String>, Map<WrappedMethod, Method>>> cacheMethods = new ConcurrentHashMap<>();
private final Map<String, Boolean> cacheRemap = new ConcurrentHashMap<>();
@ -89,7 +89,6 @@ public class ClassLoaderRemapper extends JarRemapper {
try {
Map<Method, String> names = new HashMap<>();
Map<WrappedMethod, Method> 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<WrappedField, String> getFields(Class<?> cl, String internalName) {
private BiMap<Field, String> getFields(Class<?> cl, String internalName) {
return cacheFields.computeIfAbsent(internalName, k -> this.tryGetFields(cl, k));
}
private BiMap<WrappedField, String> tryGetFields(Class<?> cl, String internalName) {
private BiMap<Field, String> tryGetFields(Class<?> cl, String internalName) {
try {
HashBiMap<WrappedField, String> map = HashBiMap.create();
ArclightReflectionHandler.remapper = this;
HashBiMap<Field, String> 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<WrappedField, String> fields = getFields(cl, internalName);
return fields.getOrDefault(WrappedField.of(field), srgName);
BiMap<Field, String> 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;