parent
2b5f9b69c1
commit
c5b9b05132
@ -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"))
|
@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) {
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,17 +1,21 @@
|
|||||||
package io.izzel.arclight.common.mixin.core.world.gen;
|
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.entity.Entity;
|
||||||
import net.minecraft.world.gen.WorldGenRegion;
|
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.bukkit.event.entity.CreatureSpawnEvent;
|
||||||
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
@Mixin(WorldGenRegion.class)
|
@Mixin(WorldGenRegion.class)
|
||||||
public abstract class WorldGenRegionMixin implements IWorldWriterBridge {
|
public abstract class WorldGenRegionMixin implements WorldBridge {
|
||||||
|
|
||||||
// @formatter:off
|
// @formatter:off
|
||||||
@Shadow public abstract boolean addEntity(Entity entityIn);
|
@Shadow public abstract boolean addEntity(Entity entityIn);
|
||||||
|
@Shadow @Final private ServerWorld world;
|
||||||
// @formatter:on
|
// @formatter:on
|
||||||
|
|
||||||
public boolean addEntity(Entity entity, CreatureSpawnEvent.SpawnReason reason) {
|
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) {
|
public void bridge$pushAddEntityReason(CreatureSpawnEvent.SpawnReason reason) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CraftWorld bridge$getWorld() {
|
||||||
|
return ((WorldBridge) this.world).bridge$getWorld();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CreatureSpawnEvent.SpawnReason bridge$getAddEntityReason() {
|
public CreatureSpawnEvent.SpawnReason bridge$getAddEntityReason() {
|
||||||
return CreatureSpawnEvent.SpawnReason.DEFAULT;
|
return CreatureSpawnEvent.SpawnReason.DEFAULT;
|
||||||
|
|||||||
@ -77,7 +77,7 @@ public class ClassLoaderRemapper extends JarRemapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BiMap: srg -> bukkit
|
// 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, Map.Entry<Map<Method, String>, Map<WrappedMethod, Method>>> cacheMethods = new ConcurrentHashMap<>();
|
||||||
private final Map<String, Boolean> cacheRemap = new ConcurrentHashMap<>();
|
private final Map<String, Boolean> cacheRemap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@ -89,7 +89,6 @@ public class ClassLoaderRemapper extends JarRemapper {
|
|||||||
try {
|
try {
|
||||||
Map<Method, String> names = new HashMap<>();
|
Map<Method, String> names = new HashMap<>();
|
||||||
Map<WrappedMethod, Method> types = new HashMap<>();
|
Map<WrappedMethod, Method> types = new HashMap<>();
|
||||||
ArclightReflectionHandler.remapper = this;
|
|
||||||
for (Method method : cl.getMethods()) {
|
for (Method method : cl.getMethods()) {
|
||||||
String name = mapMethod(method);
|
String name = mapMethod(method);
|
||||||
names.put(method, name);
|
names.put(method, name);
|
||||||
@ -102,7 +101,6 @@ public class ClassLoaderRemapper extends JarRemapper {
|
|||||||
WrappedMethod wrapped = new WrappedMethod(name, method.getParameterTypes());
|
WrappedMethod wrapped = new WrappedMethod(name, method.getParameterTypes());
|
||||||
types.put(wrapped, method);
|
types.put(wrapped, method);
|
||||||
}
|
}
|
||||||
ArclightReflectionHandler.remapper = null;
|
|
||||||
return Maps.immutableEntry(names, types);
|
return Maps.immutableEntry(names, types);
|
||||||
} catch (NoClassDefFoundError error) {
|
} catch (NoClassDefFoundError error) {
|
||||||
tryDefineClass(error.getMessage());
|
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));
|
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 {
|
try {
|
||||||
HashBiMap<WrappedField, String> map = HashBiMap.create();
|
HashBiMap<Field, String> map = HashBiMap.create();
|
||||||
ArclightReflectionHandler.remapper = this;
|
|
||||||
for (Field field : cl.getFields()) {
|
for (Field field : cl.getFields()) {
|
||||||
map.put(WrappedField.of(field), mapField(field));
|
map.forcePut(field, mapField(field));
|
||||||
}
|
}
|
||||||
for (Field field : cl.getDeclaredFields()) {
|
for (Field field : cl.getDeclaredFields()) {
|
||||||
map.put(WrappedField.of(field), mapField(field));
|
map.forcePut(field, mapField(field));
|
||||||
}
|
}
|
||||||
ArclightReflectionHandler.remapper = null;
|
|
||||||
return map;
|
return map;
|
||||||
} catch (NoClassDefFoundError error) {
|
} catch (NoClassDefFoundError error) {
|
||||||
tryDefineClass(error.getMessage());
|
tryDefineClass(error.getMessage());
|
||||||
@ -161,24 +157,24 @@ public class ClassLoaderRemapper extends JarRemapper {
|
|||||||
public String tryMapDecFieldToSrg(Class<?> cl, String bukkitName) {
|
public String tryMapDecFieldToSrg(Class<?> cl, String bukkitName) {
|
||||||
String internalName = Type.getInternalName(cl);
|
String internalName = Type.getInternalName(cl);
|
||||||
if (internalName.startsWith(PREFIX)) {
|
if (internalName.startsWith(PREFIX)) {
|
||||||
WrappedField field = getFields(cl, internalName).inverse().get(bukkitName);
|
Field field = getFields(cl, internalName).inverse().get(bukkitName);
|
||||||
return field == null ? bukkitName : field.name;
|
return field == null ? bukkitName : field.getName();
|
||||||
} else return bukkitName;
|
} else return bukkitName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String tryMapFieldToSrg(Class<?> cl, String bukkitName) {
|
public String tryMapFieldToSrg(Class<?> cl, String bukkitName) {
|
||||||
String internalName = Type.getInternalName(cl);
|
String internalName = Type.getInternalName(cl);
|
||||||
if (shouldRemap(internalName)) {
|
if (shouldRemap(internalName)) {
|
||||||
WrappedField field = getFields(cl, internalName).inverse().get(bukkitName);
|
Field field = getFields(cl, internalName).inverse().get(bukkitName);
|
||||||
return field == null ? bukkitName : field.name;
|
return field == null ? bukkitName : field.getName();
|
||||||
} else return bukkitName;
|
} else return bukkitName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String tryMapFieldToBukkit(Class<?> cl, String srgName, Field field) {
|
public String tryMapFieldToBukkit(Class<?> cl, String srgName, Field field) {
|
||||||
String internalName = Type.getInternalName(cl);
|
String internalName = Type.getInternalName(cl);
|
||||||
if (internalName.startsWith(PREFIX)) {
|
if (internalName.startsWith(PREFIX)) {
|
||||||
BiMap<WrappedField, String> fields = getFields(cl, internalName);
|
BiMap<Field, String> fields = getFields(cl, internalName);
|
||||||
return fields.getOrDefault(WrappedField.of(field), srgName);
|
return fields.getOrDefault(field, srgName);
|
||||||
} else return 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 static class WrappedMethod {
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user