root/trunk/src/game/BattleGroundEY.cpp @ 34

Revision 34, 41.1 kB (checked in by yumileroy, 17 years ago)

[svn] * Removing useless data accidentally committed.
* Applying ImpConfig? patch.
* Note: QUEUE_FOR_GM currently disabled as it's not compatible with the ACE patch. Anyone care to rewrite it?
* Note2: This is untested - I may have done some mistakes here and there. Will try to compile now.

Original author: XTZGZoReX
Date: 2008-10-10 13:37:21-05:00

Line 
1/*
2 * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17 */
18
19#include "Object.h"
20#include "Player.h"
21#include "BattleGround.h"
22#include "BattleGroundEY.h"
23#include "Creature.h"
24#include "Chat.h"
25#include "ObjectMgr.h"
26#include "MapManager.h"
27#include "Language.h"
28#include "World.h"
29#include "Util.h"
30
31BattleGroundEY::BattleGroundEY()
32{
33    m_BuffChange = true;
34    m_BgObjects.resize(BG_EY_OBJECT_MAX);
35    m_BgCreatures.resize(BG_EY_CREATURES_MAX);
36    m_Points_Trigger[FEL_REALVER] = TR_FEL_REALVER_BUFF;
37    m_Points_Trigger[BLOOD_ELF] = TR_BLOOD_ELF_BUFF;
38    m_Points_Trigger[DRAENEI_RUINS] = TR_DRAENEI_RUINS_BUFF;
39    m_Points_Trigger[MAGE_TOWER] = TR_MAGE_TOWER_BUFF;
40}
41
42BattleGroundEY::~BattleGroundEY()
43{
44}
45
46void BattleGroundEY::Update(time_t diff)
47{
48    BattleGround::Update(diff);
49    // after bg start we get there (once)
50    if (GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize())
51    {
52        ModifyStartDelayTime(diff);
53
54        if(!(m_Events & 0x01))
55        {
56            m_Events |= 0x01;
57
58            // setup here, only when at least one player has ported to the map
59            if(!SetupBattleGround())
60            {
61                EndNow();
62                return;
63            }
64
65            SpawnBGObject(BG_EY_OBJECT_DOOR_A, RESPAWN_IMMEDIATELY);
66            SpawnBGObject(BG_EY_OBJECT_DOOR_H, RESPAWN_IMMEDIATELY);
67
68            for(uint32 i = BG_EY_OBJECT_A_BANNER_FEL_REALVER_CENTER; i < BG_EY_OBJECT_MAX; ++i)
69                SpawnBGObject(i, RESPAWN_ONE_DAY);
70
71            SetStartDelayTime(START_DELAY0);
72        }
73        // After 1 minute, warning is signalled
74        else if(GetStartDelayTime() <= START_DELAY1 && !(m_Events & 0x04))
75        {
76            m_Events |= 0x04;
77            SendMessageToAll(GetMangosString(LANG_BG_EY_ONE_MINUTE));
78        }
79        // After 1,5 minute, warning is signalled
80        else if(GetStartDelayTime() <= START_DELAY2 && !(m_Events & 0x08))
81        {
82            m_Events |= 0x08;
83            SendMessageToAll(GetMangosString(LANG_BG_EY_HALF_MINUTE));
84        }
85        // After 2 minutes, gates OPEN ! x)
86        else if(GetStartDelayTime() < 0 && !(m_Events & 0x10))
87        {
88            m_Events |= 0x10;
89            SpawnBGObject(BG_EY_OBJECT_DOOR_A, RESPAWN_ONE_DAY);
90            SpawnBGObject(BG_EY_OBJECT_DOOR_H, RESPAWN_ONE_DAY);
91
92            for(uint32 i = BG_EY_OBJECT_N_BANNER_FEL_REALVER_CENTER; i <= BG_EY_OBJECT_FLAG_NETHERSTORM; ++i)
93                SpawnBGObject(i, RESPAWN_IMMEDIATELY);
94            for(uint32 i = 0; i < EY_POINTS_MAX; ++i)
95            {
96                //randomly spawn buff
97                uint8 buff = urand(0, 2);
98                SpawnBGObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REALVER + buff + i * 3, RESPAWN_IMMEDIATELY);
99            }
100
101            SendMessageToAll(GetMangosString(LANG_BG_EY_BEGIN));
102
103            if(sWorld.getConfig(CONFIG_BG_START_MUSIC))
104            {
105                PlaySoundToAll(SOUND_BG_START);
106                PlaySoundToAll(SOUND_BG_START_L70ETC); //MUSIC
107            }
108            else
109                PlaySoundToAll(SOUND_BG_START);
110            SetStatus(STATUS_IN_PROGRESS);
111
112            for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
113                if(Player *plr = objmgr.GetPlayer(itr->first))
114                    plr->RemoveAurasDueToSpell(SPELL_PREPARATION);
115        }
116    }
117    else if(GetStatus() == STATUS_IN_PROGRESS)
118    {
119        m_PointAddingTimer -= diff;
120        if(m_PointAddingTimer <= 0)
121        {
122            m_PointAddingTimer = BG_EY_FPOINTS_TICK_TIME;
123            if (m_TeamPointsCount[BG_TEAM_ALLIANCE] > 0)
124                AddPoints(ALLIANCE, BG_EY_TickPoints[m_TeamPointsCount[BG_TEAM_ALLIANCE] - 1]);
125            if (m_TeamPointsCount[BG_TEAM_HORDE] > 0)
126                AddPoints(HORDE, BG_EY_TickPoints[m_TeamPointsCount[BG_TEAM_HORDE] - 1]);
127        }
128
129        if(m_FlagState == BG_EY_FLAG_STATE_WAIT_RESPAWN || m_FlagState == BG_EY_FLAG_STATE_ON_GROUND)
130        {
131            m_FlagsTimer -= diff;
132
133            if(m_FlagsTimer < 0)
134            {
135                m_FlagsTimer = 0;
136                if (m_FlagState == BG_EY_FLAG_STATE_WAIT_RESPAWN)
137                    RespawnFlag(true);
138                else
139                    RespawnFlagAfterDrop();
140            }
141        }
142
143        m_TowerCapCheckTimer -= diff;
144        if(m_TowerCapCheckTimer <= 0)
145        {
146            //check if player joined point
147            /*I used this order of calls, because although we will check if one player is in gameobject's distance 2 times
148              but we can count of players on current point in CheckSomeoneLeftPoint
149            */
150            this->CheckSomeoneJoinedPoint();
151            //check if player left point
152            this->CheckSomeoneLeftPoint();
153            this->UpdatePointStatuses();
154            m_TowerCapCheckTimer = BG_EY_FPOINTS_TICK_TIME;
155        }
156    }
157}
158
159void BattleGroundEY::AddPoints(uint32 Team, uint32 Points)
160{
161    uint8 team_index = GetTeamIndexByTeamId(Team);
162    m_TeamScores[team_index] += Points;
163    m_HonorScoreTics[team_index] += Points;
164    if (m_HonorScoreTics[team_index] >= BG_HONOR_SCORE_TICKS)
165    {
166        RewardHonorToTeam(20, Team);
167        m_HonorScoreTics[team_index] -= BG_HONOR_SCORE_TICKS;
168    }
169    UpdateTeamScore(Team);
170}
171
172void BattleGroundEY::CheckSomeoneJoinedPoint()
173{
174    GameObject *obj = NULL;
175    for (uint8 i = 0; i < EY_POINTS_MAX; ++i)
176    {
177        obj = HashMapHolder<GameObject>::Find(m_BgObjects[BG_EY_OBJECT_TOWER_CAP_FEL_REALVER + i]);
178        if (obj)
179        {
180            uint8 j = 0;
181            while (j < m_PlayersNearPoint[EY_POINTS_MAX].size())
182            {
183                Player *plr = objmgr.GetPlayer(m_PlayersNearPoint[EY_POINTS_MAX][j]);
184                if(!plr)
185                {
186                    sLog.outError("BattleGroundEY: Player " I64FMTD " not found!", m_PlayersNearPoint[EY_POINTS_MAX][j]);
187                    ++j;
188                    continue;
189                }
190                if (plr->isAlive() && plr->IsWithinDistInMap(obj, BG_EY_POINT_RADIUS))
191                {
192                    //player joined point!
193                    //show progress bar
194                    UpdateWorldStateForPlayer(PROGRESS_BAR_PERCENT_GREY, BG_EY_PROGRESS_BAR_PERCENT_GREY, plr);
195                    UpdateWorldStateForPlayer(PROGRESS_BAR_STATUS, m_PointBarStatus[i], plr);
196                    UpdateWorldStateForPlayer(PROGRESS_BAR_SHOW, BG_EY_PROGRESS_BAR_SHOW, plr);
197                    //add player to point
198                    m_PlayersNearPoint[i].push_back(m_PlayersNearPoint[EY_POINTS_MAX][j]);
199                    //remove player from "free space"
200                    m_PlayersNearPoint[EY_POINTS_MAX].erase(m_PlayersNearPoint[EY_POINTS_MAX].begin() + j);
201                }
202                else
203                    ++j;
204            }
205        }
206    }
207}
208
209void BattleGroundEY::CheckSomeoneLeftPoint()
210{
211    //reset current point counts
212    for (uint8 i = 0; i < 2*EY_POINTS_MAX; ++i)
213        m_CurrentPointPlayersCount[i] = 0;
214    GameObject *obj = NULL;
215    for(uint8 i = 0; i < EY_POINTS_MAX; ++i)
216    {
217        obj = HashMapHolder<GameObject>::Find(m_BgObjects[BG_EY_OBJECT_TOWER_CAP_FEL_REALVER + i]);
218        if(obj)
219        {
220            uint8 j = 0;
221            while (j < m_PlayersNearPoint[i].size())
222            {
223                Player *plr = objmgr.GetPlayer(m_PlayersNearPoint[i][j]);
224                if (!plr)
225                {
226                    sLog.outError("BattleGroundEY: Player " I64FMTD " not found!", m_PlayersNearPoint[i][j]);
227                    //move not existed player to "free space" - this will cause many error showing in log, but it is a very important bug
228                    m_PlayersNearPoint[EY_POINTS_MAX].push_back(m_PlayersNearPoint[i][j]);
229                    m_PlayersNearPoint[i].erase(m_PlayersNearPoint[i].begin() + j);
230                    ++j;
231                    continue;
232                }
233                if (!plr->isAlive() || !plr->IsWithinDistInMap(obj, BG_EY_POINT_RADIUS))
234                    //move player out of point (add him to players that are out of points
235                {
236                    m_PlayersNearPoint[EY_POINTS_MAX].push_back(m_PlayersNearPoint[i][j]);
237                    m_PlayersNearPoint[i].erase(m_PlayersNearPoint[i].begin() + j);
238                    this->UpdateWorldStateForPlayer(PROGRESS_BAR_SHOW, BG_EY_PROGRESS_BAR_DONT_SHOW, plr);
239                }
240                else
241                {
242                    //player is neat flag, so update count:
243                    m_CurrentPointPlayersCount[2 * i + GetTeamIndexByTeamId(plr->GetTeam())]++;
244                    ++j;
245                }
246            }
247        }
248    }
249}
250
251void BattleGroundEY::UpdatePointStatuses()
252{
253    for(uint8 point = 0; point < EY_POINTS_MAX; ++point)
254    {
255        if (m_PlayersNearPoint[point].empty())
256            continue;
257        //count new point bar status:
258        m_PointBarStatus[point] += (m_CurrentPointPlayersCount[2 * point] - m_CurrentPointPlayersCount[2 * point + 1] < BG_EY_POINT_MAX_CAPTURERS_COUNT) ? m_CurrentPointPlayersCount[2 * point] - m_CurrentPointPlayersCount[2 * point + 1] : BG_EY_POINT_MAX_CAPTURERS_COUNT;
259
260        if (m_PointBarStatus[point] > BG_EY_PROGRESS_BAR_ALI_CONTROLLED)
261            //point is fully alliance's
262            m_PointBarStatus[point] = BG_EY_PROGRESS_BAR_ALI_CONTROLLED;
263        if (m_PointBarStatus[point] < BG_EY_PROGRESS_BAR_HORDE_CONTROLLED)
264            //point is fully horde's
265            m_PointBarStatus[point] = BG_EY_PROGRESS_BAR_HORDE_CONTROLLED;
266
267        uint32 pointOwnerTeamId = 0;
268        //find which team should own this point
269        if (m_PointBarStatus[point] <= BG_EY_PROGRESS_BAR_NEUTRAL_LOW)
270            pointOwnerTeamId = HORDE;
271        else if (m_PointBarStatus[point] >= BG_EY_PROGRESS_BAR_NEUTRAL_HIGH)
272            pointOwnerTeamId = ALLIANCE;
273        else
274            pointOwnerTeamId = EY_POINT_NO_OWNER;
275
276        for (uint8 i = 0; i < m_PlayersNearPoint[point].size(); ++i)
277        {
278            Player *plr = objmgr.GetPlayer(m_PlayersNearPoint[point][i]);
279            if (plr)
280            {
281                this->UpdateWorldStateForPlayer(PROGRESS_BAR_STATUS, m_PointBarStatus[point], plr);
282                                                            //if point owner changed we must evoke event!
283                if (pointOwnerTeamId != m_PointOwnedByTeam[point])
284                {
285                    //point was uncontrolled and player is from team which captured point
286                    if (m_PointState[point] == EY_POINT_STATE_UNCONTROLLED && plr->GetTeam() == pointOwnerTeamId)
287                        this->EventTeamCapturedPoint(plr, point);
288
289                    //point was under control and player isn't from team which controlled it
290                    if (m_PointState[point] == EY_POINT_UNDER_CONTROL && plr->GetTeam() != m_PointOwnedByTeam[point])
291                        this->EventTeamLostPoint(plr, point);
292                }
293            }
294        }
295    }
296}
297
298void BattleGroundEY::UpdateTeamScore(uint32 Team)
299{
300    uint32 score = GetTeamScore(Team);
301    if(score >= EY_MAX_TEAM_SCORE)
302    {
303        score = EY_MAX_TEAM_SCORE;
304        EndBattleGround(Team);
305    }
306
307    if(Team == ALLIANCE)
308        UpdateWorldState(EY_ALLIANCE_RESOURCES, score);
309    else
310        UpdateWorldState(EY_HORDE_RESOURCES, score);
311}
312
313void BattleGroundEY::UpdatePointsCount(uint32 Team)
314{
315    if(Team == ALLIANCE)
316        UpdateWorldState(EY_ALLIANCE_BASE, m_TeamPointsCount[BG_TEAM_ALLIANCE]);
317    else
318        UpdateWorldState(EY_HORDE_BASE, m_TeamPointsCount[BG_TEAM_HORDE]);
319}
320
321void BattleGroundEY::UpdatePointsIcons(uint32 Team, uint32 Point)
322{
323    //we MUST firstly send 0, after that we can send 1!!!
324    if (m_PointState[Point] == EY_POINT_UNDER_CONTROL)
325    {
326        UpdateWorldState(m_PointsIconStruct[Point].WorldStateControlIndex, 0);
327        if(Team == ALLIANCE)
328            UpdateWorldState(m_PointsIconStruct[Point].WorldStateAllianceControlledIndex, 1);
329        else
330            UpdateWorldState(m_PointsIconStruct[Point].WorldStateHordeControlledIndex, 1);
331    }
332    else
333    {
334        if(Team == ALLIANCE)
335            UpdateWorldState(m_PointsIconStruct[Point].WorldStateAllianceControlledIndex, 0);
336        else
337            UpdateWorldState(m_PointsIconStruct[Point].WorldStateHordeControlledIndex, 0);
338        UpdateWorldState(m_PointsIconStruct[Point].WorldStateControlIndex, 1);
339    }
340}
341
342void BattleGroundEY::AddPlayer(Player *plr)
343{
344    BattleGround::AddPlayer(plr);
345    //create score and add it to map
346    BattleGroundEYScore* sc = new BattleGroundEYScore;
347
348    m_PlayersNearPoint[EY_POINTS_MAX].push_back(plr->GetGUID());
349
350    m_PlayerScores[plr->GetGUID()] = sc;
351}
352
353void BattleGroundEY::RemovePlayer(Player *plr, uint64 guid)
354{
355    // sometimes flag aura not removed :(
356    for (int j = EY_POINTS_MAX; j >= 0; --j)
357    {
358        for(int i = 0; i < m_PlayersNearPoint[j].size(); ++i)
359            if(m_PlayersNearPoint[j][i] == guid)
360                m_PlayersNearPoint[j].erase(m_PlayersNearPoint[j].begin() + i);
361    }
362    if(IsFlagPickedup())
363    {
364        if(m_FlagKeeper == guid)
365        {
366            if(plr)
367                this->EventPlayerDroppedFlag(plr);
368            else
369            {
370                SetFlagPicker(0);
371                RespawnFlag(true);
372            }
373        }
374    }
375}
376
377void BattleGroundEY::HandleAreaTrigger(Player *Source, uint32 Trigger)
378{
379    if(GetStatus() != STATUS_IN_PROGRESS)
380        return;
381
382    if(!Source->isAlive())                                  //hack code, must be removed later
383        return;
384
385    switch(Trigger)
386    {
387        case TR_BLOOD_ELF_POINT:
388            if(m_PointState[BLOOD_ELF] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[BLOOD_ELF] == Source->GetTeam())
389                if(m_FlagState && GetFlagPickerGUID() == Source->GetGUID())
390                    EventPlayerCapturedFlag(Source, BG_EY_OBJECT_FLAG_BLOOD_ELF);
391            break;
392        case TR_FEL_REALVER_POINT:
393            if(m_PointState[FEL_REALVER] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[FEL_REALVER] == Source->GetTeam())
394                if(m_FlagState && GetFlagPickerGUID() == Source->GetGUID())
395                    EventPlayerCapturedFlag(Source, BG_EY_OBJECT_FLAG_FEL_REALVER);
396            break;
397        case TR_MAGE_TOWER_POINT:
398            if(m_PointState[MAGE_TOWER] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[MAGE_TOWER] == Source->GetTeam())
399                if(m_FlagState && GetFlagPickerGUID() == Source->GetGUID())
400                    EventPlayerCapturedFlag(Source, BG_EY_OBJECT_FLAG_MAGE_TOWER);
401            break;
402        case TR_DRAENEI_RUINS_POINT:
403            if(m_PointState[DRAENEI_RUINS] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[DRAENEI_RUINS] == Source->GetTeam())
404                if(m_FlagState && GetFlagPickerGUID() == Source->GetGUID())
405                    EventPlayerCapturedFlag(Source, BG_EY_OBJECT_FLAG_DRAENEI_RUINS);
406            break;
407        case 4512:
408        case 4515:
409        case 4517:
410        case 4519:
411        case 4530:
412        case 4531:
413        case 4568:
414        case 4569:
415        case 4570:
416        case 4571:
417            break;
418        default:
419            sLog.outError("WARNING: Unhandled AreaTrigger in Battleground: %u", Trigger);
420            Source->GetSession()->SendAreaTriggerMessage("Warning: Unhandled AreaTrigger in Battleground: %u", Trigger);
421            break;
422    }
423}
424
425bool BattleGroundEY::SetupBattleGround()
426{
427        // doors
428    if(    !AddObject(BG_EY_OBJECT_DOOR_A, BG_OBJECT_A_DOOR_EY_ENTRY, 2527.6f, 1596.91f, 1262.13f, -3.12414f, -0.173642f, -0.001515f, 0.98477f, -0.008594f, RESPAWN_IMMEDIATELY)
429        || !AddObject(BG_EY_OBJECT_DOOR_H, BG_OBJECT_H_DOOR_EY_ENTRY, 1803.21f, 1539.49f, 1261.09f, 3.14159f, 0.173648f, 0, 0.984808f, 0, RESPAWN_IMMEDIATELY)
430        // banners (alliance)
431        || !AddObject(BG_EY_OBJECT_A_BANNER_FEL_REALVER_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2057.46f, 1735.07f, 1187.91f, -0.925024f, 0, 0, 0.446198f, -0.894934f, RESPAWN_ONE_DAY)
432        || !AddObject(BG_EY_OBJECT_A_BANNER_FEL_REALVER_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2032.25f, 1729.53f, 1190.33f, 1.8675f, 0, 0, 0.803857f, 0.594823f, RESPAWN_ONE_DAY)
433        || !AddObject(BG_EY_OBJECT_A_BANNER_FEL_REALVER_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2092.35f, 1775.46f, 1187.08f, -0.401426f, 0, 0, 0.199368f, -0.979925f, RESPAWN_ONE_DAY)
434        || !AddObject(BG_EY_OBJECT_A_BANNER_BLOOD_ELF_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2047.19f, 1349.19f, 1189.0f, -1.62316f, 0, 0, 0.725374f, -0.688354f, RESPAWN_ONE_DAY)
435        || !AddObject(BG_EY_OBJECT_A_BANNER_BLOOD_ELF_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2074.32f, 1385.78f, 1194.72f, 0.488692f, 0, 0, 0.241922f, 0.970296f, RESPAWN_ONE_DAY)
436        || !AddObject(BG_EY_OBJECT_A_BANNER_BLOOD_ELF_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2025.13f, 1386.12f, 1192.74f, 2.3911f, 0, 0, 0.930418f, 0.366501f, RESPAWN_ONE_DAY)
437        || !AddObject(BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2276.8f, 1400.41f, 1196.33f, 2.44346f, 0, 0, 0.939693f, 0.34202f, RESPAWN_ONE_DAY)
438        || !AddObject(BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2305.78f, 1404.56f, 1199.38f, 1.74533f, 0, 0, 0.766044f, 0.642788f, RESPAWN_ONE_DAY)
439        || !AddObject(BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2245.4f, 1366.41f, 1195.28f, 2.21657f, 0, 0, 0.894934f, 0.446198f, RESPAWN_ONE_DAY)
440        || !AddObject(BG_EY_OBJECT_A_BANNER_MAGE_TOWER_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2270.84f, 1784.08f, 1186.76f, 2.42601f, 0, 0, 0.936672f, 0.350207f, RESPAWN_ONE_DAY)
441        || !AddObject(BG_EY_OBJECT_A_BANNER_MAGE_TOWER_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2269.13f, 1737.7f, 1186.66f, 0.994838f, 0, 0, 0.477159f, 0.878817f, RESPAWN_ONE_DAY)
442        || !AddObject(BG_EY_OBJECT_A_BANNER_MAGE_TOWER_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2300.86f, 1741.25f, 1187.7f, -0.785398f, 0, 0, 0.382683f, -0.92388f, RESPAWN_ONE_DAY)
443        // banners (horde)
444        || !AddObject(BG_EY_OBJECT_H_BANNER_FEL_REALVER_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2057.46f, 1735.07f, 1187.91f, -0.925024f, 0, 0, 0.446198f, -0.894934f, RESPAWN_ONE_DAY)
445        || !AddObject(BG_EY_OBJECT_H_BANNER_FEL_REALVER_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2032.25f, 1729.53f, 1190.33f, 1.8675f, 0, 0, 0.803857f, 0.594823f, RESPAWN_ONE_DAY)
446        || !AddObject(BG_EY_OBJECT_H_BANNER_FEL_REALVER_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2092.35f, 1775.46f, 1187.08f, -0.401426f, 0, 0, 0.199368f, -0.979925f, RESPAWN_ONE_DAY)
447        || !AddObject(BG_EY_OBJECT_H_BANNER_BLOOD_ELF_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2047.19f, 1349.19f, 1189.0f, -1.62316f, 0, 0, 0.725374f, -0.688354f, RESPAWN_ONE_DAY)
448        || !AddObject(BG_EY_OBJECT_H_BANNER_BLOOD_ELF_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2074.32f, 1385.78f, 1194.72f, 0.488692f, 0, 0, 0.241922f, 0.970296f, RESPAWN_ONE_DAY)
449        || !AddObject(BG_EY_OBJECT_H_BANNER_BLOOD_ELF_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2025.13f, 1386.12f, 1192.74f, 2.3911f, 0, 0, 0.930418f, 0.366501f, RESPAWN_ONE_DAY)
450        || !AddObject(BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2276.8f, 1400.41f, 1196.33f, 2.44346f, 0, 0, 0.939693f, 0.34202f, RESPAWN_ONE_DAY)
451        || !AddObject(BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2305.78f, 1404.56f, 1199.38f, 1.74533f, 0, 0, 0.766044f, 0.642788f, RESPAWN_ONE_DAY)
452        || !AddObject(BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2245.4f, 1366.41f, 1195.28f, 2.21657f, 0, 0, 0.894934f, 0.446198f, RESPAWN_ONE_DAY)
453        || !AddObject(BG_EY_OBJECT_H_BANNER_MAGE_TOWER_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2270.84f, 1784.08f, 1186.76f, 2.42601f, 0, 0, 0.936672f, 0.350207f, RESPAWN_ONE_DAY)
454        || !AddObject(BG_EY_OBJECT_H_BANNER_MAGE_TOWER_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2269.13f, 1737.7f, 1186.66f, 0.994838f, 0, 0, 0.477159f, 0.878817f, RESPAWN_ONE_DAY)
455        || !AddObject(BG_EY_OBJECT_H_BANNER_MAGE_TOWER_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2300.86f, 1741.25f, 1187.7f, -0.785398f, 0, 0, 0.382683f, -0.92388f, RESPAWN_ONE_DAY)
456        // banners (natural)
457        || !AddObject(BG_EY_OBJECT_N_BANNER_FEL_REALVER_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2057.46f, 1735.07f, 1187.91f, -0.925024f, 0, 0, 0.446198f, -0.894934f, RESPAWN_ONE_DAY)
458        || !AddObject(BG_EY_OBJECT_N_BANNER_FEL_REALVER_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2032.25f, 1729.53f, 1190.33f, 1.8675f, 0, 0, 0.803857f, 0.594823f, RESPAWN_ONE_DAY)
459        || !AddObject(BG_EY_OBJECT_N_BANNER_FEL_REALVER_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2092.35f, 1775.46f, 1187.08f, -0.401426f, 0, 0, 0.199368f, -0.979925f, RESPAWN_ONE_DAY)
460        || !AddObject(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2047.19f, 1349.19f, 1189.0f, -1.62316f, 0, 0, 0.725374f, -0.688354f, RESPAWN_ONE_DAY)
461        || !AddObject(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2074.32f, 1385.78f, 1194.72f, 0.488692f, 0, 0, 0.241922f, 0.970296f, RESPAWN_ONE_DAY)
462        || !AddObject(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2025.13f, 1386.12f, 1192.74f, 2.3911f, 0, 0, 0.930418f, 0.366501f, RESPAWN_ONE_DAY)
463        || !AddObject(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2276.8f, 1400.41f, 1196.33f, 2.44346f, 0, 0, 0.939693f, 0.34202f, RESPAWN_ONE_DAY)
464        || !AddObject(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2305.78f, 1404.56f, 1199.38f, 1.74533f, 0, 0, 0.766044f, 0.642788f, RESPAWN_ONE_DAY)
465        || !AddObject(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2245.4f, 1366.41f, 1195.28f, 2.21657f, 0, 0, 0.894934f, 0.446198f, RESPAWN_ONE_DAY)
466        || !AddObject(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2270.84f, 1784.08f, 1186.76f, 2.42601f, 0, 0, 0.936672f, 0.350207f, RESPAWN_ONE_DAY)
467        || !AddObject(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2269.13f, 1737.7f, 1186.66f, 0.994838f, 0, 0, 0.477159f, 0.878817f, RESPAWN_ONE_DAY)
468        || !AddObject(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2300.86f, 1741.25f, 1187.7f, -0.785398f, 0, 0, 0.382683f, -0.92388f, RESPAWN_ONE_DAY)
469        // flags
470        || !AddObject(BG_EY_OBJECT_FLAG_NETHERSTORM, BG_OBJECT_FLAG2_EY_ENTRY, 2174.782227f, 1569.054688f, 1160.361938f, -1.448624f, 0, 0, 0.662620f, -0.748956f, RESPAWN_ONE_DAY)
471        || !AddObject(BG_EY_OBJECT_FLAG_FEL_REALVER, BG_OBJECT_FLAG1_EY_ENTRY, 2044.28f, 1729.68f, 1189.96f, -0.017453f, 0, 0, 0.008727f, -0.999962f, RESPAWN_ONE_DAY)
472        || !AddObject(BG_EY_OBJECT_FLAG_BLOOD_ELF, BG_OBJECT_FLAG1_EY_ENTRY, 2048.83f, 1393.65f, 1194.49f, 0.20944f, 0, 0, 0.104528f, 0.994522f, RESPAWN_ONE_DAY)
473        || !AddObject(BG_EY_OBJECT_FLAG_DRAENEI_RUINS, BG_OBJECT_FLAG1_EY_ENTRY, 2286.56f, 1402.36f, 1197.11f, 3.72381f, 0, 0, 0.957926f, -0.287016f, RESPAWN_ONE_DAY)
474        || !AddObject(BG_EY_OBJECT_FLAG_MAGE_TOWER, BG_OBJECT_FLAG1_EY_ENTRY, 2284.48f, 1731.23f, 1189.99f, 2.89725f, 0, 0, 0.992546f, 0.121869f, RESPAWN_ONE_DAY)
475        // tower cap
476        || !AddObject(BG_EY_OBJECT_TOWER_CAP_FEL_REALVER, BG_OBJECT_FR_TOWER_CAP_EY_ENTRY, 2024.600708f, 1742.819580f, 1195.157715f, 2.443461f, 0, 0, 0.939693f, 0.342020f, RESPAWN_ONE_DAY)
477        || !AddObject(BG_EY_OBJECT_TOWER_CAP_BLOOD_ELF, BG_OBJECT_BE_TOWER_CAP_EY_ENTRY, 2050.493164f, 1372.235962f, 1194.563477f, 1.710423f, 0, 0, 0.754710f, 0.656059f, RESPAWN_ONE_DAY)
478        || !AddObject(BG_EY_OBJECT_TOWER_CAP_DRAENEI_RUINS, BG_OBJECT_DR_TOWER_CAP_EY_ENTRY, 2301.010498f, 1386.931641f, 1197.183472f, 1.570796f, 0, 0, 0.707107f, 0.707107f, RESPAWN_ONE_DAY)
479        || !AddObject(BG_EY_OBJECT_TOWER_CAP_MAGE_TOWER, BG_OBJECT_HU_TOWER_CAP_EY_ENTRY, 2282.121582f, 1760.006958f, 1189.707153f, 1.919862f, 0, 0, 0.819152f, 0.573576f, RESPAWN_ONE_DAY)
480        )
481    {
482        sLog.outErrorDb("BatteGroundEY: Failed to spawn some object BattleGround not created!");
483        return false;
484    }
485
486    //buffs
487    for (int i = 0; i < EY_POINTS_MAX; ++i)
488    {
489        AreaTriggerEntry const* at = sAreaTriggerStore.LookupEntry(m_Points_Trigger[i]);
490        if( !at )
491        {
492            sLog.outError("BattleGroundEY: Unknown trigger: %u", m_Points_Trigger[i]);
493            continue;
494        }
495        if (   !AddObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REALVER + i * 3, Buff_Entries[0], at->x, at->y, at->z, 0.907571f, 0, 0, 0.438371f, 0.898794f, RESPAWN_ONE_DAY)
496            || !AddObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REALVER + i * 3 + 1, Buff_Entries[1], at->x, at->y, at->z, 0.907571f, 0, 0, 0.438371f, 0.898794f, RESPAWN_ONE_DAY)
497            || !AddObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REALVER + i * 3 + 2, Buff_Entries[2], at->x, at->y, at->z, 0.907571f, 0, 0, 0.438371f, 0.898794f, RESPAWN_ONE_DAY)
498            )
499            sLog.outError("BattleGroundEY: Cannot spawn buff");
500    }
501
502    WorldSafeLocsEntry const *sg = NULL;
503    sg = sWorldSafeLocsStore.LookupEntry(EY_GRAVEYARD_MAIN_ALLIANCE);
504    if( !sg || !AddSpiritGuide(EY_SPIRIT_MAIN_ALLIANCE, sg->x, sg->y, sg->z, 3.124139f, ALLIANCE) )
505    {
506        sLog.outErrorDb("BatteGroundEY: Failed to spawn spirit guide! BattleGround not created!");
507        return false;
508    }
509
510    sg = sWorldSafeLocsStore.LookupEntry(EY_GRAVEYARD_MAIN_HORDE);
511    if( !sg || !AddSpiritGuide(EY_SPIRIT_MAIN_HORDE, sg->x, sg->y, sg->z, 3.193953f, HORDE) )
512    {
513        sLog.outErrorDb("BatteGroundEY: Failed to spawn spirit guide! BattleGround not created!");
514        return false;
515    }
516
517    return true;
518}
519
520void BattleGroundEY::ResetBGSubclass()
521{
522    m_TeamScores[BG_TEAM_ALLIANCE] = 0;
523    m_TeamScores[BG_TEAM_HORDE] = 0;
524    m_TeamPointsCount[BG_TEAM_ALLIANCE] = 0;
525    m_TeamPointsCount[BG_TEAM_HORDE] = 0;
526    m_HonorScoreTics[BG_TEAM_ALLIANCE] = 0;
527    m_HonorScoreTics[BG_TEAM_HORDE] = 0;
528    m_FlagState = BG_EY_FLAG_STATE_ON_BASE;
529    m_FlagCapturedBgObjectType = 0;
530    m_FlagKeeper = 0;
531    m_DroppedFlagGUID = 0;
532    m_PointAddingTimer = 0;
533    m_TowerCapCheckTimer = 0;
534
535    for(uint8 i = 0; i < EY_POINTS_MAX; ++i)
536    {
537        m_PointOwnedByTeam[i] = EY_POINT_NO_OWNER;
538        m_PointState[i] = EY_POINT_STATE_UNCONTROLLED;
539        m_PointBarStatus[i] = BG_EY_PROGRESS_BAR_STATE_MIDDLE;
540        m_PlayersNearPoint[i].clear();
541        m_PlayersNearPoint[i].reserve(15);                  //tip size
542    }
543    m_PlayersNearPoint[EY_PLAYERS_OUT_OF_POINTS].clear();
544    m_PlayersNearPoint[EY_PLAYERS_OUT_OF_POINTS].reserve(30);
545}
546
547void BattleGroundEY::RespawnFlag(bool send_message)
548{
549    if (m_FlagCapturedBgObjectType > 0)
550        SpawnBGObject(m_FlagCapturedBgObjectType, RESPAWN_ONE_DAY);
551
552    m_FlagCapturedBgObjectType = 0;
553    m_FlagState = BG_EY_FLAG_STATE_ON_BASE;
554    SpawnBGObject(BG_EY_OBJECT_FLAG_NETHERSTORM, RESPAWN_IMMEDIATELY);
555
556    if(send_message)
557    {
558        SendMessageToAll(GetMangosString(LANG_BG_EY_RESETED_FLAG));
559        PlaySoundToAll(BG_EY_SOUND_FLAG_RESET);             // flags respawned sound...
560    }
561
562    UpdateWorldState(NETHERSTORM_FLAG, 1);
563}
564
565void BattleGroundEY::RespawnFlagAfterDrop()
566{
567    RespawnFlag(true);
568
569    GameObject *obj = HashMapHolder<GameObject>::Find(GetDroppedFlagGUID());
570    if(obj)
571        obj->Delete();
572    else
573        sLog.outError("BattleGroundEY: Unknown dropped flag guid: %u",GetDroppedFlagGUID());
574
575    SetDroppedFlagGUID(0);
576}
577
578void BattleGroundEY::HandleKillPlayer(Player *player, Player *killer)
579{
580    if(GetStatus() != STATUS_IN_PROGRESS)
581        return;
582
583    BattleGround::HandleKillPlayer(player, killer);
584    EventPlayerDroppedFlag(player);
585}
586
587void BattleGroundEY::EventPlayerDroppedFlag(Player *Source)
588{
589    if(GetStatus() != STATUS_IN_PROGRESS)
590    {
591        // if not running, do not cast things at the dropper player, neither send unnecessary messages
592        // just take off the aura
593        if(IsFlagPickedup() && GetFlagPickerGUID() == Source->GetGUID())
594        {
595            SetFlagPicker(0);
596            Source->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);
597        }
598        return;
599    }
600
601    if(!IsFlagPickedup())
602        return;
603
604    if(GetFlagPickerGUID() != Source->GetGUID())
605        return;
606
607    const char *message = "";
608    uint8 type = 0;
609
610    SetFlagPicker(0);
611    Source->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);
612    m_FlagState = BG_EY_FLAG_STATE_ON_GROUND;
613    m_FlagsTimer = BG_EY_FLAG_RESPAWN_TIME;
614    Source->CastSpell(Source, SPELL_RECENTLY_DROPPED_FLAG, true);
615    Source->CastSpell(Source, BG_EY_PLAYER_DROPPED_FLAG_SPELL, true);
616    if(Source->GetTeam() == ALLIANCE)
617    {
618        message = GetMangosString(LANG_BG_EY_DROPPED_FLAG);
619        type = CHAT_MSG_BG_SYSTEM_ALLIANCE;
620    }
621    else
622    {
623        message = GetMangosString(LANG_BG_EY_DROPPED_FLAG);
624        type = CHAT_MSG_BG_SYSTEM_HORDE;
625    }
626    //this does not work correctly :( (it should remove flag carrier name)
627    UpdateWorldState(NETHERSTORM_FLAG_STATE_HORDE, BG_EY_FLAG_STATE_WAIT_RESPAWN);
628    UpdateWorldState(NETHERSTORM_FLAG_STATE_ALLIANCE, BG_EY_FLAG_STATE_WAIT_RESPAWN);
629
630    WorldPacket data;
631    ChatHandler::FillMessageData(&data, Source->GetSession(), type, LANG_UNIVERSAL, NULL, Source->GetGUID(), message, NULL);
632    SendPacketToAll(&data);
633}
634
635void BattleGroundEY::EventPlayerClickedOnFlag(Player *Source, GameObject* target_obj)
636{
637    if(GetStatus() != STATUS_IN_PROGRESS || this->IsFlagPickedup() || !Source->IsWithinDistInMap(target_obj, 10))
638        return;
639
640    const char *message;
641    uint8 type = 0;
642    message = GetMangosString(LANG_BG_EY_HAS_TAKEN_FLAG);
643
644    if(Source->GetTeam() == ALLIANCE)
645    {
646        UpdateWorldState(NETHERSTORM_FLAG_STATE_ALLIANCE, BG_EY_FLAG_STATE_ON_PLAYER);
647        type = CHAT_MSG_BG_SYSTEM_ALLIANCE;
648        PlaySoundToAll(BG_EY_SOUND_FLAG_PICKED_UP_ALLIANCE);
649    }
650    else
651    {
652        UpdateWorldState(NETHERSTORM_FLAG_STATE_HORDE, BG_EY_FLAG_STATE_ON_PLAYER);
653        type = CHAT_MSG_BG_SYSTEM_HORDE;
654        PlaySoundToAll(BG_EY_SOUND_FLAG_PICKED_UP_HORDE);
655    }
656
657    if (m_FlagState == BG_EY_FLAG_STATE_ON_BASE)
658        UpdateWorldState(NETHERSTORM_FLAG, 0);
659    m_FlagState = BG_EY_FLAG_STATE_ON_PLAYER;
660
661    SpawnBGObject(BG_EY_OBJECT_FLAG_NETHERSTORM, RESPAWN_ONE_DAY);
662    SetFlagPicker(Source->GetGUID());
663    //get flag aura on player
664    Source->CastSpell(Source, BG_EY_NETHERSTORM_FLAG_SPELL, true);
665    Source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
666
667    WorldPacket data;
668    ChatHandler::FillMessageData(&data, Source->GetSession(), type, LANG_UNIVERSAL, NULL, Source->GetGUID(), message, NULL);
669    SendPacketToAll(&data);
670}
671
672void BattleGroundEY::EventTeamLostPoint(Player *Source, uint32 Point)
673{
674    if(GetStatus() != STATUS_IN_PROGRESS)
675        return;
676
677    //Natural point
678    uint8 message_type = 0;
679    const char *message = "";
680    uint32 Team = m_PointOwnedByTeam[Point];
681
682    if(!Team)
683        return;
684
685    if (Team == ALLIANCE)
686    {
687        m_TeamPointsCount[BG_TEAM_ALLIANCE]--;
688        message_type = CHAT_MSG_BG_SYSTEM_ALLIANCE;
689        message = GetMangosString(m_LoosingPointTypes[Point].MessageIdAlliance);
690        SpawnBGObject(m_LoosingPointTypes[Point].DespawnObjectTypeAlliance, RESPAWN_ONE_DAY);
691        SpawnBGObject(m_LoosingPointTypes[Point].DespawnObjectTypeAlliance + 1, RESPAWN_ONE_DAY);
692        SpawnBGObject(m_LoosingPointTypes[Point].DespawnObjectTypeAlliance + 2, RESPAWN_ONE_DAY);
693    }
694    else
695    {
696        m_TeamPointsCount[BG_TEAM_HORDE]--;
697        message_type = CHAT_MSG_BG_SYSTEM_HORDE;
698        message = GetMangosString(m_LoosingPointTypes[Point].MessageIdHorde);
699        SpawnBGObject(m_LoosingPointTypes[Point].DespawnObjectTypeHorde, RESPAWN_ONE_DAY);
700        SpawnBGObject(m_LoosingPointTypes[Point].DespawnObjectTypeHorde + 1, RESPAWN_ONE_DAY);
701        SpawnBGObject(m_LoosingPointTypes[Point].DespawnObjectTypeHorde + 2, RESPAWN_ONE_DAY);
702    }
703
704    SpawnBGObject(m_LoosingPointTypes[Point].SpawnNeutralObjectType, RESPAWN_IMMEDIATELY);
705    SpawnBGObject(m_LoosingPointTypes[Point].SpawnNeutralObjectType + 1, RESPAWN_IMMEDIATELY);
706    SpawnBGObject(m_LoosingPointTypes[Point].SpawnNeutralObjectType + 2, RESPAWN_IMMEDIATELY);
707
708    //buff isn't despawned
709
710    m_PointOwnedByTeam[Point] = EY_POINT_NO_OWNER;
711    m_PointState[Point] = EY_POINT_NO_OWNER;
712
713    WorldPacket data;
714    ChatHandler::FillMessageData(&data, Source->GetSession(), message_type, LANG_UNIVERSAL, NULL, Source->GetGUID(), message, NULL);
715    SendPacketToAll(&data);
716
717    UpdatePointsIcons(Team, Point);
718    UpdatePointsCount(Team);
719}
720
721void BattleGroundEY::EventTeamCapturedPoint(Player *Source, uint32 Point)
722{
723    if(GetStatus() != STATUS_IN_PROGRESS)
724        return;
725
726    uint8 type = 0;
727    const char *message = "";
728    uint32 Team = Source->GetTeam();
729
730    SpawnBGObject(m_CapturingPointTypes[Point].DespawnNeutralObjectType, RESPAWN_ONE_DAY);
731    SpawnBGObject(m_CapturingPointTypes[Point].DespawnNeutralObjectType + 1, RESPAWN_ONE_DAY);
732    SpawnBGObject(m_CapturingPointTypes[Point].DespawnNeutralObjectType + 2, RESPAWN_ONE_DAY);
733
734    if (Team == ALLIANCE)
735    {
736        m_TeamPointsCount[BG_TEAM_ALLIANCE]++;
737        type = CHAT_MSG_BG_SYSTEM_ALLIANCE;
738        message = GetMangosString(m_CapturingPointTypes[Point].MessageIdAlliance);
739        SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeAlliance, RESPAWN_IMMEDIATELY);
740        SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeAlliance + 1, RESPAWN_IMMEDIATELY);
741        SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeAlliance + 2, RESPAWN_IMMEDIATELY);
742    }
743    else
744    {
745        m_TeamPointsCount[BG_TEAM_HORDE]++;
746        type = CHAT_MSG_BG_SYSTEM_HORDE;
747        message = GetMangosString(m_CapturingPointTypes[Point].MessageIdHorde);
748        SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeHorde, RESPAWN_IMMEDIATELY);
749        SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeHorde + 1, RESPAWN_IMMEDIATELY);
750        SpawnBGObject(m_CapturingPointTypes[Point].SpawnObjectTypeHorde + 2, RESPAWN_IMMEDIATELY);
751    }
752
753    //buff isn't respawned
754
755    m_PointOwnedByTeam[Point] = Team;
756    m_PointState[Point] = EY_POINT_UNDER_CONTROL;
757
758    WorldPacket data;
759    ChatHandler::FillMessageData(&data, Source->GetSession(), type, LANG_UNIVERSAL, NULL, Source->GetGUID(), message, NULL);
760    SendPacketToAll(&data);
761
762    if(m_BgCreatures[Point])
763        DelCreature(Point);
764
765    WorldSafeLocsEntry const *sg = NULL;
766    sg = sWorldSafeLocsStore.LookupEntry(m_CapturingPointTypes[Point].GraveYardId);
767    if(!sg || !AddSpiritGuide(Point, sg->x, sg->y, sg->z, 3.124139f, Team))
768        sLog.outError("BatteGroundEY: Failed to spawn spirit guide! point: %u, team: u, graveyard_id: %u", Point, Team, m_CapturingPointTypes[Point].GraveYardId);
769
770    UpdatePointsIcons(Team, Point);
771    UpdatePointsCount(Team);
772}
773
774void BattleGroundEY::EventPlayerCapturedFlag(Player *Source, uint32 BgObjectType)
775{
776    if(GetStatus() != STATUS_IN_PROGRESS || this->GetFlagPickerGUID() != Source->GetGUID())
777        return;
778
779    uint8 type = 0;
780    uint8 team_id = 0;
781    const char *message = "";
782
783    SetFlagPicker(0);
784    m_FlagState = BG_EY_FLAG_STATE_WAIT_RESPAWN;
785    Source->RemoveAurasDueToSpell(BG_EY_NETHERSTORM_FLAG_SPELL);
786
787    Source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
788    if(Source->GetTeam() == ALLIANCE)
789    {
790        PlaySoundToAll(BG_EY_SOUND_FLAG_CAPTURED_ALLIANCE);
791        team_id = BG_TEAM_ALLIANCE;
792        message = GetMangosString(LANG_BG_EY_CAPTURED_FLAG_A);
793        type = CHAT_MSG_BG_SYSTEM_ALLIANCE;
794    }
795    else
796    {
797        PlaySoundToAll(BG_EY_SOUND_FLAG_CAPTURED_HORDE);
798        team_id = BG_TEAM_HORDE;
799        message = GetMangosString(LANG_BG_EY_CAPTURED_FLAG_H);
800        type = CHAT_MSG_BG_SYSTEM_HORDE;
801    }
802
803    SpawnBGObject(BgObjectType, RESPAWN_IMMEDIATELY);
804
805    m_FlagsTimer = BG_EY_FLAG_RESPAWN_TIME;
806    m_FlagCapturedBgObjectType = BgObjectType;
807
808    WorldPacket data;
809    ChatHandler::FillMessageData(&data, Source->GetSession(), type, LANG_UNIVERSAL, NULL, Source->GetGUID(), message, NULL);
810    SendPacketToAll(&data);
811
812    if(m_TeamPointsCount[team_id] > 0)
813        AddPoints(Source->GetTeam(), BG_EY_FlagPoints[m_TeamPointsCount[team_id] - 1]);
814
815    UpdatePlayerScore(Source, SCORE_FLAG_CAPTURES, 1);
816}
817
818void BattleGroundEY::UpdatePlayerScore(Player *Source, uint32 type, uint32 value)
819{
820    std::map<uint64, BattleGroundScore*>::iterator itr = m_PlayerScores.find(Source->GetGUID());
821
822    if(itr == m_PlayerScores.end())                         // player not found
823        return;
824
825    switch(type)
826    {
827        case SCORE_FLAG_CAPTURES:                           // flags captured
828            ((BattleGroundEYScore*)itr->second)->FlagCaptures += value;
829            break;
830        default:
831            BattleGround::UpdatePlayerScore(Source, type, value);
832            break;
833    }
834}
835
836void BattleGroundEY::FillInitialWorldStates(WorldPacket& data)
837{
838    data << uint32(EY_HORDE_BASE) << uint32(m_TeamPointsCount[BG_TEAM_HORDE]);
839    data << uint32(EY_ALLIANCE_BASE) << uint32(m_TeamPointsCount[BG_TEAM_ALLIANCE]);
840    data << uint32(0xab6) << uint32(0x0);
841    data << uint32(0xab5) << uint32(0x0);
842    data << uint32(0xab4) << uint32(0x0);
843    data << uint32(0xab3) << uint32(0x0);
844    data << uint32(0xab2) << uint32(0x0);
845    data << uint32(0xab1) << uint32(0x0);
846    data << uint32(0xab0) << uint32(0x0);
847    data << uint32(0xaaf) << uint32(0x0);
848
849    data << uint32(DRAENEI_RUINS_HORDE_CONTROL)     << uint32(m_PointOwnedByTeam[DRAENEI_RUINS] == HORDE && m_PointState[DRAENEI_RUINS] == EY_POINT_UNDER_CONTROL);
850
851    data << uint32(DRAENEI_RUINS_ALLIANCE_CONTROL)  << uint32(m_PointOwnedByTeam[DRAENEI_RUINS] == ALLIANCE && m_PointState[DRAENEI_RUINS] == EY_POINT_UNDER_CONTROL);
852
853    data << uint32(DRAENEI_RUINS_UNCONTROL)         << uint32(m_PointState[DRAENEI_RUINS] != EY_POINT_UNDER_CONTROL);
854
855    data << uint32(MAGE_TOWER_ALLIANCE_CONTROL)     << uint32(m_PointOwnedByTeam[MAGE_TOWER] == ALLIANCE && m_PointState[MAGE_TOWER] == EY_POINT_UNDER_CONTROL);
856
857    data << uint32(MAGE_TOWER_HORDE_CONTROL)        << uint32(m_PointOwnedByTeam[MAGE_TOWER] == HORDE && m_PointState[MAGE_TOWER] == EY_POINT_UNDER_CONTROL);
858
859    data << uint32(MAGE_TOWER_UNCONTROL)            << uint32(m_PointState[MAGE_TOWER] != EY_POINT_UNDER_CONTROL);
860
861    data << uint32(FEL_REAVER_HORDE_CONTROL)        << uint32(m_PointOwnedByTeam[FEL_REALVER] == HORDE && m_PointState[FEL_REALVER] == EY_POINT_UNDER_CONTROL);
862
863    data << uint32(FEL_REAVER_ALLIANCE_CONTROL)     << uint32(m_PointOwnedByTeam[FEL_REALVER] == ALLIANCE && m_PointState[FEL_REALVER] == EY_POINT_UNDER_CONTROL);
864
865    data << uint32(FEL_REAVER_UNCONTROL)            << uint32(m_PointState[FEL_REALVER] != EY_POINT_UNDER_CONTROL);
866
867    data << uint32(BLOOD_ELF_HORDE_CONTROL)         << uint32(m_PointOwnedByTeam[BLOOD_ELF] == HORDE && m_PointState[BLOOD_ELF] == EY_POINT_UNDER_CONTROL);
868
869    data << uint32(BLOOD_ELF_ALLIANCE_CONTROL)      << uint32(m_PointOwnedByTeam[BLOOD_ELF] == ALLIANCE && m_PointState[BLOOD_ELF] == EY_POINT_UNDER_CONTROL);
870
871    data << uint32(BLOOD_ELF_UNCONTROL)             << uint32(m_PointState[BLOOD_ELF] != EY_POINT_UNDER_CONTROL);
872
873    data << uint32(NETHERSTORM_FLAG)                << uint32(m_FlagState == BG_EY_FLAG_STATE_ON_BASE);
874
875    data << uint32(0xad2) << uint32(0x1);
876    data << uint32(0xad1) << uint32(0x1);
877    data << uint32(0xabe) << uint32(GetTeamScore(HORDE));
878    data << uint32(0xabd) << uint32(GetTeamScore(ALLIANCE));
879    data << uint32(0xa05) << uint32(0x8e);
880    data << uint32(0xaa0) << uint32(0x0);
881    data << uint32(0xa9f) << uint32(0x0);
882    data << uint32(0xa9e) << uint32(0x0);
883    data << uint32(0xc0d) << uint32(0x17b);
884}
885
886WorldSafeLocsEntry const *BattleGroundEY::GetClosestGraveYard(float x, float y, float z, uint32 team)
887{
888    uint32 g_id = 0;
889
890    if(team == ALLIANCE)
891        g_id = EY_GRAVEYARD_MAIN_ALLIANCE;
892    else if(team == HORDE)
893        g_id = EY_GRAVEYARD_MAIN_HORDE;
894    else
895        return NULL;
896
897    float distance, nearestDistance;
898
899    WorldSafeLocsEntry const* entry = NULL;
900    WorldSafeLocsEntry const* nearestEntry = NULL;
901    entry = sWorldSafeLocsStore.LookupEntry(g_id);
902    nearestEntry = entry;
903
904    if(!entry)
905    {
906        sLog.outError("BattleGroundEY: Not found the main team graveyard. Graveyard system isn't working!");
907        return NULL;
908    }
909
910    distance = (entry->x - x)*(entry->x - x) + (entry->y - y)*(entry->y - y) + (entry->z - z)*(entry->z - z);
911    nearestDistance = distance;
912
913    for(uint8 i = 0; i < EY_POINTS_MAX; ++i)
914    {
915        if(m_PointOwnedByTeam[i]==team && m_PointState[i]==EY_POINT_UNDER_CONTROL)
916        {
917            entry = sWorldSafeLocsStore.LookupEntry(m_CapturingPointTypes[i].GraveYardId);
918            if(!entry)
919                sLog.outError("BattleGroundEY: Not found graveyard: %u",m_CapturingPointTypes[i].GraveYardId);
920            else
921            {
922                distance = (entry->x - x)*(entry->x - x) + (entry->y - y)*(entry->y - y) + (entry->z - z)*(entry->z - z);
923                if(distance < nearestDistance)
924                {
925                    nearestDistance = distance;
926                    nearestEntry = entry;
927                }
928            }
929        }
930    }
931
932    return nearestEntry;
933}
Note: See TracBrowser for help on using the browser.