vampire-like/Assets/GameMain/Scripts/Simulation/Jobs/SimulationWorld.CollisionPr...

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
}
}