diff --git a/build.gradle b/build.gradle index 28f44b51..094b8f38 100644 --- a/build.gradle +++ b/build.gradle @@ -65,6 +65,7 @@ repositories { url "https://maven.tterrag.com/" } maven { url "https://maven.shedaniel.me" } + maven { url 'https://maven.blamejared.com' } } dependencies { @@ -99,6 +100,7 @@ dependencies { modCompileOnly("team.chisel.ctm:CTM:${ctm_version}") modCompileOnly("curse.maven:supermartijncore-454372:4455391") modImplementation("appeng:appliedenergistics2-forge:12.9.4") + modImplementation("vazkii.patchouli:Patchouli:1.19.2-77") } tasks.withType(JavaCompile) { diff --git a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index 4078272c..d28c1268 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -68,6 +68,7 @@ public class ModernFixEarlyConfig { this.addMixinRule("perf.deduplicate_location", false); this.addMixinRule("perf.cache_blockstate_cache_arrays", true); this.addMixinRule("perf.cache_model_materials", true); + this.addMixinRule("perf.patchouli_deduplicate_books", modPresent("patchouli")); this.addMixinRule("perf.datapack_reload_exceptions", true); this.addMixinRule("perf.faster_texture_stitching", true); /* off by default in 1.18 because it doesn't work as well */ diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/patchouli_deduplicate_books/ClientBookRegistryMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/patchouli_deduplicate_books/ClientBookRegistryMixin.java new file mode 100644 index 00000000..bd8950a6 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/patchouli_deduplicate_books/ClientBookRegistryMixin.java @@ -0,0 +1,72 @@ +package org.embeddedt.modernfix.mixin.perf.patchouli_deduplicate_books; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraftforge.fml.util.ObfuscationReflectionHelper; +import org.embeddedt.modernfix.ModernFix; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import vazkii.patchouli.client.book.BookContents; +import vazkii.patchouli.client.book.BookEntry; +import vazkii.patchouli.client.book.BookPage; +import vazkii.patchouli.client.book.ClientBookRegistry; +import vazkii.patchouli.client.book.page.PageTemplate; +import vazkii.patchouli.client.book.template.BookTemplate; +import vazkii.patchouli.client.book.template.TemplateComponent; +import vazkii.patchouli.client.book.template.component.ComponentItemStack; +import vazkii.patchouli.common.book.Book; +import vazkii.patchouli.common.book.BookRegistry; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +@Mixin(ClientBookRegistry.class) +public class ClientBookRegistryMixin { + @Inject(method = "reload", at = @At("RETURN"), remap = false) + private void performDeduplication(CallbackInfo ci) { + Field templateField = ObfuscationReflectionHelper.findField(PageTemplate.class, "template"); + Field contentsField = ObfuscationReflectionHelper.findField(Book.class, "contents"); + Field componentsField = ObfuscationReflectionHelper.findField(BookTemplate.class, "components"); + Field itemsField = ObfuscationReflectionHelper.findField(ComponentItemStack.class, "items"); + int numItemsCleared = 0; + for(Book book : BookRegistry.INSTANCE.books.values()) { + try { + BookContents contents = (BookContents)contentsField.get(book); + for(BookEntry entry : contents.entries.values()) { + for (BookPage page : entry.getPages()) { + if (page instanceof PageTemplate) { + List components; + + BookTemplate template = (BookTemplate) templateField.get(page); + components = (List) componentsField.get(template); + for (TemplateComponent component : components) { + if (component instanceof ComponentItemStack) { + ItemStack[] items = (ItemStack[]) itemsField.get(component); + for (ItemStack item : items) { + if (item.getItem() == Items.AIR) { + // remove any NBT + CompoundTag tag = item.getTag(); + if (tag != null) { + numItemsCleared++; + List keys = new ArrayList<>(tag.getAllKeys()); + for (String key : keys) + item.removeTagKey(key); + } + } + } + } + } + } + } + } + } catch(ReflectiveOperationException e) { + continue; + } + } + ModernFix.LOGGER.info("Cleared {} unneeded book NBT tags", numItemsCleared); + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index 6ac4b0ea..f500bca2 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -63,6 +63,7 @@ "perf.model_optimizations.TransformationMatrixMixin", "perf.model_optimizations.BooleanPropertyMixin", "perf.model_optimizations.PropertyMixin", + "perf.patchouli_deduplicate_books.ClientBookRegistryMixin", "perf.thread_priorities.IntegratedServerMixin", "safety.BlockColorsMixin", "safety.ItemColorsMixin",