public Data(MyLootTableDefinition lt, MyStringHash ds, bool permission, string actionHint, MyStringHash actionIcon) { LootTable = lt; DestinationState = ds; RequiresPermission = permission; ActionHint = actionHint; ActionIcon = actionIcon; }
protected override void Init(MyObjectBuilder_DefinitionBase def) { base.Init(def); var ob = (MyObjectBuilder_EquiHarvestableComponentDefinition)def; _lootTableByTag.Clear(); _lootTableByItem.Clear(); if (ob.Entries == null) { return; } foreach (var k in ob.Entries) { if (string.IsNullOrWhiteSpace(k.From)) { MyDefinitionErrors.Add(Package, $"{Id} has an entry with no from state", LogSeverity.Warning); continue; } if (k.Harvesters == null || k.Harvesters.Length == 0) { MyDefinitionErrors.Add(Package, $"{Id} has an entry with no harvesters", LogSeverity.Warning); continue; } MyLootTableDefinition lootTable = null; if (k.LootTable.HasValue) { lootTable = MyDefinitionManager.Get <MyLootTableDefinition>(k.LootTable.Value); if (lootTable == null) { MyDefinitionErrors.Add(Package, $"{Id} has an entry from {k.From} referring to missing loot table {k.LootTable}", LogSeverity.Warning); continue; } } foreach (var item in k.Harvesters) { if (!item.IsValid()) { MyDefinitionErrors.Add(Package, $"{Id} has an entry with an invalid harvester", LogSeverity.Warning); } } var sourceState = MyStringHash.GetOrCompute(k.From); var destState = MyStringHash.GetOrCompute(k.To); var data = new Data(lootTable, destState, k.RequiresPermission, k.ActionHint ?? "Harvest", MyStringHash.GetOrCompute(k.ActionIcon ?? "Pickup_Item")); foreach (var item in k.Harvesters) { if (!item.IsValid()) { continue; } if (!string.IsNullOrWhiteSpace(item.Tag)) { _lootTableByTag[new TagKey(sourceState, MyStringHash.GetOrCompute(item.Tag))] = data; } else { _lootTableByItem[new DefinitionKey(sourceState, item)] = data; } } } }
public static void GenerateLuckyContent(this MyInventoryBase inventory, MyLootTableDefinition lootTableDefinition, LootContext context, HashSet <MyStringHash> blacklistedLootTables = null) { var cachingHashSet = new CachingHashSet <MyLootTableDefinition.Row>(); foreach (var item in lootTableDefinition.LootTable) { cachingHashSet.Add(item); } cachingHashSet.ApplyChanges(); var num = 0f; if (blacklistedLootTables == null) { blacklistedLootTables = new HashSet <MyStringHash>(); } blacklistedLootTables.Add(lootTableDefinition.Id.SubtypeId); foreach (var row in cachingHashSet) { if (row.AlwaysDrops && row.ItemDefinition != null) { if (row.ItemDefinition.Value.TypeId == typeof(MyObjectBuilder_LootTableDefinition)) { var nestedTable = MyDefinitionManager.Get <MyLootTableDefinition>(row.ItemDefinition.Value); if (nestedTable != null && !blacklistedLootTables.Contains(nestedTable.Id.SubtypeId)) { inventory.GenerateLuckyContent(nestedTable, context, blacklistedLootTables); } } else { AddItemsFuzzy(inventory, row.ItemDefinition.Value, row.Amount); } if (row.IsUnique) { cachingHashSet.Remove(row, false); continue; } } num += row.Weight; } var rollLucky = Math.Round(lootTableDefinition.Rolls * context.RollMultiplier + context.RollAdditive); for (var j = 0; j < rollLucky; j++) { var num2 = MyRandom.Instance.NextFloat(0f, num); cachingHashSet.ApplyChanges(); foreach (var row2 in cachingHashSet) { num2 -= row2.Weight; if (num2 > 0f || row2.ItemDefinition == null) { continue; } if (row2.ItemDefinition.Value.TypeId == typeof(MyObjectBuilder_LootTableDefinition)) { var nestedTable = MyDefinitionManager.Get <MyLootTableDefinition>(row2.ItemDefinition.Value); if (nestedTable != null) { inventory.GenerateLuckyContent(nestedTable, context); } } else { AddItemsFuzzy(inventory, row2.ItemDefinition.Value, row2.Amount); } if (row2.IsUnique) { cachingHashSet.Remove(row2, false); num -= row2.Weight; } break; } } blacklistedLootTables.Remove(lootTableDefinition.Id.SubtypeId); }