Files
Emberwild/Assets/GAME/Script/Inventory/ItemData.cs
Mathew 78bfdf2828 Merge remote-tracking branch 'origin/feat/inport-props' into feat/craft-discovery
# Conflicts:
#	Assets/External/Animated PBR Chest Demo/Materials/WoodChest.mat
#	Packages/com.distantlands.cozy.core/Content/Integration/Import for BiRP.unitypackage.meta
#	Packages/com.distantlands.cozy.core/Content/Integration/Import for HDRP.unitypackage.meta
#	Packages/com.distantlands.cozy.core/Content/Integration/Import for URP.unitypackage.meta
2026-07-25 19:42:26 +02:00

115 lines
4.5 KiB
C#

using UnityEngine;
using Ashwild.Player;
namespace Ashwild.Inventory
{
public enum ItemType
{
Material,
Tool,
Weapon,
Consumable
}
public enum HarvestType
{
None,
Tree,
Rock
}
[CreateAssetMenu(fileName = "NewItem", menuName = "Items/Item Data")]
public class ItemData : ScriptableObject
{
[Header("Identity")]
[SerializeField] private string itemName;
[SerializeField] private Sprite icon;
[SerializeField] [TextArea] private string description;
[Header("Stacking")]
[SerializeField] private bool isStackable = true;
[SerializeField] private int maxStackSize = 64;
[Header("Type")]
[SerializeField] private ItemType itemType;
[Header("Uses / Durability")]
[Tooltip("How many times this item can be used before it is depleted (a tool's hits, a food's bites). 0 = no usage tracking — a normal item without a uses bar.")]
[SerializeField] private int maxUses = 0;
[Tooltip("When the uses reach 0: checked = the item stays in the inventory, shown red and unusable (repairable tool, refillable container); unchecked = it is destroyed.")]
[SerializeField] private bool keepWhenDepleted = false;
[Header("Tool")]
[SerializeField] private HarvestType harvestType = HarvestType.None;
[SerializeField] private float toolPower = 1f;
[Header("Consumable")]
[SerializeField] private float healthRestore;
[SerializeField] private float hungerRestore;
[SerializeField] private float thirstRestore;
[Header("Cooking")]
[SerializeField] private ItemData cookedResult;
[SerializeField] private float cookTime = 10f;
[Header("Fuel")]
[SerializeField] private bool isFuel;
[SerializeField] private float fuelSeconds = 30f;
[Header("Prefabs")]
[SerializeField] private GameObject worldPrefab;
[SerializeField] private GameObject handPrefab;
[Header("Animation")]
[Tooltip("Clips the owner's first-person arms play while holding this item. Empty = bare-hand set.")]
[SerializeField] private PlayerAnimationSet armsAnimationSet;
[Tooltip("Clips the third-person body plays while holding this item, as seen by other players.")]
[SerializeField] private PlayerAnimationSet bodyAnimationSet;
public string ItemName => itemName;
public Sprite Icon => icon;
public string Description => description;
public bool IsStackable => isStackable;
public int MaxStackSize => maxStackSize;
public ItemType ItemType => itemType;
public int MaxUses => maxUses;
/// <summary>
/// When uses run out: true keeps the item (shown red, unusable until repaired/refilled),
/// false destroys it. Repairable tools and refillable containers set this true.
/// </summary>
public bool KeepWhenDepleted => keepWhenDepleted;
/// <summary>
/// Whether this item tracks per-instance uses (a tool's durability, a food's bites). Items
/// with uses get a slot bar and are treated as non-stackable so each instance keeps its own value.
/// </summary>
public bool HasUses => maxUses > 0;
public HarvestType HarvestType => harvestType;
public float ToolPower => toolPower;
public float HealthRestore => healthRestore;
public float HungerRestore => hungerRestore;
public float ThirstRestore => thirstRestore;
public ItemData CookedResult => cookedResult;
public float CookTime => cookTime;
public bool IsCookable => cookedResult != null;
public bool IsFuel => isFuel;
public float FuelSeconds => fuelSeconds;
public GameObject WorldPrefab => worldPrefab;
public GameObject HandPrefab => handPrefab;
/// <summary>
/// The clip set this item imposes on one of the player's two rigs. Kept as a lookup rather than
/// two public properties so a binder can be pointed at either rig from the inspector and stay
/// the same component — the arms and the body run identical code on different data.
/// Returns null when the item authors nothing, which makes the binder fall back to bare hands.
/// </summary>
public PlayerAnimationSet GetAnimationSet(PlayerAnimationRig rig)
{
return rig == PlayerAnimationRig.Arms ? armsAnimationSet : bodyAnimationSet;
}
}
}