Add event publishing for inventory and combat interactions
This commit is contained in:
@@ -34,5 +34,8 @@ public class DamageSystem : ISystem
|
|||||||
{
|
{
|
||||||
var targetAttributes = _world.GetComponent<AttributeComponent>(e.Target);
|
var targetAttributes = _world.GetComponent<AttributeComponent>(e.Target);
|
||||||
targetAttributes?.ModifyValue(Attribute.Health, -e.Amount);
|
targetAttributes?.ModifyValue(Attribute.Health, -e.Amount);
|
||||||
|
|
||||||
|
var newHealth = targetAttributes?.GetValue(Attribute.Health) ?? 0f;
|
||||||
|
_world.PublishEvent(new EntityDamagedEvent(e.Target, newHealth, e.Amount));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using GameCore.Combat.Interfaces;
|
using GameCore.Combat.Interfaces;
|
||||||
|
using GameCore.Events;
|
||||||
using GameCore.Inventory;
|
using GameCore.Inventory;
|
||||||
|
|
||||||
namespace GameCore.Combat.Effects;
|
namespace GameCore.Combat.Effects;
|
||||||
@@ -8,7 +9,12 @@ public class ConsumeAmmoCost(string ammoId, int amount) : ICostEffect
|
|||||||
public void Execute(EffectContext context)
|
public void Execute(EffectContext context)
|
||||||
{
|
{
|
||||||
var inventory = context.World.GetComponent<InventoryComponent>(context.Owner);
|
var inventory = context.World.GetComponent<InventoryComponent>(context.Owner);
|
||||||
inventory?.RemoveItem(ammoId, amount);
|
if (inventory == null) return;
|
||||||
|
|
||||||
|
inventory.RemoveItem(ammoId, amount);
|
||||||
|
|
||||||
|
var newQuantity = inventory.GetItemCount(ammoId);
|
||||||
|
context.World.PublishEvent(new InventoryItemChangedEvent(context.Owner, ammoId, newQuantity));
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool CanAfford(EffectContext context)
|
public bool CanAfford(EffectContext context)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using GameCore.Combat.Interfaces;
|
using GameCore.Combat.Interfaces;
|
||||||
|
using GameCore.Events;
|
||||||
using GameCore.Input;
|
using GameCore.Input;
|
||||||
|
|
||||||
namespace GameCore.Combat.Effects;
|
namespace GameCore.Combat.Effects;
|
||||||
@@ -12,8 +13,11 @@ public class HitscanEffect(float range) : IEffect
|
|||||||
|
|
||||||
if (input == null || weapon == null) return;
|
if (input == null || weapon == null) return;
|
||||||
|
|
||||||
var targetPos = input.MuzzlePosition + input.MuzzleDirection * range;
|
var fromPos = input.MuzzlePosition;
|
||||||
var hit = context.World.WorldQuery.Raycast(input.MuzzlePosition, targetPos, context.Owner);
|
var targetPos = fromPos + input.MuzzleDirection * range;
|
||||||
|
var hit = context.World.WorldQuery.Raycast(fromPos, targetPos, context.Owner);
|
||||||
|
|
||||||
|
context.World.PublishEvent(new HitscanImpactEvent(context.Owner, fromPos, targetPos, hit));
|
||||||
|
|
||||||
if (hit.DidHit)
|
if (hit.DidHit)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using GameCore.Combat.Effects;
|
using GameCore.Combat.Effects;
|
||||||
using GameCore.ECS;
|
using GameCore.ECS;
|
||||||
using GameCore.ECS.Interfaces;
|
using GameCore.ECS.Interfaces;
|
||||||
|
using GameCore.Events;
|
||||||
using GameCore.Physics;
|
using GameCore.Physics;
|
||||||
|
|
||||||
namespace GameCore.Combat;
|
namespace GameCore.Combat;
|
||||||
@@ -24,6 +25,7 @@ public class ProjectileSystem : ISystem
|
|||||||
var hit = world.WorldQuery.Raycast(position.Position, newPosition, projectileData.Owner);
|
var hit = world.WorldQuery.Raycast(position.Position, newPosition, projectileData.Owner);
|
||||||
if (hit.DidHit)
|
if (hit.DidHit)
|
||||||
{
|
{
|
||||||
|
world.PublishEvent(new ProjectileImpactEvent(projectile, hit));
|
||||||
var hitContext = new EffectContext
|
var hitContext = new EffectContext
|
||||||
{
|
{
|
||||||
World = world,
|
World = world,
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
|
using GameCore.Math;
|
||||||
|
|
||||||
namespace GameCore.ECS;
|
namespace GameCore.ECS;
|
||||||
|
|
||||||
public struct HitResult
|
public struct HitResult
|
||||||
{
|
{
|
||||||
public bool DidHit;
|
public bool DidHit;
|
||||||
public Entity HitEntity;
|
public Entity? HitEntity;
|
||||||
|
public Vector3 Position;
|
||||||
|
public Vector3 Normal;
|
||||||
}
|
}
|
||||||
11
GameCore/Events/EntityDamagedEvent.cs
Normal file
11
GameCore/Events/EntityDamagedEvent.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
using GameCore.ECS;
|
||||||
|
using GameCore.Events.Interfaces;
|
||||||
|
|
||||||
|
namespace GameCore.Events;
|
||||||
|
|
||||||
|
public readonly struct EntityDamagedEvent(Entity target, float newHealth, float damageTaken) : IEvent
|
||||||
|
{
|
||||||
|
public readonly Entity Target = target;
|
||||||
|
public readonly float NewHealth = newHealth;
|
||||||
|
public readonly float DamageTaken = damageTaken;
|
||||||
|
}
|
||||||
13
GameCore/Events/HitscanImpactEvent.cs
Normal file
13
GameCore/Events/HitscanImpactEvent.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
using GameCore.ECS;
|
||||||
|
using GameCore.Events.Interfaces;
|
||||||
|
using GameCore.Math;
|
||||||
|
|
||||||
|
namespace GameCore.Events;
|
||||||
|
|
||||||
|
public readonly struct HitscanImpactEvent(Entity owner, Vector3 from, Vector3 to, HitResult hit) : IEvent
|
||||||
|
{
|
||||||
|
public readonly Entity Owner = owner;
|
||||||
|
public readonly Vector3 From = from;
|
||||||
|
public readonly Vector3 To = to;
|
||||||
|
public readonly HitResult Hit = hit;
|
||||||
|
}
|
||||||
10
GameCore/Events/InstantItemUsedEvent.cs
Normal file
10
GameCore/Events/InstantItemUsedEvent.cs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
using GameCore.ECS;
|
||||||
|
using GameCore.Events.Interfaces;
|
||||||
|
|
||||||
|
namespace GameCore.Events;
|
||||||
|
|
||||||
|
public readonly struct InstantItemUsedEvent(Entity picker, string itemId) : IEvent
|
||||||
|
{
|
||||||
|
public readonly Entity Picker = picker;
|
||||||
|
public readonly string ItemId = itemId;
|
||||||
|
}
|
||||||
11
GameCore/Events/InventoryItemChangedEvent.cs
Normal file
11
GameCore/Events/InventoryItemChangedEvent.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
using GameCore.ECS;
|
||||||
|
using GameCore.Events.Interfaces;
|
||||||
|
|
||||||
|
namespace GameCore.Events;
|
||||||
|
|
||||||
|
public readonly struct InventoryItemChangedEvent(Entity owner, string itemId, int newQuantity) : IEvent
|
||||||
|
{
|
||||||
|
public readonly Entity Owner = owner;
|
||||||
|
public readonly string ItemId = itemId;
|
||||||
|
public readonly int NewQuantity = newQuantity;
|
||||||
|
}
|
||||||
10
GameCore/Events/ProjectileImpactEvent.cs
Normal file
10
GameCore/Events/ProjectileImpactEvent.cs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
using GameCore.ECS;
|
||||||
|
using GameCore.Events.Interfaces;
|
||||||
|
|
||||||
|
namespace GameCore.Events;
|
||||||
|
|
||||||
|
public readonly struct ProjectileImpactEvent(Entity projectile, HitResult hit) : IEvent
|
||||||
|
{
|
||||||
|
public readonly Entity ProjectileEntity = projectile;
|
||||||
|
public readonly HitResult Hit = hit;
|
||||||
|
}
|
||||||
10
GameCore/Events/WeaponEquippedEvent.cs
Normal file
10
GameCore/Events/WeaponEquippedEvent.cs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
using GameCore.ECS;
|
||||||
|
using GameCore.Events.Interfaces;
|
||||||
|
|
||||||
|
namespace GameCore.Events;
|
||||||
|
|
||||||
|
public readonly struct WeaponEquippedEvent(Entity owner, string newWeaponItemId) : IEvent
|
||||||
|
{
|
||||||
|
public readonly Entity Owner = owner;
|
||||||
|
public readonly string NewWeaponItemId = newWeaponItemId;
|
||||||
|
}
|
||||||
@@ -21,6 +21,10 @@ public class InventorySystem : ISystem
|
|||||||
private void OnAddItem(AddItemToInventoryEvent e)
|
private void OnAddItem(AddItemToInventoryEvent e)
|
||||||
{
|
{
|
||||||
var inventory = _world.GetComponent<InventoryComponent>(e.Target);
|
var inventory = _world.GetComponent<InventoryComponent>(e.Target);
|
||||||
inventory?.AddItem(e.Item);
|
if (inventory == null) return;
|
||||||
|
inventory.AddItem(e.Item);
|
||||||
|
|
||||||
|
var newQuantity = inventory.GetItemCount(e.Item.ItemId);
|
||||||
|
_world.PublishEvent(new InventoryItemChangedEvent(e.Target, e.Item.ItemId, newQuantity));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -27,6 +27,7 @@ public class ItemAcquisitionSystem : ISystem
|
|||||||
|
|
||||||
if (pickupComponent.IsInstantUse)
|
if (pickupComponent.IsInstantUse)
|
||||||
{
|
{
|
||||||
|
_world.PublishEvent(new InstantItemUsedEvent(e.Picker, e.ItemId));
|
||||||
var context = new EffectContext
|
var context = new EffectContext
|
||||||
{
|
{
|
||||||
World = _world,
|
World = _world,
|
||||||
|
|||||||
@@ -38,5 +38,7 @@ public class EquipmentSystem : ISystem
|
|||||||
weaponComponent.OnFireEffects = newData.OnFireEffects;
|
weaponComponent.OnFireEffects = newData.OnFireEffects;
|
||||||
weaponComponent.OnHitEffects = newData.OnHitEffects;
|
weaponComponent.OnHitEffects = newData.OnHitEffects;
|
||||||
weaponComponent.CooldownTimer = 0f;
|
weaponComponent.CooldownTimer = 0f;
|
||||||
|
|
||||||
|
_world.PublishEvent(new WeaponEquippedEvent(e.Owner, e.NewWeaponItemId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user