From 999b9bb30eef647be2966811a061235aac579556 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Thu, 23 Jun 2022 00:09:06 +0800 Subject: [PATCH] Fix field remapping with same name in hierarchy (#539 #550) Update AGP to 1.23 --- arclight-common/build.gradle | 2 +- .../core/server/level/ServerLevelMixin.java | 8 +++--- .../world/level/chunk/LevelChunkMixin.java | 4 +-- .../common/mod/ArclightMixinPlugin.java | 26 +++---------------- .../mod/util/remapper/ArclightRemapper.java | 14 +++++++++- .../util/remapper/ClassLoaderRemapper.java | 2 +- arclight-forge/build.gradle | 2 +- build.gradle | 2 +- 8 files changed, 27 insertions(+), 33 deletions(-) diff --git a/arclight-common/build.gradle b/arclight-common/build.gradle index 8f449116..b323cb87 100644 --- a/arclight-common/build.gradle +++ b/arclight-common/build.gradle @@ -65,7 +65,7 @@ dependencies { annotationProcessor 'com.github.ArclightTeam:mixin-tools:1.0.0' implementation 'jline:jline:2.12.1' - implementation 'net.md-5:SpecialSource:1.9.0' + implementation 'net.md-5:SpecialSource:1.11.0' implementation 'org.apache.logging.log4j:log4j-jul:2.15.0' implementation 'net.md-5:bungeecord-chat:1.16-R0.4' implementation 'mysql:mysql-connector-java:5.1.49' diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ServerLevelMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ServerLevelMixin.java index 034298fd..fbfc2be5 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ServerLevelMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ServerLevelMixin.java @@ -109,7 +109,7 @@ public abstract class ServerLevelMixin extends LevelMixin implements ServerWorld // @formatter:on @SuppressWarnings({"FieldCanBeLocal", "unused"}) - public PrimaryLevelData $$worldDataServer; + public PrimaryLevelData M; // TODO f_8549_ check on update private int tickPosition; public LevelStorageSource.LevelStorageAccess convertable; public UUID uuid; @@ -153,10 +153,10 @@ public abstract class ServerLevelMixin extends LevelMixin implements ServerWorld } } if (worldInfo instanceof PrimaryLevelData) { - this.$$worldDataServer = (PrimaryLevelData) worldInfo; + this.M = (PrimaryLevelData) worldInfo; } else if (worldInfo instanceof DerivedLevelData) { // damn spigot again - this.$$worldDataServer = DelegateWorldInfo.wrap(((DerivedLevelData) worldInfo)); + this.M = DelegateWorldInfo.wrap(((DerivedLevelData) worldInfo)); ((DerivedWorldInfoBridge) worldInfo).bridge$setDimType(this.getTypeKey()); if (ArclightConfig.spec().getCompat().isSymlinkWorld()) { WorldSymlink.create((DerivedLevelData) worldInfo, levelSave.getDimensionPath(this.dimension()).toFile()); @@ -165,7 +165,7 @@ public abstract class ServerLevelMixin extends LevelMixin implements ServerWorld this.spigotConfig = new SpigotWorldConfig(worldInfo.getLevelName()); this.uuid = WorldUUID.getUUID(levelSave.getDimensionPath(this.dimension()).toFile()); ((ServerChunkProviderBridge) this.chunkSource).bridge$setViewDistance(spigotConfig.viewDistance); - ((WorldInfoBridge) this.$$worldDataServer).bridge$setWorld((ServerLevel) (Object) this); + ((WorldInfoBridge) this.M).bridge$setWorld((ServerLevel) (Object) this); var data = this.getDataStorage().computeIfAbsent(LevelPersistentData::new, () -> new LevelPersistentData(null), "bukkit_pdc"); this.bridge$getWorld().readBukkitValues(data.getTag()); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/chunk/LevelChunkMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/chunk/LevelChunkMixin.java index 5a633753..7dd706a0 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/chunk/LevelChunkMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/chunk/LevelChunkMixin.java @@ -44,12 +44,12 @@ public abstract class LevelChunkMixin extends ChunkAccessMixin implements ChunkB public boolean mustNotSave; public boolean needsDecoration; private transient boolean arclight$doPlace; - public ServerLevel $$level; + public ServerLevel q; // TODO f_62776_ check on update @Inject(method = "(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/level/ChunkPos;Lnet/minecraft/world/level/chunk/UpgradeData;Lnet/minecraft/world/ticks/LevelChunkTicks;Lnet/minecraft/world/ticks/LevelChunkTicks;J[Lnet/minecraft/world/level/chunk/LevelChunkSection;Lnet/minecraft/world/level/chunk/LevelChunk$PostLoadProcessor;Lnet/minecraft/world/level/levelgen/blending/BlendingData;)V", at = @At("RETURN")) private void arclight$init(Level worldIn, ChunkPos p_196855_, UpgradeData p_196856_, LevelChunkTicks p_196857_, LevelChunkTicks p_196858_, long p_196859_, @Nullable LevelChunkSection[] p_196860_, @Nullable LevelChunk.PostLoadProcessor p_196861_, @Nullable BlendingData p_196862_, CallbackInfo ci) { if (DistValidate.isValid(worldIn)) { - this.$$level = ((ServerLevel) worldIn); + this.q = ((ServerLevel) worldIn); this.bukkitChunk = new CraftChunk((LevelChunk) (Object) this); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMixinPlugin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMixinPlugin.java index cafb0bff..10a353c0 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMixinPlugin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/ArclightMixinPlugin.java @@ -7,7 +7,6 @@ import com.google.common.collect.Maps; import org.objectweb.asm.Opcodes; import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.ClassNode; -import org.objectweb.asm.tree.FieldInsnNode; import org.objectweb.asm.tree.FieldNode; import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.MethodInsnNode; @@ -106,10 +105,10 @@ public class ArclightMixinPlugin implements IMixinConfigPlugin { .build(); // damn spigot - private final Map> fieldRenames = ImmutableMap.>builder() - .put("net.minecraft.world.level.chunk.LevelChunk", ImmutableMap.of("$$level", "f_62776_")) - .put("net.minecraft.server.level.ServerLevel", ImmutableMap.of("$$worldDataServer", "f_8549_")) - .build(); + //private final Map> fieldRenames = ImmutableMap.>builder() + // .put("net.minecraft.world.level.chunk.LevelChunk", ImmutableMap.of("$$level", "f_62776_")) + // .put("net.minecraft.server.level.ServerLevel", ImmutableMap.of("$$worldDataServer", "f_8549_")) + // .build(); private final Set modifyConstructor = ImmutableSet.builder() .add("net.minecraft.world.level.Level") @@ -173,23 +172,6 @@ public class ArclightMixinPlugin implements IMixinConfigPlugin { } } modifyConstructor(targetClassName, targetClass); - renameFields(targetClassName, targetClass); - } - - private void renameFields(String targetClassName, ClassNode classNode) { - Map map = this.fieldRenames.get(targetClassName); - if (map != null) { - for (FieldNode field : classNode.fields) { - field.name = map.getOrDefault(field.name, field.name); - } - for (MethodNode method : classNode.methods) { - for (AbstractInsnNode instruction : method.instructions) { - if (instruction instanceof FieldInsnNode node) { - node.name = map.getOrDefault(node.name, node.name); - } - } - } - } } private void modifyConstructor(String targetClassName, ClassNode classNode) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRemapper.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRemapper.java index b2966f49..caa7fd36 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRemapper.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/remapper/ArclightRemapper.java @@ -18,6 +18,8 @@ import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; +import java.io.StringReader; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.function.Function; @@ -68,8 +70,18 @@ public class ArclightRemapper { new BufferedReader(new InputStreamReader(ArclightRemapper.class.getResourceAsStream("/bukkit_srg.srg"))), null, null, false ); + // TODO workaround for https://github.com/md-5/SpecialSource/pull/81 + // remove on update + var content = new String(ArclightRemapper.class.getResourceAsStream("/bukkit_srg.srg").readAllBytes(), StandardCharsets.UTF_8); + var i = content.indexOf("net/minecraft/server/level/ChunkMap net/minecraft/server/level/ChunkTracker"); + var nextSection = content.substring(i).lines().skip(1).dropWhile(it -> it.startsWith("\t")).findFirst().orElseThrow(); + var nextIndex = content.indexOf(nextSection); this.toBukkitMapping.loadMappings( - new BufferedReader(new InputStreamReader(ArclightRemapper.class.getResourceAsStream("/bukkit_srg.srg"))), + new BufferedReader(new StringReader(content.substring(0, i) + content.substring(nextIndex))), + null, null, true + ); + this.toBukkitMapping.loadMappings( + new BufferedReader(new StringReader(content.substring(i, nextIndex))), null, null, true ); BiMap inverseClassMap = HashBiMap.create(toNmsMapping.classes).inverse(); 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 151c951e..cd8a5efd 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 @@ -200,7 +200,7 @@ public class ClassLoaderRemapper extends LenientJarRemapper { private String mapField(Field field) { String owner = Type.getInternalName(field.getDeclaringClass()); String srgName = field.getName(); - String desc = Type.getInternalName(field.getType()); + String desc = Type.getDescriptor(field.getType()); return toBukkitRemapper.mapFieldName(owner, srgName, desc, -1); } diff --git a/arclight-forge/build.gradle b/arclight-forge/build.gradle index 2f123be6..05fef20f 100644 --- a/arclight-forge/build.gradle +++ b/arclight-forge/build.gradle @@ -44,7 +44,7 @@ repositories { def embedLibs = [/*"org.spongepowered:mixin:$mixinVersion", */ 'org.yaml:snakeyaml:1.30', 'org.xerial:sqlite-jdbc:3.36.0.3', 'mysql:mysql-connector-java:8.0.27', /*'commons-lang:commons-lang:2.6',*/ 'com.googlecode.json-simple:json-simple:1.1.1', - 'org.apache.logging.log4j:log4j-jul:2.17.0', 'net.md-5:SpecialSource:1.10.0', + 'org.apache.logging.log4j:log4j-jul:2.17.0', 'net.md-5:SpecialSource:1.11.0', 'org.jline:jline-terminal-jansi:3.12.1', 'org.fusesource.jansi:jansi:1.18', /*'org.jline:jline-terminal:3.12.1', 'org.jline:jline-reader:3.12.1',*/ 'jline:jline:2.12.1', 'org.apache.maven:maven-resolver-provider:3.8.1', diff --git a/build.gradle b/build.gradle index 85d94f02..9f5c0861 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ allprojects { } ext { - agpVersion = '1.22' + agpVersion = '1.23' minecraftVersion = '1.18.2' forgeVersion = '40.1.31' apiVersion = '1.2.6'