Files
VOIDRPG/Assets/90 - Scripts/Generic/Objects/Wearable/WearableObjectState.cs
T
2026-07-09 21:33:33 +02:00

101 lines
3.2 KiB
C#

using System.Linq;
using InfinityPBR.ModularCharacterHelper;
using Sirenix.Utilities;
using UnityEngine;
using VOID.Generic.Objects.Item.Events;
using VOID.Generic.Objects.Unit;
using VOID.Generic.Objects.Wearable;
using VOID.Generic.Objects.Wearable.Events;
using VOID.ScriptableObjects;
namespace VOID.Generic.Objects.Item
{
[System.Serializable]
public class WearableObjectState : ObjectComponent<WearableObject>
{
#region Initialize
protected override void EventInitialize()
{
parent.itemEvents.onDroppedAfter.AddListener(OnDropped);
parent.wearableEvents.onEquippedAfter.AddListener(OnEquip);
parent.wearableEvents.onUnEquippedAfter.AddListener(OnUnEquip);
}
#endregion
public UnitObject wearerUnit { get; private set; }
public BasicStatus equipStatus { get; private set; }
private GameObject _equipModelGameObject;
private void OnDropped(DropEvent dropEvent)
{
EndEquipStatus();
wearerUnit = null;
}
private void OnEquip(EquipEvent equipEvent)
{
wearerUnit = equipEvent.unit;
ApplyEquipStatus();
ShowEquipModel();
}
private void OnUnEquip(UnEquipEvent unEquipEvent)
{
EndEquipStatus();
HideEquipModel();
wearerUnit = null;
}
private void ApplyEquipStatus()
{
if (parent.wearableData.effects.Count <= 0) return;
equipStatus = ScriptableObject.CreateInstance<BasicStatus>();
equipStatus.name = $"EquipStatus: {wearerUnit.gameObject.name}";
equipStatus.effects = parent.wearableData.effects;
equipStatus.permanent = true;
equipStatus.hidden = true;
wearerUnit.statusManager.AddStatus(equipStatus, wearerUnit, false);
}
private void EndEquipStatus()
{
if (!equipStatus) return;
equipStatus.Cancel();
equipStatus = null;
}
private void ShowEquipModel()
{
var modularCharacter = wearerUnit.unitState.modularCharacter;
if (!modularCharacter) return;
// GameObject container for all parts
_equipModelGameObject = new GameObject($"{parent.name} - equip model");
_equipModelGameObject.transform.parent = wearerUnit.transform;
// Find all matching parts that can be attached to unit's rig
parent
.GetComponentsInChildren<ModularPart>(true)
.Where(modularPart => modularPart.avatar == modularCharacter.avatar)
.Select(modularPart => Object.Instantiate(modularPart.gameObject).GetComponent<ModularPart>())
.ForEach(modularPart =>
{
modularPart.gameObject.transform.parent = _equipModelGameObject.transform;
modularCharacter.AttachPart(modularPart);
});
}
private void HideEquipModel()
{
if (_equipModelGameObject) Object.Destroy(_equipModelGameObject);
_equipModelGameObject = null;
}
}
}