85 lines
3.1 KiB
C#
85 lines
3.1 KiB
C#
using HarmonyLib;
|
|
using KFCommonUtilityLib.Scripts.Attributes;
|
|
using System.Collections;
|
|
using UnityEngine;
|
|
|
|
[TypeTarget(typeof(ItemActionRanged))]
|
|
public class ActionModuleHoldOpen
|
|
{
|
|
private const string emptyAnimatorBool = "empty";
|
|
private int emptyAnimatorBoolHash;
|
|
|
|
[HarmonyPatch(nameof(ItemAction.ReadFrom)), MethodTargetPostfix]
|
|
private void Postfix_ReadFrom(DynamicProperties _props, ItemActionRanged __instance)
|
|
{
|
|
int metaIndex = __instance.ActionIndex;
|
|
if (_props.Values.TryGetValue("ShareMetaWith", out string str) && int.TryParse(str, out metaIndex))
|
|
{
|
|
|
|
}
|
|
if (metaIndex > 0)
|
|
{
|
|
emptyAnimatorBoolHash = Animator.StringToHash(emptyAnimatorBool + __instance.ActionIndex);
|
|
}
|
|
else
|
|
{
|
|
emptyAnimatorBoolHash = Animator.StringToHash(emptyAnimatorBool);
|
|
}
|
|
}
|
|
|
|
[HarmonyPatch(nameof(ItemActionRanged.getUserData)), MethodTargetPostfix]
|
|
public void Postfix_getUserData(ItemActionData _actionData, ref int __result)
|
|
{
|
|
__result |= (_actionData.invData.itemValue.Meta <= 0 ? 1 : 0);
|
|
}
|
|
|
|
[HarmonyPatch(nameof(ItemAction.ItemActionEffects)), MethodTargetPostfix]
|
|
public void Postfix_ItemActionEffects(ItemActionData _actionData, int _firingState, int _userData)
|
|
{
|
|
if (_firingState != (int)ItemActionFiringState.Off && (_userData & 1) > 0)
|
|
_actionData.invData.holdingEntity.emodel.avatarController.UpdateBool(emptyAnimatorBoolHash, true, false);
|
|
}
|
|
|
|
[HarmonyPatch(nameof(ItemActionRanged.ReloadGun)), MethodTargetPostfix]
|
|
public void Postfix_ReloadGun(ItemActionData _actionData)
|
|
{
|
|
//delay 2 frames before reloading, since the animation is likely to be triggered the next frame this is called
|
|
ThreadManager.StartCoroutine(DelaySetEmpty(_actionData, false, 2));
|
|
}
|
|
|
|
[HarmonyPatch(nameof(ItemAction.StartHolding)), MethodTargetPrefix]
|
|
public bool Prefix_StartHolding(ItemActionData _data)
|
|
{
|
|
//delay 1 frame before equipping weapon
|
|
if (_data.invData.itemValue.Meta <= 0)
|
|
ThreadManager.StartCoroutine(DelaySetEmpty(_data, true, 2));
|
|
return true;
|
|
}
|
|
|
|
[HarmonyPatch(nameof(ItemActionRanged.ConsumeAmmo)), MethodTargetPostfix]
|
|
public void Postfix_ConsumeAmmo(ItemActionData _actionData)
|
|
{
|
|
if (_actionData.invData.itemValue.Meta == 0)
|
|
_actionData.invData.holdingEntity.FireEvent(CustomEnums.onSelfMagzineDeplete, true);
|
|
}
|
|
|
|
[HarmonyPatch(nameof(ItemAction.SwapAmmoType)), MethodTargetPrefix]
|
|
public bool Prefix_SwapAmmoType(EntityAlive _entity)
|
|
{
|
|
_entity.emodel.avatarController.UpdateBool(emptyAnimatorBoolHash, true, false);
|
|
return true;
|
|
}
|
|
|
|
private IEnumerator DelaySetEmpty(ItemActionData _actionData, bool empty, int delay)
|
|
{
|
|
for (int i = 0; i < delay; i++)
|
|
{
|
|
yield return null;
|
|
}
|
|
if (_actionData.invData.holdingEntity.inventory.holdingItemIdx == _actionData.invData.slotIdx)
|
|
{
|
|
_actionData.invData.holdingEntity.emodel.avatarController.UpdateBool(emptyAnimatorBoolHash, empty, false);
|
|
}
|
|
yield break;
|
|
}
|
|
} |