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

Revision 2, 40.3 kB (checked in by yumileroy, 17 years ago)

[svn] * Proper SVN structure

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