//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); }
private void ResolveRuleChains( IItemDropRule rule, DropAttemptInfo info, ItemDropAttemptResult parentResult) { this.ResolveRuleChains(ref info, ref parentResult, rule.ChainedRules); }
public static IItemDropRule OnFailedConditions( this IItemDropRule rule, IItemDropRule ruleToChain, bool hideLootReport = false) { rule.ChainedRules.Add((IItemDropRuleChainAttempt) new Chains.TryIfDoesntFillConditions(ruleToChain, hideLootReport)); return(ruleToChain); }
public static IItemDropRule OnSuccess( this IItemDropRule rule, IItemDropRule ruleToChain, bool hideLootReport = false) { rule.ChainedRules.Add((IItemDropRuleChainAttempt) new Chains.TryIfSucceeded(ruleToChain, hideLootReport)); return(ruleToChain); }
public static IItemDropRule OnFailedRoll( this IItemDropRule rule, IItemDropRule ruleToChain, bool hideLootReport = false) { rule.ChainedRules.Add((IItemDropRuleChainAttempt) new Chains.TryIfFailedRandomRoll(ruleToChain, hideLootReport)); return(ruleToChain); }
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); }
//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!! }
private ItemDropAttemptResult ResolveRule(IItemDropRule rule, DropAttemptInfo info) { if (!rule.CanDrop(info)) { ItemDropAttemptResult itemDropAttemptResult = default(ItemDropAttemptResult); itemDropAttemptResult.State = ItemDropAttemptResultState.DoesntFillConditions; ItemDropAttemptResult itemDropAttemptResult2 = itemDropAttemptResult; ResolveRuleChains(rule, info, itemDropAttemptResult2); return(itemDropAttemptResult2); } ItemDropAttemptResult itemDropAttemptResult3 = (rule as INestedItemDropRule)?.TryDroppingItem(info, ResolveRule) ?? rule.TryDroppingItem(info); ResolveRuleChains(rule, info, itemDropAttemptResult3); return(itemDropAttemptResult3); }
private ItemDropAttemptResult ResolveRule( IItemDropRule rule, DropAttemptInfo info) { if (!rule.CanDrop(info)) { ItemDropAttemptResult parentResult = new ItemDropAttemptResult() { State = ItemDropAttemptResultState.DoesntFillConditions }; this.ResolveRuleChains(rule, info, parentResult); return(parentResult); } ItemDropAttemptResult parentResult1 = !(rule is INestedItemDropRule nestedItemDropRule) ? rule.TryDroppingItem(info) : nestedItemDropRule.TryDroppingItem(info, new ItemDropRuleResolveAction(this.ResolveRule)); this.ResolveRuleChains(rule, info, parentResult1); return(parentResult1); }
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 IItemDropRule Remove(IItemDropRule entry) => itemDropDatabase.RemoveFromNPC(npcType, entry);
public IItemDropRule Add(IItemDropRule entry) => itemDropDatabase.RegisterToNPC(npcType, entry);
public TryIfFailedRandomRoll(IItemDropRule rule, bool hideLootReport = false) { this.RuleToChain = rule; this._hideLootReport = hideLootReport; }
public TryIfSucceeded(IItemDropRule rule, bool hideLootReport = false) { this.RuleToChain = rule; this._hideLootReport = hideLootReport; }
public TryIfDoesntFillConditions(IItemDropRule rule, bool hideLootReport = false) { this.RuleToChain = rule; this._hideLootReport = hideLootReport; }
public IItemDropRule Add(IItemDropRule entry) => itemDropDatabase.RegisterToGlobal(entry);
public DropBasedOnExpertMode(IItemDropRule ruleForNormalMode, IItemDropRule ruleForExpertMode) { this._ruleForNormalMode = ruleForNormalMode; this._ruleForExpertMode = ruleForExpertMode; this.ChainedRules = new List <IItemDropRuleChainAttempt>(); }
public DropBasedOnMasterMode(IItemDropRule ruleForDefault, IItemDropRule ruleForMasterMode) { this._ruleForDefault = ruleForDefault; this._ruleForMasterMode = ruleForMasterMode; this.ChainedRules = new List <IItemDropRuleChainAttempt>(); }
public IItemDropRule Remove(IItemDropRule entry) { itemDropDatabase._globalEntries.Remove(entry); return(entry); }
public DropBasedOnEMode(IItemDropRule ruleForEMode, IItemDropRule ruleForDefault) { this.ruleForEMode = ruleForEMode; this.ruleForDefault = ruleForDefault; ChainedRules = new List <IItemDropRuleChainAttempt>(); }