Exemplo n.º 1
0
    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);
    }
Exemplo n.º 2
0
    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);
    }