//Mimics ItemDropRule.ExpertGetsRerolls but with custom % instead of #rerolls //Wrapper for other rules ontop internal static void NPCExpertGetsRerolls(NPCLoot npcLoot, int itemId, int chanceDenominator = 1, int minimumDropped = 1, int maximumDropped = 1, int chanceNumerator = 1, IItemDropRule ruleExpert = null, IItemDropRule ruleNormal = null, float rerollChance = 0.5f) { //Since the conditions are exclusive, only one of them will show up IItemDropRule expertRule = new LeadingConditionRule(new Conditions.IsExpert()); IItemDropRule ruleToAdd = expertRule; if (ruleExpert != null) { ruleToAdd = ruleExpert; //If a rule is specified, use that to add it (Always add the "baseline" rule first) expertRule = ruleToAdd.OnSuccess(expertRule); } expertRule.OnSuccess(new CommonDropWithReroll(itemId, chanceDenominator, minimumDropped, maximumDropped, chanceNumerator, rerollChance)); npcLoot.Add(ruleToAdd); //Vanilla example //Conditions.IsPumpkinMoon condition2 = new Conditions.IsPumpkinMoon(); //Conditions.FromCertainWaveAndAbove condition3 = new Conditions.FromCertainWaveAndAbove(15); //LeadingConditionRule entry = new LeadingConditionRule(condition2); //LeadingConditionRule ruleToChain = new LeadingConditionRule(condition3); //npcLoot.Add(entry).OnSuccess(ruleToChain).OnSuccess(ItemDropRule.Common(1856)); IItemDropRule notExpertRule = new LeadingConditionRule(new Conditions.NotExpert()); ruleToAdd = notExpertRule; if (ruleNormal != null) { ruleToAdd = ruleNormal; notExpertRule = ruleToAdd.OnSuccess(notExpertRule); } notExpertRule.OnSuccess(new CommonDrop(itemId, chanceDenominator, minimumDropped, maximumDropped, chanceNumerator)); npcLoot.Add(ruleToAdd); }
public static void EModeDrop(NPCLoot npcLoot, IItemDropRule rule) { EModeDropCondition dropCondition = new EModeDropCondition(); IItemDropRule conditionalRule = new LeadingConditionRule(dropCondition); conditionalRule.OnSuccess(rule); npcLoot.Add(conditionalRule); }
public static bool LockEarlyBirdDrop(NPCLoot npcLoot, IItemDropRule rule) { EModeEarlyBirdLockDropCondition lockCondition = new EModeEarlyBirdLockDropCondition(); IItemDropRule conditionalRule = new LeadingConditionRule(lockCondition); conditionalRule.OnSuccess(rule); npcLoot.Add(conditionalRule); return(true); }
public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot) { base.ModifyNPCLoot(npc, npcLoot); LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition()); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <GalacticGlobe>())); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.LunarOre, 150)); npcLoot.Add(emodeRule); }
public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot) { base.ModifyNPCLoot(npc, npcLoot); LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition()); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <PrecisionSeal>())); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.HallowedFishingCrateHard, 5)); npcLoot.Add(emodeRule); }
public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot) { base.ModifyNPCLoot(npc, npcLoot); LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition()); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <NecromanticBrew>())); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.DungeonFishingCrate, 5)); npcLoot.Add(emodeRule); }
public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot) { base.ModifyNPCLoot(npc, npcLoot); LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition()); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <BetsysHeart>())); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.GoldenCrateHard, 5)); npcLoot.Add(emodeRule); }
public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot) { base.ModifyNPCLoot(npc, npcLoot); LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition()); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <Deerclawps>())); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <DeerSinew>())); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.FrozenCrate, 5)); npcLoot.Add(emodeRule); }
public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot) { base.ModifyNPCLoot(npc, npcLoot); LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition()); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <QueenStinger>())); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.JungleFishingCrate, 5)); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.HerbBag, 5)); npcLoot.Add(emodeRule); }
public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot) { base.ModifyNPCLoot(npc, npcLoot); LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition()); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <SlimyShield>())); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.WoodenCrate, 5)); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.LifeCrystal, 3)); npcLoot.Add(emodeRule); }
public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot) { base.ModifyNPCLoot(npc, npcLoot); LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition()); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <AgitatingLens>())); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.IronCrate, 5)); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.FallenStar, 5)); npcLoot.Add(emodeRule); }
public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot) { base.ModifyNPCLoot(npc, npcLoot); LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition()); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <MagicalBulb>())); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.JungleFishingCrateHard, 5)); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.LifeFruit, 3)); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.ChlorophyteOre, 200)); npcLoot.Add(emodeRule); }
//ModifyNPCLoot uses a unique system called the ItemDropDatabase, which has many different rules for many different drop use cases. //Here we go through all of them, and how they can be used. //There are tons of other examples in vanilla! In a decompiled vanilla build, GameContent/ItemDropRules/ItemDropDatabase adds item drops to every single vanilla NPC, which can be a good resource. public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot) { if (!NPCID.Sets.CountsAsCritter[npc.type]) //If npc is not a critter { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <ExampleItem>(), 1)); //Make it drop ExampleItem. // ItemDropRule.Common is what you would use in most cases, it simply drops the item with a chance specified. // The dropsOutOfY int is used for the numerator of the fractional chance of dropping this item. // Likewise, the dropsXOutOfY int is used for the denominator. // For example, if you had a dropsOutOfY as 7 and a dropsXOutOfY as 2, then the chance the item would drop is 2/7 or about 28%. } // We will now use the Guide to explain many of the other types of drop rules. if (npc.type == NPCID.Guide) { // RemoveWhere will remove any drop rule that matches the provided expression. // To make your own expressions to remove vanilla drop rules, you'll usually have to study the original source code that adds those rules. npcLoot.RemoveWhere( // The following expression returns true if the following conditions are met: rule => rule is ItemDropWithConditionRule drop && // If the rule is an ItemDropWithConditionRule instance drop.itemId == ItemID.GreenCap && // And that instance drops a green cap drop.condition is Conditions.NamedNPC npcNameCondition && // ..And if its condition is that an npc name must match some string npcNameCondition.neededName == "Andrew" // And the condition's string is "Andrew". ); npcLoot.Add(ItemDropRule.Common(ItemID.GreenCap, 1)); //In conjunction with the above removal, this makes it so a guide with any name will drop the Green Cap. } if (npc.type == NPCID.Crimera || npc.type == NPCID.Corruptor) { //Here we make use of our own special rule we created: drop during daytime ExampleDropCondition exampleDropCondition = new ExampleDropCondition(); IItemDropRule conditionalRule = new LeadingConditionRule(exampleDropCondition); int itemType = ItemID.Vertebrae; if (npc.type == NPCID.Crimera) { itemType = ItemID.RottenChunk; } //33% chance to drop other corresponding item in addition IItemDropRule rule = ItemDropRule.Common(itemType, chanceDenominator: 3); //Apply our item drop rule to the conditional rule conditionalRule.OnSuccess(rule); //Add the rule npcLoot.Add(conditionalRule); //It will result in the drop being shown in the bestiary, but only drop if the condition is true. } //TODO: Add the rest of the vanilla drop rules!! }
public override void ModifyNPCLoot(NPCLoot npcLoot) { npcLoot.Add(ItemDropRule.BossBag(ModContent.ItemType <TrojanSquirrelBag>())); npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <TrojanSquirrelTrophy>(), 10)); LeadingConditionRule rule = new LeadingConditionRule(new Conditions.NotExpert()); rule.OnSuccess(ItemDropRule.OneFromOptions(1, ModContent.ItemType <TreeSword>(), ModContent.ItemType <MountedAcornGun>(), ModContent.ItemType <SnowballStaff>(), ModContent.ItemType <KamikazeSquirrelStaff>())); rule.OnSuccess(ItemDropRule.Common(ItemID.WoodenCrate, 1, 1, 5)); rule.OnSuccess(ItemDropRule.Common(ItemID.HerbBag, 1, 1, 5)); rule.OnSuccess(ItemDropRule.Common(ItemID.Acorn, 1, 100, 100)); rule.OnSuccess(ItemDropRule.Common(ModContent.Find <ModItem>("Fargowiltas", "LumberJaxe").Type, 10)); npcLoot.Add(rule); }
public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot) { base.ModifyNPCLoot(npc, npcLoot); LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition()); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <GuttedHeart>())); emodeRule.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.CrimsonFishingCrate, 5)); //to make up for no loot until dead emodeRule.OnSuccess(ItemDropRule.Common(ItemID.TissueSample, 1, 60, 60)); emodeRule.OnSuccess(ItemDropRule.Common(ItemID.CrimtaneOre, 1, 200, 200)); npcLoot.Add(emodeRule); }
public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot) { base.ModifyNPCLoot(npc, npcLoot); LeadingConditionRule emodeRule = new LeadingConditionRule(new EModeDropCondition()); LeadingConditionRule lastEater = new LeadingConditionRule(new Conditions.LegacyHack_IsABoss()); emodeRule.OnSuccess(lastEater); lastEater.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ModContent.ItemType <DarkenedHeart>())); lastEater.OnSuccess(FargoSoulsUtil.BossBagDropCustom(ItemID.CorruptFishingCrate, 5)); //to make up for no loot until dead lastEater.OnSuccess(ItemDropRule.Common(ItemID.ShadowScale, 1, 60, 60)); lastEater.OnSuccess(ItemDropRule.Common(ItemID.DemoniteOre, 1, 200, 200)); npcLoot.Add(emodeRule); }
internal static void GlobalExpertGetsRerolls(GlobalLoot globalLoot, int itemId, int chanceDenominator = 1, int minimumDropped = 1, int maximumDropped = 1, int chanceNumerator = 1, IItemDropRule ruleExpert = null, IItemDropRule ruleNormal = null) { IItemDropRule expertRule = new LeadingConditionRule(new Conditions.IsExpert()); IItemDropRule ruleToAdd = expertRule; if (ruleExpert != null) { ruleToAdd = ruleExpert; //If a rule is specified, use that to add it (Always add the "baseline" rule first) expertRule = ruleToAdd.OnSuccess(expertRule); } expertRule.OnSuccess(new CommonDropWithReroll(itemId, chanceDenominator, minimumDropped, maximumDropped, chanceNumerator)); globalLoot.Add(ruleToAdd); IItemDropRule notExpertRule = new LeadingConditionRule(new Conditions.NotExpert()); ruleToAdd = notExpertRule; if (ruleNormal != null) { ruleToAdd = ruleNormal; notExpertRule = ruleToAdd.OnSuccess(notExpertRule); } notExpertRule.OnSuccess(new CommonDrop(itemId, chanceDenominator, minimumDropped, maximumDropped, chanceNumerator)); globalLoot.Add(ruleToAdd); }
public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot) { IItemDropRule BossDrop(int item) { return(new DropBasedOnEMode(ItemDropRule.Common(item, 3), ItemDropRule.Common(item, 10))); } switch (npc.type) { case NPCID.KingSlime: npcLoot.Add(BossDrop(ModContent.ItemType <SlimeKingsSlasher>())); break; case NPCID.EyeofCthulhu: npcLoot.Add(BossDrop(ModContent.ItemType <LeashOfCthulhu>())); break; case NPCID.EaterofWorldsHead: case NPCID.EaterofWorldsBody: case NPCID.EaterofWorldsTail: { LeadingConditionRule lastEater = new LeadingConditionRule(new Conditions.LegacyHack_IsABoss()); lastEater.OnSuccess(BossDrop(ModContent.ItemType <EaterStaff>())); npcLoot.Add(lastEater); } break; case NPCID.BrainofCthulhu: npcLoot.Add(BossDrop(ModContent.ItemType <BrainStaff>())); break; case NPCID.QueenBee: npcLoot.Add(BossDrop(ModContent.ItemType <TheSmallSting>())); break; case NPCID.SkeletronHead: npcLoot.Add(BossDrop(ModContent.ItemType <BoneZone>())); //npcLoot.Add(BossDrop(ModContent.ItemType<BrittleBone>(), 200)); break; case NPCID.WallofFlesh: npcLoot.Add(BossDrop(ModContent.ItemType <FleshHand>())); break; case NPCID.TheDestroyer: npcLoot.Add(BossDrop(ModContent.ItemType <DestroyerGun>())); break; case NPCID.SkeletronPrime: npcLoot.Add(BossDrop(ModContent.ItemType <RefractorBlaster>())); break; case NPCID.Retinazer: case NPCID.Spazmatism: { LeadingConditionRule noTwin = new LeadingConditionRule(new Conditions.MissingTwin()); noTwin.OnSuccess(BossDrop(ModContent.ItemType <TwinRangs>())); npcLoot.Add(noTwin); } break; case NPCID.Plantera: npcLoot.Add(BossDrop(ModContent.ItemType <Dicer>())); break; case NPCID.Golem: npcLoot.Add(BossDrop(ModContent.ItemType <RockSlide>())); break; case NPCID.DukeFishron: npcLoot.Add(BossDrop(ModContent.ItemType <FishStick>())); break; case NPCID.DD2Betsy: npcLoot.Add(BossDrop(ModContent.ItemType <DragonBreath>())); break; case NPCID.BigMimicJungle: npcLoot.Add(ItemDropRule.OneFromOptions(1, ModContent.ItemType <Vineslinger>(), ModContent.ItemType <Mahoguny>(), ModContent.ItemType <OvergrownKey>())); break; default: break; } //if (Fargowiltas.Instance.CalamityLoaded && Revengeance && FargoSoulsWorld.EternityMode && Main.bloodMoon && Main.moonPhase == 0 && Main.raining && Main.rand.NextBool(10)) //{ // Mod calamity = ModLoader.GetMod("CalamityMod"); // if (npc.type == calamity.NPCType("DevourerofGodsHeadS")) // { // Item.NewItem(npc.Hitbox, calamity.ItemType("CosmicPlushie")); // } //} }
public override void ModifyNPCLoot(NPC npc, NPCLoot npcLoot) { //HOW TO SEE DROP RATES IN THE BESTIARY: /* * 1. Get the "GamerMod (Debug Tools)" mod * 2. Enter a world, type "/bestiary" in chat * 3. If it says "done?", leave the world (so that the 100% progress saves on that world) * 4. ??? * 5. profit (check bestiary for drops) * * You need to do this for every world you are using (ideally a normal and an expert world) * You only have to do this once or when new NPCs get added. New drops to existing NPCs do not need redoing the steps */ //This method is called once when the game loads (per NPC), so you can't make dynamic checks based on world state like "npc.value > 0f" here if (npc.type == NPCID.GoblinSorcerer) { //20 is the chanceDenominator argument, meaning its a 1/20 roll aka old Main.rand.NextBool(20) npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <ShadowyClicker>(), 20)); } else if (npc.type == NPCID.Frankenstein || npc.type == NPCID.SwampThing) { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <EclipticClicker>(), 25)); } else if (npc.type == NPCID.BloodZombie || npc.type == NPCID.Drippler) { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <HemoClicker>(), 25)); } else if (npc.type == NPCID.DarkCaster) { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <Milk>(), 15)); } else if (npc.type == NPCID.IceMimic) { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <AimAssistModule>(), 4)); } else if (npc.type == NPCID.Gastropod) { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <ChocolateChip>(), 20)); } else if (npc.type == NPCID.SandElemental) { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <SandstormClicker>(), 2)); } else if (npc.type == NPCID.IceGolem) { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <BlizzardClicker>(), 2)); } else if (npc.type == NPCID.PirateCaptain) { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <CaptainsClicker>(), 8)); } else if (npc.type == NPCID.PirateShip) { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <GoldenTicket>(), 4)); } else if (npc.type == NPCID.Pumpking) { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <LanternClicker>(), 10)); } else if (npc.type == NPCID.MourningWood) { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <WitchClicker>(), 10)); } else if (npc.type == NPCID.SantaNK1) { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <NaughtyClicker>(), 10)); } else if (npc.type == NPCID.IceQueen) { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <FrozenClicker>(), 10)); } else if (npc.type == NPCID.DD2DarkMageT1 || npc.type == NPCID.DD2DarkMageT3) { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <ArcaneClicker>(), 5)); } else if (npc.type == NPCID.DD2OgreT2 || npc.type == NPCID.DD2OgreT3) { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <SnottyClicker>(), 5)); } else if (npc.type == NPCID.MaggotZombie) { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <TriggerFinger>(), 18)); } else if (npc.type == NPCID.MartianSaucerCore) { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <HighTechClicker>(), 4)); } else if (npc.type == NPCID.WindyBalloon) { npcLoot.Add(ItemDropRule.Common(ModContent.ItemType <BalloonClicker>(), 10)); } else if (npc.type == NPCID.BloodNautilus) { npcLoot.Add(ItemDropRule.NormalvsExpert(ModContent.ItemType <SpiralClicker>(), 2, 1)); } else if (npc.type == NPCID.FireImp) { DropHelper.NPCExpertGetsRerolls(npcLoot, ModContent.ItemType <ImpishClicker>(), 35); } else if (npc.type == NPCID.TorchGod) { LeadingConditionRule neverDropsRule = new LeadingConditionRule(new Conditions.NeverTrue()); neverDropsRule.OnSuccess(ItemDropRule.Common(ModContent.ItemType <TorchClicker>())); npcLoot.Add(neverDropsRule); } //Here go drops for normal mode that mirror through boss bags in expert mode (see ClickerItemGlobal) Conditions.NotExpert notExpert = new Conditions.NotExpert(); if (npc.type == NPCID.MoonLordCore) { npcLoot.Add(ItemDropRule.ByCondition(notExpert, ModContent.ItemType <LordsClicker>())); npcLoot.Add(ItemDropRule.ByCondition(notExpert, ModContent.ItemType <TheClicker>(), 5)); } else if (npc.type == NPCID.TheDestroyer || npc.type == NPCID.SkeletronPrime || npc.type == NPCID.Retinazer || npc.type == NPCID.Spazmatism) { var ruleToAdd = ItemDropRule.ByCondition(notExpert, ModContent.ItemType <BottomlessBoxofPaperclips>(), 4); if (npc.type == NPCID.TheDestroyer || npc.type == NPCID.SkeletronPrime) { npcLoot.Add(ruleToAdd); } else { LeadingConditionRule missingTwinRule = new LeadingConditionRule(new Conditions.MissingTwin()); missingTwinRule.OnSuccess(ruleToAdd); npcLoot.Add(missingTwinRule); } } else if (npc.type == NPCID.DD2Betsy) { npcLoot.Add(ItemDropRule.ByCondition(notExpert, ModContent.ItemType <DraconicClicker>(), 4)); } else if (npc.type == NPCID.Deerclops) { npcLoot.Add(ItemDropRule.ByCondition(notExpert, ModContent.ItemType <CyclopsClicker>(), 4)); } else if (npc.type == NPCID.HallowBoss) { npcLoot.Add(ItemDropRule.ByCondition(notExpert, ModContent.ItemType <RainbowClicker>(), 4)); } else if (npc.type == NPCID.DukeFishron) { npcLoot.Add(ItemDropRule.ByCondition(notExpert, ModContent.ItemType <SeafoamClicker>(), 5)); } else if (npc.type == NPCID.WallofFlesh) { npcLoot.Add(ItemDropRule.ByCondition(notExpert, ModContent.ItemType <ClickerEmblem>(), 4)); } else if (npc.type == NPCID.KingSlime) { npcLoot.Add(ItemDropRule.ByCondition(notExpert, ModContent.ItemType <StickyKeychain>(), 4)); } else if (npc.type == NPCID.QueenSlimeBoss) { npcLoot.Add(ItemDropRule.ByCondition(notExpert, ModContent.ItemType <ClearKeychain>(), 4)); } else if (npc.type == NPCID.LunarTowerStardust || npc.type == NPCID.LunarTowerSolar || npc.type == NPCID.LunarTowerVortex || npc.type == NPCID.LunarTowerNebula) { int miceFragment = ModContent.ItemType <MiceFragment>(); var pNormal = default(DropOneByOne.Parameters); pNormal.ChanceDenominator = 1; pNormal.ChanceNumerator = 1; pNormal.MinimumStackPerChunkBase = 1; pNormal.MaximumStackPerChunkBase = 1; pNormal.BonusMinDropsPerChunkPerPlayer = 0; pNormal.BonusMaxDropsPerChunkPerPlayer = 0; pNormal.MinimumItemDropsCount = 3; pNormal.MaximumItemDropsCount = 15; var pExpert = pNormal; //Since DropOneByOne.Parameters is a struct, this is a copy/new assignment pExpert.MinimumItemDropsCount = 5; pExpert.MaximumItemDropsCount = 22; var normalModeRule = new DropOneByOne(miceFragment, pNormal); var expertModeRule = new DropOneByOne(miceFragment, pExpert); npcLoot.Add(new DropBasedOnExpertMode(normalModeRule, expertModeRule)); } }