using System; using AriasServerUtils; using Vintagestory.API.Common; using Vintagestory.API.Config; using Vintagestory.API.Datastructures; using Vintagestory.API.Server; using Vintagestory.API.Util; public static class RustyGearUtils { internal static string[] saveInvTypes = new string[] { GlobalConstants.hotBarInvClassName, GlobalConstants.backpackInvClassName, GlobalConstants.craftingInvClassName, GlobalConstants.mousecursorInvClassName, GlobalConstants.characterInvClassName }; // Replace with the correct code if it's different private const string RustyGearCode = "currency-rustygear"; /// /// Counts the total number of rusty gears in the player's inventory. /// public static int CountRustyGears(IServerPlayer player) { int total = 0; player.Entity.WalkInventory((slot) => { if (slot is ItemSlotCreative || !(slot.Inventory is InventoryBasePlayer)) return true; total += CurrencyValuePerItem(slot) * slot.StackSize; return true; }); return total; } private static int CurrencyValuePerItem(ItemSlot slot) { JsonObject obj = slot.Itemstack?.Collectible?.Attributes?["currency"]; if (obj != null && obj.Exists) { JsonObject v = obj["value"]; return v.Exists ? v.AsInt(0) : 0; } return 0; } /// /// Attempts to subtract a specific number of rusty gears from the player's inventory. /// /// The player. /// How many gears to remove. /// True if the full amount was successfully removed, false if not enough gears. public static bool SubtractRustyGears(IServerPlayer player, int amount) { // Check if the player has enough rusty gears int currentAmount = CountRustyGears(player); if (currentAmount < amount) return false; // Subtract the specified amount of rusty gears from the player's inventory player.Entity.WalkInventory((slot) => { if (slot is ItemSlotCreative || !(slot.Inventory is InventoryBasePlayer)) return true; int value = CurrencyValuePerItem(slot) * slot.StackSize; if (value > 0 && slot.StackSize > 0) { // Calculate the amount of rusty gears to remove from this slot int amountToRemove = Math.Min(value, amount); // If the slot size is less than or equal to the amount to remove, set the slot's itemstack to null if (slot.StackSize <= amountToRemove) slot.Itemstack = null; else { // Otherwise, subtract the amount to remove from the slot size and decrement the total amount slot.Itemstack.StackSize -= amountToRemove; amount -= amountToRemove; } } // If the total amount has been removed, return true if (amount <= 0) return true; // we're done return true; }); // If the player's inventory still contains rusty gears, they don't have enough to remove return false; } public static PlayerInventory GetAllItems(IServerPlayer player) { PlayerInventory inv = new PlayerInventory(); var invMgr = player.InventoryManager; var iBackpackSlotNum = 0; foreach (var type in saveInvTypes) { foreach (var stack in invMgr.GetOwnInventory(type)) { if (iBackpackSlotNum >= 4) { continue; } if (type == GlobalConstants.backpackInvClassName) { iBackpackSlotNum++; } if (stack.Empty) continue; if (stack.Inventory.ClassName == GlobalConstants.characterInvClassName) { if (stack.Itemstack.ItemAttributes?["protectionModifiers"].Exists ?? false) { inv.Items.Add(stack.Itemstack.Clone()); } } else inv.Items.Add(stack.Itemstack.Clone()); } } return inv; } }