Damage source and effect fix

This commit is contained in:
Фёдор Веселов 2024-10-06 19:55:42 +05:00
commit c89d93cf24
15 changed files with 52 additions and 34 deletions

View file

@ -14,7 +14,7 @@ public partial class FlashComponent : CanvasGroup
_shaderMaterial = Material as ShaderMaterial;
}
public void DamageFlash(int damage)
public void DamageFlash(int damage,Node origin)
{
Flash();
}

View file

@ -1,3 +1,5 @@
using Godot;
namespace Newlon.Components;
//
@ -7,6 +9,7 @@ public interface IEntity
{
public int Hp { get; }
public int MaxHp { get; }
public void TakeDamage(int amount);
public void Heal(int amount);
public void TakeDamage(int amount,Node origin, Utility.DamageTypes damageType = Utility.DamageTypes.PHYSICAL);
public void Heal(int amount, Node origin);
}

View file

@ -15,8 +15,12 @@ public partial class LinearProjectile : Area2D, IProjectile
private int _damage;
[Export]
private Effect _impactEffect;
[Export]
private Utility.DamageTypes _damageType = Utility.DamageTypes.PHYSICAL;
private int _line;
private bool used = false;
public int Line { get => _line; set { _line = value; } }
public override void _PhysicsProcess(double delta)
{
@ -25,10 +29,12 @@ public partial class LinearProjectile : Area2D, IProjectile
public void OnAreaEntered(Area2D area)
{
if (used == true) return;
var entity = area.GetParent<IEntity>();
if (entity != null)
{
entity.TakeDamage(_damage);
entity.TakeDamage(_damage,this,_damageType);
used = true;
if (entity is IEffectHandler effectHandler && _impactEffect != null)
effectHandler.GiveEffect(_impactEffect);
QueueFree();

View file

@ -12,7 +12,7 @@ public partial class AreaAttack : Area2D
foreach (var zombie in GetOverlappingAreas())
{
var zombieData = zombie.GetParent<RuntimeZombieData>();
zombieData?.TakeDamage(_damage);
zombieData?.TakeDamage(_damage,GetParent());
}
}
}

View file

@ -12,7 +12,7 @@ public partial class ExplosionComponent : Area2D
foreach(var zombie in GetOverlappingAreas())
{
var zombieData = zombie.GetParent<RuntimeZombieData>();
zombieData?.TakeDamage(damage);
zombieData?.TakeDamage(damage,GetParent());
}
GetParent<RuntimePlantData>().Kill();

View file

@ -18,18 +18,18 @@ public partial class RuntimePlantData : Node2D, IEntity
public PlantResource Resource;
[Signal]
public delegate void OnHPChangedEventHandler(int amount);
public delegate void OnHPChangedEventHandler(int amount,Node origin);
public override void _Ready()
{
_hp = _maxHP;
}
public void Heal(int amount)
public void Heal(int amount,Node origin)
{
_hp += amount;
EmitSignal(SignalName.OnHPChanged,amount);
EmitSignal(SignalName.OnHPChanged,amount,origin);
if (MaxHp > 0)
{
@ -37,11 +37,11 @@ public partial class RuntimePlantData : Node2D, IEntity
}
}
public void TakeDamage(int amount)
public void TakeDamage(int amount,Node origin, Utility.DamageTypes damageType = Utility.DamageTypes.PHYSICAL)
{
_hp -= amount;
EmitSignal(SignalName.OnHPChanged,-amount);
EmitSignal(SignalName.OnHPChanged,-amount, origin);
if (_hp <= 0)
{

View file

@ -24,7 +24,7 @@ public partial class AloeBehaviour : Node
{
if((float)plantData.Hp / (float)plantData.MaxHp < _hpTreshold)
{
plantData.Heal(3000 + 25 * plantData.MaxHp);
plantData.Heal(3000 + 25 * plantData.MaxHp,GetParent());
_charge = false;
_player.Play("aloe/heal");
_player.Queue("aloe/idle_used");

View file

@ -4,7 +4,7 @@ namespace Newlon.Components.Zombies;
public partial class AudioDamage : AudioStreamPlayer2D
{
public void OnDamaged(int amount)
public void OnDamaged(int amount, Node origin)
{
Play();
}

View file

@ -15,7 +15,7 @@ public partial class EatBox : Area2D
public void Bite()
{
plant.TakeDamage(_damage);
plant?.TakeDamage(_damage,GetParent());
}
public void OnAreaEntered(Area2D area)

View file

@ -7,7 +7,7 @@ namespace Newlon.Components.Zombies;
public partial class RuntimeZombieData : Node2D, IEntity, ILocalTimescale, IEffectHandler
{
[Signal]
public delegate void OnHPChangedEventHandler(int deltaHP);
public delegate void OnHPChangedEventHandler(int deltaHP, Node origin);
[Signal]
public delegate void OnLocalTimescaleChangedEventHandler(int currentTimescale);
@ -45,14 +45,15 @@ public partial class RuntimeZombieData : Node2D, IEntity, ILocalTimescale, IEffe
var timer = new Timer() {Autostart = false, OneShot = true};
_effectSlotTimers[i] = timer;
AddChild(timer);
timer.Timeout += () => {EndEffectAtSlot(i);};
int current_index = i;
timer.Timeout += () => {EndEffectAtSlot(current_index);};
}
}
public void Heal(int amount)
public void Heal(int amount,Node origin)
{
_hp += amount;
EmitSignal(SignalName.OnHPChanged,amount);
EmitSignal(SignalName.OnHPChanged,amount,origin);
if (MaxHp > 0)
{
@ -60,10 +61,10 @@ public partial class RuntimeZombieData : Node2D, IEntity, ILocalTimescale, IEffe
}
}
public void TakeDamage(int amount)
public void TakeDamage(int amount, Node origin, Utility.DamageTypes damageType = Utility.DamageTypes.PHYSICAL)
{
_hp -= amount;
EmitSignal(SignalName.OnHPChanged,-amount);
EmitSignal(SignalName.OnHPChanged,-amount, origin);
if (_hp <= 0)
{
@ -101,7 +102,7 @@ public partial class RuntimeZombieData : Node2D, IEntity, ILocalTimescale, IEffe
public void ProcessEffects()
{
for(int i = 0; i < Utility.EffectSlotCount; i++)
_activeEffectSlots[i].Process(this);
_activeEffectSlots[i]?.Process(this);
}
private void EndEffectAtSlot(int slot)