private static void DrawSavingsCustomCurrency(ILContext il)
    {
        int walletIndex = il.AddVariable <long>();

        ILCursor cursor = new ILCursor(il);

        if (cursor.TryGotoNext(i => i.MatchLdloc(0), i => i.MatchLdloca(2), i => i.MatchLdcI4(4)))
        {
            cursor.Emit(OpCodes.Ldloc, 0);
            cursor.Emit(OpCodes.Ldloca, 2);
            cursor.Emit(OpCodes.Ldloc, 1);
            cursor.EmitDelegate <BuyItemCustomCurrency_Del>((CustomCurrencySystem system, ref bool overflowing, Player player) =>
            {
                long val = 0;

                foreach (Item pItem in player.inventory)
                {
                    if (pItem.ModItem is Wallet wallet)
                    {
                        val += system.CountCurrency(out overflowing, wallet.GetItemStorage().ToArray());
                    }
                }

                return(val);
            });
            cursor.Emit(OpCodes.Stloc, walletIndex);

            cursor.Index += 2;
            cursor.Remove();

            cursor.Emit(OpCodes.Ldc_I4, 5);

            cursor.Index++;
            cursor.Emit(OpCodes.Dup);
            cursor.Emit(OpCodes.Ldc_I4, 4);
            cursor.Emit(OpCodes.Ldloc, walletIndex);
            cursor.Emit(OpCodes.Stelem_I8);
        }

        if (cursor.TryGotoNext(MoveType.AfterLabel, i => i.MatchLdsfld <Main>("instance"), i => i.MatchLdcI4(4076)))
        {
            cursor.Emit(OpCodes.Ldarg, 0);
            cursor.Emit(OpCodes.Ldloc, walletIndex);
            cursor.Emit(OpCodes.Ldarg, 2);
            cursor.Emit(OpCodes.Ldarg, 3);

            cursor.EmitDelegate <Action <SpriteBatch, long, float, float> >((sb, walletCount, shopx, shopy) =>
            {
                if (walletCount > 0L)
                {
                    int walletType = ModContent.ItemType <Wallet>();
                    Main.instance.LoadItem(walletType);

                    Texture2D texture = TextureAssets.Item[walletType].Value;
                    sb.Draw(texture, Utils.CenteredRectangle(new Vector2(shopx + 70f, shopy + 45f), texture.Size() * 0.5f), Color.White);
                }
            });
        }
    }
        private static void ItemSlot_DrawSavings(ILContext il)
        {
            int walletIndex = il.AddVariable(typeof(long));

            ILCursor cursor = new ILCursor(il);
            ILLabel  label  = cursor.DefineLabel();

            if (cursor.TryGotoNext(i => i.MatchStloc(4), i => i.MatchLdloca(1), i => i.MatchLdcI4(3)))
            {
                cursor.Index++;

                cursor.Emit(OpCodes.Ldloc, 0);
                cursor.EmitDelegate <Func <Player, long> >(player => player.inventory.OfType <Wallet>().Sum(wallet => wallet.Coins));
                cursor.Emit(OpCodes.Stloc, walletIndex);

                cursor.Index++;

                cursor.Remove();
                cursor.Emit(OpCodes.Ldc_I4, 4);
            }

            if (cursor.TryGotoNext(i => i.MatchLdloc(4), i => i.MatchStelemI8()))
            {
                cursor.Index += 2;

                cursor.Emit(OpCodes.Dup);
                cursor.Emit(OpCodes.Ldc_I4, 3);
                cursor.Emit(OpCodes.Ldloc, walletIndex);
                cursor.Emit(OpCodes.Stelem_I8);
            }

            if (cursor.TryGotoNext(i => i.MatchLdloc(2), i => i.MatchLdcI4(0), i => i.MatchConvI8(), i => i.MatchBle(out _)))
            {
                cursor.Index += 3;

                cursor.Remove();
                cursor.Emit(OpCodes.Ble, label);
            }

            if (cursor.TryGotoNext(i => i.MatchLdarg(0), i => i.MatchLdsfld(typeof(Lang).GetField("inter", BaseLibrary.Utility.defaultFlags)), i => i.MatchLdcI4(66)))
            {
                cursor.MarkLabel(label);

                cursor.Emit(OpCodes.Ldarg, 0);
                cursor.Emit(OpCodes.Ldloc, walletIndex);
                cursor.Emit(OpCodes.Ldarg, 1);
                cursor.Emit(OpCodes.Ldarg, 2);

                cursor.EmitDelegate <Action <SpriteBatch, long, float, float> >((sb, walletCount, shopx, shopy) =>
                {
                    int walletType = PortableStorage.Instance.ItemType <Wallet>();
                    if (walletCount > 0L)
                    {
                        sb.Draw(Main.itemTexture[walletType], Utils.CenteredRectangle(new Vector2(shopx + 70f, shopy + 40f), Main.itemTexture[walletType].Size() * 0.5f));
                    }
                });
            }
        }
    private static void BuyItemCustomCurrency(ILContext il)
    {
        ILCursor cursor      = new ILCursor(il);
        int      walletCoins = il.AddVariable <long>();

        // count custom coins in Wallets, add them to local variable
        if (cursor.TryGotoNext(MoveType.AfterLabel, i => i.MatchLdloc(0), i => i.MatchLdloca(1), i => i.MatchLdcI4(5)))
        {
            cursor.Emit(OpCodes.Ldloc, 0);
            cursor.Emit(OpCodes.Ldloca, 1);
            cursor.Emit(OpCodes.Ldarg, 0);

            cursor.EmitDelegate <BuyItemCustomCurrency_Del>((CustomCurrencySystem system, ref bool overflowing, Player player) =>
            {
                long val = 0;

                foreach (Item pItem in player.inventory)
                {
                    if (pItem.ModItem is Wallet wallet)
                    {
                        val += system.CountCurrency(out overflowing, wallet.GetItemStorage().ToArray());
                    }
                }

                return(val);
            });

            cursor.Emit(OpCodes.Stloc, walletCoins);

            cursor.Index += 2;

            cursor.Remove();
            cursor.Emit(OpCodes.Ldc_I4, 6);
        }

        // add wallet coins to other coins before the price check
        if (cursor.TryGotoNext(MoveType.AfterLabel, i => i.MatchCallvirt <CustomCurrencySystem>("CombineStacks")))
        {
            cursor.Emit(OpCodes.Dup);
            cursor.Emit(OpCodes.Ldc_I4, 5);
            cursor.Emit(OpCodes.Ldloc, walletCoins);
            cursor.Emit(OpCodes.Stelem_I8);
        }

        // replace CustomCurrentSystem.TryPurchasing with our own
        if (cursor.TryGotoNext(MoveType.AfterLabel, i => i.MatchCallvirt <CustomCurrencySystem>("TryPurchasing")))
        {
            cursor.Index -= 9;
            cursor.Remove();
            cursor.Index += 8;
            cursor.Remove();

            cursor.Emit(OpCodes.Ldarg, 0);
            cursor.Emit(OpCodes.Ldloc, 0);
            cursor.EmitDelegate <Func <int, List <Item[]>, List <Point>, List <Point>, List <Point>, List <Point>, List <Point>, List <Point>, Player, CustomCurrencySystem, bool> >(TryPurchasingCustomCurrency);
        }
    }
    private static void DrawSavings(ILContext il)
    {
        int walletIndex = il.AddVariable <long>();

        ILCursor cursor = new ILCursor(il);

        if (cursor.TryGotoNext(i => i.MatchLdloca(1), i => i.MatchLdcI4(4)))
        {
            cursor.Emit(OpCodes.Ldloc, 0);
            cursor.EmitDelegate <Func <Player, long> >(player =>
            {
                long coins = 0;

                foreach (Item pItem in player.inventory)
                {
                    if (pItem.ModItem is Wallet wallet)
                    {
                        coins += wallet.GetItemStorage().CountCoins();
                    }
                }

                return(coins);
            });
            cursor.Emit(OpCodes.Stloc, walletIndex);

            cursor.Index++;
            cursor.Remove();

            cursor.Emit(OpCodes.Ldc_I4, 5);

            cursor.Index++;
            cursor.Emit(OpCodes.Dup);
            cursor.Emit(OpCodes.Ldc_I4, 4);
            cursor.Emit(OpCodes.Ldloc, walletIndex);
            cursor.Emit(OpCodes.Stelem_I8);
        }

        if (cursor.TryGotoNext(MoveType.AfterLabel, i => i.MatchLdarg(0), i => i.MatchLdsfld <Lang>("inter")))
        {
            cursor.Emit(OpCodes.Ldarg, 0);
            cursor.Emit(OpCodes.Ldloc, walletIndex);
            cursor.Emit(OpCodes.Ldarg, 1);
            cursor.Emit(OpCodes.Ldarg, 2);

            cursor.EmitDelegate <Action <SpriteBatch, long, float, float> >((sb, walletCount, shopx, shopy) =>
            {
                if (walletCount > 0L)
                {
                    int walletType = ModContent.ItemType <Wallet>();
                    Main.instance.LoadItem(walletType);

                    Texture2D texture = TextureAssets.Item[walletType].Value;
                    sb.Draw(texture, Utils.CenteredRectangle(new Vector2(shopx + 70f, shopy + 45f), texture.Size() * 0.5f), Color.White);
                }
            });
        }
    }
Beispiel #5
0
        private static void Player_QuickHeal_GetItemToUse(ILContext il)
        {
            Type type       = typeof(ValueTuple <Item, int>);
            int  tupleIndex = il.AddVariable(type);

            ILCursor cursor = new ILCursor(il);

            if (cursor.TryGotoNext(i => i.MatchLdcI4(0), i => i.MatchStloc(3), i => i.MatchBr(out _)))
            {
                cursor.Emit(OpCodes.Ldarg, 0);
                cursor.Emit(OpCodes.Ldloc, 0);
                cursor.Emit(OpCodes.Ldloc, 2);

                cursor.EmitDelegate <Func <Player, int, int, ValueTuple <Item, int> > >((player, lostHealth, healthGain) =>
                {
                    Item result = null;

                    foreach (Item item in player.inventory.OfType <AlchemistBag>().SelectMany(x => x.Handler.Items))
                    {
                        if (item.stack > 0 && item.type > 0 && item.potion && item.healLife > 0 && ItemLoader.CanUseItem(item, player))
                        {
                            int healWaste = player.GetHealLife(item, true) - lostHealth;
                            if (healthGain < 0)
                            {
                                if (healWaste > healthGain)
                                {
                                    result     = item;
                                    healthGain = healWaste;
                                }
                            }
                            else if (healWaste < healthGain && healWaste >= 0)
                            {
                                result     = item;
                                healthGain = healWaste;
                            }
                        }
                    }

                    return(result, healthGain);
                });

                cursor.Emit(OpCodes.Stloc, tupleIndex);

                cursor.Emit(OpCodes.Ldloc, tupleIndex);
                cursor.Emit(OpCodes.Ldfld, type.GetField("Item1", BaseLibrary.Utility.defaultFlags));
                cursor.Emit(OpCodes.Stloc, 1);

                cursor.Emit(OpCodes.Ldloc, tupleIndex);
                cursor.Emit(OpCodes.Ldfld, type.GetField("Item2", BaseLibrary.Utility.defaultFlags));
                cursor.Emit(OpCodes.Stloc, 3);
            }
        }
    private static void BuyItem(ILContext il)
    {
        ILCursor cursor      = new ILCursor(il);
        int      walletIndex = il.AddVariable <long>();

        if (cursor.TryGotoNext(i => i.MatchLdloca(0), i => i.MatchLdcI4(5)))
        {
            cursor.Emit(OpCodes.Ldarg, 0);

            cursor.EmitDelegate <Func <Player, long> >(player =>
            {
                long coins = 0;

                foreach (Item pItem in player.inventory)
                {
                    if (pItem.ModItem is Wallet wallet)
                    {
                        coins += wallet.GetItemStorage().CountCoins();
                    }
                }

                return(coins);
            });

            cursor.Emit(OpCodes.Stloc, walletIndex);

            cursor.Index++;
            cursor.Remove();

            cursor.Emit(OpCodes.Ldc_I4, 6);

            cursor.Index++;
            cursor.Emit(OpCodes.Dup);
            cursor.Emit(OpCodes.Ldc_I4, 5);
            cursor.Emit(OpCodes.Ldloc, walletIndex);
            cursor.Emit(OpCodes.Stelem_I8);
        }

        if (cursor.TryGotoNext(i => i.MatchCall <Player>("TryPurchasing")))
        {
            cursor.Remove();
            cursor.Emit(OpCodes.Ldarg, 0);
            cursor.EmitDelegate <Func <int, List <Item[]>, List <Point>, List <Point>, List <Point>, List <Point>, List <Point>, List <Point>, Player, bool> >(TryPurchasing);
        }
    }
Beispiel #7
0
        private static void Player_PickAmmo(ILContext il)
        {
            int firstAmmoIndex = il.AddVariable(typeof(Item));
            int canShootIndex  = il.GetParameterIndex("canShoot");

            ILCursor cursor    = new ILCursor(il);
            ILLabel  elseLabel = cursor.DefineLabel();
            ILLabel  endLabel  = cursor.DefineLabel();

            cursor.Emit(OpCodes.Newobj, typeof(Item).GetConstructors()[0]);
            cursor.Emit(OpCodes.Stloc, firstAmmoIndex);

            if (cursor.TryGotoNext(i => i.MatchNewobj(typeof(Item).GetConstructors()[0]), i => i.MatchStloc(0)))
            {
                cursor.Index += 2;

                cursor.Emit(OpCodes.Ldarg, 0);
                cursor.Emit(OpCodes.Ldarg, 1);
                cursor.EmitDelegate <Func <Player, Item, Item> >((player, sItem) => player.inventory.OfType <BaseAmmoBag>().SelectMany(x => x.Handler.Items).FirstOrDefault(ammo => ammo.ammo == sItem.useAmmo && ammo.stack > 0));
                cursor.Emit(OpCodes.Stloc, firstAmmoIndex);

                cursor.Emit(OpCodes.Ldloc, firstAmmoIndex);
                cursor.Emit(OpCodes.Brfalse, elseLabel);

                cursor.Emit(OpCodes.Ldloc, firstAmmoIndex);
                cursor.Emit(OpCodes.Stloc, 0);

                cursor.Emit(OpCodes.Ldarg, canShootIndex);
                cursor.Emit(OpCodes.Ldc_I4, 1);
                cursor.Emit(OpCodes.Stind_I1);

                cursor.Emit(OpCodes.Br, endLabel);
            }

            if (cursor.TryGotoNext(i => i.MatchLdcI4(0), i => i.MatchStloc(1), i => i.MatchLdcI4(54)))
            {
                cursor.MarkLabel(elseLabel);
            }

            if (cursor.TryGotoNext(i => i.MatchLdarg(3), i => i.MatchLdindU1(), i => i.MatchBrfalse(out _)))
            {
                cursor.MarkLabel(endLabel);
            }
        }
Beispiel #8
0
        private static void Player_FishingLevel(ILContext il)
        {
            Type tupleType  = typeof(ValueTuple <Item, int>);
            int  tupleIndex = il.AddVariable(tupleType);

            int itemIndex = il.AddVariable(typeof(Item));

            ILCursor cursor = new ILCursor(il);
            ILLabel  label  = cursor.DefineLabel();

            if (cursor.TryGotoNext(i => i.MatchLdcI4(0), i => i.MatchStloc(3)))
            {
                cursor.Index += 2;

                cursor.Emit(OpCodes.Ldarg, 0);

                cursor.EmitDelegate <Func <Player, ValueTuple <Item, int> > >(player =>
                {
                    foreach (Item item in player.inventory.OfType <FishingBelt>().SelectMany(belt => belt.Handler.Items))
                    {
                        if (item.stack > 0 && item.bait > 0)
                        {
                            if (item.type == 2673)
                            {
                                return(null, -1);
                            }
                            return(item, item.bait);
                        }
                    }

                    return(null, 0);
                });

                cursor.Emit(OpCodes.Stloc, tupleIndex);

                cursor.Emit(OpCodes.Ldloc, tupleIndex);
                cursor.Emit(OpCodes.Ldfld, tupleType.GetField("Item1", BaseLibrary.Utility.defaultFlags));
                cursor.Emit(OpCodes.Stloc, itemIndex);

                cursor.Emit(OpCodes.Ldloc, tupleIndex);
                cursor.Emit(OpCodes.Ldfld, tupleType.GetField("Item2", BaseLibrary.Utility.defaultFlags));
                cursor.Emit(OpCodes.Stloc, 0);

                cursor.Emit(OpCodes.Ldloc, 0);
                cursor.Emit(OpCodes.Ldc_I4, -1);
                cursor.Emit(OpCodes.Ceq);
                cursor.Emit(OpCodes.Brfalse, label);
                cursor.Emit(OpCodes.Ldc_I4, -1);
                cursor.Emit(OpCodes.Ret);

                cursor.MarkLabel(label);
            }

            if (cursor.TryGotoNext(i => i.MatchLdsfld(typeof(Item).GetField("bait", BaseLibrary.Utility.defaultFlags)), i => i.MatchStloc(0), i => i.MatchBr(out _)))
            {
                cursor.Index += 2;

                cursor.Emit(OpCodes.Ldarg, 0);
                cursor.Emit(OpCodes.Ldfld, typeof(Player).GetField("inventory", BaseLibrary.Utility.defaultFlags));
                cursor.Emit(OpCodes.Ldloc, 3);
                cursor.Emit(OpCodes.Ldelem_Ref);
                cursor.Emit(OpCodes.Stloc, itemIndex);
            }

            if (cursor.TryGotoNext(i => i.MatchLdarg(0), i => i.MatchLdfld(typeof(Player).GetField("inventory", BaseLibrary.Utility.defaultFlags)), i => i.MatchLdloc(3), i => i.MatchLdelemRef(), i => i.MatchLdloca(4)))
            {
                cursor.RemoveRange(4);
                cursor.Emit(OpCodes.Ldloc, itemIndex);
            }
        }
Beispiel #9
0
        private static void Player_ItemCheck(ILContext il)
        {
            Type type       = typeof(ValueTuple <int, bool>);
            int  tupleIndex = il.AddVariable(type);

            ILCursor cursor = new ILCursor(il);
            ILLabel  label  = cursor.DefineLabel();

            if (cursor.TryGotoNext(i => i.MatchLdcI4(0), i => i.MatchStloc(29)))
            {
                cursor.Index += 2;

                cursor.Emit(OpCodes.Ldarg, 0);
                cursor.Emit(OpCodes.Ldloc, 26);

                ;
                cursor.EmitDelegate <Func <Player, int, ValueTuple <int, bool> > >((player, index) =>
                {
                    bool foundBait = false;
                    int baitType   = 0;

                    foreach (Item item in player.inventory.OfType <FishingBelt>().SelectMany(belt => belt.Handler.Items))
                    {
                        if (item.stack > 0 && item.bait > 0)
                        {
                            bool consumeBait = false;
                            int baitPower    = 1 + item.bait / 5;

                            if (baitPower < 1)
                            {
                                baitPower = 1;
                            }
                            if (player.accTackleBox)
                            {
                                baitPower++;
                            }
                            if (Main.rand.Next(baitPower) == 0)
                            {
                                consumeBait = true;
                            }
                            if (Main.projectile[index].localAI[1] < 0f)
                            {
                                consumeBait = true;
                            }

                            if (Main.projectile[index].localAI[1] > 0f)
                            {
                                Item fish = new Item();
                                fish.SetDefaults((int)Main.projectile[index].localAI[1]);
                                if (fish.rare < 0)
                                {
                                    consumeBait = false;
                                }
                            }

                            if (consumeBait)
                            {
                                baitType = item.type;
                                if (ItemLoader.ConsumeItem(item, player))
                                {
                                    item.stack--;
                                }
                                if (item.stack <= 0)
                                {
                                    item.SetDefaults();
                                }
                            }

                            foundBait = true;
                            break;
                        }
                    }

                    return(baitType, foundBait);
                });

                cursor.Emit(OpCodes.Stloc, tupleIndex);

                cursor.Emit(OpCodes.Ldloc, tupleIndex);
                cursor.Emit(OpCodes.Ldfld, type.GetField("Item1", BaseLibrary.Utility.defaultFlags));
                cursor.Emit(OpCodes.Stloc, 29);

                cursor.Emit(OpCodes.Ldloc, tupleIndex);
                cursor.Emit(OpCodes.Ldfld, type.GetField("Item2", BaseLibrary.Utility.defaultFlags));
                cursor.Emit(OpCodes.Stloc, 28);

                cursor.Emit(OpCodes.Ldloc, 28);
                cursor.Emit(OpCodes.Brtrue, label);
            }

            if (cursor.TryGotoNext(i => i.MatchLdloc(28), i => i.MatchBrfalse(out _)))
            {
                cursor.MarkLabel(label);
            }
        }