示例#1
0
文件: Barrier.cs 项目: mts508/Artemis
    private void InitBarrier(
        int guid,
        string name,
        Vector3 center,
        Vector3 facingDir,
        float width,
        bool bidirectional,
        BlockingRules blocksVision,
        BlockingRules blocksAbilities,
        BlockingRules blocksMovement,
        BlockingRules blocksMovementOnCrossover,
        BlockingRules blocksPositionTargeting,
        bool considerAsCover,
        int maxDuration,
        ActorData owner,
        List <GameObject> barrierSequencePrefabs,
        bool playSequences,
        GameplayResponseForActor onEnemyMovedThrough,
        GameplayResponseForActor onAllyMovedThrough,
        int maxHits,
        bool endOnCasterDeath,
        SequenceSource parentSequenceSource,
        Team barrierTeam)
    {
        m_guid          = guid;
        m_name          = name;
        m_center        = center;
        m_facingDir     = facingDir;
        m_bidirectional = bidirectional;
        Vector3 a = Vector3.Cross(facingDir, Vector3.up);

        a.Normalize();
        float d = width * Board.Get().squareSize;

        m_endpoint1               = center + a * d / 2f;
        m_endpoint2               = center - a * d / 2f;
        BlocksVision              = blocksVision;
        BlocksAbilities           = blocksAbilities;
        BlocksMovement            = blocksMovement;
        BlocksMovementOnCrossover = blocksMovementOnCrossover;
        BlocksPositionTargeting   = blocksPositionTargeting;
        m_considerAsCover         = considerAsCover;
        m_owner                  = owner;
        m_team                   = m_owner?.GetTeam() ?? barrierTeam;
        m_time                   = new EffectDuration();
        m_time.duration          = maxDuration;
        m_barrierSequencePrefabs = barrierSequencePrefabs;
        m_playSequences          = playSequences && m_barrierSequencePrefabs != null;
        m_barrierSequences       = new List <Sequence>();
        if (m_playSequences)
        {
            BarrierSequenceSource = new SequenceSource(null, null, false, parentSequenceSource);
        }
        m_maxHits = maxHits;

        // added
        m_onEnemyMovedThrough = onEnemyMovedThrough;
        m_onAllyMovedThrough  = onAllyMovedThrough;
        m_endOnCasterDeath    = endOnCasterDeath;
    }
示例#2
0
        private ClientActorHitResults MakeClientActorHitResults(Barrier barrier, GameplayResponseForActor response, ActorData hitter)
        {
            var  casterStats            = barrier.Caster.GetActorStats();
            var  casterStatus           = barrier.Caster.GetActorStatus();
            bool empowered              = casterStatus?.HasStatus(StatusType.Empowered) ?? false;
            bool weakened               = casterStatus?.HasStatus(StatusType.Weakened) ?? false;
            int  finalDamage            = casterStats?.CalculateOutgoingDamageForTargeter(response.m_damage) ?? response.m_damage;
            int  finalHealing           = casterStats?.CalculateOutgoingHealForTargeter(response.m_healing) ?? response.m_healing;
            int  techPointGainForCaster = 0;
            var  payload = GetBarrierPayload(barrier);

            if (payload != null && payload.GetTechPointsForCaster != null)
            {
                foreach (var tpi in payload.GetTechPointsForCaster(barrier))
                {
                    switch (tpi.m_type)
                    {
                    case TechPointInteractionType.RewardOnDamage_OncePerCast:
                        if (finalDamage > 0 && payload.Hits == 1)
                        {
                            techPointGainForCaster += tpi.m_amount;
                        }
                        break;

                    case TechPointInteractionType.RewardOnDamage_PerTarget:
                        if (finalDamage > 0)
                        {
                            techPointGainForCaster += tpi.m_amount;
                        }
                        break;

                    case TechPointInteractionType.RewardOnHit_OncePerCast:
                        if (payload.Hits == 1)
                        {
                            techPointGainForCaster += tpi.m_amount;
                        }
                        break;

                    case TechPointInteractionType.RewardOnHit_PerAllyTarget:
                        if (barrier.Caster.GetTeam() == hitter.GetTeam())
                        {
                            techPointGainForCaster += tpi.m_amount;
                        }
                        break;

                    case TechPointInteractionType.RewardOnHit_PerEnemyTarget:
                        if (barrier.Caster.GetTeam() != hitter.GetTeam())
                        {
                            techPointGainForCaster += tpi.m_amount;
                        }
                        break;

                    case TechPointInteractionType.RewardOnHit_PerTarget:
                        techPointGainForCaster += tpi.m_amount;
                        break;
                    }
                }
            }
            return(new ClientActorHitResultsBuilder()
                   .SetDamage(finalDamage, barrier.GetCenterPos(), false, empowered && !weakened, weakened && !empowered) // TODO apply weakened/empowered/energized/etc in builder
                   .SetHealing(finalHealing)
                   .SetTechPoints(response.m_techPoints, 0, techPointGainForCaster)                                       // TODO maybe response.m_techPoints is for caster too?
                   .SetRevealTarget()
                   .SetCanBeReactedTo(false)
                   .Build());
        }