public static FindFieldInType ( Mono.Cecil.TypeDefinition type, string fieldName ) : |
||
type | Mono.Cecil.TypeDefinition | |
fieldName | string | |
return |
public void ForceGravityGlobeOn() { var playerCtor = CecilHelpers.FindMethodInAssembly(terraria, "System.Void Terraria.Player::.ctor()"); var processor = playerCtor.Body.GetILProcessor(); var firstInstruction = playerCtor.Body.Instructions[0]; var loadThis = processor.Create(Mono.Cecil.Cil.OpCodes.Ldarg_0); processor.InsertBefore(firstInstruction, loadThis); var loadTrue = processor.Create(Mono.Cecil.Cil.OpCodes.Ldc_I4_1); processor.InsertAfter(loadThis, loadTrue); var saveInGravControl = processor.Create(Mono.Cecil.Cil.OpCodes.Stfld, CecilHelpers.FindFieldInType(playerCtor.DeclaringType, "gravControl2")); processor.InsertAfter(loadTrue, saveInGravControl); var playerReset = CecilHelpers.FindMethodInAssembly(terraria, "System.Void Terraria.Player::ResetEffects()"); CecilHelpers.ChangeDefaultBooleanValue(playerReset, "System.Boolean Terraria.Player::gravControl2", true); }
private void ReplaceLiquidRendererInMethod(MethodDefinition method) { var oldType = CecilHelpers.FindTypeInAssembly(terraria, "Terraria.GameContent.Liquid.LiquidRenderer"); var oldField = CecilHelpers.FindFieldInType(oldType, "Instance"); var newType = CecilHelpers.FindTypeInAssembly(liquid, "Terraria.GameContent.Liquid.ReplacementLiquidRenderer"); var newField = CecilHelpers.FindFieldInType(newType, "Instance"); var newMap = GetMethodMap(newType); var processor = method.Body.GetILProcessor(); for (int i = 0; i < method.Body.Instructions.Count; i++) { var inst = method.Body.Instructions[i]; if (inst.OpCode == Mono.Cecil.Cil.OpCodes.Call || inst.OpCode == Mono.Cecil.Cil.OpCodes.Calli || inst.OpCode == Mono.Cecil.Cil.OpCodes.Callvirt) { var methodCall = inst.Operand as MethodDefinition; if (methodCall != null && methodCall.FullName.Contains("Terraria.GameContent.Liquid.LiquidRenderer")) { var splitName = methodCall.FullName.Split(new string[] { "::" }, StringSplitOptions.None); if (splitName.Length == 2 && newMap.ContainsKey(splitName[1])) { var newMethod = newMap[splitName[1]]; inst.Operand = method.Module.Import(newMethod); method.Body.Instructions[i] = inst; } } } else if (inst.OpCode == Mono.Cecil.Cil.OpCodes.Ldsfld) { if (inst.Operand == oldField) { inst.Operand = method.Module.Import(newField); method.Body.Instructions[i] = inst; } } } }
public void DoubleUISize() { var mainType = CecilHelpers.FindTypeInAssembly(terraria, "Terraria.Main"); var inventoryScaleField = CecilHelpers.FindFieldInType(mainType, "inventoryScale"); var reforgeScaleField = CecilHelpers.FindFieldInType(mainType, "reforgeScale"); var inventoryMethod = CecilHelpers.FindMethodInAssembly(terraria, "System.Void Terraria.Main::DrawInventory()"); var processor = inventoryMethod.Body.GetILProcessor(); // There are multiple locations inside DrawInventory where it sets the scale of the inventory draw. Let's just override them. var addTimesTwoAfter = new List <Mono.Cecil.Cil.Instruction>(); var replaceOperations = new Dictionary <Mono.Cecil.Cil.Instruction, int>(); foreach (var instruction in inventoryMethod.Body.Instructions) { if (instruction.OpCode == Mono.Cecil.Cil.OpCodes.Stsfld) { if (instruction.Operand == inventoryScaleField || instruction.Operand == reforgeScaleField) { // Calculated scale...let's fix that later addTimesTwoAfter.Add(instruction.Previous); } } else if (instruction.OpCode == Mono.Cecil.Cil.OpCodes.Ldc_I4 || instruction.OpCode == Mono.Cecil.Cil.OpCodes.Ldc_R4 || instruction.OpCode == Mono.Cecil.Cil.OpCodes.Ldc_I4_S) { // Layout constants - sometimes, they're floats, other times, they're ints. Treat them the same. int value = Convert.ToInt32(instruction.Operand); switch (value) { // Coins/ammo case 496: case 497: case 498: value = 1150; break; case 532: case 533: case 534: value = 1275; break; // Sort/deposit icons case 244: value = 580; break; // Trash case 448: value = 1028; break; case 258: value = 580; break; // Equipment case -47: value = -100; break; case 47: value = 100; break; // Crafting menu case 42: value = 100; break; // Below here, generically double case 168: //case 85: //case 54: // Equipment //case 174: /* * case 92: * case 32: * case 440: */ /* * // case 58: // Don't double 58 because it slides too many things off screen * // case 56: // Don't double 56 because it screws up all other layouts * * case 64: * // Buffs: * case 46: * case 260: * * // Crafting / Recipes * case 118: * case 73: * case 331: * case 26: * case 50: * case 42: * case 150: * case 94: * case 450: * case 340: * case 310: * case 280: * //case 20: * //case 40: * //case 80: * case 380: * // UI Elements * case 302: * //case 30: */ value *= 2; break; default: break; // We don't recognize the value, so we won't double it. } if (instruction.OpCode == Mono.Cecil.Cil.OpCodes.Ldc_I4) { instruction.Operand = value; } else if (instruction.OpCode == Mono.Cecil.Cil.OpCodes.Ldc_I4_S) { if (value >= -128 && value <= 127) { instruction.Operand = (sbyte)value; } else { //replaceOperations.Add(instruction, value); } } else { instruction.Operand = (float)value; } } } foreach (var instruction in replaceOperations.Keys) { var replacementInstruction = processor.Create(Mono.Cecil.Cil.OpCodes.Ldc_I4, replaceOperations[instruction]); processor.Replace(instruction, replacementInstruction); } foreach (var instruction in addTimesTwoAfter) { var insertTwoInstruction = processor.Create(Mono.Cecil.Cil.OpCodes.Ldc_R4, 2.0f); processor.InsertAfter(instruction, insertTwoInstruction); var multiplyInstruction = processor.Create(Mono.Cecil.Cil.OpCodes.Mul); processor.InsertAfter(insertTwoInstruction, multiplyInstruction); } }