private static void AddItemsFuzzy(MyInventoryBase inventory, MyDefinitionId itemDefinition, int amount)
        {
            if (itemDefinition.TypeId == typeof(MyObjectBuilder_ItemTagDefinition))
            {
                inventory.AddItemsWithTag(itemDefinition.SubtypeId, amount, true);
                return;
            }

            inventory.AddItems(itemDefinition, amount);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Add items of the definition id specified.
        ///
        /// If Id is an item, simply add the items.
        /// If Id is a tag, add a random item with that tag.
        /// If Id is loot table, add results of that loot table.
        /// </summary>
        /// <param name="inventory"></param>
        /// <param name="id"></param>
        /// <param name="amount"></param>
        /// <returns>True if item added, false if item didn't fit</returns>
        public static bool AddItemsFuzzyOrLoot(this MyInventoryBase inventory, MyDefinitionId id, int amount = 1)
        {
            var result = true;

            if (id.TypeId == typeof(MyObjectBuilder_LootTableDefinition))
            {
                var lootTableDefinition = MyDefinitionManager.Get <MyLootTableDefinition>(id);
                for (var i = 0; i < amount; i++)
                {
                    inventory.GenerateContent(lootTableDefinition);
                }
            }
            else if (id.TypeId == typeof(MyObjectBuilder_ItemTagDefinition))
            {
                result = inventory.AddItemsWithTag(id.SubtypeId, amount, true);
            }
            else
            {
                result = inventory.AddItems(id, amount);
            }

            return(result);
        }
Exemplo n.º 3
0
        public static bool Apply <TInstance>(MyInventoryBase items, ListReader <ImmutableInventoryAction> actions,
                                             LuckyLoot.LootContext?luckContext = null, ActionWithArg <TInstance, ImmutableInventoryAction>?errorReporter = null)
        {
            var luck    = luckContext ?? LuckyLoot.DefaultLoot;
            var success = true;

            foreach (var action in actions)
            {
                switch (action.Mode)
                {
                case ImmutableInventoryAction.InventoryActionMode.GiveTakeItem:
                {
                    if (action.Amount > 0)
                    {
                        success = action.TargetId.TypeId == typeof(MyObjectBuilder_ItemTagDefinition)
                                ? items.AddItemsWithTag(action.TargetId.SubtypeId, action.Amount)
                                : items.AddItems(action.TargetId, action.Amount);
                    }
                    else
                    {
                        success = action.TargetId.TypeId == typeof(MyObjectBuilder_ItemTagDefinition)
                                ? items.RemoveItemsWithTag(action.TargetId.SubtypeId, -action.Amount)
                                : items.RemoveItems(action.TargetId, -action.Amount);
                    }
                    break;
                }

                case ImmutableInventoryAction.InventoryActionMode.RepairDamageItem:
                {
                    var remaining = action.Amount;
                    if (action.TargetId.TypeId == typeof(MyObjectBuilder_ItemTagDefinition))
                    {
                        foreach (var item in items.Items)
                        {
                            if (item is MyDurableItem durable && item.HasTag(action.TargetId.SubtypeId))
                            {
                                ApplyDurability(durable, ref remaining);
                                if (durable.Durability == 0)
                                {
                                    var broken = durable.GetDefinition().BrokenItem;
                                    var amount = item.Amount;
                                    if (!items.Remove(item))
                                    {
                                        break;
                                    }

                                    if (broken.HasValue && !items.AddItems(broken.Value, amount))
                                    {
                                        break;
                                    }
                                }

                                if (remaining == 0)
                                {
                                    break;
                                }
                            }
                        }
                    }
                    else
                    {
                        foreach (var item in items.Items)
                        {
                            if (item is MyDurableItem durable && item.DefinitionId == action.TargetId)
                            {
                                ApplyDurability(durable, ref remaining);
                                if (durable.Durability == 0)
                                {
                                    var broken = durable.GetDefinition().BrokenItem;
                                    var amount = item.Amount;
                                    if (!items.Remove(item))
                                    {
                                        break;
                                    }
                                    if (broken.HasValue && !items.AddItems(broken.Value, amount))
                                    {
                                        break;
                                    }
                                }

                                if (remaining == 0)
                                {
                                    break;
                                }
                            }
                        }
                    }

                    success = remaining == 0;
                    break;
                }

                case ImmutableInventoryAction.InventoryActionMode.GiveTakeLootTable:
                {
                    using (ItemCollection.Borrow(out var tmp))
                    {
                        using (PoolManager.Get(out HashSet <MyStringHash> tmpSet))
                        {
                            var table = MyDefinitionManager.Get <MyLootTableDefinition>(action.TargetId);
                            for (var pass = 0; pass < Math.Abs(action.Amount); pass++)
                            {
                                tmpSet.Clear();
                                tmp.GenerateLuckyContent(table, luck, tmpSet);
                            }
                        }

                        if (action.Amount > 0)
                        {
                            foreach (var item in tmp.Items)
                            {
                                success &= items.Add(item);
                            }
                        }
                        else
                        {
                            foreach (var item in tmp.Items)
                            {
                                success &= items.RemoveItems(item.DefinitionId, item.Amount);
                            }
                        }
                    }

                    break;
                }

                default:
                    throw new Exception("Bad mode");
                }

                if (!success)
                {
                    errorReporter?.Invoke(action);
                    return(false);
                }
            }

            return(success);
        }