Files
beyond/Assets/ThirdParty/Invector-3rdPersonController/Melee Combat/Scripts/MeleeWeapon/vCollectMeleeControl.cs
2024-11-20 15:21:28 +01:00

260 lines
8.1 KiB
C#

using UnityEngine;
namespace Invector.vMelee
{
using UnityEngine.Events;
using vCharacterController;
using vCharacterController.vActions;
[vClassHeader("Collect Melee Control", "This component is used when you're character doesn't have a ItemManager to manage items, this will allow you to pickup 1 weapon at the time.")]
public class vCollectMeleeControl : vMonoBehaviour
{
[HideInInspector]
public vMeleeManager meleeManager;
[Header("Handlers")]
public vHandler rightHandler = new vHandler();
public vHandler leftHandler = new vHandler();
[Header("Unequip Inputs")]
public GenericInput unequipRightInput;
public GenericInput unequipLeftInput;
[HideInInspector]
public vCollectableStandalone leftWeapon, rightWeapon;
public vControlDisplayWeaponStandalone controlDisplayPrefab;
protected vControlDisplayWeaponStandalone currentDisplay;
[vEditorToolbar("Melee Events")]
public UnityEngine.Events.UnityEvent onEquipMeleeWeapon, onUnequipMeleeWeapon, onEquipRightWeapon, onEquipLeftWeapon, onUnEquipRightWeapon, onUnEquipLeftWeapon;
internal bool wasUsingMeleeWeapon;
protected virtual void Start()
{
meleeManager = GetComponent<vMeleeManager>();
if (controlDisplayPrefab)
{
currentDisplay = Instantiate(controlDisplayPrefab);
}
}
protected virtual void Update()
{
UnequipWeaponHandle();
CheckIsEquipedWifhWeapon();
}
public virtual void HandleCollectableInput(vCollectableStandalone collectableStandAlone)
{
if (!meleeManager)
{
return;
}
if (collectableStandAlone != null && collectableStandAlone.weapon != null)
{
EquipMeleeWeapon(collectableStandAlone);
}
}
protected virtual void EquipMeleeWeapon(vCollectableStandalone collectable)
{
var weapon = collectable.weapon.GetComponent<vMeleeWeapon>();
if (!weapon)
{
return;
}
if (weapon.meleeType != vMeleeType.OnlyDefense)
{
var p = GetEquipPoint(rightHandler, collectable.targetEquipPoint);
if (!p)
{
return;
}
collectable.weapon.transform.SetParent(p);
collectable.weapon.transform.localPosition = Vector3.zero;
collectable.weapon.transform.localEulerAngles = Vector3.zero;
if (rightWeapon && rightWeapon.gameObject != collectable.gameObject)
{
RemoveRightWeapon();
}
if (collectable.twoHandWeapon || leftWeapon && leftWeapon.twoHandWeapon)
{
RemoveLeftWeapon();
}
meleeManager.SetRightWeapon(weapon.gameObject);
collectable.OnEquip.Invoke();
rightWeapon = collectable;
onEquipRightWeapon.Invoke();
UpdateRightDisplay(collectable);
}
if (weapon.meleeType != vMeleeType.OnlyAttack && weapon.meleeType != vMeleeType.AttackAndDefense)
{
var p = GetEquipPoint(leftHandler, collectable.targetEquipPoint);
if (!p)
{
return;
}
collectable.weapon.transform.SetParent(p);
collectable.weapon.transform.localPosition = Vector3.zero;
collectable.weapon.transform.localEulerAngles = Vector3.zero;
if (leftWeapon && leftWeapon.gameObject != collectable.gameObject)
{
RemoveLeftWeapon();
}
if (collectable.twoHandWeapon || rightWeapon && rightWeapon.twoHandWeapon)
{
RemoveRightWeapon();
}
onEquipLeftWeapon.Invoke();
meleeManager.SetLeftWeapon(weapon.gameObject);
collectable.OnEquip.Invoke();
leftWeapon = collectable;
UpdateLeftDisplay(collectable);
}
}
protected virtual Transform GetEquipPoint(vHandler point, string name)
{
Transform p = point.defaultHandler;
var customP = point.customHandlers.Find(_p => _p.name.Equals(name));
if (customP)
{
p = customP;
}
return p;
}
protected virtual void UnequipWeaponHandle()
{
if (rightWeapon)
{
if (unequipRightInput.GetButtonDown())
{
RemoveRightWeapon();
}
}
if (leftWeapon)
{
if (unequipLeftInput.GetButtonDown())
{
RemoveLeftWeapon();
}
}
}
public virtual void RemoveLeftWeapon()
{
if (leftWeapon)
{
leftWeapon.weapon.transform.parent = null;
leftWeapon.OnDrop.Invoke();
onUnEquipLeftWeapon.Invoke();
}
if (meleeManager)
{
meleeManager.leftWeapon = null;
}
UpdateLeftDisplay();
}
public virtual void RemoveRightWeapon()
{
if (rightWeapon)
{
rightWeapon.weapon.transform.parent = null;
rightWeapon.OnDrop.Invoke();
onUnEquipRightWeapon.Invoke();
}
if (meleeManager)
{
meleeManager.rightWeapon = null;
}
UpdateRightDisplay();
}
public virtual bool isUsingTwoHandWeapon
{
get
{
return rightWeapon != null && rightWeapon.twoHandWeapon || leftWeapon != null && leftWeapon.twoHandWeapon;
}
}
public virtual bool isUsingMeleeWeapon
{
get
{
if (!meleeManager)
{
return false;
}
return meleeManager.leftWeapon && meleeManager.leftWeapon.gameObject.activeInHierarchy ||
meleeManager.rightWeapon && meleeManager.rightWeapon.gameObject.activeInHierarchy;
}
}
protected virtual void CheckIsEquipedWifhWeapon()
{
if (wasUsingMeleeWeapon && !isUsingMeleeWeapon)
{
onUnequipMeleeWeapon.Invoke();
wasUsingMeleeWeapon = false;
}
else if (!wasUsingMeleeWeapon && isUsingMeleeWeapon)
{
onEquipMeleeWeapon.Invoke();
wasUsingMeleeWeapon = true;
}
}
protected virtual void UpdateLeftDisplay(vCollectableStandalone collectable = null)
{
if (!currentDisplay)
{
return;
}
if (collectable)
{
currentDisplay.SetLeftWeaponIcon(collectable.weaponIcon);
currentDisplay.SetLeftWeaponText(collectable.weaponText);
}
else
{
currentDisplay.RemoveLeftWeaponIcon();
currentDisplay.RemoveLeftWeaponText();
}
}
protected virtual void UpdateRightDisplay(vCollectableStandalone collectable = null)
{
if (!currentDisplay)
{
return;
}
if (collectable)
{
currentDisplay.SetRightWeaponIcon(collectable.weaponIcon);
currentDisplay.SetRightWeaponText(collectable.weaponText);
}
else
{
currentDisplay.RemoveRightWeaponIcon();
currentDisplay.RemoveRightWeaponText();
}
}
}
}