116 lines
3.5 KiB
C#
116 lines
3.5 KiB
C#
using CustomEvent;
|
|
using Definition.DataStruct;
|
|
using Entity;
|
|
using Entity.Weapon;
|
|
using UnityEngine;
|
|
|
|
namespace Simulation
|
|
{
|
|
public sealed partial class SimulationWorld
|
|
{
|
|
#region Collision Presentation
|
|
|
|
private void DispatchProjectileHitPresentationEvent(int projectileEntityId, int sourceEntityId,
|
|
int sourceOwnerEntityId, int targetEntityId, int damage, in Vector3 hitPosition)
|
|
{
|
|
if (!_dispatchProjectileHitPresentationEvent)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var eventComponent = GameEntry.Event;
|
|
if (eventComponent == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
eventComponent.Fire(this, ProjectileHitPresentationEventArgs.Create(
|
|
projectileEntityId,
|
|
sourceEntityId,
|
|
sourceOwnerEntityId,
|
|
targetEntityId,
|
|
damage,
|
|
hitPosition,
|
|
_dispatchProjectileHitMarkerEvent,
|
|
_dispatchProjectileHitEffectEvent,
|
|
_projectileHitPresentationEffectTypeId));
|
|
}
|
|
|
|
private static bool TryResolveImpactSource(EntityBase sourceEntity, EntityBase ownerEntity,
|
|
out EntityBase attacker, out ImpactData impactData)
|
|
{
|
|
if (TryResolveImpactFromEntity(sourceEntity, out impactData))
|
|
{
|
|
attacker = sourceEntity;
|
|
return true;
|
|
}
|
|
|
|
if (TryResolveImpactFromEntity(ownerEntity, out impactData))
|
|
{
|
|
attacker = ownerEntity;
|
|
return true;
|
|
}
|
|
|
|
attacker = null;
|
|
impactData = default;
|
|
return false;
|
|
}
|
|
|
|
private static bool TryResolveImpactFromEntity(EntityBase entity, out ImpactData impactData)
|
|
{
|
|
if (entity is WeaponBase weapon)
|
|
{
|
|
impactData = weapon.GetImpactData();
|
|
return true;
|
|
}
|
|
|
|
if (entity is EnemyProjectile enemyProjectile)
|
|
{
|
|
impactData = enemyProjectile.GetImpactData();
|
|
return true;
|
|
}
|
|
|
|
if (entity is TargetableObject targetableObject)
|
|
{
|
|
impactData = targetableObject.GetImpactData();
|
|
return true;
|
|
}
|
|
|
|
impactData = default;
|
|
return false;
|
|
}
|
|
|
|
private static bool TryGetAliveTargetableEntity(int entityId, out TargetableObject target)
|
|
{
|
|
target = null;
|
|
|
|
var enemyManager = GameEntry.EnemyManager;
|
|
if (enemyManager != null && enemyManager.TryGetEnemy(entityId, out EntityBase enemyEntity))
|
|
{
|
|
if (enemyEntity is TargetableObject enemyTarget && enemyTarget.Available && !enemyTarget.IsDead)
|
|
{
|
|
target = enemyTarget;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
EntityBase entity = TryGetEntityById(entityId);
|
|
if (entity is TargetableObject targetable && targetable.Available && !targetable.IsDead)
|
|
{
|
|
target = targetable;
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private static EntityBase TryGetEntityById(int entityId)
|
|
{
|
|
var entityComponent = GameEntry.Entity;
|
|
return entityComponent != null ? entityComponent.GetGameEntity(entityId) : null;
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|