2
0
Fork 0

Changed durability code from reflection to ASM

frozen
Shinare 2 years ago
parent 891c8a603c
commit 89dde83214

@ -23,40 +23,6 @@ public class Materials {
modifyMaterial("ASH", 2000, 0.0F, 0.6F, 2, 7.0F, 10, CinderLoE.ingotAsh);
//modifyMaterial("BRONZE", 2000, 0.0F, 0.6F, 2, 7.0F, 10, LOTRMod.bronze);
// Modified Vanilla Material, for Royal armor and prot (1000 - Original Durability) * 0.25
// Orcs
modifyMaterial("ANGMAR", 480, 2.5F, 0.6F, 2, 6.0F, 10, LOTRMod.orcSteel); //Original Durability = 350 | Add 162 | 1/4
modifyMaterial("URUK", 662, 3.0F, 0.7F, 2, 6.0F, 5, LOTRMod.urukSteel); //Original Durability = 550 | Add 112 | 1/4
modifyMaterial("BLACK_URUK", 774, 3.0F, 0.7F, 2, 6.0F, 6, LOTRMod.blackUrukSteel); //Original Durability = 550 | Add 112 | 2/4
modifyMaterial("HALF_TROLL", 475, 2.5F, 0.6F, 1, 5.0F, 6, LOTRMod.gemsbokHide); //Original Durability = 300 | Add 175 | 1/4
// Good Humans
modifyMaterial("DALE", 475, 2.5F, 0.6F, 2, 6.0F, 10, Items.iron_ingot); //Original Durability = 300 | Add 175 | 1/4
modifyMaterial("GONDOR", 725, 2.5F, 0.6F, 2, 6.0F, 10, Items.iron_ingot); //Original Durability = 450 | Add 137 | 2/4
modifyMaterial("DORWINION_ELF", 875, 3.0F, 0.6F, 2, 7.0F, 15, LOTRMod.elfSteel); //Original Durability = 500 | Add 125 | 2/4
modifyMaterial("ROHAN", 300, 2.5F, 0.6F, 2, 6.0F, 10, Items.iron_ingot); //Original Durability = 300 | Add 175 | 0/4
modifyMaterial("TAUREDAIN", 300, 2.5F, 0.6F, 3, 8.0F, 10, LOTRMod.bronze); //Original Durability = 300 | Add 175 | 0/4
modifyMaterial("DORWINION", 400, 2.5F, 0.6F, 2, 6.0F, 10, Items.iron_ingot); //Original Durability = 400 | Add 150 | 0/4
modifyMaterial("LOSSARNACH", 300, 2.5F, 0.6F, 3, 8.0F, 10, Items.iron_ingot); //Original Durability = 300 | Add 175 | 0/4
modifyMaterial("LAMEDON", 300, 2.5F, 0.6F, 3, 8.0F, 10, Items.iron_ingot); //Original Durability = 300 | Add 175 | 0/4
// Evil Humans
modifyMaterial("RHUN_GOLD", 558, 2.5F, 0.6F, 2, 6.0F, 10, LOTRMod.gildedIron); //Original Durability = 450 | Add 137 | 1/4
modifyMaterial("RHUN", 400, 2.5F, 0.6F, 2, 6.0F, 10, Items.iron_ingot); //Original Durability = 400 | Add 150 | 0/4
modifyMaterial("DUNLENDING", 437, 2.0F, 0.6F, 2, 6.0F, 8, Items.iron_ingot); //Original Durability = 250 | Add 187 | 1/4
modifyMaterial("NEAR_HARAD", 650, 2.5F, 0.6F, 2, 6.0F, 10, LOTRMod.bronze); //Original Durability = 300 | Add 175 | 2/4
modifyMaterial("HARNEDOR", 250, 2.0F, 0.6F, 2, 6.0F, 8, LOTRMod.bronze); //Original Durability = 250 | Add 187 | 0/4
modifyMaterial("CORSAIR", 300, 2.5F, 0.6F, 2, 6.0F, 10, Items.iron_ingot); //Original Durability = 300 | Add 175 | 0/4
modifyMaterial("GULF_HARAD", 350, 2.5F, 0.6F, 2, 6.0F, 10, LOTRMod.bronze); //Original Durability = 350 | Add 162 | 0/4
modifyMaterial("UMBAR", 450, 2.5F, 0.6F, 2, 6.0F, 10, Items.iron_ingot); //Original Durability = 450 | Add 137 | 0/4
modifyMaterial("MOREDAIN", 250, 2.0F, 0.6F, 2, 6.0F, 8, LOTRMod.gemsbokHide); //Original Durability = 250 | Add 187 | 0/4
//Elves
modifyMaterial("WOOD_ELVEN", 1000, 3.0F, 0.6F, 2, 9.0F, 15, LOTRMod.elfSteel); //Original Durability = 500 | Add 125 | 4/4
}
public static void modifyMaterial(String fieldName, int uses, float weapon_damage, float protection, int harvest_level, float speed, int enchantability, Item crafting_item) {

@ -7,6 +7,14 @@ import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.FieldNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.IntInsnNode;
import org.objectweb.asm.tree.FieldInsnNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.LdcInsnNode;
import org.objectweb.asm.tree.AbstractInsnNode;
import java.util.Iterator;
public class LOTRMaterialTransformer implements IClassTransformer {
@Override
@ -18,7 +26,38 @@ public class LOTRMaterialTransformer implements IClassTransformer {
ClassNode classNode = new ClassNode();
reader.accept(classNode, 0);
// Add the RED_DWARF_STEEL field
setDurability("ANGMAR", 480, classNode); //Original Durability = 350 | Add 162 | 1/4
setDurability("URUK", 662, classNode); //Original Durability = 550 | Add 112 | 1/4
setDurability("BLACK_URUK", 774, classNode); //Original Durability = 550 | Add 112 | 2/4
setDurability("HALF_TROLL", 475, classNode); //Original Durability = 300 | Add 175 | 1/4
// Good Humans
setDurability("DALE", 475, classNode); //Original Durability = 300 | Add 175 | 1/4
setDurability("GONDOR", 725, classNode); //Original Durability = 450 | Add 137 | 2/4
setDurability("DORWINION_ELF", 875, classNode); //Original Durability = 500 | Add 125 | 2/4
setDurability("ROHAN", 300, classNode); //Original Durability = 300 | Add 175 | 0/4
setDurability("TAUREDAIN", 300, classNode); //Original Durability = 300 | Add 175 | 0/4
setDurability("DORWINION", 400, classNode); //Original Durability = 400 | Add 150 | 0/4
setDurability("LOSSARNACH", 300, classNode); //Original Durability = 300 | Add 175 | 0/4
setDurability("LAMEDON", 300, classNode); //Original Durability = 300 | Add 175 | 0/4
// Evil Humans
setDurability("RHUN_GOLD", 558, classNode); //Original Durability = 450 | Add 137 | 1/4
setDurability("RHUN", 400, classNode); //Original Durability = 400 | Add 150 | 0/4
setDurability("DUNLENDING", 437, classNode); //Original Durability = 250 | Add 187 | 1/4
setDurability("NEAR_HARAD", 650, classNode); //Original Durability = 300 | Add 175 | 2/4
setDurability("HARNEDOR", 250, classNode); //Original Durability = 250 | Add 187 | 0/4
setDurability("CORSAIR", 300, classNode); //Original Durability = 300 | Add 175 | 0/4
setDurability("GULF_HARAD", 350, classNode); //Original Durability = 350 | Add 162 | 0/4
setDurability("UMBAR", 450, classNode); //Original Durability = 450 | Add 137 | 0/4
setDurability("MOREDAIN", 250, classNode); //Original Durability = 250 | Add 187 | 0/4
//Elves
setDurability("WOOD_ELVEN", 1000, classNode); //Original Durability = 500 | Add 125 | 4/4
addMaterial("RED_DWARF", classNode);
addMaterial("WIZARD", classNode);
addMaterial("LIMWAITH_BONE", classNode);
@ -49,4 +88,45 @@ public class LOTRMaterialTransformer implements IClassTransformer {
);
classNode.fields.add(field);
}
public void setDurability(String fieldName, int durability, ClassNode classNode) {
MethodNode clinit = null;
boolean foundField = false;
// First, find the <clinit> method
for (MethodNode method : classNode.methods) {
if (method.name.equals("<clinit>")) {
clinit = method;
break;
}
}
if (clinit == null) {
return;
}
Iterator<AbstractInsnNode> 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 <clinit>.");
}
}
}

@ -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();
}
}
}
Loading…
Cancel
Save