From 89dde832147d200954597464183f3192d2df039e Mon Sep 17 00:00:00 2001 From: Shinare Date: Tue, 7 May 2024 17:14:16 +0300 Subject: [PATCH] Changed durability code from reflection to ASM --- .gradle/8.2.1/checksums/checksums.lock | Bin 17 -> 17 bytes .gradle/8.2.1/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../com/zivilon/cinder_loe/Materials.java | 34 -------- .../coremod/LOTRMaterialTransformer.java | 82 +++++++++++++++++- .../cinder_loe/mixins/MixinLOTRMaterial.java | 78 ----------------- 5 files changed, 81 insertions(+), 113 deletions(-) delete mode 100644 src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTRMaterial.java diff --git a/.gradle/8.2.1/checksums/checksums.lock b/.gradle/8.2.1/checksums/checksums.lock index 0b4c425077fc2d7af898bdba616be4514d1b0b45..168218c668656d28620afc9f8e3a9d00af5cd071 100644 GIT binary patch literal 17 UcmZQRdH method + for (MethodNode method : classNode.methods) { + if (method.name.equals("")) { + clinit = method; + break; + } + } + + if (clinit == null) { + return; + } + + + Iterator iter = clinit.instructions.iterator(); + while (iter.hasNext()) { + AbstractInsnNode insn = iter.next(); + + if (insn instanceof LdcInsnNode && ((LdcInsnNode) insn).cst.equals(fieldName)) { + foundField = true; + } + + if (foundField && insn instanceof MethodInsnNode && ((MethodInsnNode) insn).name.equals("setUses")) { + AbstractInsnNode durabilityInsn = insn.getPrevious(); + + if (durabilityInsn instanceof IntInsnNode) { + ((IntInsnNode) durabilityInsn).operand = durability; + System.out.println("[CinderLoE] Updated durability for " + fieldName + " to " + durability); + return; + } + } + } + + if (!foundField) { + System.out.println("[CinderLoE] Field '" + fieldName + "' not found in ."); + } + } } diff --git a/src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTRMaterial.java b/src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTRMaterial.java deleted file mode 100644 index 865f938..0000000 --- a/src/main/java/com/zivilon/cinder_loe/mixins/MixinLOTRMaterial.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.zivilon.cinder_loe.mixins; - -import lotr.common.LOTRMod; -import net.minecraft.block.Block; -import net.minecraft.item.Item; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; - -import lotr.common.item.LOTRMaterial; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; - -import com.zivilon.cinder_loe.CinderLoE; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(LOTRMaterial.class) -public abstract class MixinLOTRMaterial { - - - static { - try { - Class lotrMaterialClass = Class.forName("lotr.common.item.LOTRMaterial"); - Field redDwarfSteelField = lotrMaterialClass.getField("RED_DWARF_STEEL"); - - - // Reflection to access and instantiate the private constructor of LOTRMaterial - Constructor constructor = lotrMaterialClass.getDeclaredConstructor(String.class); - constructor.setAccessible(true); - Object redDwarfSteelMaterial = constructor.newInstance("RED_DWARF_STEEL"); - - - // Reflection to call the private methods on the new instance - Method setUses = lotrMaterialClass.getDeclaredMethod("setUses", int.class); - Method setDamage = lotrMaterialClass.getDeclaredMethod("setDamage", float.class); - Method setProtection = lotrMaterialClass.getDeclaredMethod("setProtection", float.class); - Method setHarvestLevel = lotrMaterialClass.getDeclaredMethod("setHarvestLevel", int.class); - Method setSpeed = lotrMaterialClass.getDeclaredMethod("setSpeed", float.class); - Method setEnchantability = lotrMaterialClass.getDeclaredMethod("setEnchantability", int.class); - - setUses.setAccessible(true); - setDamage.setAccessible(true); - setProtection.setAccessible(true); - setHarvestLevel.setAccessible(true); - setSpeed.setAccessible(true); - setEnchantability.setAccessible(true); - - // Red Dwarf - setUses.invoke(redDwarfSteelMaterial, 700); - setDamage.invoke(redDwarfSteelMaterial, 3.0F); - setProtection.invoke(redDwarfSteelMaterial, 0.7F); - setHarvestLevel.invoke(redDwarfSteelMaterial, 3); - setSpeed.invoke(redDwarfSteelMaterial, 7.0F); - setEnchantability.invoke(redDwarfSteelMaterial, 10); - - - - // Assuming a public method to set the crafting item exists - Method setCraftingItem = lotrMaterialClass.getDeclaredMethod("setCraftingItem", Item.class); - setCraftingItem.setAccessible(true); - setCraftingItem.invoke(redDwarfSteelMaterial, CinderLoE.redDwarfSteel); - - - // Now, assign the created and configured LOTRMaterial instance to the static field - redDwarfSteelField.set(null, redDwarfSteelMaterial); - - } catch (Exception e) { - e.printStackTrace(); - } - } -}