diff --git a/build.gradle.kts b/build.gradle.kts index 2883cff..bf7cb79 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ plugins { // Project properties group = "github.kasuminova.stellarcore" -version = "1.5.17" +version = "1.5.19" // Set the toolchain version to decouple the Java we run Gradle with from the Java used to compile and run the mod java { diff --git a/src/main/java/github/kasuminova/stellarcore/common/config/category/Performance.java b/src/main/java/github/kasuminova/stellarcore/common/config/category/Performance.java index 74c1044..43d3d42 100644 --- a/src/main/java/github/kasuminova/stellarcore/common/config/category/Performance.java +++ b/src/main/java/github/kasuminova/stellarcore/common/config/category/Performance.java @@ -205,6 +205,7 @@ public static class Vanilla { @Config.Comment({ "(Client/Server Performance) Cache constants -32768 - 32767 of NBTTagByte, NBTTagInt, NBTTagLong, NBTTagFloat, NBTTagDouble using constant pool.", "Like IntegerCache in the JVM, improves memory usage and reduces object creation overhead.", + "Note: Some mods may not comply with the specification causing NBTBase to be loaded prematurely, so there may be a higher probability of problems with this feature.", "Incompatible with old version of Quark (< r1.6-189), which modifies the bytecode of the NBTTag class too early.", }) @Config.RequiresMcRestart @@ -334,6 +335,10 @@ public static class Forge { @Config.Name("ASMDataTableCPUUsageImprovements") public boolean asmDataTable = false; + @Config.Comment("(Client/Server Performance) Improved performance of ASMModParser in parsing bytecode, improved startup speed (~1 ~ 5 seconds).") + @Config.Name("ASMModParserImprovements") + public boolean asmModParser = true; + @Config.Comment("(Client/Server Performance) ChunkManager optimisation, improves performance in more player environments.") @Config.RequiresMcRestart @Config.Name("ChunkManager") diff --git a/src/main/java/github/kasuminova/stellarcore/mixin/StellarCoreEarlyMixinLoader.java b/src/main/java/github/kasuminova/stellarcore/mixin/StellarCoreEarlyMixinLoader.java index ea72cde..f8e087e 100644 --- a/src/main/java/github/kasuminova/stellarcore/mixin/StellarCoreEarlyMixinLoader.java +++ b/src/main/java/github/kasuminova/stellarcore/mixin/StellarCoreEarlyMixinLoader.java @@ -56,6 +56,7 @@ public class StellarCoreEarlyMixinLoader implements IFMLLoadingPlugin { addMixinCFG("mixins.stellar_core_minecraft_texture_load.json", () -> StellarCoreConfig.PERFORMANCE.vanilla.parallelTextureLoad); addMixinCFG("mixins.stellar_core_forge.json", () -> StellarCoreConfig.PERFORMANCE.customLoadingScreen.splashProgress); addMixinCFG("mixins.stellar_core_forge_asmdatatable.json", () -> StellarCoreConfig.PERFORMANCE.forge.asmDataTable); + addMixinCFG("mixins.stellar_core_forge_asmmodparser.json", () -> StellarCoreConfig.PERFORMANCE.forge.asmModParser); addMixinCFG("mixins.stellar_core_forge_bakedquad.json", () -> StellarCoreConfig.PERFORMANCE.forge.unpackedBakedQuadDataCanonicalization); addMixinCFG("mixins.stellar_core_forge_bakedquad_vertexdata.json", () -> StellarCoreConfig.PERFORMANCE.forge.unpackedBakedQuadVertexDataCanonicalization); addMixinCFG("mixins.stellar_core_forge_capability.json", () -> StellarCoreConfig.PERFORMANCE.forge.deallocateEmptyCapabilityNBT); diff --git a/src/main/java/github/kasuminova/stellarcore/mixin/botania/MixinTileRuneAltar.java b/src/main/java/github/kasuminova/stellarcore/mixin/botania/MixinTileRuneAltar.java index b9374b9..a710c3c 100644 --- a/src/main/java/github/kasuminova/stellarcore/mixin/botania/MixinTileRuneAltar.java +++ b/src/main/java/github/kasuminova/stellarcore/mixin/botania/MixinTileRuneAltar.java @@ -11,6 +11,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import vazkii.botania.api.recipe.RecipeRuneAltar; import vazkii.botania.common.block.tile.TileRuneAltar; import vazkii.botania.common.block.tile.TileSimpleInventory; @@ -23,6 +24,9 @@ public abstract class MixinTileRuneAltar extends TileSimpleInventory { @Shadow(remap = false) public abstract boolean isEmpty(); + @Shadow(remap = false) + RecipeRuneAltar currentRecipe; + @Unique private boolean stellar_core$shouldGetEntities = true; @@ -32,7 +36,7 @@ private void injectUpdateRecipe(final CallbackInfo ci) { return; } - if (isEmpty()) { + if (this.currentRecipe == null && isEmpty()) { ci.cancel(); } } diff --git a/src/main/java/github/kasuminova/stellarcore/mixin/minecraft/forge/asmmodparser/MixinASMModParser.java b/src/main/java/github/kasuminova/stellarcore/mixin/minecraft/forge/asmmodparser/MixinASMModParser.java new file mode 100644 index 0000000..6f29dc5 --- /dev/null +++ b/src/main/java/github/kasuminova/stellarcore/mixin/minecraft/forge/asmmodparser/MixinASMModParser.java @@ -0,0 +1,19 @@ +package github.kasuminova.stellarcore.mixin.minecraft.forge.asmmodparser; + +import net.minecraftforge.fml.common.discovery.asm.ASMModParser; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@SuppressWarnings("MethodMayBeStatic") +@Mixin(value = ASMModParser.class, remap = false) +public class MixinASMModParser { + + @Redirect(method = "", at = @At(value = "INVOKE", target = "Lorg/objectweb/asm/ClassReader;accept(Lorg/objectweb/asm/ClassVisitor;I)V")) + private void redirectInit(final ClassReader instance, final ClassVisitor classVisitor, final int flags) { + instance.accept(classVisitor, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES); + } + +} diff --git a/src/main/java/github/kasuminova/stellarcore/mixin/minecraft/nbtpool/MixinNBTTagCompound.java b/src/main/java/github/kasuminova/stellarcore/mixin/minecraft/nbtpool/MixinNBTTagCompound.java index 07e5790..361d091 100644 --- a/src/main/java/github/kasuminova/stellarcore/mixin/minecraft/nbtpool/MixinNBTTagCompound.java +++ b/src/main/java/github/kasuminova/stellarcore/mixin/minecraft/nbtpool/MixinNBTTagCompound.java @@ -27,7 +27,7 @@ public class MixinNBTTagCompound { @SuppressWarnings("MethodMayBeStatic") @Redirect(method = "read", at = @At(value = "INVOKE", target = "Ljava/util/Map;put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", remap = false)) private Object redirectRead(final Map instance, final Object key, final Object value) { - return instance.put(key, ((StellarPooledNBT) value).stellar_core$getPooledNBT()); + return instance.put(key, StellarPooledNBT.stellar_core$getPooledNBT((NBTBase) value)); } /** @@ -39,7 +39,7 @@ public void setTag(String key, NBTBase value) { if (value == null) { throw new IllegalArgumentException("Invalid null NBT value with key " + key); } - this.tagMap.put(key, (NBTBase) ((StellarPooledNBT) value).stellar_core$getPooledNBT()); + this.tagMap.put(key, (NBTBase) StellarPooledNBT.stellar_core$getPooledNBT(value)); } /** diff --git a/src/main/java/github/kasuminova/stellarcore/mixin/minecraft/nbtpool/MixinNBTTagList.java b/src/main/java/github/kasuminova/stellarcore/mixin/minecraft/nbtpool/MixinNBTTagList.java index def900f..a19b0dd 100644 --- a/src/main/java/github/kasuminova/stellarcore/mixin/minecraft/nbtpool/MixinNBTTagList.java +++ b/src/main/java/github/kasuminova/stellarcore/mixin/minecraft/nbtpool/MixinNBTTagList.java @@ -1,6 +1,7 @@ package github.kasuminova.stellarcore.mixin.minecraft.nbtpool; import github.kasuminova.stellarcore.mixin.util.StellarPooledNBT; +import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagList; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -18,17 +19,17 @@ public class MixinNBTTagList { */ @Redirect(method = "read", at = @At(value = "INVOKE", target = "Ljava/util/List;add(Ljava/lang/Object;)Z", remap = false)) private boolean redirectRead(final List instance, final Object element) { - return instance.add(((StellarPooledNBT) element).stellar_core$getPooledNBT()); + return instance.add(StellarPooledNBT.stellar_core$getPooledNBT((NBTBase) element)); } @Redirect(method = "appendTag", at = @At(value = "INVOKE", target = "Ljava/util/List;add(Ljava/lang/Object;)Z", remap = false)) private boolean redirectAppendTag(final List instance, final Object element) { - return instance.add(((StellarPooledNBT) element).stellar_core$getPooledNBT()); + return instance.add(StellarPooledNBT.stellar_core$getPooledNBT((NBTBase) element)); } @Redirect(method = "set", at = @At(value = "INVOKE", target = "Ljava/util/List;set(ILjava/lang/Object;)Ljava/lang/Object;", remap = false)) private Object redirectSet(final List instance, final int i, final Object element) { - return instance.set(i, ((StellarPooledNBT) element).stellar_core$getPooledNBT()); + return instance.set(i, StellarPooledNBT.stellar_core$getPooledNBT((NBTBase) element)); } } diff --git a/src/main/java/github/kasuminova/stellarcore/mixin/util/StellarPooledNBT.java b/src/main/java/github/kasuminova/stellarcore/mixin/util/StellarPooledNBT.java index 80c348b..00e3ad0 100644 --- a/src/main/java/github/kasuminova/stellarcore/mixin/util/StellarPooledNBT.java +++ b/src/main/java/github/kasuminova/stellarcore/mixin/util/StellarPooledNBT.java @@ -1,7 +1,17 @@ package github.kasuminova.stellarcore.mixin.util; +import net.minecraft.nbt.NBTBase; + public interface StellarPooledNBT { + static Object stellar_core$getPooledNBT(final NBTBase nbt) { + try { + return ((StellarPooledNBT) nbt).stellar_core$getPooledNBT(); + } catch (ClassCastException e) { + return nbt; + } + } + /** * 返回 Object 来兼容其他模组的反射。 */ diff --git a/src/main/resources/mixins.stellar_core_forge_asmmodparser.json b/src/main/resources/mixins.stellar_core_forge_asmmodparser.json new file mode 100644 index 0000000..4dd82f7 --- /dev/null +++ b/src/main/resources/mixins.stellar_core_forge_asmmodparser.json @@ -0,0 +1,10 @@ +{ + "package": "github.kasuminova.stellarcore.mixin.minecraft.forge.asmmodparser", + "refmap": "mixins.stellar_core.refmap.json", + "target": "@env(DEFAULT)", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "MixinASMModParser" + ] +} \ No newline at end of file