Example #1
0
        //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);
        }
Example #2
0
 private void ResolveRuleChains(
     IItemDropRule rule,
     DropAttemptInfo info,
     ItemDropAttemptResult parentResult)
 {
     this.ResolveRuleChains(ref info, ref parentResult, rule.ChainedRules);
 }
Example #3
0
 public static IItemDropRule OnFailedConditions(
     this IItemDropRule rule,
     IItemDropRule ruleToChain,
     bool hideLootReport = false)
 {
     rule.ChainedRules.Add((IItemDropRuleChainAttempt) new Chains.TryIfDoesntFillConditions(ruleToChain, hideLootReport));
     return(ruleToChain);
 }
Example #4
0
 public static IItemDropRule OnSuccess(
     this IItemDropRule rule,
     IItemDropRule ruleToChain,
     bool hideLootReport = false)
 {
     rule.ChainedRules.Add((IItemDropRuleChainAttempt) new Chains.TryIfSucceeded(ruleToChain, hideLootReport));
     return(ruleToChain);
 }
Example #5
0
 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);
        }
Example #8
0
        //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!!
        }
Example #9
0
        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);
        }
Example #10
0
        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);
        }
Example #11
0
        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);
        }
Example #12
0
 public IItemDropRule Remove(IItemDropRule entry) => itemDropDatabase.RemoveFromNPC(npcType, entry);
Example #13
0
 public IItemDropRule Add(IItemDropRule entry) => itemDropDatabase.RegisterToNPC(npcType, entry);
Example #14
0
 public TryIfFailedRandomRoll(IItemDropRule rule, bool hideLootReport = false)
 {
     this.RuleToChain     = rule;
     this._hideLootReport = hideLootReport;
 }
Example #15
0
 public TryIfSucceeded(IItemDropRule rule, bool hideLootReport = false)
 {
     this.RuleToChain     = rule;
     this._hideLootReport = hideLootReport;
 }
Example #16
0
 public TryIfDoesntFillConditions(IItemDropRule rule, bool hideLootReport = false)
 {
     this.RuleToChain     = rule;
     this._hideLootReport = hideLootReport;
 }
Example #17
0
 public IItemDropRule Add(IItemDropRule entry) => itemDropDatabase.RegisterToGlobal(entry);
Example #18
0
 public DropBasedOnExpertMode(IItemDropRule ruleForNormalMode, IItemDropRule ruleForExpertMode)
 {
     this._ruleForNormalMode = ruleForNormalMode;
     this._ruleForExpertMode = ruleForExpertMode;
     this.ChainedRules       = new List <IItemDropRuleChainAttempt>();
 }
Example #19
0
 public DropBasedOnMasterMode(IItemDropRule ruleForDefault, IItemDropRule ruleForMasterMode)
 {
     this._ruleForDefault    = ruleForDefault;
     this._ruleForMasterMode = ruleForMasterMode;
     this.ChainedRules       = new List <IItemDropRuleChainAttempt>();
 }
Example #20
0
        public IItemDropRule Remove(IItemDropRule entry)
        {
            itemDropDatabase._globalEntries.Remove(entry);

            return(entry);
        }
Example #21
0
 public DropBasedOnEMode(IItemDropRule ruleForEMode, IItemDropRule ruleForDefault)
 {
     this.ruleForEMode   = ruleForEMode;
     this.ruleForDefault = ruleForDefault;
     ChainedRules        = new List <IItemDropRuleChainAttempt>();
 }