Example #1
0
        public CreateItemResult Execute(
            DelegateSpawnDropItem delegateSpawnDropItem,
            DropItemContext dropItemContext,
            double probabilityMultiplier)
        {
            this.Freeze();

            var result = new CreateItemResult()
            {
                IsEverythingCreated = true
            };

            using var selectedEntries = Api.Shared.GetTempList <Entry>();
            this.SelectRandomEntries(selectedEntries);

            // execute selected entries
            foreach (var entry in selectedEntries)
            {
                ExecuteEntry(entry,
                             dropItemContext,
                             out var entryResult,
                             probabilityMultiplier,
                             delegateSpawnDropItem);
                result.MergeWith(entryResult);
            }

            return(result);
        }
Example #2
0
        private static void ExecuteEntry(
            Entry entry,
            DropItemContext dropItemContext,
            out CreateItemResult createItemResult,
            double probabilityMultiplier,
            DelegateSpawnDropItem delegateSpawnDropItem)
        {
            if (entry.Condition != null)
            {
                try
                {
                    if (!entry.Condition(dropItemContext))
                    {
                        // condition not match
                        createItemResult = null;
                        return;
                    }
                }
                catch (Exception ex)
                {
                    Api.Logger.Exception(ex, "Exception during checking condition for droplist item " + entry);
                    createItemResult = null;
                    return;
                }
            }

            probabilityMultiplier *= entry.Probability;
            createItemResult       = entry.EntryNestedList != null
                                   ? entry.EntryNestedList.Execute(delegateSpawnDropItem,
                                                                   dropItemContext,
                                                                   probabilityMultiplier)
                                   : ExecuteSpawnItem(entry.EntryItem,
                                                      delegateSpawnDropItem,
                                                      probabilityMultiplier);
        }
Example #3
0
        private static CreateItemResult ExecuteSpawnItem(
            DropItem dropItem,
            DelegateSpawnDropItem delegateSpawnDropItem,
            double probability)
        {
            probability *= DropListItemsCountMultiplier;

            if (!RandomHelper.RollWithProbability(probability))
            {
                return(new CreateItemResult()
                {
                    IsEverythingCreated = true
                });
            }

            var countToSpawn = dropItem.Count
                               + RandomHelper.Next(minValue: 0,
                                                   maxValueExclusive: dropItem.CountRandom + 1);

            if (countToSpawn <= 0)
            {
                // nothing to spawn this time
                return(new CreateItemResult()
                {
                    IsEverythingCreated = true
                });
            }

            if (probability > 1)
            {
                var multiplier = probability;
                countToSpawn = (int)Math.Round(countToSpawn * multiplier,
                                               MidpointRounding.AwayFromZero);
            }

            if (countToSpawn <= 0)
            {
                return(new CreateItemResult()
                {
                    IsEverythingCreated = true
                });
            }

            if (countToSpawn > ushort.MaxValue)
            {
                countToSpawn = ushort.MaxValue;
            }

            return(delegateSpawnDropItem(dropItem.ProtoItem, (ushort)countToSpawn));
        }
Example #4
0
        private static CreateItemResult ExecuteSpawnItem(
            DropItem dropItem,
            DelegateSpawnDropItem delegateSpawnDropItem,
            double probability)
        {
            var countToSpawn = dropItem.Count + RandomHelper.Next(0, dropItem.CountRandom + 1);

            if (countToSpawn <= 0)
            {
                return(new CreateItemResult()
                {
                    IsEverythingCreated = true
                });
            }

            // apply probability
            probability = MathHelper.Clamp(probability, 0, 1);
            if (probability < 1)
            {
                var countToSpawnFloat = countToSpawn * probability;
                if (countToSpawnFloat > 1)
                {
                    countToSpawn = (int)Math.Round(RandomHelper.NextDouble() * countToSpawnFloat,
                                                   MidpointRounding.AwayFromZero);
                }
                else
                {
                    // cannot spawn even 1 item... so let's roll and try spawn exactly 1 item
                    // TODO: not sure if we're using the probability correctly here
                    countToSpawn = RandomHelper.RollWithProbability(probability)
                                       ? 1
                                       : 0;
                }
            }

            if (countToSpawn <= 0)
            {
                return(new CreateItemResult()
                {
                    IsEverythingCreated = true
                });
            }

            if (countToSpawn > ushort.MaxValue)
            {
                countToSpawn = ushort.MaxValue;
            }

            return(delegateSpawnDropItem(dropItem.ProtoItem, (ushort)countToSpawn));
        }