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); }
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); }
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)); }
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)); }