Пример #1
0
 public Data(MyLootTableDefinition lt, MyStringHash ds, bool permission, string actionHint, MyStringHash actionIcon)
 {
     LootTable          = lt;
     DestinationState   = ds;
     RequiresPermission = permission;
     ActionHint         = actionHint;
     ActionIcon         = actionIcon;
 }
Пример #2
0
        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);
        }