78bfdf2828
# 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
115 lines
4.5 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|