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); } }); } }
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); } }
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); } }
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); } }
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); } }