public static void Create(EntityCommandBuffer commandBuffer, int tick, Entity instigator, float3 center, int collisionMask, SplashDamageSettings settings) { var request = new SplashDamageRequest { instigator = instigator, tick = tick, center = center, collisionMask = collisionMask, settings = settings }; commandBuffer.AddComponent(commandBuffer.CreateEntity(), request); }
void Damage(float3 origin, ref SplashDamageSettings settings, Entity instigator, Entity hitCollisionOwnerEntity, float3 centerOfMass) { // TODO (mogens) dont hardcode center of mass - and dont get from Character. Should be set on hitCollOwner by some other system if (EntityManager.HasComponent <Character>(hitCollisionOwnerEntity)) { var charPredicedState = EntityManager.GetComponentData <CharacterPredictedData>(hitCollisionOwnerEntity); centerOfMass = charPredicedState.position + Vector3.up * 1.2f; } // Calc damage var damageVector = centerOfMass - origin; var damageDirection = math.normalize(damageVector); var distance = math.length(damageVector); if (distance > settings.radius) { return; } var damage = settings.damage; var impulse = settings.impulse; if (distance > settings.falloffStartRadius) { var falloffFraction = (distance - settings.falloffStartRadius) / (settings.radius - settings.falloffStartRadius); damage -= (settings.damage - settings.minDamage) * falloffFraction; impulse -= (settings.impulse - settings.minImpulse) * falloffFraction; } if (instigator != Entity.Null && instigator == hitCollisionOwnerEntity) { damage = damage * settings.ownerDamageFraction; } //GameDebug.Log(string.Format("SplashDamage. Target:{0} Inst:{1}", collider.hitCollision, m_world.GetGameObjectFromEntity(instigator) )); var damageEventBuffer = EntityManager.GetBuffer <DamageEvent>(hitCollisionOwnerEntity); DamageEvent.AddEvent(damageEventBuffer, instigator, damage, damageDirection, impulse); }