Files
beyond/Assets/Scripts/InvectorDerivatives/bMeleeEquipment.cs
2024-11-20 15:21:28 +01:00

148 lines
4.9 KiB
C#

using Invector;
using Invector.vItemManager;
using Invector.vMelee;
using System;
using UnityEngine;
namespace Beyond
{
[vClassHeader("Melee Equipment", openClose = false, useHelpBox = true,
helpBoxText = "Use this component if you also use the ItemManager in your Character")]
public class bMeleeEquipment : bEquipment
{
private vMeleeWeapon _weapon;
[SerializeField]
private IWeaponSpecialEffects weaponEffect;
public string damageTypeToSetOnPowered = "";
public int powerModifier = 15;
protected bool withoutMeleeWeapon;
public bItemAttribute power = null;
private void Awake()
{
weaponEffect = GetComponent<IWeaponSpecialEffects>();
}
protected virtual vMeleeWeapon meleeWeapon
{
get
{
if (!_weapon && !withoutMeleeWeapon)
{
_weapon = GetComponent<vMeleeWeapon>();
if (!_weapon) withoutMeleeWeapon = true;
}
return _weapon;
}
}
//add draw effect play here?
public override void OnEquip(bItem item)
{
if (meleeWeapon)
{
var damage = item.GetItemAttribute(bItemAttributes.Damage);
var staminaCost = item.GetItemAttribute(bItemAttributes.StaminaCost);
var defenseRate = item.GetItemAttribute(bItemAttributes.DefenseRate);
var defenseRange = item.GetItemAttribute(bItemAttributes.DefenseRange);
var minDamage = item.GetItemAttribute(bItemAttributes.MinDamage);
var maxDamage = item.GetItemAttribute(bItemAttributes.MaxDamage);
var bonusDamage = item.GetItemAttribute(bItemAttributes.BonusDamage);
if (bonusDamage != null)
{
powerModifier = bonusDamage.value;
}
else
{
powerModifier = 0;
}
if (damage != null) this.meleeWeapon.damage.damageValue = damage.value;
if (staminaCost != null) this.meleeWeapon.staminaCost = staminaCost.value;
if (defenseRate != null) this.meleeWeapon.defenseRate = defenseRate.value;
if (defenseRange != null) this.meleeWeapon.defenseRange = defenseRate.value;
if (minDamage != null) this.meleeWeapon.minDamage.damageValue = minDamage.value;
if (maxDamage != null) this.meleeWeapon.maxDamage.damageValue = maxDamage.value;
}
TryToApplyPowerEffect(item);
//add on itemmanagerconsumed event here
base.OnEquip(item);
}
//could be extracted to different class actually
private void TryToApplyPowerEffect(bItem item)
{
power = item.GetItemAttribute(bItemAttributes.Power);
bItemManager itemManager = Player.Instance.ItemManager;
if (power != null)
{
_weapon.onDamageHit.AddListener(RecheckPowerBehaviour);
itemManager.onUseItem.AddListener(TryToEnableLoadedPowerEffect);
TryToEnableLoadedPowerEffect(null);
}
}
private void TryToEnableLoadedPowerEffect(bItem arg0)
{
if (power.value > 0)
{
EnableDamagingEffect();
weaponEffect.EnableLoadedPowerEffect();
}
else
{
DisableDamagingEffect();
weaponEffect.DisableLoadedPowerEffect();
}
}
private void EnableDamagingEffect()
{
_weapon.damageModifier = powerModifier; //could make it load from item property
if (damageTypeToSetOnPowered != "")
{
_weapon.damage.damageType = damageTypeToSetOnPowered;
}
}
private void DisableDamagingEffect()
{
_weapon.damageModifier = 0;
if (damageTypeToSetOnPowered != "")
{
_weapon.damage.damageType = "";
}
}
private void RecheckPowerBehaviour(vHitInfo arg0)
{
if (power.value <= 0)
{
weaponEffect.DisableLoadedPowerEffect();
DisableDamagingEffect();
}
else
{
power.value--;
EnableDamagingEffect();
}
}
public override void OnUnequip(bItem item)
{
_weapon.onDamageHit.RemoveListener(RecheckPowerBehaviour);
bItemManager itemManager = Player.Instance.ItemManager;
itemManager.onUseItem.RemoveListener(TryToEnableLoadedPowerEffect);
//power.OnValueChanged -= UpdatePowerEffect;
base.OnUnequip(item);
}
}
}