FindFieldInType() public static method

public static FindFieldInType ( Mono.Cecil.TypeDefinition type, string fieldName ) : FieldDefinition
type Mono.Cecil.TypeDefinition
fieldName string
return Mono.Cecil.FieldDefinition
コード例 #1
0
        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);
        }
コード例 #2
0
        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;
                    }
                }
            }
        }
コード例 #3
0
        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);
            }
        }