From 0b7c4700fd32dd00b463f3e891ba4377e6f05f38 Mon Sep 17 00:00:00 2001 From: Bragin Stepan Date: Sat, 21 Feb 2026 18:57:18 +0500 Subject: [PATCH] feat: add base attack systems --- .../Gameplay/Entities/EntitiesFactory.cs | 36 ++- .../Gameplay/Entities/Generated/EntityAPI.cs | 211 ++++++++++++++++++ .../Logic/Gameplay/Features/Attack.meta | 3 + .../Features/Attack/AttackComponents.cs | 22 ++ .../Features/Attack/AttackComponents.cs.meta | 3 + .../Gameplay/Features/Attack/Systems.meta | 3 + .../Features/Attack/Systems/Base.meta | 3 + .../Attack/Systems/Base/EndAttackSystem.cs | 44 ++++ .../Systems/Base/EndAttackSystem.cs.meta | 3 + .../Systems/Base/ProcessAttackTimerSystem.cs | 43 ++++ .../Base/ProcessAttackTimerSystem.cs.meta | 3 + .../Attack/Systems/Base/StartAttackSystem.cs | 43 ++++ .../Systems/Base/StartAttackSystem.cs.meta | 3 + .../Features/Attack/Systems/Shoot.meta | 3 + 14 files changed, 417 insertions(+), 6 deletions(-) create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack.meta create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/AttackComponents.cs create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/AttackComponents.cs.meta create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems.meta create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base.meta create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/EndAttackSystem.cs create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/EndAttackSystem.cs.meta create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/ProcessAttackTimerSystem.cs create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/ProcessAttackTimerSystem.cs.meta create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/StartAttackSystem.cs create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/StartAttackSystem.cs.meta create mode 100644 Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Shoot.meta diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/EntitiesFactory.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/EntitiesFactory.cs index 12ae260..30ba371 100644 --- a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/EntitiesFactory.cs +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/EntitiesFactory.cs @@ -1,4 +1,5 @@ -using _Project.Develop.Runtime.Logic.Gameplay.Features.Damage; +using _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.Systems; +using _Project.Develop.Runtime.Logic.Gameplay.Features.Damage; using _Project.Develop.Runtime.Logic.Gameplay.Features.Lifetime.Systems; using _Project.Develop.Runtime.Logic.Gameplay.Features.Movement; using _Project.Develop.Runtime.Logic.Gameplay.Features.Sensors.Systems; @@ -46,7 +47,13 @@ namespace _Project.Develop.Runtime.Entities .AddIsMoving() .AddInDeathProcess() .AddDeathProcessInitialTime(new ReactiveVariable(2)) - .AddDeathProcessCurrentTime(); + .AddDeathProcessCurrentTime() + .AddAttackProcessInitialTime(new ReactiveVariable(3)) + .AddAttackProcessCurrentTime() + .AddInAttackProcess() + .AddStartAttackRequest() + .AddStartAttackEvent() + .AddEndAttackEvent(); ICompositeCondition canMove = new CompositeCondition() .Add(new FuncCondition(() => entity.IsDead.Value == false)); @@ -63,12 +70,18 @@ namespace _Project.Develop.Runtime.Entities ICompositeCondition canApplyDamage = new CompositeCondition() .Add(new FuncCondition(() => entity.IsDead.Value == false)); + + ICompositeCondition canStartAttack = new CompositeCondition() + .Add(new FuncCondition(() => entity.IsDead.Value == false)) + .Add(new FuncCondition(() => entity.InAttackProcess.Value == false)) + .Add(new FuncCondition(() => entity.IsMoving.Value == false)); entity .AddCanMove(canMove) .AddCanRotate(canRotate) .AddCanApplyDamage(canApplyDamage) .AddMustDie(mustDie) + .AddCanStartAttack(canStartAttack) .AddMustSelfRelease(mustSelfRelease); entity @@ -76,9 +89,16 @@ namespace _Project.Develop.Runtime.Entities .AddSystem(new RotateDirectionByMoveInputSystem(_playerInput)) .AddSystem(new RigidbodyMovementSystem()) .AddSystem(new RigidbodyRotationSystem()) + + .AddSystem(new StartAttackSystem()) + .AddSystem(new ProcessAttackTimerSystem()) + .AddSystem(new EndAttackSystem()) + .AddSystem(new ApplyDamageSystem()) + .AddSystem(new DeathSwitcherSystem()) .AddSystem(new DeathProcessTimerSystem()) + .AddSystem(new DisableCollidersOnDeathSystem()) .AddSystem(new SelfReleaseSystem(_entitiesLifeContext)); @@ -136,14 +156,18 @@ namespace _Project.Develop.Runtime.Entities .AddMustSelfRelease(mustSelfRelease); entity - .AddSystem(new BodyContactsDetectingSystem()) - .AddSystem(new BodyContactsEntitiesFilterSystem(_collidersRegistryService)) - .AddSystem(new DealDamageOnContactSystem()) - .AddSystem(new ApplyDamageSystem()) .AddSystem(new RigidbodyMovementSystem()) .AddSystem(new RigidbodyRotationSystem()) + + .AddSystem(new BodyContactsDetectingSystem()) + .AddSystem(new BodyContactsEntitiesFilterSystem(_collidersRegistryService)) + + .AddSystem(new DealDamageOnContactSystem()) + .AddSystem(new ApplyDamageSystem()) + .AddSystem(new DeathSwitcherSystem()) .AddSystem(new DeathProcessTimerSystem()) + .AddSystem(new DisableCollidersOnDeathSystem()) .AddSystem(new SelfReleaseSystem(_entitiesLifeContext)); diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/Generated/EntityAPI.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/Generated/EntityAPI.cs index b22bfdd..455af4a 100644 --- a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/Generated/EntityAPI.cs +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Entities/Generated/EntityAPI.cs @@ -719,5 +719,216 @@ namespace _Project.Develop.Runtime.Entities return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Damage.BodyContactDamage() {Value = value}); } + public _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.StartAttackRequest StartAttackRequestC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Attack.StartAttackRequest>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent StartAttackRequest => StartAttackRequestC.Value; + + public bool TryGetStartAttackRequest(out _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.StartAttackRequest component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddStartAttackRequest() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.StartAttackRequest() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddStartAttackRequest(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.StartAttackRequest() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.StartAttackEvent StartAttackEventC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Attack.StartAttackEvent>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent StartAttackEvent => StartAttackEventC.Value; + + public bool TryGetStartAttackEvent(out _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.StartAttackEvent component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddStartAttackEvent() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.StartAttackEvent() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddStartAttackEvent(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.StartAttackEvent() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.CanStartAttack CanStartAttackC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Attack.CanStartAttack>(); + + public _Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition CanStartAttack => CanStartAttackC.Value; + + public bool TryGetCanStartAttack(out _Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.CanStartAttack component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddCanStartAttack(_Project.Develop.Runtime.Utilities.Conditions.ICompositeCondition value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.CanStartAttack() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.EndAttackEvent EndAttackEventC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Attack.EndAttackEvent>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent EndAttackEvent => EndAttackEventC.Value; + + public bool TryGetEndAttackEvent(out _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.EndAttackEvent component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddEndAttackEvent() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.EndAttackEvent() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddEndAttackEvent(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.EndAttackEvent() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackProcessInitialTime AttackProcessInitialTimeC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackProcessInitialTime>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable AttackProcessInitialTime => AttackProcessInitialTimeC.Value; + + public bool TryGetAttackProcessInitialTime(out _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackProcessInitialTime component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddAttackProcessInitialTime() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackProcessInitialTime() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddAttackProcessInitialTime(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackProcessInitialTime() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackProcessCurrentTime AttackProcessCurrentTimeC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackProcessCurrentTime>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable AttackProcessCurrentTime => AttackProcessCurrentTimeC.Value; + + public bool TryGetAttackProcessCurrentTime(out _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackProcessCurrentTime component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddAttackProcessCurrentTime() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackProcessCurrentTime() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddAttackProcessCurrentTime(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackProcessCurrentTime() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackDelayTime AttackDelayTimeC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackDelayTime>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable AttackDelayTime => AttackDelayTimeC.Value; + + public bool TryGetAttackDelayTime(out _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackDelayTime component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddAttackDelayTime() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackDelayTime() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddAttackDelayTime(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackDelayTime() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackDelayEndEvent AttackDelayEndEventC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackDelayEndEvent>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent AttackDelayEndEvent => AttackDelayEndEventC.Value; + + public bool TryGetAttackDelayEndEvent(out _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackDelayEndEvent component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddAttackDelayEndEvent() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackDelayEndEvent() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddAttackDelayEndEvent(_Project.Develop.Runtime.Utils.ReactiveManagement.Event.ReactiveEvent value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.AttackDelayEndEvent() {Value = value}); + } + + public _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.InAttackProcess InAttackProcessC => GetComponent<_Project.Develop.Runtime.Logic.Gameplay.Features.Attack.InAttackProcess>(); + + public _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable InAttackProcess => InAttackProcessC.Value; + + public bool TryGetInAttackProcess(out _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + bool result = TryGetComponent(out _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.InAttackProcess component); + if(result) + value = component.Value; + else + value = default(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable); + return result; + } + + public _Project.Develop.Runtime.Entities.Entity AddInAttackProcess() + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.InAttackProcess() { Value = new _Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable() }); + } + + public _Project.Develop.Runtime.Entities.Entity AddInAttackProcess(_Project.Develop.Runtime.Utils.ReactiveManagement.ReactiveVariable value) + { + return AddComponent(new _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.InAttackProcess() {Value = value}); + } + } } diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack.meta new file mode 100644 index 0000000..9e47273 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b89412a37593416d972b8a40fe4ad61d +timeCreated: 1771680505 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/AttackComponents.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/AttackComponents.cs new file mode 100644 index 0000000..4cb43a1 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/AttackComponents.cs @@ -0,0 +1,22 @@ +using _Project.Develop.Runtime.Entities; +using _Project.Develop.Runtime.Utilities.Conditions; +using _Project.Develop.Runtime.Utils.ReactiveManagement; +using _Project.Develop.Runtime.Utils.ReactiveManagement.Event; + +namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Attack +{ + public class StartAttackRequest : IEntityComponent { public ReactiveEvent Value; } + public class StartAttackEvent : IEntityComponent { public ReactiveEvent Value; } + + public class CanStartAttack : IEntityComponent { public ICompositeCondition Value; } + + public class EndAttackEvent : IEntityComponent { public ReactiveEvent Value; } + + public class AttackProcessInitialTime : IEntityComponent { public ReactiveVariable Value; } + public class AttackProcessCurrentTime : IEntityComponent { public ReactiveVariable Value; } + + public class AttackDelayTime : IEntityComponent { public ReactiveVariable Value; } + public class AttackDelayEndEvent : IEntityComponent { public ReactiveEvent Value; } + + public class InAttackProcess : IEntityComponent { public ReactiveVariable Value; } +} \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/AttackComponents.cs.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/AttackComponents.cs.meta new file mode 100644 index 0000000..5379cec --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/AttackComponents.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 09e2d7dedb34455a8ca464d3a25e6f38 +timeCreated: 1771680515 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems.meta new file mode 100644 index 0000000..1f2228a --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: db3e7a5aa2634428a39cefa672bbb597 +timeCreated: 1771680531 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base.meta new file mode 100644 index 0000000..5e7c7ab --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5e5cd43b995e43eaaf01eb772ce4e53f +timeCreated: 1771681280 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/EndAttackSystem.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/EndAttackSystem.cs new file mode 100644 index 0000000..d403687 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/EndAttackSystem.cs @@ -0,0 +1,44 @@ +using System; +using _Project.Develop.Runtime.Entities; +using _Project.Develop.Runtime.Utils.ReactiveManagement; +using _Project.Develop.Runtime.Utils.ReactiveManagement.Event; +using UnityEngine; + +namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.Systems +{ + public class EndAttackSystem : IInitializableSystem, IDisposableSystem + { + private ReactiveEvent _endAttackEvent; + private ReactiveVariable _inAttackProcess; + private ReactiveVariable _attackProcessInitialTime; + private ReactiveVariable _attackProcessCurrentTime; + + private IDisposable _timerDisposable; + + public void OnInit(Entity entity) + { + _endAttackEvent = entity.EndAttackEvent; + _inAttackProcess = entity.InAttackProcess; + _attackProcessInitialTime = entity.AttackProcessInitialTime; + _attackProcessCurrentTime = entity.AttackProcessCurrentTime; + + _timerDisposable = _attackProcessCurrentTime.Subscribe(OnTimerChanged); + } + + private void OnTimerChanged(float arg1, float currentTime) + { + if (TimeIsDone(currentTime)) + { + _inAttackProcess.Value = false; + _endAttackEvent.Invoke(); + } + } + + public void OnDispose() + { + _timerDisposable.Dispose(); + } + + private bool TimeIsDone(float currentTime) => currentTime >= _attackProcessInitialTime.Value; + } +} \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/EndAttackSystem.cs.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/EndAttackSystem.cs.meta new file mode 100644 index 0000000..e9cb899 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/EndAttackSystem.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 14247d25256641f4bdebce95c190de83 +timeCreated: 1771681439 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/ProcessAttackTimerSystem.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/ProcessAttackTimerSystem.cs new file mode 100644 index 0000000..ee424b5 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/ProcessAttackTimerSystem.cs @@ -0,0 +1,43 @@ +using System; +using _Project.Develop.Runtime.Entities; +using _Project.Develop.Runtime.Utils.ReactiveManagement; +using _Project.Develop.Runtime.Utils.ReactiveManagement.Event; + +namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.Systems +{ + public class ProcessAttackTimerSystem: IInitializableSystem, IDisposableSystem, IUpdatableSystem + { + private ReactiveVariable _currentTime; + private ReactiveVariable _inAttackProcess; + private ReactiveEvent _startAttackEvent; + + private IDisposable _startAttackEventDisposable; + + public void OnInit(Entity entity) + { + _currentTime = entity.AttackProcessCurrentTime; + _inAttackProcess = entity.InAttackProcess; + _startAttackEvent = entity.StartAttackEvent; + + _startAttackEventDisposable = _startAttackEvent.Subscribe(OnStartAttackProcess); + } + + private void OnStartAttackProcess() + { + _currentTime.Value = 0; + } + + public void OnUpdate(float deltaTime) + { + if (_inAttackProcess.Value == false) + return; + + _currentTime.Value += deltaTime; + } + + public void OnDispose() + { + _startAttackEventDisposable.Dispose(); + } + } +} \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/ProcessAttackTimerSystem.cs.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/ProcessAttackTimerSystem.cs.meta new file mode 100644 index 0000000..2477a32 --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/ProcessAttackTimerSystem.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7b3331518167469c8bedadab4206184f +timeCreated: 1771681046 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/StartAttackSystem.cs b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/StartAttackSystem.cs new file mode 100644 index 0000000..ad27e2f --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/StartAttackSystem.cs @@ -0,0 +1,43 @@ +using System; +using _Project.Develop.Runtime.Entities; +using _Project.Develop.Runtime.Utilities.Conditions; +using _Project.Develop.Runtime.Utils.ReactiveManagement; +using _Project.Develop.Runtime.Utils.ReactiveManagement.Event; +using UnityEngine; + +namespace _Project.Develop.Runtime.Logic.Gameplay.Features.Attack.Systems +{ + public class StartAttackSystem : IInitializableSystem, IDisposableSystem + { + private ReactiveEvent _startAttackRequest; + private ReactiveEvent _startAttackEvent; + private ReactiveVariable _inAttackProcess; + private ICompositeCondition _canStartAttack; + + private IDisposable _attackRequestDisposable; + + public void OnInit(Entity entity) + { + _startAttackRequest = entity.StartAttackRequest; + _startAttackEvent = entity.StartAttackEvent; + _inAttackProcess = entity.InAttackProcess; + _canStartAttack = entity.CanStartAttack; + + _attackRequestDisposable = _startAttackRequest.Subscribe(OnAttackRequest); + } + + private void OnAttackRequest() + { + if (_canStartAttack.Evaluate()) + { + _inAttackProcess.Value = true; + _startAttackEvent.Invoke(); + } + } + + public void OnDispose() + { + _attackRequestDisposable.Dispose(); + } + } +} \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/StartAttackSystem.cs.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/StartAttackSystem.cs.meta new file mode 100644 index 0000000..f8e9dfd --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Base/StartAttackSystem.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a699afa5a7c24f0c8d16cc6639068255 +timeCreated: 1771680808 \ No newline at end of file diff --git a/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Shoot.meta b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Shoot.meta new file mode 100644 index 0000000..31cdafe --- /dev/null +++ b/Assets/_Project/Develop/Runtime/Logic/Gameplay/Features/Attack/Systems/Shoot.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 30ae0ba2feaa4da3b5463d2cb8d5bfbe +timeCreated: 1771681294 \ No newline at end of file