Add logic to clear air items of NBT from Patchouli book registry

This commit is contained in:
embeddedt 2023-04-25 21:05:02 -04:00
parent e843f8ed6d
commit d86344f309
No known key found for this signature in database
GPG Key ID: A69433EC199B5613
4 changed files with 72 additions and 0 deletions

View File

@ -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) {

View File

@ -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);

View File

@ -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<TemplateComponent> components;
try {
BookTemplate template = (BookTemplate)templateField.get(page);
components = (List<TemplateComponent>)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<String> 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);
}
}

View File

@ -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",