diff --git a/build.gradle b/build.gradle index 34698add..4ab0f76e 100644 --- a/build.gradle +++ b/build.gradle @@ -64,6 +64,7 @@ repositories { maven { // CTM url "https://maven.tterrag.com/" } + maven { url 'https://maven.blamejared.com' } } dependencies { @@ -103,6 +104,7 @@ dependencies { modCompileOnly("curse.maven:valhesiastructures-347488:3476252") modCompileOnly files("deps/starlight-1.2.jar") modCompileOnly("appeng:appliedenergistics2:8.4.7") + modCompileOnly("vazkii.patchouli:Patchouli:1.16.4-53.3") } 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 b1e487ce..0a019baf 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -83,6 +83,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.async_locator", true); this.addMixinRule("perf.faster_texture_stitching", true); 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..2870f173 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/patchouli_deduplicate_books/ClientBookRegistryMixin.java @@ -0,0 +1,68 @@ +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.common.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.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 componentsField = ObfuscationReflectionHelper.findField(BookTemplate.class, "components"); + Field itemsField = ObfuscationReflectionHelper.findField(ComponentItemStack.class, "items"); + int numItemsCleared = 0; + for(Book book : BookRegistry.INSTANCE.books.values()) { + for(BookEntry entry : book.contents.entries.values()) { + for(BookPage page : entry.getPages()) { + if(page instanceof PageTemplate) { + List components; + try { + 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 81f58eb4..aab39d97 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -95,6 +95,7 @@ "perf.model_optimizations.TransformationMatrixMixin", "perf.model_optimizations.BooleanPropertyMixin", "perf.model_optimizations.PropertyMixin", + "perf.patchouli_deduplicate_books.ClientBookRegistryMixin", "perf.async_jei.InputConstantsMixin", "perf.async_jei.IngredientListElementFactoryMixin", "perf.async_jei.ClientLifecycleHandlerMixin",