示例#1
0
        void SearchUnits(List <Unit> targetList, float radius, bool check3D)
        {
            var check = new AnyUnitInObjectRangeCheck(this, radius, check3D);

            if (IsServerSide())
            {
                var searcher = new PlayerListSearcher(this, targetList, check);
                Cell.VisitWorldObjects(this, searcher, GetTemplate().MaxSearchRadius);
            }
            else
            {
                var searcher = new UnitListSearcher(this, targetList, check);
                Cell.VisitAllObjects(this, searcher, GetTemplate().MaxSearchRadius);
            }
        }
示例#2
0
            void OnPeriodic(AuraEffect aurEff)
            {
                // Every 5 seconds
                Unit target = GetTarget();
                Unit caster = GetCaster();

                // If our player is no longer sit, remove all auras
                if (target.GetStandState() != UnitStandStateType.Sit)
                {
                    target.RemoveAura(SpellIds.RomanticPicnicAchiev);
                    target.RemoveAura(GetAura());
                    return;
                }

                target.CastSpell(target, SpellIds.BasketCheck, false); // unknown use, it targets Romantic Basket
                target.CastSpell(target, RandomHelper.RAND(SpellIds.MealEatVisual, SpellIds.DrinkVisual), false);

                bool foundSomeone = false;
                // For nearby players, check if they have the same aura. If so, cast Romantic Picnic (45123)
                // required by achievement and "hearts" visual
                List <Player> playerList            = new List <Player>();
                AnyPlayerInObjectRangeCheck checker = new AnyPlayerInObjectRangeCheck(target, SharedConst.InteractionDistance * 2);
                var searcher = new PlayerListSearcher(target, playerList, checker);

                Cell.VisitWorldObjects(target, searcher, SharedConst.InteractionDistance * 2);
                foreach (var player in playerList)
                {
                    if (player != target && player.HasAura(GetId())) // && player.GetStandState() == UNIT_STAND_STATE_SIT)
                    {
                        if (caster)
                        {
                            caster.CastSpell(player, SpellIds.RomanticPicnicAchiev, true);
                            caster.CastSpell(target, SpellIds.RomanticPicnicAchiev, true);
                        }
                        foundSomeone = true;
                        // break;
                    }
                }

                if (!foundSomeone && target.HasAura(SpellIds.RomanticPicnicAchiev))
                {
                    target.RemoveAura(SpellIds.RomanticPicnicAchiev);
                }
            }
示例#3
0
        public virtual bool Update(uint diff)
        {
            if (!m_capturePoint)
            {
                return(false);
            }

            float radius = m_capturePoint.GetGoInfo().ControlZone.radius;

            for (int team = 0; team < 2; ++team)
            {
                foreach (var playerGuid in m_activePlayers[team].ToList())
                {
                    Player player = Global.ObjAccessor.FindPlayer(playerGuid);
                    if (player)
                    {
                        if (!m_capturePoint.IsWithinDistInMap(player, radius) || !player.IsOutdoorPvPActive())
                        {
                            HandlePlayerLeave(player);
                        }
                    }
                }
            }

            List <Player> players  = new List <Player>();
            var           checker  = new AnyPlayerInObjectRangeCheck(m_capturePoint, radius);
            var           searcher = new PlayerListSearcher(m_capturePoint, players, checker);

            Cell.VisitWorldObjects(m_capturePoint, searcher, radius);

            foreach (var player in players)
            {
                if (player.IsOutdoorPvPActive())
                {
                    m_activePlayers[player.GetTeamId()].Add(player.GetGUID());
                    HandlePlayerEnter(player);
                }
            }

            // get the difference of numbers
            float fact_diff = (m_activePlayers[0].Count - m_activePlayers[1].Count) * diff / 1000;

            if (fact_diff == 0.0f)
            {
                return(false);
            }

            Team  Challenger = 0;
            float maxDiff    = m_maxSpeed * diff;

            if (fact_diff < 0)
            {
                // horde is in majority, but it's already horde-controlled . no change
                if (m_State == ObjectiveStates.Horde && m_value <= -m_maxValue)
                {
                    return(false);
                }

                if (fact_diff < -maxDiff)
                {
                    fact_diff = -maxDiff;
                }

                Challenger = Team.Horde;
            }
            else
            {
                // ally is in majority, but it's already ally-controlled . no change
                if (m_State == ObjectiveStates.Alliance && m_value >= m_maxValue)
                {
                    return(false);
                }

                if (fact_diff > maxDiff)
                {
                    fact_diff = maxDiff;
                }

                Challenger = Team.Alliance;
            }

            float oldValue = m_value;
            uint  oldTeam  = m_team;

            m_OldState = m_State;

            m_value += fact_diff;

            if (m_value < -m_minValue) // red
            {
                if (m_value < -m_maxValue)
                {
                    m_value = -m_maxValue;
                }
                m_State = ObjectiveStates.Horde;
                m_team  = TeamId.Horde;
            }
            else if (m_value > m_minValue) // blue
            {
                if (m_value > m_maxValue)
                {
                    m_value = m_maxValue;
                }
                m_State = ObjectiveStates.Alliance;
                m_team  = TeamId.Alliance;
            }
            else if (oldValue * m_value <= 0) // grey, go through mid point
            {
                // if challenger is ally, then n.a challenge
                if (Challenger == Team.Alliance)
                {
                    m_State = ObjectiveStates.NeutralAllianceChallenge;
                }
                // if challenger is horde, then n.h challenge
                else if (Challenger == Team.Horde)
                {
                    m_State = ObjectiveStates.NeutralHordeChallenge;
                }
                m_team = TeamId.Neutral;
            }
            else // grey, did not go through mid point
            {
                // old phase and current are on the same side, so one team challenges the other
                if (Challenger == Team.Alliance && (m_OldState == ObjectiveStates.Horde || m_OldState == ObjectiveStates.NeutralHordeChallenge))
                {
                    m_State = ObjectiveStates.HordeAllianceChallenge;
                }
                else if (Challenger == Team.Horde && (m_OldState == ObjectiveStates.Alliance || m_OldState == ObjectiveStates.NeutralAllianceChallenge))
                {
                    m_State = ObjectiveStates.AllianceHordeChallenge;
                }
                m_team = TeamId.Neutral;
            }

            if (m_value != oldValue)
            {
                SendChangePhase();
            }

            if (m_OldState != m_State)
            {
                if (oldTeam != m_team)
                {
                    ChangeTeam(oldTeam);
                }
                ChangeState();
                return(true);
            }

            return(false);
        }