Files
Cielonos/Assets/Scripts/MainGame/AttackArea/Submodules/HitSubmodule.cs
SoulliesOfficial ef7b479712 initial
2025-11-25 08:19:33 -05:00

124 lines
3.7 KiB
C#

using System;
using System.Collections.Generic;
using Cielonos.MainGame.Characters;
using UnityEngine;
using UnityEngine.Events;
namespace Cielonos.MainGame
{
public partial class HitSubmodule : AttackAreaSubmoduleBase
{
public int hitCount;
public float hitInterval;
private float currentIntervalTime;
public List<GameObject> checkedObjects;
public bool isAutoPlayHitSound;
public List<string> hitSoundList;
public List<Action<CharacterBase, Vector3>> hitEventList;
public HitSubmodule(AttackAreaBase attackArea) : base(attackArea)
{
InitializeAsOnceHit();
CommonInitialize();
}
public HitSubmodule(AttackAreaBase attackArea, float hitInterval = -1, int hitCount = -1) : base(attackArea)
{
InitializeAsMultipleHit(hitInterval, hitCount);
CommonInitialize();
}
private void InitializeAsOnceHit()
{
this.hitCount = 1;
this.hitInterval = -1;
this.currentIntervalTime = 0;
}
private void InitializeAsMultipleHit(float hitInterval, int hitCount)
{
this.hitCount = hitCount;
this.hitInterval = hitInterval;
this.currentIntervalTime = 0;
}
private void CommonInitialize()
{
isAutoPlayHitSound = true;
checkedObjects = new List<GameObject>();
hitSoundList = new List<string>();
hitEventList = new List<Action<CharacterBase, Vector3>>();
}
}
public partial class HitSubmodule
{
public HitSubmodule AddHitSound(string soundName, AK.Wwise.Event soundEvent = null)
{
if (owner.itemSource == null) return this;
soundEvent ??= owner.itemSource.audioContainer.soundEventDictionary[soundName];
attackArea.audioContainer.soundEventDictionary.TryAdd(soundName, soundEvent);
hitSoundList.Add(soundName);
return this;
}
public HitSubmodule AddHitEvent(Action<CharacterBase, Vector3> hitEvent)
{
hitEventList.Add(hitEvent);
return this;
}
}
public partial class HitSubmodule
{
public void Update()
{
if (!isEnabling || hitCount <= 1 || attackArea.timeSm.delayTime > 0)
{
return;
}
currentIntervalTime += Time.deltaTime; //attackArea.creator.selfTimeModule.EntityDeltaTime;
if (currentIntervalTime >= hitInterval)
{
checkedObjects.Clear();
if (attackArea.attackSm != null)
{
//attackArea.attackSm.modifiedAttackValue = attackArea.attackSm.originalAttackValue;
}
currentIntervalTime -= hitInterval;
hitCount--;
}
if (hitCount <= 0)
{
attackArea.isEnabling = false;
}
}
public void AddCheckedObject(GameObject obj)
{
checkedObjects.Add(obj);
}
public void PlayHitSound(Vector3 position, string soundName)
{
if (hitSoundList.Count == 0) return;
attackArea.audioContainer.PlaySoundFX(soundName, position);
}
public void InvokeAllHitEvents(CharacterBase target, Vector3 hitPosition)
{
if (attackArea.canTriggerHitEvent)
{
foreach (Action<CharacterBase, Vector3> hitEvent in hitEventList)
{
hitEvent.Invoke(target, hitPosition);
}
}
}
}
}