public static List <TNPC> generateNPCList()
        {
            List <TNPC>          tocreate = new List <TNPC>();
            List <NPCDefinition> broken   = BrokenNPCs.getBrokenNPCs();

            for (int i = 0; i < NPCLoader.NPCCount; i++)
            {
                NPC npc = new NPC();
                npc.SetDefaults(i);
                TNPC mem = new TNPC();
                mem.Name  = new string(npc.FullName.ToCharArray().Where(c => !char.IsWhiteSpace(c)).ToArray());
                mem.ID    = npc.type;
                mem.Price = npc.lifeMax + (npc.defense * 2) + (npc.damage * damagepricemultiplier);
                if (npc.modNPC != null)
                {
                    mem.Mod = npc.modNPC.mod.ToString();
                }
                else
                {
                    mem.Mod = "Vanilla";
                }
                if (mem.Price <= 0)
                {
                    mem.Price = 99999;
                }
                NPCDefinition totest = new NPCDefinition(npc.type);
                if (!broken.Contains(totest))
                {
                    tocreate.Add(mem);
                }
            }
            return(tocreate);
        }
Exemple #2
0
 public ShopPackDefinition(NPCDefinition neededBoss, string name, int price, List <ShopPackItemDefinition> items)
 {
     this.NeededBossKill = neededBoss;
     this.Name           = name;
     this.Price          = price;
     this.Items          = items;
 }
        ////////////////

        protected override void ReceiveOnClient()
        {
            var      mymod   = RewardsMod.Instance;
            var      myworld = ModContent.GetInstance <RewardsWorld>();
            KillData data    = myworld.Logic.GetPlayerData(Main.LocalPlayer);

            if (data == null)
            {
                throw new ModHelpersException("No player data for " + Main.LocalPlayer.name);
            }

            NPC npc = new NPC();

            npc.SetDefaults(this.NpcType);
            npc.boss = this.IsBoss;

            bool  isGrind, isExpired;
            float reward = data.RecordKill(npc, out isGrind, out isExpired);

            if (mymod.SettingsConfig.DebugModeKillInfo)
            {
                int  kills     = data.KilledNpcs.ContainsKey(npc.type) ? data.KilledNpcs[npc.type] : -1;
                var  npcDef    = new NPCDefinition(npc.type);
                bool needsBoss = mymod.PointsConfig.NpcRewardRequiredAsBoss.Contains(npcDef);

                string msg = "ReceiveOnClient npc: " + npc.TypeName + " (" + npc.type + ")" + ", #: " + kills
                             + ", isGrind: " + isGrind + ", isExpired: " + isExpired + ", reward: " + reward
                             + ", needsBoss:" + needsBoss + " (is? " + npc.boss + ")";
                Main.NewText(msg);
                LogHelpers.Log(" " + msg);
            }

            data.AddRewardForPlayer(Main.LocalPlayer, isGrind, isExpired, reward);
        }
        public void RewardKill_Host(Player toPlayer, NPC npc)
        {
            var   mymod = RewardsMod.Instance;
            bool  isGrind, isExpired;
            float reward = this.CalculateKillReward(npc, out isGrind, out isExpired);

            if (mymod.SettingsConfig.DebugModeKillInfo)
            {
                int  kills     = this.KilledNpcs.ContainsKey(npc.type) ? this.KilledNpcs[npc.type] : -1;
                var  npcDef    = new NPCDefinition(npc.type);
                bool needsBoss = mymod.PointsConfig.NpcRewardRequiredAsBoss.Contains(npcDef);

                string msg = "RewardKill_SyncsFromHost to: " + toPlayer.name + ", npc: " + npc.TypeName + " (" + npc.type + ")" + ", #: " + kills
                             + ", isGrind: " + isGrind + ", reward: " + reward + ", needsBoss:" + needsBoss + " (is? " + npc.boss + ")";
                Main.NewText(msg);
                LogHelpers.Log(" " + msg);
            }

            float finalReward = this.AddRewardForPlayer(toPlayer, isGrind, isExpired, reward);

            if (Main.netMode == 2)
            {
                if (finalReward > 0)                    // <- Careful! Any uses for 0 reward packets?
                {
                    KillRewardProtocol.SendRewardToClient(toPlayer.whoAmI, -1, npc);
                }
            }
        }
Exemple #5
0
        public static bool CanEnrage(NPC npc)
        {
            var config = EnragedConfig.Instance;
            var wl     = config.Get <HashSet <NPCDefinition> >(nameof(config.NpcWhitelist));
            var def    = new NPCDefinition(npc.type);

            return(wl.Contains(def));
        }
        public override void SetupShop(int type, Chest shop, ref int nextSlot)
        {
            var           config = RuinedItemsConfig.Instance;
            NPCDefinition npcDef = config.Get <NPCDefinition>(nameof(config.MagitechScrapSoldByWhom));

            if (npcDef?.Type == type)
            {
                var scrapItem = new Item();
                scrapItem.SetDefaults(ModContent.ItemType <MagitechScrapItem>());

                shop.item[nextSlot++] = scrapItem;
            }
        }
Exemple #7
0
        public override void NPCLoot(NPC npc)
        {
            var mymod  = (StarvationMod)this.mod;
            var npcDef = new NPCDefinition(npc.type);

            if (mymod.Config.TupperwareDropsNpcIdsAndChances.ContainsKey(npcDef))
            {
                if (Main.rand.NextFloat() < mymod.Config.TupperwareDropsNpcIdsAndChances[npcDef])
                {
                    ItemHelpers.CreateItem(npc.Center, ModContent.ItemType <TupperwareItem>(), 1, TupperwareItem.Width, TupperwareItem.Height);
                }
            }
        }
Exemple #8
0
        public RewardsPointsConfig()
        {
            var wofDef      = new NPCDefinition(NPCID.WallofFlesh);
            var planteraDef = new NPCDefinition(NPCID.Plantera);
            var golemDef    = new NPCDefinition(NPCID.Golem);
            var moonlordDef = new NPCDefinition(NPCID.MoonLordCore);                //NPCID.MoonLordHead?

            this.NpcRewardsOnKill = new Dictionary <NPCDefinition, NPCKillRewardValue> {
                { new NPCDefinition(NPCID.KingSlime), new NPCKillRewardValue(10) },
                { new NPCDefinition(NPCID.EyeofCthulhu), new NPCKillRewardValue(10) },
                { new NPCDefinition(NPCID.EaterofWorldsHead), new NPCKillRewardValue(25) },
                { new NPCDefinition(NPCID.BrainofCthulhu), new NPCKillRewardValue(25) },
                { new NPCDefinition(NPCID.QueenBee), new NPCKillRewardValue(20) },
                { new NPCDefinition(NPCID.SkeletronHead), new NPCKillRewardValue(30) },
                { new NPCDefinition(NPCID.WallofFlesh), new NPCKillRewardValue(50) },
                { new NPCDefinition(NPCID.TheDestroyer), new NPCKillRewardValue(50) },
                { new NPCDefinition(NPCID.Retinazer), new NPCKillRewardValue(50 / 2) },
                { new NPCDefinition(NPCID.Spazmatism), new NPCKillRewardValue(50 / 2) },
                { new NPCDefinition(NPCID.SkeletronPrime), new NPCKillRewardValue(50) },
                { new NPCDefinition(NPCID.Plantera), new NPCKillRewardValue(100) },
                { new NPCDefinition(NPCID.Golem), new NPCKillRewardValue(100) },
                { new NPCDefinition(NPCID.DukeFishron), new NPCKillRewardValue(100) },
                { new NPCDefinition(NPCID.CultistBoss), new NPCKillRewardValue(50) },
                { new NPCDefinition(NPCID.DD2Betsy), new NPCKillRewardValue(100) },
                { new NPCDefinition(NPCID.LunarTowerSolar), new NPCKillRewardValue(35) },
                { new NPCDefinition(NPCID.LunarTowerVortex), new NPCKillRewardValue(35) },
                { new NPCDefinition(NPCID.LunarTowerNebula), new NPCKillRewardValue(35) },
                { new NPCDefinition(NPCID.LunarTowerStardust), new NPCKillRewardValue(35) },
                { moonlordDef, new NPCKillRewardValue(250) }
            };

            this.NpcRewardRequiredAsBoss = new HashSet <NPCDefinition> {
                new NPCDefinition(NPCID.EaterofWorldsHead)
            };

            this.NpcRewardNotGivenAfterNpcKilled = new Dictionary <NPCDefinition, NPCDefinition> {
                { new NPCDefinition(NPCID.KingSlime), wofDef },
                { new NPCDefinition(NPCID.EyeofCthulhu), wofDef },
                { new NPCDefinition(NPCID.EaterofWorldsHead), wofDef },
                { new NPCDefinition(NPCID.BrainofCthulhu), wofDef },
                { new NPCDefinition(NPCID.QueenBee), wofDef },
                { new NPCDefinition(NPCID.SkeletronHead), wofDef },
                { new NPCDefinition(NPCID.WallofFlesh), planteraDef },
                { new NPCDefinition(NPCID.TheDestroyer), golemDef },
                { new NPCDefinition(NPCID.Retinazer), golemDef },
                { new NPCDefinition(NPCID.Spazmatism), golemDef },
                { new NPCDefinition(NPCID.SkeletronPrime), golemDef },
                { new NPCDefinition(NPCID.Plantera), moonlordDef },
                { new NPCDefinition(NPCID.Golem), moonlordDef }
            };
        }
        private int CalculateNpcKillReward(NPC npc, ref bool isGrind, ref bool isExpired)
        {
            var  mymod     = RewardsMod.Instance;
            var  npcDef    = new NPCDefinition(npc.type);
            int  points    = 0;
            bool needsBoss = mymod.PointsConfig.NpcRewardRequiredAsBoss.Contains(npcDef);
            bool canReward = !needsBoss || (needsBoss && npc.boss);

            isGrind   = false;
            isExpired = false;

            if (mymod.PointsConfig.NpcRewardsOnKill.ContainsKey(npcDef))
            {
                if (canReward)
                {
                    points = mymod.PointsConfig.NpcRewardsOnKill[npcDef].PP;
                }
            }

            if (mymod.PointsConfig.NpcRewardNotGivenAfterNpcKilled.ContainsKey(npcDef))
            {
                NPCDefinition blockingNpcDef  = mymod.PointsConfig.NpcRewardNotGivenAfterNpcKilled[npcDef];
                int           blockingNpcType = blockingNpcDef.Type;

                if (this.KilledNpcs.ContainsKey(blockingNpcType) && this.KilledNpcs[blockingNpcType] > 0)
                {
                    isExpired = true;
                }
            }

            if (this.KilledNpcs.ContainsKey(npc.type) && this.KilledNpcs[npc.type] > 0)
            {
                isGrind = canReward;
            }
            else
            {
                /*if( mymod.Config.NpcRewardPrediction ) {
                 *      Mod boss_list_mod = ModLoader.GetMod( "BossChecklist" );
                 *      if( boss_list_mod != null && boss_list_mod.Version >= new Version(0, 1, 5, 3) ) {
                 *              var boss_info = (Tuple<float, int, bool>)boss_list_mod.Call( "GetBossState", name );
                 *
                 *              if( boss_info != null && boss_info.Item2 == 0 ) {
                 *                      points = this.EstimateKillReward( mymod, npc, boss_info.Item1 );
                 *              }
                 *      }
                 * }*/
            }

            return(points);
        }
Exemple #10
0
        public static void SetNpcLootBlacklistEntry(NPCDefinition npcDef, bool localOnly)
        {
            if (!LoadLibraries.IsWorldLoaded())
            {
                throw new ModLibsException("World not loaded");
            }

            var myworld = ModContent.GetInstance <NihilismWorld>();

            myworld.Logic.DataAccess.SetNpcLootBlacklistEntry(npcDef);

            if (!localOnly)
            {
                myworld.Logic.SyncDataChanges();
            }
        }
Exemple #11
0
		public void SelectNPC(int index, bool update_rotation = false, bool force = false)
		{
			NPCDefinition item = NPCDefinition.GetNPC(index);
			properties.SelectedObject = item;
			name_label.Text = item.Name + " (" + item.ID + ")";

			if (force || last_npc != index)
			{
				model_viewer.SelectedModel = item.GetModel(0, 0, null);

			}
			else
			{
				model_viewer.SetModel(item.GetModel(0, 0, null), false);
			}
			last_npc = index;
		}
        public static EntityDefinition GetEntDef(HologramMode mode, string rawDef)
        {
            switch (mode)
            {
            case HologramMode.NPC:
                return(NPCDefinition.FromString(rawDef));

            case HologramMode.Item:
                return(ItemDefinition.FromString(rawDef));

            case HologramMode.Projectile:
                return(ProjectileDefinition.FromString(rawDef));

            default:
                throw new NotImplementedException("No such mode..");
            }
        }
        ////

        private bool AutoInitializeElementOfSpecificNPC(NPC npc)
        {
            var config = ElementsConfig.Instance;
            var npcDef = new NPCDefinition(npc.type);

            if (!config.AutoAssignedAnyNPC.ContainsKey(npcDef))
            {
                return(false);
            }

            ElementDefinition elemDef = ElementDefinition.PickDefinitionForNPC(config.AutoAssignedAnyNPC[npcDef]);

            if (elemDef != null)
            {
                this.Elements.Add(elemDef);
            }

            return(true);
        }
        ////////////////

        public float RecordKill(NPC npc, out bool isGrind, out bool isExpired)
        {
            var   mymod  = RewardsMod.Instance;
            float reward = this.CalculateKillReward(npc, out isGrind, out isExpired);

            var  npcDef    = new NPCDefinition(npc.type);
            bool needsBoss = mymod.PointsConfig.NpcRewardRequiredAsBoss.Contains(npcDef);
            bool canReward = !needsBoss || (needsBoss && npc.boss);

            if (canReward)
            {
                if (this.KilledNpcs.ContainsKey(npc.type))
                {
                    this.KilledNpcs[npc.type]++;
                }
                else
                {
                    this.KilledNpcs[npc.type] = 1;
                }
            }

            return(reward);
        }
Exemple #15
0
        ////////////////

        public StarvationConfig()
        {
            this.TupperwareSellsFromMerchantByNpc = new NPCDefinition(NPCID.SkeletonMerchant);

            this.PerItemWellFedTickDurations[new ItemDefinition(ItemID.CookedMarshmallow)] = new IntTickSetting {
                Ticks = 5 * 60 * 60
            };                                                                                                                                          // 5 minutes
            this.PerItemWellFedTickDurations[new ItemDefinition(ItemID.BowlofSoup)] = new IntTickSetting {
                Ticks = 45 * 60 * 60
            };                                                                                                                                                          // 45 minutes
            this.PerItemWellFedTickDurations[new ItemDefinition(ItemID.PumpkinPie)] = new IntTickSetting {
                Ticks = 25 * 60 * 60
            };                                                                                                                                                          // 25 minutes
            this.PerItemWellFedTickDurations[new ItemDefinition(ItemID.CookedFish)] = new IntTickSetting {
                Ticks = 15 * 60 * 60
            };                                                                                                                                                          // 15 minutes
            this.PerItemWellFedTickDurations[new ItemDefinition(ItemID.CookedShrimp)] = new IntTickSetting {
                Ticks = 15 * 60 * 60
            };                                                                                                                                                  // 15 minutes
            this.PerItemWellFedTickDurations[new ItemDefinition(ItemID.Sashimi)] = new IntTickSetting {
                Ticks = 15 * 60 * 60
            };                                                                                                                                                  // 15 minutes
            this.PerItemWellFedTickDurations[new ItemDefinition(ItemID.GrubSoup)] = new IntTickSetting {
                Ticks = 120 * 60 * 60
            };                                                                                                                                                  // 120 minutes
            this.PerItemWellFedTickDurations[new ItemDefinition(ItemID.GingerbreadCookie)] = new IntTickSetting {
                Ticks = 5 * 60 * 60
            };                                                                                                                                          // 5 minutes
            this.PerItemWellFedTickDurations[new ItemDefinition(ItemID.SugarCookie)] = new IntTickSetting {
                Ticks = 5 * 60 * 60
            };                                                                                                                                                          // 5 minutes
            this.PerItemWellFedTickDurations[new ItemDefinition(ItemID.ChristmasPudding)] = new IntTickSetting {
                Ticks = 5 * 60 * 60
            };                                                                                                                                          // 5 minutes

            this.TupperwareDropsNpcIdsAndChances[new NPCDefinition(NPCID.Skeleton)] = 0.35f;
        }
Exemple #16
0
 public void UnsetNpcLootWhitelistEntry(NPCDefinition npcDef)
 {
     this.Filters.NpcLootWhitelist.Remove(npcDef);
 }
Exemple #17
0
 public void UnsetNpcLootBlacklist2Entry(NPCDefinition npcDef)
 {
     this.Filters.NpcLootBlacklist2.Remove(npcDef);
 }
 public void SetNpcBlacklistEntry(NPCDefinition npcDef)
 {
     this.Filters.NpcBlacklist.Add(npcDef);
 }
Exemple #19
0
        public static void BuyNPCCommand(Viewer viewer, int NPCType, int count)
        {
            if (count > 100)
            {
                //just to prevent... a lot of things.
                count = 100;
            }
            NPC npc = new NPC();

            npc.SetDefaults(NPCType);
            double        cost = 0;
            NPCDefinition test = new NPCDefinition(NPCType);

            if (TConfig.whitelistmodeNPC && !TConfig.BannedNPC.Contains(test) || !TConfig.whitelistmodeNPC && TConfig.BannedNPC.Contains(test) || TConfig.disableNPC || TConfig.disablebosses && npc.boss || TConfig.disabletownies && npc.townNPC)
            {
                return;
            }

            cost = twitchtestmod.GetNPCprice(npc.type) * count;

            if (Calls.removecoins(viewer, Convert.ToDouble(cost)))
            {
                //if multiplayerclient, we can't spawn it ourselfes. so give it to the server.
                if (Main.netMode == NetmodeID.MultiplayerClient)
                {
                    MainNetworking.NPCAddToQueue(NPCType, count, viewer.Name);
                    Calls.sendmessage("@" + viewer.Name + " Your " + count + " " + npc.FullName + "(s) will be spawned");
                    return;
                }

                if (npc.townNPC)
                {
                    for (int i = 0; i < Main.npc.Length; i++)
                    {
                        NPC anpc = Main.npc[i];
                        if (npc.type == anpc.type)
                        {
                            npc.Teleport(Main.player[Main.myPlayer].position, 1);
                            return;
                        }
                    }
                }

                Random xrandomizer = new Random();
                int    posx        = (int)Main.player[Main.myPlayer].position.X;
                int    posy        = (int)Main.player[Main.myPlayer].position.Y;
                if (posy < 700)
                {
                    posy = posy + 700;
                }
                else
                {
                    posy = posy - 400;
                }

                for (int i = 0; i < count; i++)
                {
                    posx = (int)Main.player[Main.myPlayer].position.X;
                    posx = posx + xrandomizer.Next(-800, 800);
                    if (posx < 0)
                    {
                        posx = 0;
                    }
                    //NPC.NewNPC(posx, posy, NPCType);
                    //Main.npc[NPC.NewNPC(posx, posy, NPCType)].netUpdate = true;
                    NPC.NewNPC(posx, posy, NPCType);
                }
                if (TConfig.ChatBuyAlert)
                {
                    Main.NewText(viewer.Name + " has bought " + count + " " + npc.FullName, Color.Red);
                }
                Calls.sendmessage("@" + viewer.Name + " Your " + count + " " + npc.FullName + "(s) have/has been spawned");
            }
            else
            {
                Calls.sendmessage("@" + viewer.Name + " you don't have enough Coins for this NPC - it costs " + cost);
            }
        }
 public void SetNpcLootWhitelistEntry(NPCDefinition npcDef)
 {
     this.Filters.NpcLootWhitelist.Add(npcDef);
 }
 public void SetNpcLootBlacklist2Entry(NPCDefinition npcDef)
 {
     this.Filters.NpcLootBlacklist2.Add(npcDef);
 }
        public RewardsShopConfig()
        {
            var wofDef      = new NPCDefinition(NPCID.WallofFlesh);
            var planteraDef = new NPCDefinition(NPCID.Plantera);
            var golemDef    = new NPCDefinition(NPCID.Golem);
            var moonlordDef = new NPCDefinition(NPCID.MoonLordCore);                //NPCID.MoonLordHead?

            this.ShopLoadout = new List <ShopPackDefinition> {
                new ShopPackDefinition(null, "Iron Age Pack", 5, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.IronBar), 99)
                }),
                new ShopPackDefinition(null, "Money Purse", 10, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.GoldCoin), 99)
                }),
                new ShopPackDefinition(null, "Nature Watcher's Pack", 10, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.FlowerBoots), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.Binoculars), 1)
                }),
                new ShopPackDefinition(null, "Bindings Pack", 10, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.BandofRegeneration), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.BandofStarpower), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.CelestialMagnet), 1)
                }),
                new ShopPackDefinition(null, "Traveler's Pack", 25, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.Aglet), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.IceSkates), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.TigerClimbingGear), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.WaterWalkingBoots), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.HandWarmer), 1)
                }),
                new ShopPackDefinition(null, "Rough Traveler's Pack", 25, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.AnkletoftheWind), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.FeralClaws), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.JellyfishDivingGear), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.LavaCharm), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.MagmaStone), 1)
                }),
                new ShopPackDefinition(null, "Ground Hater's Pack", 25, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.SandstorminaBottle), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.ShinyRedBalloon), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.LuckyHorseshoe), 1)
                }),
                new ShopPackDefinition(null, "Stoicist's Pack", 20, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.CobaltShield), 1)
                }),
                new ShopPackDefinition(null, "Alucard's Pack", 35, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.Arkhalis), 1)
                }),
                new ShopPackDefinition(null, "Gizmo Pack", 25, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.Toolbox), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.ArchitectGizmoPack), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.ActuationAccessory), 1)
                }),
                new ShopPackDefinition(null, "Information Monger's Pack", 25, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.GPS), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.GoblinTech), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.REK), 1)
                }),
                new ShopPackDefinition(null, "Fisherman's Pack", 50, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.AnglerTackleBag), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.FishFinder), 1)
                }),

                // Hard mode only:
                new ShopPackDefinition(wofDef, "Mimic's Lament Pack", 35, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.MagicDagger), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.TitanGlove), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.PhilosophersStone), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.CrossNecklace), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.StarCloak), 1)
                }),
                new ShopPackDefinition(wofDef, "Gangster's Pack", 35, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.Uzi), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.RifleScope), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.EndlessMusketPouch), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.GangstaHat), 1)
                }),
                new ShopPackDefinition(wofDef, "Avenger Pack", 25, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.AvengerEmblem), 1)
                }),
                new ShopPackDefinition(wofDef, "Life Pack", 150, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.AnkhCharm), 1)
                }),
                new ShopPackDefinition(wofDef, "Lucky Pack", 150, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.CoinRing), 1)
                }),
                new ShopPackDefinition(wofDef, "Dimensionalist's Pack", 200, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.RodofDiscord), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.TeleportationPotion), 30)
                }),

                // Post-plantera:
                new ShopPackDefinition(planteraDef, "Whack Pack", 50, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.TheAxe), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.Bananarang), 10),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.SlapHand), 1)
                }),

                // Post-golem:
                new ShopPackDefinition(golemDef, "Golem Eye Pack", 25, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.EyeoftheGolem), 1)
                }),
                new ShopPackDefinition(golemDef, "Defender's Pack", 150, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.CelestialShell), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.PaladinsShield), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.FrozenTurtleShell), 1)
                }),

                // Post-moonlord:
                new ShopPackDefinition(moonlordDef, "Eldritch Pack", 500, new List <ShopPackItemDefinition> {
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.Meowmere), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.Terrarian), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.StarWrath), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.SDMG), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.FireworksLauncher), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.LastPrism), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.LunarFlareBook), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.RainbowCrystalStaff), 1),
                    new ShopPackItemDefinition(new ItemDefinition(ItemID.MoonlordTurretStaff), 1)
                })
            };
        }