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