diff options
author | chai <215380520@qq.com> | 2023-10-27 11:05:14 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2023-10-27 11:05:14 +0800 |
commit | 766cdff5ffa72b65d7f106658d1603f47739b2ba (patch) | |
tree | 34d7799a94dfa9be182825577583c0fa6dc935f7 /GameCode/ShieldCharge.cs |
+ init
Diffstat (limited to 'GameCode/ShieldCharge.cs')
-rw-r--r-- | GameCode/ShieldCharge.cs | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/GameCode/ShieldCharge.cs b/GameCode/ShieldCharge.cs new file mode 100644 index 0000000..a2860d1 --- /dev/null +++ b/GameCode/ShieldCharge.cs @@ -0,0 +1,168 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Sonigon; +using UnityEngine; + +public class ShieldCharge : MonoBehaviour +{ + [Header("Sounds")] + public SoundEvent soundShieldCharge; + + [Header("Settings")] + public float damagePerLevel; + + [Header("Settings")] + public float knockBackPerLevel; + + public float forcePerLevel; + + public float timePerLevel; + + public ParticleSystem hitPart; + + public float shake; + + public float damage; + + public float knockBack; + + public float stopForce; + + public AnimationCurve forceCurve; + + public float force; + + public float drag; + + public float time; + + private CharacterData data; + + private AttackLevel level; + + private Vector3 dir; + + private bool cancelForce; + + private List<CharacterData> hitDatas = new List<CharacterData>(); + + private float blockTime; + + private void Start() + { + level = GetComponent<AttackLevel>(); + data = GetComponentInParent<CharacterData>(); + PlayerCollision component = data.GetComponent<PlayerCollision>(); + component.collideWithPlayerAction = (Action<Vector2, Vector2, Player>)Delegate.Combine(component.collideWithPlayerAction, new Action<Vector2, Vector2, Player>(Collide)); + GetComponentInParent<ChildRPC>().childRPCsVector2Vector2Int.Add("ShieldChargeCollide", RPCA_Collide); + Block componentInParent = GetComponentInParent<Block>(); + componentInParent.SuperFirstBlockAction = (Action<BlockTrigger.BlockTriggerType>)Delegate.Combine(componentInParent.SuperFirstBlockAction, new Action<BlockTrigger.BlockTriggerType>(DoBlock)); + } + + private void OnDestroy() + { + PlayerCollision component = data.GetComponent<PlayerCollision>(); + component.collideWithPlayerAction = (Action<Vector2, Vector2, Player>)Delegate.Remove(component.collideWithPlayerAction, new Action<Vector2, Vector2, Player>(Collide)); + GetComponentInParent<ChildRPC>().childRPCsVector2Vector2Int.Remove("ShieldChargeCollide"); + Block componentInParent = GetComponentInParent<Block>(); + componentInParent.SuperFirstBlockAction = (Action<BlockTrigger.BlockTriggerType>)Delegate.Remove(componentInParent.SuperFirstBlockAction, new Action<BlockTrigger.BlockTriggerType>(DoBlock)); + } + + private void Update() + { + blockTime -= TimeHandler.deltaTime; + } + + public void DoBlock(BlockTrigger.BlockTriggerType trigger) + { + if (trigger != BlockTrigger.BlockTriggerType.ShieldCharge) + { + Charge(trigger); + } + } + + public void Charge(BlockTrigger.BlockTriggerType trigger) + { + StartCoroutine(DoCharge(trigger)); + } + + private IEnumerator DoCharge(BlockTrigger.BlockTriggerType trigger) + { + SoundManager.Instance.Play(soundShieldCharge, base.transform); + cancelForce = false; + hitDatas.Clear(); + if (trigger == BlockTrigger.BlockTriggerType.Empower) + { + Vector3 currentPos = base.transform.position; + yield return new WaitForSeconds(0f); + dir = (currentPos - base.transform.position).normalized; + } + else + { + dir = data.aimDirection; + } + float usedTime = (blockTime = time + (float)level.LevelsUp() * timePerLevel); + float num = time * 0.1f + (float)level.LevelsUp() * time * 0.15f; + for (int i = 0; i < level.LevelsUp(); i++) + { + float num2 = time / (float)level.attackLevel; + _ = time; + num += num2; + StartCoroutine(DelayBlock(num)); + } + float c = 0f; + while (c < 1f) + { + c += Time.fixedDeltaTime / usedTime; + if (!cancelForce) + { + data.healthHandler.TakeForce(dir * forceCurve.Evaluate(c) * (force + (float)level.LevelsUp() * forcePerLevel), ForceMode2D.Force, forceIgnoreMass: true, ignoreBlock: true); + data.healthHandler.TakeForce(-data.playerVel.velocity * drag * Time.fixedDeltaTime, ForceMode2D.Force, forceIgnoreMass: true, ignoreBlock: true); + } + data.sinceGrounded = 0f; + yield return new WaitForFixedUpdate(); + } + data.block.RPCA_DoBlock(firstBlock: false, dontSetCD: true, BlockTrigger.BlockTriggerType.ShieldCharge); + } + + private IEnumerator DelayBlock(float delay) + { + yield return new WaitForSeconds(delay); + data.block.RPCA_DoBlock(firstBlock: false, dontSetCD: true, BlockTrigger.BlockTriggerType.ShieldCharge); + } + + public void RPCA_Collide(Vector2 pos, Vector2 colDir, int playerID) + { + CharacterData componentInParent = PlayerManager.instance.GetPlayerWithID(playerID).gameObject.GetComponentInParent<CharacterData>(); + if ((bool)componentInParent) + { + cancelForce = true; + hitPart.transform.rotation = Quaternion.LookRotation(dir); + hitPart.Play(); + componentInParent.healthHandler.TakeDamage(dir * (damage + (float)level.LevelsUp() * damagePerLevel), base.transform.position, null, data.player); + componentInParent.healthHandler.TakeForce(dir * (knockBack + (float)level.LevelsUp() * knockBackPerLevel)); + data.healthHandler.TakeForce(-dir * knockBack, ForceMode2D.Impulse, forceIgnoreMass: false, ignoreBlock: true); + data.healthHandler.TakeForce(-dir * stopForce, ForceMode2D.Impulse, forceIgnoreMass: true, ignoreBlock: true); + data.block.RPCA_DoBlock(firstBlock: false, dontSetCD: true, BlockTrigger.BlockTriggerType.ShieldCharge); + GamefeelManager.GameFeel(dir * shake); + } + } + + public void Collide(Vector2 pos, Vector2 colDir, Player player) + { + if (!data.view.IsMine || blockTime < 0f) + { + return; + } + CharacterData componentInParent = player.gameObject.GetComponentInParent<CharacterData>(); + if (!hitDatas.Contains(componentInParent)) + { + hitDatas.Add(componentInParent); + if ((bool)componentInParent) + { + GetComponentInParent<ChildRPC>().CallFunction("ShieldChargeCollide", pos, colDir, player.playerID); + } + } + } +} |