root/trunk/src/game/BattleGroundAV.cpp @ 283

Revision 283, 68.8 kB (checked in by yumileroy, 17 years ago)

*Alterac Valley. By Bogie and Balrok. Note: some core contents are modified. Will fix them later. Some sql are disabled because of possible conflict with offical DB. Use them at your own risk.

Original author: megamage
Date: 2008-11-21 19:45:49-06:00

Line 
1/*
2 * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
3 *
4 * Copyright (C) 2008 Trinity <http://www.trinitycore.org/>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21#include "Player.h"
22#include "BattleGround.h"
23#include "BattleGroundAV.h"
24#include "Creature.h"
25#include "Chat.h"
26#include "Object.h"
27#include "ObjectMgr.h"
28#include "ObjectAccessor.h"
29#include "MapManager.h"
30#include "Language.h"
31#include "SpellAuras.h"
32#include "Formulas.h"
33
34BattleGroundAV::BattleGroundAV()
35{
36
37    m_BgObjects.resize(BG_AV_OBJECT_MAX);
38    m_BgCreatures.resize(AV_CPLACE_MAX+AV_STATICCPLACE_MAX);
39}
40
41BattleGroundAV::~BattleGroundAV()
42{
43}
44
45const uint16 BattleGroundAV::GetBonusHonor(uint8 kills) //TODO: move this function to Battleground.cpp (needs to find a way to get m_MaxLevel)
46{
47    return Trinity::Honor::hk_honor_at_level(m_MaxLevel, kills);
48}
49
50void BattleGroundAV::HandleKillPlayer(Player *player, Player *killer)
51{
52    if(GetStatus() != STATUS_IN_PROGRESS)
53        return;
54
55    BattleGround::HandleKillPlayer(player, killer);
56        UpdateScore(player->GetTeam(),-1);
57}
58
59void BattleGroundAV::HandleKillUnit(Creature *unit, Player *killer)
60{
61    sLog.outDebug("bg_av HandleKillUnit %i",unit->GetEntry());
62    if(GetStatus() != STATUS_IN_PROGRESS)
63        return;
64    uint32 entry = unit->GetEntry();
65    if(entry == BG_AV_CreatureInfo[AV_NPC_A_BOSS][0])
66    {
67        CastSpellOnTeam(23658,HORDE); //this is a spell which finishes a quest where a player has to kill the boss
68        RewardReputationToTeam(729,BG_AV_REP_BOSS,HORDE);
69        RewardHonorToTeam(GetBonusHonor(BG_AV_KILL_BOSS),HORDE);
70        EndBattleGround(HORDE);
71    }
72    else if ( entry == BG_AV_CreatureInfo[AV_NPC_H_BOSS][0] )
73    {
74        CastSpellOnTeam(23658,ALLIANCE); //this is a spell which finishes a quest where a player has to kill the boss
75        RewardReputationToTeam(730,BG_AV_REP_BOSS,ALLIANCE);
76        RewardHonorToTeam(GetBonusHonor(BG_AV_KILL_BOSS),ALLIANCE);
77        EndBattleGround(ALLIANCE);
78    }
79    else if(entry == BG_AV_CreatureInfo[AV_NPC_A_CAPTAIN][0])
80    {
81        if(!m_CaptainAlive[0])
82        {
83            sLog.outError("Killed a Captain twice, please report this bug, if you haven't done \".respawn\"");
84            return;
85        }
86        m_CaptainAlive[0]=false;
87        RewardReputationToTeam(729,BG_AV_REP_CAPTAIN,HORDE);
88        RewardHonorToTeam(GetBonusHonor(BG_AV_KILL_CAPTAIN),HORDE);
89        UpdateScore(ALLIANCE,(-1)*BG_AV_RES_CAPTAIN);
90        //spawn destroyed aura
91        for(uint8 i=0; i<=9; i++)
92            SpawnBGObject(BG_AV_OBJECT_BURN_BUILDING_ALLIANCE+i,RESPAWN_IMMEDIATELY);
93        Creature* creature = GetBGCreature(AV_CPLACE_HERALD);
94        if(creature)
95            YellToAll(creature,GetTrinityString(LANG_BG_AV_A_CAPTAIN_DEAD),LANG_UNIVERSAL);
96
97    }
98    else if ( entry == BG_AV_CreatureInfo[AV_NPC_H_CAPTAIN][0] )
99    {
100        if(!m_CaptainAlive[1])
101        {
102            sLog.outError("Killed a Captain twice, please report this bug, if you haven't done \".respawn\"");
103            return;
104        }
105        m_CaptainAlive[1]=false;
106        RewardReputationToTeam(730,BG_AV_REP_CAPTAIN,ALLIANCE);
107        RewardHonorToTeam(GetBonusHonor(BG_AV_KILL_CAPTAIN),ALLIANCE);
108        UpdateScore(HORDE,(-1)*BG_AV_RES_CAPTAIN);
109        //spawn destroyed aura
110        for(uint8 i=0; i<=9; i++)
111            SpawnBGObject(BG_AV_OBJECT_BURN_BUILDING_HORDE+i,RESPAWN_IMMEDIATELY);
112        Creature* creature = GetBGCreature(AV_CPLACE_HERALD);
113        if(creature)
114            YellToAll(creature,GetTrinityString(LANG_BG_AV_H_CAPTAIN_DEAD),LANG_UNIVERSAL);
115    }
116    else if ( entry == BG_AV_CreatureInfo[AV_NPC_N_MINE_N_4][0] || entry == BG_AV_CreatureInfo[AV_NPC_N_MINE_A_4][0] || entry == BG_AV_CreatureInfo[AV_NPC_N_MINE_H_4][0])
117        ChangeMineOwner(AV_NORTH_MINE,killer->GetTeam());
118    else if ( entry == BG_AV_CreatureInfo[AV_NPC_S_MINE_N_4][0] || entry == BG_AV_CreatureInfo[AV_NPC_S_MINE_A_4][0] || entry == BG_AV_CreatureInfo[AV_NPC_S_MINE_H_4][0])
119        ChangeMineOwner(AV_SOUTH_MINE,killer->GetTeam());
120}
121
122void BattleGroundAV::HandleQuestComplete(uint32 questid, Player *player)
123{
124    if (GetStatus() != STATUS_IN_PROGRESS)
125        return;//maybe we should log this, cause this must be a cheater or a big bug
126    uint8 team = GetTeamIndexByTeamId(player->GetTeam());
127    //TODO add reputation, events (including quest not available anymore, next quest availabe, go/npc de/spawning)and maybe honor
128    sLog.outError("BG_AV Quest %i completed",questid);
129    switch(questid)
130    {
131        case AV_QUEST_A_SCRAPS1:
132        case AV_QUEST_A_SCRAPS2:
133        case AV_QUEST_H_SCRAPS1:
134        case AV_QUEST_H_SCRAPS2:
135            m_Team_QuestStatus[team][0]+=20;
136            if(m_Team_QuestStatus[team][0] == 500 || m_Team_QuestStatus[team][0] == 1000 || m_Team_QuestStatus[team][0] == 1500) //25,50,75 turn ins
137            {
138                sLog.outDebug("BG_AV Quest %i completed starting with unit upgrading..",questid);
139                for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i)
140                    if (m_Nodes[i].Owner == player->GetTeam() && m_Nodes[i].State == POINT_CONTROLED)
141                    {
142                        DePopulateNode(i);
143                        PopulateNode(i);
144                            //maybe this is bad, because it will instantly respawn all creatures on every grave..
145                     }
146            }
147            break;
148        case AV_QUEST_A_COMMANDER1:
149        case AV_QUEST_H_COMMANDER1:
150            m_Team_QuestStatus[team][1]++;
151            RewardReputationToTeam(team,1,player->GetTeam());
152            if(m_Team_QuestStatus[team][1] == 30)
153                sLog.outDebug("BG_AV Quest %i completed (need to implement some events here",questid);
154            break;
155        case AV_QUEST_A_COMMANDER2:
156        case AV_QUEST_H_COMMANDER2:
157            m_Team_QuestStatus[team][2]++;
158            RewardReputationToTeam(team,1,player->GetTeam());
159            if(m_Team_QuestStatus[team][2] == 60)
160                sLog.outDebug("BG_AV Quest %i completed (need to implement some events here",questid);
161            break;
162        case AV_QUEST_A_COMMANDER3:
163        case AV_QUEST_H_COMMANDER3:
164            m_Team_QuestStatus[team][3]++;
165            RewardReputationToTeam(team,1,player->GetTeam());
166            if(m_Team_QuestStatus[team][1] == 120)
167                sLog.outDebug("BG_AV Quest %i completed (need to implement some events here",questid);
168            break;
169        case AV_QUEST_A_BOSS1:
170        case AV_QUEST_H_BOSS1:
171            m_Team_QuestStatus[team][4] += 9; //you can turn in 10 or 1 item..
172        case AV_QUEST_A_BOSS2:
173        case AV_QUEST_H_BOSS2:
174            m_Team_QuestStatus[team][4]++;
175            if(m_Team_QuestStatus[team][4] >= 200)
176                sLog.outDebug("BG_AV Quest %i completed (need to implement some events here",questid);
177            break;
178        case AV_QUEST_A_NEAR_MINE:
179        case AV_QUEST_H_NEAR_MINE:
180            m_Team_QuestStatus[team][5]++;
181            if(m_Team_QuestStatus[team][5] == 28)
182            {
183                sLog.outDebug("BG_AV Quest %i completed (need to implement some events here",questid);
184                if(m_Team_QuestStatus[team][6] == 7)
185                    sLog.outDebug("BG_AV Quest %i completed (need to implement some events here - ground assault ready",questid);
186            }
187            break;
188        case AV_QUEST_A_OTHER_MINE:
189        case AV_QUEST_H_OTHER_MINE:
190            m_Team_QuestStatus[team][6]++;
191            if(m_Team_QuestStatus[team][6] == 7)
192            {
193                sLog.outDebug("BG_AV Quest %i completed (need to implement some events here",questid);
194                if(m_Team_QuestStatus[team][5] == 20)
195                    sLog.outDebug("BG_AV Quest %i completed (need to implement some events here - ground assault ready",questid);
196            }
197            break;
198        case AV_QUEST_A_RIDER_HIDE:
199        case AV_QUEST_H_RIDER_HIDE:
200            m_Team_QuestStatus[team][7]++;
201            if(m_Team_QuestStatus[team][7] == 25)
202            {
203                sLog.outDebug("BG_AV Quest %i completed (need to implement some events here",questid);
204                if(m_Team_QuestStatus[team][8] == 25)
205                    sLog.outDebug("BG_AV Quest %i completed (need to implement some events here - rider assault ready",questid);
206            }
207            break;
208        case AV_QUEST_A_RIDER_TAME:
209        case AV_QUEST_H_RIDER_TAME:
210            m_Team_QuestStatus[team][8]++;
211            if(m_Team_QuestStatus[team][8] == 25)
212            {
213                sLog.outDebug("BG_AV Quest %i completed (need to implement some events here",questid);
214                if(m_Team_QuestStatus[team][7] == 25)
215                    sLog.outDebug("BG_AV Quest %i completed (need to implement some events here - rider assault ready",questid);
216            }
217            break;
218        default:
219            sLog.outDebug("BG_AV Quest %i completed but is not interesting at all",questid);
220            return; //was no interesting quest at all
221            break;
222    }
223}
224
225
226void BattleGroundAV::UpdateScore(uint16 team, int16 points )
227{ //note: to remove reinforcementpoints points must be negative, for adding reinforcements points must be positive
228    assert( team == ALLIANCE || team == HORDE);
229    uint8 teamindex = GetTeamIndexByTeamId(team); //0=ally 1=horde
230    m_Team_Scores[teamindex] += points;
231
232    UpdateWorldState(((teamindex==BG_TEAM_HORDE)?AV_Horde_Score:AV_Alliance_Score), m_Team_Scores[teamindex]);
233    if( points < 0)
234    {
235        if( m_Team_Scores[teamindex] < 1)
236        {
237            m_Team_Scores[teamindex]=0;
238            EndBattleGround(((teamindex==BG_TEAM_HORDE)?ALLIANCE:HORDE));
239        }
240        else if(!m_IsInformedNearVictory[teamindex] && m_Team_Scores[teamindex] < SEND_MSG_NEAR_LOSE)
241        {
242            SendMessageToAll(GetTrinityString((teamindex==BG_TEAM_HORDE)?LANG_BG_AV_H_NEAR_LOSE:LANG_BG_AV_A_NEAR_LOSE));
243            PlaySoundToAll(AV_SOUND_NEAR_VICTORY);
244            m_IsInformedNearVictory[teamindex] = true;
245        }
246    }
247}
248
249Creature* BattleGroundAV::AddAVCreature(uint16 cinfoid, uint16 type )
250{
251    uint32 level;
252    bool isStatic=false;
253    Creature* creature = NULL;
254    assert(type <= AV_CPLACE_MAX + AV_STATICCPLACE_MAX);
255    if(type>=AV_CPLACE_MAX) //static
256    {
257        type-=AV_CPLACE_MAX;
258        cinfoid=int(BG_AV_StaticCreaturePos[type][4]);
259        creature = AddCreature(BG_AV_StaticCreatureInfo[cinfoid][0],(type+AV_CPLACE_MAX),BG_AV_StaticCreatureInfo[cinfoid][1],BG_AV_StaticCreaturePos[type][0],BG_AV_StaticCreaturePos[type][1],BG_AV_StaticCreaturePos[type][2],BG_AV_StaticCreaturePos[type][3]);
260        level = ( BG_AV_StaticCreatureInfo[cinfoid][2] == BG_AV_StaticCreatureInfo[cinfoid][3] ) ? BG_AV_StaticCreatureInfo[cinfoid][2] : urand(BG_AV_StaticCreatureInfo[cinfoid][2],BG_AV_StaticCreatureInfo[cinfoid][3]);
261        isStatic=true;
262    }
263    else
264    {
265        creature = AddCreature(BG_AV_CreatureInfo[cinfoid][0],type,BG_AV_CreatureInfo[cinfoid][1],BG_AV_CreaturePos[type][0],BG_AV_CreaturePos[type][1],BG_AV_CreaturePos[type][2],BG_AV_CreaturePos[type][3]);
266        level = ( BG_AV_CreatureInfo[cinfoid][2] == BG_AV_CreatureInfo[cinfoid][3] ) ? BG_AV_CreatureInfo[cinfoid][2] : urand(BG_AV_CreatureInfo[cinfoid][2],BG_AV_CreatureInfo[cinfoid][3]);
267    }
268    if(!creature)
269        return NULL;
270    if(creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_A_CAPTAIN][0] || creature->GetEntry() == BG_AV_CreatureInfo[AV_NPC_H_CAPTAIN][0])
271        creature->SetRespawnDelay(RESPAWN_ONE_DAY); // TODO: look if this can be done by database + also add this for the wingcommanders
272
273    if((isStatic && cinfoid>=10 && cinfoid<=14) || (!isStatic && ((cinfoid >= AV_NPC_A_GRAVEDEFENSE0 && cinfoid<=AV_NPC_A_GRAVEDEFENSE3) ||
274        (cinfoid>=AV_NPC_H_GRAVEDEFENSE0 && cinfoid<=AV_NPC_H_GRAVEDEFENSE3))))
275    {
276        if(!isStatic && ((cinfoid>=AV_NPC_A_GRAVEDEFENSE0 && cinfoid<=AV_NPC_A_GRAVEDEFENSE3)
277            || (cinfoid>=AV_NPC_H_GRAVEDEFENSE0 && cinfoid<=AV_NPC_H_GRAVEDEFENSE3)))
278        {
279            CreatureData &data = objmgr.NewOrExistCreatureData(creature->GetDBTableGUIDLow());
280            data.spawndist      = 5;
281        }
282        //else spawndist will be 15, so creatures move maximum=10
283        creature->SetDefaultMovementType(RANDOM_MOTION_TYPE);
284        creature->GetMotionMaster()->Initialize();
285        creature->setDeathState(JUST_DIED);
286        creature->Respawn();
287        //TODO: find a way to add a motionmaster without killing the creature (i
288        //just copied this code from a gm-command
289    }
290
291    if(level != 0)
292        level += m_MaxLevel-60; //maybe we can do this more generic for custom level-range.. actually it's blizzlike
293    creature->SetLevel(level);
294    return creature;
295}
296
297void BattleGroundAV::Update(time_t diff)
298{
299    BattleGround::Update(diff);
300    if (GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize())
301    {
302        ModifyStartDelayTime(diff);
303
304        if (!(m_Events & 0x01))
305        {
306            m_Events |= 0x01;
307
308#ifdef ARENA_PATCH
309            if(!SetupBattleGround())
310            {
311                EndNow();
312                return;
313            }
314#endif
315
316            uint16 i;
317            sLog.outDebug("Alterac Valley: entering state STATUS_WAIT_JOIN ...");
318            // Initial Nodes
319            for(i = 0; i < BG_AV_OBJECT_MAX; i++)
320                SpawnBGObject(i, RESPAWN_ONE_DAY);
321            for(i = BG_AV_OBJECT_FLAG_A_FIRSTAID_STATION; i <= BG_AV_OBJECT_FLAG_A_STONEHEART_GRAVE ; i++){
322                SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+3*i,RESPAWN_IMMEDIATELY);
323                SpawnBGObject(i, RESPAWN_IMMEDIATELY);
324            }
325            for(i = BG_AV_OBJECT_FLAG_A_DUNBALDAR_SOUTH; i <= BG_AV_OBJECT_FLAG_A_STONEHEART_BUNKER ; i++)
326                SpawnBGObject(i, RESPAWN_IMMEDIATELY);
327            for(i = BG_AV_OBJECT_FLAG_H_ICEBLOOD_GRAVE; i <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_WTOWER ; i++){
328                SpawnBGObject(i, RESPAWN_IMMEDIATELY);
329                if(i<=BG_AV_OBJECT_FLAG_H_FROSTWOLF_HUT)
330                    SpawnBGObject(BG_AV_OBJECT_AURA_H_FIRSTAID_STATION+3*GetNodeThroughObject(i),RESPAWN_IMMEDIATELY);
331            }
332            for(i = BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH; i <= BG_AV_OBJECT_TFLAG_A_STONEHEART_BUNKER; i+=2)
333            {
334                SpawnBGObject(i, RESPAWN_IMMEDIATELY); //flag
335                SpawnBGObject(i+16, RESPAWN_IMMEDIATELY); //aura
336            }
337            for(i = BG_AV_OBJECT_TFLAG_H_ICEBLOOD_TOWER; i <= BG_AV_OBJECT_TFLAG_H_FROSTWOLF_WTOWER; i+=2)
338            {
339                SpawnBGObject(i, RESPAWN_IMMEDIATELY); //flag
340                SpawnBGObject(i+16, RESPAWN_IMMEDIATELY); //aura
341            }
342            //snowfall and the doors
343            for(i = BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE; i <= BG_AV_OBJECT_DOOR_A; i++)
344                SpawnBGObject(i, RESPAWN_IMMEDIATELY);
345            SpawnBGObject(BG_AV_OBJECT_AURA_N_SNOWFALL_GRAVE,RESPAWN_IMMEDIATELY);
346
347            //creatures
348            sLog.outDebug("BG_AV start poputlating nodes");
349                        for(BG_AV_Nodes i= BG_AV_NODES_FIRSTAID_STATION; i < BG_AV_NODES_MAX; ++i )
350            {
351                if(m_Nodes[i].Owner)
352                                PopulateNode(i);
353            }
354            //all creatures which don't get despawned through the script are static
355            sLog.outDebug("BG_AV: start spawning static creatures");
356            for(i=0; i < AV_STATICCPLACE_MAX; i++ )
357                AddAVCreature(0,i+AV_CPLACE_MAX);
358                //mainspiritguides:
359            sLog.outDebug("BG_AV: start spawning spiritguides creatures");
360                AddSpiritGuide(7, BG_AV_CreaturePos[7][0], BG_AV_CreaturePos[7][1], BG_AV_CreaturePos[7][2], BG_AV_CreaturePos[7][3], ALLIANCE);
361                AddSpiritGuide(8, BG_AV_CreaturePos[8][0], BG_AV_CreaturePos[8][1], BG_AV_CreaturePos[8][2], BG_AV_CreaturePos[8][3], HORDE);
362            //spawn the marshals (those who get deleted, if a tower gets destroyed)
363            sLog.outDebug("BG_AV: start spawning marshal creatures");
364            for(i=AV_NPC_A_MARSHAL_SOUTH; i<= AV_NPC_H_MARSHAL_WTOWER; i++)
365                AddAVCreature(i,AV_CPLACE_A_MARSHAL_SOUTH+(i-AV_NPC_A_MARSHAL_SOUTH));
366
367            AddAVCreature(AV_NPC_HERALD,AV_CPLACE_HERALD);
368            DoorClose(BG_AV_OBJECT_DOOR_A);
369            DoorClose(BG_AV_OBJECT_DOOR_H);
370
371            SetStartDelayTime(START_DELAY0);
372        }
373        // After 1 minute, warning is signalled
374        else if (GetStartDelayTime() <= START_DELAY1 && !(m_Events & 0x04))
375        {
376            m_Events |= 0x04;
377            SendMessageToAll(GetTrinityString(LANG_BG_AV_ONEMINTOSTART));
378        }
379        // After 1,5 minute, warning is signalled
380        else if (GetStartDelayTime() <= START_DELAY2 && !(m_Events & 0x08))
381        {
382            m_Events |= 0x08;
383            SendMessageToAll(GetTrinityString(LANG_BG_AV_HALFMINTOSTART));
384        }
385        // After 2 minutes, gates OPEN ! x)
386        else if (GetStartDelayTime() <= 0 && !(m_Events & 0x10))
387        {
388            UpdateWorldState(AV_SHOW_H_SCORE, 1);
389            UpdateWorldState(AV_SHOW_A_SCORE, 1);
390            m_Events |= 0x10;
391
392            SendMessageToAll(GetTrinityString(LANG_BG_AV_STARTED));
393            PlaySoundToAll(SOUND_BG_START);
394            SetStatus(STATUS_IN_PROGRESS);
395
396            sLog.outDebug("BG_AV: start spawning mine stuff");
397            for(uint16 i= BG_AV_OBJECT_MINE_SUPPLY_N_MIN; i<=BG_AV_OBJECT_MINE_SUPPLY_N_MAX;i++)
398                SpawnBGObject(i,RESPAWN_IMMEDIATELY);
399            for(uint16 i= BG_AV_OBJECT_MINE_SUPPLY_S_MIN; i<=BG_AV_OBJECT_MINE_SUPPLY_S_MAX;i++)
400                SpawnBGObject(i,RESPAWN_IMMEDIATELY);
401            for(uint8 mine = AV_NORTH_MINE; mine <= AV_SOUTH_MINE; mine++) //mine population
402                ChangeMineOwner(mine, AV_NEUTRAL_TEAM,true);
403            DoorOpen(BG_AV_OBJECT_DOOR_H);
404            DoorOpen(BG_AV_OBJECT_DOOR_A);
405
406
407            for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
408                if(Player* plr = objmgr.GetPlayer(itr->first))
409                    plr->RemoveAurasDueToSpell(SPELL_PREPARATION);
410        }
411    }
412    else if(GetStatus() == STATUS_IN_PROGRESS)
413    {
414        for(uint8 i=0; i<=1;i++)//0=alliance, 1=horde
415        {
416            if(!m_CaptainAlive[i])
417                continue;
418            if(m_CaptainBuffTimer[i] > diff)
419                m_CaptainBuffTimer[i] -= diff;
420            else
421            {
422                if(i==0)
423                {
424                    CastSpellOnTeam(AV_BUFF_A_CAPTAIN,ALLIANCE);
425                    Creature* creature = GetBGCreature(AV_CPLACE_MAX + 61);
426                    if(creature)
427                        YellToAll(creature,LANG_BG_AV_A_CAPTAIN_BUFF,LANG_COMMON);
428                }
429                else
430                {
431                    CastSpellOnTeam(AV_BUFF_H_CAPTAIN,HORDE);
432                    Creature* creature = GetBGCreature(AV_CPLACE_MAX + 59); //TODO: make the captains a dynamic creature
433                    if(creature)
434                        YellToAll(creature,LANG_BG_AV_H_CAPTAIN_BUFF,LANG_ORCISH);
435                }
436                m_CaptainBuffTimer[i] = 120000 + urand(0,4)* 60000; //as far as i could see, the buff is randomly so i make 2minutes (thats the duration of the buff itself) + 0-4minutes TODO get the right times
437            }
438        }
439        //add points from mine owning, and look if he neutral team wanrts to reclaim the mine
440        m_Mine_Timer -=diff;
441        for(uint8 mine=0; mine <2; mine++)
442        {
443            if(m_Mine_Owner[mine] == ALLIANCE || m_Mine_Owner[mine] == HORDE)
444            {
445                if( m_Mine_Timer <= 0)
446                    UpdateScore(m_Mine_Owner[mine],1);
447
448                if(m_Mine_Reclaim_Timer[mine] > diff)
449                    m_Mine_Reclaim_Timer[mine] -= diff;
450                else{ //we don't need to set this timer to 0 cause this codepart wont get called when this thing is 0
451                    ChangeMineOwner(mine,AV_NEUTRAL_TEAM);
452                }
453            }
454        }
455        if( m_Mine_Timer <= 0)
456            m_Mine_Timer=AV_MINE_TICK_TIMER; //this is at the end, cause we need to update both mines
457
458        //looks for all timers of the nodes and destroy the building (for graveyards the building wont get destroyed, it goes just to the other team
459        for(BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i < BG_AV_NODES_MAX; ++i)
460            if(m_Nodes[i].State == POINT_ASSAULTED) //maybe remove this
461            {
462                if(m_Nodes[i].Timer > diff)
463                    m_Nodes[i].Timer -= diff;
464                else
465                     EventPlayerDestroyedPoint( i);
466            }
467    }
468}
469
470void BattleGroundAV::AddPlayer(Player *plr)
471{
472    BattleGround::AddPlayer(plr);
473    //create score and add it to map, default values are set in constructor
474    BattleGroundAVScore* sc = new BattleGroundAVScore;
475    m_PlayerScores[plr->GetGUID()] = sc;
476    if(m_MaxLevel==0)
477        m_MaxLevel=(plr->getLevel()%10 == 0)? plr->getLevel() : (plr->getLevel()-(plr->getLevel()%10))+10; //TODO: just look at the code \^_^/ --but queue-info should provide this information..
478
479}
480
481void BattleGroundAV::EndBattleGround(uint32 winner)
482{
483    //calculate bonuskills for both teams:
484    //first towers:
485    uint8 kills[2]={0,0}; //0=ally 1=horde
486    uint8 rep[2]={0,0}; //0=ally 1=horde
487    for(BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i)
488    {
489            if(m_Nodes[i].State == POINT_CONTROLED)
490            {
491                if(m_Nodes[i].Owner == ALLIANCE)
492                {
493                    rep[0]   += BG_AV_REP_SURVIVING_TOWER;
494                    kills[0] += BG_AV_KILL_SURVIVING_TOWER;
495                }
496                else
497                {
498                    rep[0]   += BG_AV_KILL_SURVIVING_TOWER;
499                    kills[1] += BG_AV_KILL_SURVIVING_TOWER;
500                }
501            }
502    }
503
504    for(int i=0; i<=1; i++) //0=ally 1=horde
505    {
506        if(m_CaptainAlive[i])
507        {
508            kills[i] += BG_AV_KILL_SURVIVING_CAPTAIN;
509            rep[i]   += BG_AV_REP_SURVIVING_CAPTAIN;
510        }
511        if(rep[i] != 0)
512            RewardReputationToTeam((i == 0)?730:729,rep[i],(i == 0)?ALLIANCE:HORDE);
513        if(kills[i] != 0)
514            RewardHonorToTeam(GetBonusHonor(kills[i]),(i == 0)?ALLIANCE:HORDE);
515    }
516
517    //TODO add enterevademode for all attacking creatures
518    BattleGround::EndBattleGround(winner);
519}
520
521void BattleGroundAV::RemovePlayer(Player* plr,uint64 /*guid*/)
522{
523   if(!plr)
524    {
525        sLog.outError("bg_AV no player at remove");
526        return;
527    }
528    //TODO search more buffs
529    plr->RemoveAurasDueToSpell(AV_BUFF_ARMOR);
530    plr->RemoveAurasDueToSpell(AV_BUFF_A_CAPTAIN);
531    plr->RemoveAurasDueToSpell(AV_BUFF_H_CAPTAIN);
532}
533
534
535void BattleGroundAV::HandleAreaTrigger(Player *Source, uint32 Trigger)
536{
537    // this is wrong way to implement these things. On official it done by gameobject spell cast.
538    if(GetStatus() != STATUS_IN_PROGRESS)
539        return;
540
541    uint32 SpellId = 0;
542    switch(Trigger)
543    {
544        case 95:
545        case 2608:
546                        if(Source->GetTeam() != ALLIANCE)
547                Source->GetSession()->SendAreaTriggerMessage("Only The Alliance can use that portal");
548            else
549                Source->LeaveBattleground();
550            break;
551        case 2606:
552            if(Source->GetTeam() != HORDE)
553                Source->GetSession()->SendAreaTriggerMessage("Only The Horde can use that portal");
554            else
555                Source->LeaveBattleground();
556            break;
557        case 3326:
558        case 3327:
559        case 3328:
560        case 3329:
561        case 3330:
562        case 3331:
563                        //Source->Unmount();
564            break;
565        default:
566            sLog.outDebug("WARNING: Unhandled AreaTrigger in Battleground: %u", Trigger);
567//            Source->GetSession()->SendAreaTriggerMessage("Warning: Unhandled AreaTrigger in Battleground: %u", Trigger);
568            break;
569    }
570
571    if(SpellId)
572        Source->CastSpell(Source, SpellId, true);
573}
574
575void BattleGroundAV::UpdatePlayerScore(Player* Source, uint32 type, uint32 value)
576{
577
578    std::map<uint64, BattleGroundScore*>::iterator itr = m_PlayerScores.find(Source->GetGUID());
579
580    if(itr == m_PlayerScores.end())                         // player not found...
581        return;
582
583    switch(type)
584    {
585        case SCORE_GRAVEYARDS_ASSAULTED:
586            ((BattleGroundAVScore*)itr->second)->GraveyardsAssaulted += value;
587            break;
588        case SCORE_GRAVEYARDS_DEFENDED:
589            ((BattleGroundAVScore*)itr->second)->GraveyardsDefended += value;
590            break;
591        case SCORE_TOWERS_ASSAULTED:
592            ((BattleGroundAVScore*)itr->second)->TowersAssaulted += value;
593            break;
594        case SCORE_TOWERS_DEFENDED:
595            ((BattleGroundAVScore*)itr->second)->TowersDefended += value;
596            break;
597        case SCORE_MINES_CAPTURED:
598            ((BattleGroundAVScore*)itr->second)->MinesCaptured += value;
599            break;
600        case SCORE_LEADERS_KILLED:
601            ((BattleGroundAVScore*)itr->second)->LeadersKilled += value;
602            break;
603        case SCORE_SECONDARY_OBJECTIVES:
604            ((BattleGroundAVScore*)itr->second)->SecondaryObjectives += value;
605            break;
606        default:
607            BattleGround::UpdatePlayerScore(Source,type,value);
608            break;
609    }
610}
611
612
613
614void BattleGroundAV::EventPlayerDestroyedPoint(BG_AV_Nodes node)
615{
616
617    uint32 object = GetObjectThroughNode(node);
618    sLog.outDebug("bg_av: player destroyed point node %i object %i",node,object);
619
620    //despawn banner
621    SpawnBGObject(object, RESPAWN_ONE_DAY);
622    DestroyNode(node);
623    UpdateNodeWorldState(node);
624
625    uint32 owner = m_Nodes[node].Owner;
626    if( IsTower(node) )
627    {
628        uint8 tmp = node-BG_AV_NODES_DUNBALDAR_SOUTH;
629        //despawn marshal
630        if(m_BgCreatures[AV_CPLACE_A_MARSHAL_SOUTH + tmp])
631            DelCreature(AV_CPLACE_A_MARSHAL_SOUTH + tmp);
632        else
633            sLog.outError("BG_AV: playerdestroyedpoint: marshal %i doesn't exist",AV_CPLACE_A_MARSHAL_SOUTH + tmp);
634        //spawn destroyed aura
635        for(uint8 i=0; i<=9; i++)
636            SpawnBGObject(BG_AV_OBJECT_BURN_DUNBALDAR_SOUTH + i + (tmp * 10),RESPAWN_IMMEDIATELY);
637
638        UpdateScore((owner == ALLIANCE) ? HORDE : ALLIANCE, (-1)*BG_AV_RES_TOWER);
639        RewardReputationToTeam((owner == ALLIANCE)?730:729,BG_AV_REP_TOWER,owner);
640        RewardHonorToTeam(GetBonusHonor(BG_AV_KILL_TOWER),owner);
641
642        SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+GetTeamIndexByTeamId(owner)+(2*tmp),RESPAWN_ONE_DAY);
643        SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+GetTeamIndexByTeamId(owner)+(2*tmp),RESPAWN_ONE_DAY);
644    }
645    else
646    {
647        if( owner == ALLIANCE )
648            SpawnBGObject(object-11, RESPAWN_IMMEDIATELY);
649        else
650            SpawnBGObject(object+11, RESPAWN_IMMEDIATELY);
651        SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION+3*node,RESPAWN_ONE_DAY);
652        SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+GetTeamIndexByTeamId(owner)+3*node,RESPAWN_IMMEDIATELY);
653        PopulateNode(node);
654        if(node == BG_AV_NODES_SNOWFALL_GRAVE) //snowfall eyecandy
655        {
656            for(uint8 i = 0; i < 4; i++)
657            {
658                SpawnBGObject(((owner==ALLIANCE)?BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_PH)+i,RESPAWN_ONE_DAY);
659                SpawnBGObject(((owner==ALLIANCE)?BG_AV_OBJECT_SNOW_EYECANDY_A  : BG_AV_OBJECT_SNOW_EYECANDY_H )+i,RESPAWN_IMMEDIATELY);
660            }
661        }
662    }
663    //send a nice message to all :)
664    char buf[256];
665    if(IsTower(node))
666        sprintf(buf, GetTrinityString(LANG_BG_AV_TOWER_TAKEN) , GetNodeName(node),( owner == ALLIANCE ) ? GetTrinityString(LANG_BG_AV_ALLY) : GetTrinityString(LANG_BG_AV_HORDE)  );
667    else
668        sprintf(buf, GetTrinityString(LANG_BG_AV_GRAVE_TAKEN) , GetNodeName(node),( owner == ALLIANCE ) ? GetTrinityString(LANG_BG_AV_ALLY) :GetTrinityString(LANG_BG_AV_HORDE)  );
669
670    Creature* creature = GetBGCreature(AV_CPLACE_HERALD);
671    if(creature)
672        YellToAll(creature,buf,LANG_UNIVERSAL);
673}
674
675void BattleGroundAV::ChangeMineOwner(uint8 mine, uint32 team, bool initial)
676{ //mine=0 northmine mine=1 southmin
677//changing the owner results in setting respawntim to infinite for current creatures, spawning new mine owners creatures and changing the chest-objects so that the current owning team can use them
678    assert(mine == AV_NORTH_MINE || mine == AV_SOUTH_MINE);
679    if(team != ALLIANCE && team != HORDE)
680        team = AV_NEUTRAL_TEAM;
681    else
682        PlaySoundToAll((team==ALLIANCE)?AV_SOUND_ALLIANCE_GOOD:AV_SOUND_HORDE_GOOD);
683
684    if(m_Mine_Owner[mine] == team && !initial)
685        return;
686    m_Mine_PrevOwner[mine] = m_Mine_Owner[mine];
687    m_Mine_Owner[mine] = team;
688
689    if(!initial)
690    {
691        sLog.outDebug("bg_av depopulating mine %i (0=north,1=south)",mine);
692        if(mine==AV_SOUTH_MINE)
693            for(uint16 i=AV_CPLACE_MINE_S_S_MIN; i <= AV_CPLACE_MINE_S_S_MAX; i++)
694                if( m_BgCreatures[i] )
695                    DelCreature(i); //TODO just set the respawntime to 999999
696        for(uint16 i=((mine==AV_NORTH_MINE)?AV_CPLACE_MINE_N_1_MIN:AV_CPLACE_MINE_S_1_MIN); i <= ((mine==AV_NORTH_MINE)?AV_CPLACE_MINE_N_3:AV_CPLACE_MINE_S_3); i++)
697            if( m_BgCreatures[i] )
698                DelCreature(i); //TODO here also
699    }
700    SendMineWorldStates(mine);
701
702    sLog.outDebug("bg_av populating mine %i (0=north,1=south)",mine);
703    uint16 miner;
704    //also neutral team exists.. after a big time, the neutral team tries to conquer the mine
705    if(mine==AV_NORTH_MINE)
706    {
707        if(team == ALLIANCE)
708            miner = AV_NPC_N_MINE_A_1;
709        else if (team == HORDE)
710            miner = AV_NPC_N_MINE_H_1;
711        else
712            miner = AV_NPC_N_MINE_N_1;
713    }
714    else
715    {
716        uint16 cinfo;
717        if(team == ALLIANCE)
718            miner = AV_NPC_S_MINE_A_1;
719        else if (team == HORDE)
720            miner = AV_NPC_S_MINE_H_1;
721        else
722            miner = AV_NPC_S_MINE_N_1;
723       //vermin
724        sLog.outDebug("spawning vermin");
725        if(team == ALLIANCE)
726            cinfo = AV_NPC_S_MINE_A_3;
727        else if (team == HORDE)
728            cinfo = AV_NPC_S_MINE_H_3;
729        else
730            cinfo = AV_NPC_S_MINE_N_S;
731        for(uint16 i=AV_CPLACE_MINE_S_S_MIN; i <= AV_CPLACE_MINE_S_S_MAX; i++)
732            AddAVCreature(cinfo,i);
733    }
734    for(uint16 i=( (mine==AV_NORTH_MINE)?AV_CPLACE_MINE_N_1_MIN:AV_CPLACE_MINE_S_1_MIN ); i <= ((mine==AV_NORTH_MINE)?AV_CPLACE_MINE_N_1_MAX:AV_CPLACE_MINE_S_1_MAX); i++)
735        AddAVCreature(miner,i);
736    //the next chooses randomly between 2 cretures
737    for(uint16 i=((mine==AV_NORTH_MINE)?AV_CPLACE_MINE_N_2_MIN:AV_CPLACE_MINE_S_2_MIN); i <= ((mine==AV_NORTH_MINE)?AV_CPLACE_MINE_N_2_MAX:AV_CPLACE_MINE_S_2_MAX); i++)
738        AddAVCreature(miner+(urand(1,2)),i);
739    AddAVCreature(miner+3,(mine==AV_NORTH_MINE)?AV_CPLACE_MINE_N_3:AV_CPLACE_MINE_S_3);
740    //because the gameobjects in this mine have changed, update all surrounding players:
741//    for(uint16 i = ((mine==AV_NORTH_MINE)?BG_AV_OBJECT_MINE_SUPPLY_N_MIN:BG_AV_OBJECT_MINE_SUPPLY_N_MIN); i <= ((mine==AV_NORTH_MINE)?BG_AV_OBJECT_MINE_SUPPLY_N_MAX:BG_AV_OBJECT_MINE_SUPPLY_N_MAX); i++)
742//    {
743        //TODO: add gameobject-update code
744//    }
745    if(team == ALLIANCE || team == HORDE)
746    {
747        m_Mine_Reclaim_Timer[mine]=AV_MINE_RECLAIM_TIMER;
748        char buf[256];
749            sprintf(buf, GetTrinityString(LANG_BG_AV_MINE_TAKEN), GetTrinityString(( mine == AV_NORTH_MINE ) ? LANG_BG_AV_MINE_NORTH : LANG_BG_AV_MINE_SOUTH), ( team == ALLIANCE ) ?  GetTrinityString(LANG_BG_AV_ALLY) : GetTrinityString(LANG_BG_AV_HORDE));
750        Creature* creature = GetBGCreature(AV_CPLACE_HERALD);
751        if(creature)
752            YellToAll(creature,buf,LANG_UNIVERSAL);
753    }
754    else
755    {
756        if(mine==AV_SOUTH_MINE) //i think this gets called all the time
757        {
758            Creature* creature = GetBGCreature(AV_CPLACE_MINE_S_3);
759            YellToAll(creature,LANG_BG_AV_S_MINE_BOSS_CLAIMS,LANG_UNIVERSAL);
760        }
761    }
762    return;
763}
764
765bool BattleGroundAV::PlayerCanDoMineQuest(int32 GOId,uint32 team)
766{
767    if(GOId == BG_AV_OBJECTID_MINE_N)
768         return (m_Mine_Owner[AV_NORTH_MINE]==team);
769    if(GOId == BG_AV_OBJECTID_MINE_S)
770         return (m_Mine_Owner[AV_SOUTH_MINE]==team);
771    return true; //cause it's no mine'object it is ok if this is true
772}
773
774void BattleGroundAV::PopulateNode(BG_AV_Nodes node)
775{
776    uint32 owner = m_Nodes[node].Owner;
777        assert(owner);
778
779    uint32 c_place = AV_CPLACE_DEFENSE_STORM_AID + ( 4 * node );
780    uint32 creatureid;
781    if(IsTower(node))
782        creatureid=(owner==ALLIANCE)?AV_NPC_A_TOWERDEFENSE:AV_NPC_H_TOWERDEFENSE;
783    else
784    {
785        uint8 team2 = GetTeamIndexByTeamId(owner);
786        if (m_Team_QuestStatus[team2][0] < 500 )
787            creatureid = ( owner == ALLIANCE )? AV_NPC_A_GRAVEDEFENSE0 : AV_NPC_H_GRAVEDEFENSE0;
788        else if ( m_Team_QuestStatus[team2][0] < 1000 )
789            creatureid = ( owner == ALLIANCE )? AV_NPC_A_GRAVEDEFENSE1 : AV_NPC_H_GRAVEDEFENSE1;
790        else if ( m_Team_QuestStatus[team2][0] < 1500 )
791            creatureid = ( owner == ALLIANCE )? AV_NPC_A_GRAVEDEFENSE2 : AV_NPC_H_GRAVEDEFENSE2;
792        else
793           creatureid = ( owner == ALLIANCE )? AV_NPC_A_GRAVEDEFENSE3 : AV_NPC_H_GRAVEDEFENSE3;
794        //spiritguide
795        if( m_BgCreatures[node] )
796            DelCreature(node);
797        if( !AddSpiritGuide(node, BG_AV_CreaturePos[node][0], BG_AV_CreaturePos[node][1], BG_AV_CreaturePos[node][2], BG_AV_CreaturePos[node][3], owner))
798            sLog.outError("AV: couldn't spawn spiritguide at node %i",node);
799
800    }
801    for(uint8 i=0; i<4; i++)
802    {
803        Creature* cr = AddAVCreature(creatureid,c_place+i);
804    }
805}
806void BattleGroundAV::DePopulateNode(BG_AV_Nodes node)
807{
808        uint32 c_place = AV_CPLACE_DEFENSE_STORM_AID + ( 4 * node );
809    for(uint8 i=0; i<4; i++)
810        if( m_BgCreatures[c_place+i] )
811            DelCreature(c_place+i);
812    //spiritguide
813    if( !IsTower(node) && m_BgCreatures[node] )
814        DelCreature(node);
815}
816
817
818const BG_AV_Nodes BattleGroundAV::GetNodeThroughObject(uint32 object)
819{
820    sLog.outDebug("bg_AV getnodethroughobject %i",object);
821        if( object <= BG_AV_OBJECT_FLAG_A_STONEHEART_BUNKER )
822                return BG_AV_Nodes(object);
823        if( object <= BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_HUT )
824                return BG_AV_Nodes(object - 11);
825        if( object <= BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_WTOWER )
826                return BG_AV_Nodes(object - 7);
827        if( object <= BG_AV_OBJECT_FLAG_C_H_STONEHEART_BUNKER )
828                return BG_AV_Nodes(object -22);
829        if( object <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_HUT )
830                return BG_AV_Nodes(object - 33);
831        if( object <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_WTOWER )
832                return BG_AV_Nodes(object - 29);
833        if( object == BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE )
834                return BG_AV_NODES_SNOWFALL_GRAVE;
835        sLog.outError("BattleGroundAV: ERROR! GetPlace got a wrong object :(");
836    assert(false);
837    return BG_AV_Nodes(0);
838}
839
840const uint32 BattleGroundAV::GetObjectThroughNode(BG_AV_Nodes node)
841{ //this function is the counterpart to GetNodeThroughObject()
842    sLog.outDebug("bg_AV GetObjectThroughNode %i",node);
843    if( m_Nodes[node].Owner == ALLIANCE )
844    {
845        if( m_Nodes[node].State == POINT_ASSAULTED )
846        {
847            if( node <= BG_AV_NODES_FROSTWOLF_HUT )
848                return node+11;
849            if( node >= BG_AV_NODES_ICEBLOOD_TOWER && node <= BG_AV_NODES_FROSTWOLF_WTOWER)
850                return node+7;
851        }
852        else if ( m_Nodes[node].State == POINT_CONTROLED )
853            if( node <= BG_AV_NODES_STONEHEART_BUNKER )
854                return node;
855    }
856    else if ( m_Nodes[node].Owner == HORDE )
857    {
858        if( m_Nodes[node].State == POINT_ASSAULTED )
859            if( node <= BG_AV_NODES_STONEHEART_BUNKER )
860                return node+22;
861        else if ( m_Nodes[node].State == POINT_CONTROLED )
862        {
863            if( node <= BG_AV_NODES_FROSTWOLF_HUT )
864                return node+33;
865            if( node >= BG_AV_NODES_ICEBLOOD_TOWER && node <= BG_AV_NODES_FROSTWOLF_WTOWER)
866                return node+29;
867        }
868    }
869    else if ( m_Nodes[node].Owner == AV_NEUTRAL_TEAM )
870        return BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE;
871    sLog.outError("BattleGroundAV: Error! GetPlaceNode couldn't resolve node %i",node);
872    assert(false);
873    return 0;
874}
875
876
877//called when using banner
878
879void BattleGroundAV::EventPlayerClickedOnFlag(Player *source, GameObject* target_obj)
880{
881    if(GetStatus() != STATUS_IN_PROGRESS)
882        return;
883    int32 object = GetObjectType(target_obj->GetGUID());
884    sLog.outDebug("BG_AV using gameobject %i with type %i",target_obj->GetEntry(),object);
885    if(object < 0)
886        return;
887    switch(target_obj->GetEntry())
888    {
889        case BG_AV_OBJECTID_BANNER_A:
890        case BG_AV_OBJECTID_BANNER_A_B:
891        case BG_AV_OBJECTID_BANNER_H:
892        case BG_AV_OBJECTID_BANNER_H_B:
893        case BG_AV_OBJECTID_BANNER_SNOWFALL_N:
894            EventPlayerAssaultsPoint(source, object);
895            break;
896        case BG_AV_OBJECTID_BANNER_CONT_A:
897        case BG_AV_OBJECTID_BANNER_CONT_A_B:
898        case BG_AV_OBJECTID_BANNER_CONT_H:
899        case BG_AV_OBJECTID_BANNER_CONT_H_B:
900            EventPlayerDefendsPoint(source, object);
901            break;
902        default:
903            break;
904    }
905}
906
907void BattleGroundAV::EventPlayerDefendsPoint(Player* player, uint32 object)
908{
909    assert(GetStatus() == STATUS_IN_PROGRESS);
910    BG_AV_Nodes node = GetNodeThroughObject(object);
911
912    uint32 owner = m_Nodes[node].Owner; //maybe should name it prevowner
913    uint32 team = player->GetTeam();
914
915    if(owner == player->GetTeam() || m_Nodes[node].State != POINT_ASSAULTED)
916        return;
917    if(m_Nodes[node].TotalOwner == AV_NEUTRAL_TEAM)
918    { //until snowfall doesn't belong to anyone it is better handled in assault-code
919        assert(node == BG_AV_NODES_SNOWFALL_GRAVE); //currently the only neutral grave
920        EventPlayerAssaultsPoint(player,object);
921        return;
922    }
923    sLog.outDebug("player defends point object: %i node: %i",object,node);
924    if(m_Nodes[node].PrevOwner != team)
925    {
926        sLog.outError("BG_AV: player defends point which doesn't belong to his team %i",node);
927        return;
928    }
929
930
931   //spawn new go :)
932    if(m_Nodes[node].Owner == ALLIANCE)
933        SpawnBGObject(object+22, RESPAWN_IMMEDIATELY); //spawn horde banner
934    else
935        SpawnBGObject(object-22, RESPAWN_IMMEDIATELY); //spawn alliance banner
936
937    if(!IsTower(node))
938    {
939        SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION+3*node,RESPAWN_ONE_DAY);
940        SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+GetTeamIndexByTeamId(team)+3*node,RESPAWN_IMMEDIATELY);
941    }
942        // despawn old go
943    SpawnBGObject(object, RESPAWN_ONE_DAY);
944
945    DefendNode(node,team);
946        PopulateNode(node);
947    UpdateNodeWorldState(node);
948
949    if(IsTower(node))
950    {
951        //spawn big flag+aura on top of tower
952        SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)),(team == ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
953        SpawnBGObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)),(team == HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
954        SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)),(team == ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
955        SpawnBGObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)),(team == HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
956    }
957    else if(node == BG_AV_NODES_SNOWFALL_GRAVE) //snowfall eyecandy
958    {
959        for(uint8 i = 0; i < 4; i++)
960        {
961            SpawnBGObject(((owner==ALLIANCE)?BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_PH)+i,RESPAWN_ONE_DAY);
962            SpawnBGObject(((team==ALLIANCE)?BG_AV_OBJECT_SNOW_EYECANDY_A : BG_AV_OBJECT_SNOW_EYECANDY_H)+i,RESPAWN_IMMEDIATELY);
963        }
964    }
965        //send a nice message to all :)
966        char buf[256];
967        sprintf(buf, GetTrinityString(( IsTower(node) ) ? LANG_BG_AV_TOWER_DEFENDED : LANG_BG_AV_GRAVE_DEFENDED), GetNodeName(node),( team == ALLIANCE ) ?  GetTrinityString(LANG_BG_AV_ALLY) : GetTrinityString(LANG_BG_AV_HORDE));
968    Creature* creature = GetBGCreature(AV_CPLACE_HERALD);
969    if(creature)
970        YellToAll(creature,buf,LANG_UNIVERSAL);
971        //update the statistic for the defending player
972        UpdatePlayerScore(player, ( IsTower(node) ) ? SCORE_TOWERS_DEFENDED : SCORE_GRAVEYARDS_DEFENDED, 1);
973    if(IsTower(node))
974        PlaySoundToAll(AV_SOUND_BOTH_TOWER_DEFEND);
975    else
976        PlaySoundToAll((team==ALLIANCE)?AV_SOUND_ALLIANCE_GOOD:AV_SOUND_HORDE_GOOD);
977}
978
979void BattleGroundAV::EventPlayerAssaultsPoint(Player* player, uint32 object)
980{
981    assert(GetStatus() == STATUS_IN_PROGRESS);
982
983    BG_AV_Nodes node = GetNodeThroughObject(object);
984    uint32 owner = m_Nodes[node].Owner; //maybe name it prevowner
985    uint32 team  = player->GetTeam();
986    sLog.outDebug("bg_av: player assaults point object %i node %i",object,node);
987    if(owner == team || team == m_Nodes[node].TotalOwner)
988        return; //surely a gm used this object
989
990
991    if(node == BG_AV_NODES_SNOWFALL_GRAVE) //snowfall is a bit special in capping + it gets eyecandy stuff
992    {
993        if(object == BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE) //initial capping
994        {
995            assert(owner == AV_NEUTRAL_TEAM && m_Nodes[node].TotalOwner == AV_NEUTRAL_TEAM);
996            if( team == ALLIANCE )
997                SpawnBGObject(BG_AV_OBJECT_FLAG_C_A_SNOWFALL_GRAVE, RESPAWN_IMMEDIATELY);
998            else
999                SpawnBGObject(BG_AV_OBJECT_FLAG_C_H_SNOWFALL_GRAVE, RESPAWN_IMMEDIATELY);
1000            SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION+3*node,RESPAWN_IMMEDIATELY); //neutral aura spawn
1001        }
1002        else if(m_Nodes[node].TotalOwner == AV_NEUTRAL_TEAM) //recapping, when no team owns this node realy
1003        {
1004            assert(m_Nodes[node].State != POINT_CONTROLED);
1005            if(team == ALLIANCE)
1006                SpawnBGObject(object-11, RESPAWN_IMMEDIATELY);
1007            else
1008                SpawnBGObject(object+11, RESPAWN_IMMEDIATELY);
1009        }
1010        //eyecandy
1011        uint32 spawn,despawn;
1012        if(team == ALLIANCE)
1013        {
1014            despawn = ( m_Nodes[node].State == POINT_ASSAULTED )?BG_AV_OBJECT_SNOW_EYECANDY_PH : BG_AV_OBJECT_SNOW_EYECANDY_H;
1015            spawn = BG_AV_OBJECT_SNOW_EYECANDY_PA;
1016        }
1017        else
1018        {
1019            despawn = ( m_Nodes[node].State == POINT_ASSAULTED )?BG_AV_OBJECT_SNOW_EYECANDY_PA : BG_AV_OBJECT_SNOW_EYECANDY_A;
1020            spawn = BG_AV_OBJECT_SNOW_EYECANDY_PH;
1021        }
1022        for(uint8 i = 0; i < 4; i++)
1023        {
1024            SpawnBGObject(despawn+i,RESPAWN_ONE_DAY);
1025            SpawnBGObject(spawn+i,RESPAWN_IMMEDIATELY);
1026        }
1027    }
1028
1029    //if snowfall gots capped it can be handled like all other graveyards
1030    if( m_Nodes[node].TotalOwner != AV_NEUTRAL_TEAM)
1031    {
1032        assert(m_Nodes[node].Owner != AV_NEUTRAL_TEAM);
1033        if(team == ALLIANCE)
1034            SpawnBGObject(object-22, RESPAWN_IMMEDIATELY);
1035        else
1036            SpawnBGObject(object+22, RESPAWN_IMMEDIATELY);
1037        if(IsTower(node))
1038        { //spawning/despawning of bigflag+aura
1039            SpawnBGObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)),(team==ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
1040            SpawnBGObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)),(team==HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
1041            SpawnBGObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)),(team==ALLIANCE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
1042            SpawnBGObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH+(2*(node-BG_AV_NODES_DUNBALDAR_SOUTH)),(team==HORDE)? RESPAWN_IMMEDIATELY : RESPAWN_ONE_DAY);
1043        }
1044        else
1045        {
1046            //spawning/despawning of aura
1047            SpawnBGObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION+3*node,RESPAWN_IMMEDIATELY); //neutral aura spawn
1048            SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+GetTeamIndexByTeamId(owner)+3*node,RESPAWN_ONE_DAY); //teeamaura despawn
1049            // Those who are waiting to resurrect at this object are taken to the closest own object's graveyard
1050            std::vector<uint64> ghost_list = m_ReviveQueue[m_BgCreatures[node]];
1051            if( !ghost_list.empty() )
1052            {
1053                Player *plr;
1054                WorldSafeLocsEntry const *ClosestGrave = NULL;
1055                for (std::vector<uint64>::iterator itr = ghost_list.begin(); itr != ghost_list.end(); ++itr)
1056                {
1057                    plr = objmgr.GetPlayer(*ghost_list.begin());
1058                    if( !plr )
1059                        continue;
1060                    if(!ClosestGrave)
1061                        ClosestGrave = GetClosestGraveYard(plr->GetPositionX(), plr->GetPositionY(), plr->GetPositionZ(), team);
1062                    else
1063                        plr->TeleportTo(GetMapId(), ClosestGrave->x, ClosestGrave->y, ClosestGrave->z, plr->GetOrientation());
1064                }
1065                m_ReviveQueue[m_BgCreatures[node]].clear();
1066            }
1067        }
1068        DePopulateNode(node);
1069    }
1070
1071    SpawnBGObject(object, RESPAWN_ONE_DAY); //delete old banner
1072    AssaultNode(node,team);
1073    UpdateNodeWorldState(node);
1074
1075    //send a nice message to all :)
1076    char buf[256];
1077    sprintf(buf, ( IsTower(node) ) ? GetTrinityString(LANG_BG_AV_TOWER_ASSAULTED) : GetTrinityString(LANG_BG_AV_GRAVE_ASSAULTED), GetNodeName(node),  ( team == ALLIANCE ) ?  GetTrinityString(LANG_BG_AV_ALLY) : GetTrinityString(LANG_BG_AV_HORDE ));
1078    Creature* creature = GetBGCreature(AV_CPLACE_HERALD);
1079    if(creature)
1080        YellToAll(creature,buf,LANG_UNIVERSAL);
1081    //update the statistic for the assaulting player
1082    UpdatePlayerScore(player, ( IsTower(node) ) ? SCORE_TOWERS_ASSAULTED : SCORE_GRAVEYARDS_ASSAULTED, 1);
1083    PlaySoundToAll((team==ALLIANCE)?AV_SOUND_ALLIANCE_ASSAULTS:AV_SOUND_HORDE_ASSAULTS);
1084}
1085
1086void BattleGroundAV::FillInitialWorldStates(WorldPacket& data)
1087{
1088    bool stateok;
1089    //graveyards
1090    for (uint8 i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; i++)
1091    {
1092        for (uint8 j =1; j <= 3; j+=2)
1093        {//j=1=assaulted j=3=controled
1094            stateok = (m_Nodes[i].State == j);
1095            data << uint32(BG_AV_NodeWorldStates[i][GetWorldStateType(j,ALLIANCE)]) << uint32((m_Nodes[i].Owner == ALLIANCE && stateok)?1:0);
1096            data << uint32(BG_AV_NodeWorldStates[i][GetWorldStateType(j,HORDE)]) << uint32((m_Nodes[i].Owner == HORDE && stateok)?1:0);
1097        }
1098    }
1099
1100    //towers
1101    for (uint8 i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_MAX; i++)
1102        for (uint8 j =1; j <= 3; j+=2)
1103        {//j=1=assaulted j=3=controled //i dont have j=2=destroyed cause destroyed is the same like enemy-team controll
1104            stateok = (m_Nodes[i].State == j || (m_Nodes[i].State == POINT_DESTROYED && j==3));
1105            data << uint32(BG_AV_NodeWorldStates[i][GetWorldStateType(j,ALLIANCE)]) << uint32((m_Nodes[i].Owner == ALLIANCE && stateok)?1:0);
1106            data << uint32(BG_AV_NodeWorldStates[i][GetWorldStateType(j,HORDE)]) << uint32((m_Nodes[i].Owner == HORDE && stateok)?1:0);
1107        }
1108    if(m_Nodes[BG_AV_NODES_SNOWFALL_GRAVE].Owner == AV_NEUTRAL_TEAM) //cause neutral teams aren't handled generic
1109        data << uint32(AV_SNOWFALL_N) << uint32(1);
1110    data << uint32(AV_Alliance_Score)  << uint32(m_Team_Scores[0]);
1111    data << uint32(AV_Horde_Score) << uint32(m_Team_Scores[1]);
1112    if(GetStatus() == STATUS_IN_PROGRESS){ //only if game started the teamscores are displayed
1113        data << uint32(AV_SHOW_A_SCORE) << uint32(1);
1114        data << uint32(AV_SHOW_H_SCORE) << uint32(1);
1115    }
1116    else
1117    {
1118        data << uint32(AV_SHOW_A_SCORE) << uint32(0);
1119        data << uint32(AV_SHOW_H_SCORE) << uint32(0);
1120    }
1121    SendMineWorldStates(AV_NORTH_MINE);
1122    SendMineWorldStates(AV_SOUTH_MINE);
1123}
1124
1125const uint8 BattleGroundAV::GetWorldStateType(uint8 state, uint16 team) //this is used for node worldstates and returns values which fit good into the worldstatesarray
1126{
1127    //neutral stuff cant get handled (currently its only snowfall)
1128    assert(team != AV_NEUTRAL_TEAM);
1129//a_c a_a h_c h_a the positions in worldstate-array
1130    if(team == ALLIANCE)
1131    {
1132        if(state==POINT_CONTROLED || state==POINT_DESTROYED)
1133            return 0;
1134        if(state==POINT_ASSAULTED)
1135            return 1;
1136    }
1137    if(team == HORDE)
1138    {
1139        if(state==POINT_DESTROYED || state==POINT_CONTROLED)
1140            return 2;
1141        if(state==POINT_ASSAULTED)
1142            return 3;
1143    }
1144    sLog.outError("BG_AV: should update a strange worldstate state:%i team:%i",state,team);
1145    return 5; //this will crash the game, but i want to know if something is wrong here
1146}
1147
1148void BattleGroundAV::UpdateNodeWorldState(BG_AV_Nodes node)
1149{
1150    UpdateWorldState(BG_AV_NodeWorldStates[node][GetWorldStateType(m_Nodes[node].State,m_Nodes[node].Owner)],1);
1151    if(m_Nodes[node].PrevOwner == AV_NEUTRAL_TEAM) //currently only snowfall is supported as neutral node (i don't want to make an extra row (neutral states) in worldstatesarray just for one node
1152        UpdateWorldState(AV_SNOWFALL_N,0);
1153    else
1154        UpdateWorldState(BG_AV_NodeWorldStates[node][GetWorldStateType(m_Nodes[node].PrevState,m_Nodes[node].PrevOwner)],0);
1155}
1156
1157void BattleGroundAV::SendMineWorldStates(uint32 mine)
1158{
1159    assert(mine == AV_NORTH_MINE || mine==AV_SOUTH_MINE);
1160// currently i'm sure, that this works (:
1161//    assert(m_Mine_PrevOwner[mine] == ALLIANCE || m_Mine_PrevOwner[mine] == HORDE || m_Mine_PrevOwner[mine] == AV_NEUTRAL_TEAM);
1162//    assert(m_Mine_Owner[mine] == ALLIANCE || m_Mine_Owner[mine] == HORDE || m_Mine_Owner[mine] == AV_NEUTRAL_TEAM);
1163
1164    uint8 owner,prevowner,mine2; //those variables are needed to access the right worldstate in the BG_AV_MineWorldStates array
1165    mine2 = (mine==AV_NORTH_MINE)?0:1;
1166    if(m_Mine_PrevOwner[mine] == ALLIANCE)
1167        prevowner = 0;
1168    else if(m_Mine_PrevOwner[mine] == HORDE)
1169        prevowner = 2;
1170    else
1171        prevowner = 1;
1172    if(m_Mine_Owner[mine] == ALLIANCE)
1173        owner = 0;
1174    else if(m_Mine_Owner[mine] == HORDE)
1175        owner = 2;
1176    else
1177        owner = 1;
1178
1179    UpdateWorldState(BG_AV_MineWorldStates[mine2][owner],1);
1180    if( prevowner != owner)
1181        UpdateWorldState(BG_AV_MineWorldStates[mine2][prevowner],0);
1182}
1183
1184
1185WorldSafeLocsEntry const* BattleGroundAV::GetClosestGraveYard(float x, float y, float z, uint32 team)
1186{
1187    WorldSafeLocsEntry const* good_entry = NULL;
1188    if( GetStatus() == STATUS_IN_PROGRESS)
1189    {
1190        // Is there any occupied node for this team?
1191        float mindist = 9999999.0f;
1192        for (uint8 i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i)
1193        {
1194            if (m_Nodes[i].Owner != team || m_Nodes[i].State != POINT_CONTROLED)
1195                continue;
1196            WorldSafeLocsEntry const*entry = sWorldSafeLocsStore.LookupEntry( BG_AV_GraveyardIds[i] );
1197            if( !entry )
1198                continue;
1199            float dist = (entry->x - x)*(entry->x - x)+(entry->y - y)*(entry->y - y);
1200            if( mindist > dist )
1201            {
1202                mindist = dist;
1203                good_entry = entry;
1204            }
1205        }
1206    }
1207    // If not, place ghost on starting location
1208    if( !good_entry )
1209        good_entry = sWorldSafeLocsStore.LookupEntry( BG_AV_GraveyardIds[GetTeamIndexByTeamId(team)+7] );
1210
1211    return good_entry;
1212}
1213
1214
1215bool BattleGroundAV::SetupBattleGround()
1216{
1217    // Create starting objects
1218    if(
1219       // alliance gates
1220        !AddObject(BG_AV_OBJECT_DOOR_A, BG_AV_OBJECTID_GATE_A, BG_AV_DoorPositons[0][0],BG_AV_DoorPositons[0][1],BG_AV_DoorPositons[0][2],BG_AV_DoorPositons[0][3],0,0,sin(BG_AV_DoorPositons[0][3]/2),cos(BG_AV_DoorPositons[0][3]/2),RESPAWN_IMMEDIATELY)
1221        // horde gates
1222        || !AddObject(BG_AV_OBJECT_DOOR_H, BG_AV_OBJECTID_GATE_H, BG_AV_DoorPositons[1][0],BG_AV_DoorPositons[1][1],BG_AV_DoorPositons[1][2],BG_AV_DoorPositons[1][3],0,0,sin(BG_AV_DoorPositons[1][3]/2),cos(BG_AV_DoorPositons[1][3]/2),RESPAWN_IMMEDIATELY))
1223    {
1224        sLog.outErrorDb("BatteGroundAV: Failed to spawn some object BattleGround not created!1");
1225        return false;
1226    }
1227
1228//spawn node-objects
1229    for (uint8 i = BG_AV_NODES_FIRSTAID_STATION ; i < BG_AV_NODES_MAX; ++i)
1230    {
1231        if( i <= BG_AV_NODES_FROSTWOLF_HUT )
1232        {
1233            if(    !AddObject(i,BG_AV_OBJECTID_BANNER_A_B,BG_AV_ObjectPos[i][0],BG_AV_ObjectPos[i][1],BG_AV_ObjectPos[i][2],BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2),RESPAWN_ONE_DAY)
1234                || !AddObject(i+11,BG_AV_OBJECTID_BANNER_CONT_A_B,BG_AV_ObjectPos[i][0],BG_AV_ObjectPos[i][1],BG_AV_ObjectPos[i][2],BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2),RESPAWN_ONE_DAY)
1235                || !AddObject(i+33,BG_AV_OBJECTID_BANNER_H_B,BG_AV_ObjectPos[i][0],BG_AV_ObjectPos[i][1],BG_AV_ObjectPos[i][2],BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2),RESPAWN_ONE_DAY)
1236                || !AddObject(i+22,BG_AV_OBJECTID_BANNER_CONT_H_B,BG_AV_ObjectPos[i][0],BG_AV_ObjectPos[i][1],BG_AV_ObjectPos[i][2],BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2),RESPAWN_ONE_DAY)
1237                //aura
1238                || !AddObject(BG_AV_OBJECT_AURA_N_FIRSTAID_STATION+i*3,BG_AV_OBJECTID_AURA_N,BG_AV_ObjectPos[i][0],BG_AV_ObjectPos[i][1],BG_AV_ObjectPos[i][2],BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2),RESPAWN_ONE_DAY)
1239                || !AddObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+i*3,BG_AV_OBJECTID_AURA_A,BG_AV_ObjectPos[i][0],BG_AV_ObjectPos[i][1],BG_AV_ObjectPos[i][2],BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2),RESPAWN_ONE_DAY)
1240                || !AddObject(BG_AV_OBJECT_AURA_H_FIRSTAID_STATION+i*3,BG_AV_OBJECTID_AURA_H,BG_AV_ObjectPos[i][0],BG_AV_ObjectPos[i][1],BG_AV_ObjectPos[i][2],BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2),RESPAWN_ONE_DAY))
1241            {
1242                sLog.outError("BatteGroundAV: Failed to spawn some object BattleGround not created!2");
1243                return false;
1244            }
1245        }
1246        else //towers
1247        {
1248            if( i <= BG_AV_NODES_STONEHEART_BUNKER ) //alliance towers
1249            {
1250                if(   !AddObject(i,BG_AV_OBJECTID_BANNER_A,BG_AV_ObjectPos[i][0],BG_AV_ObjectPos[i][1],BG_AV_ObjectPos[i][2],BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2),RESPAWN_ONE_DAY)
1251                    || !AddObject(i+22,BG_AV_OBJECTID_BANNER_CONT_H,BG_AV_ObjectPos[i][0],BG_AV_ObjectPos[i][1],BG_AV_ObjectPos[i][2],BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2),RESPAWN_ONE_DAY)
1252                    || !AddObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)),BG_AV_OBJECTID_AURA_A,BG_AV_ObjectPos[i+8][0],BG_AV_ObjectPos[i+8][1],BG_AV_ObjectPos[i+8][2],BG_AV_ObjectPos[i+8][3], 0, 0, sin(BG_AV_ObjectPos[i+8][3]/2), cos(BG_AV_ObjectPos[i+8][3]/2),RESPAWN_ONE_DAY)
1253                    || !AddObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)),BG_AV_OBJECTID_AURA_N,BG_AV_ObjectPos[i+8][0],BG_AV_ObjectPos[i+8][1],BG_AV_ObjectPos[i+8][2],BG_AV_ObjectPos[i+8][3], 0, 0, sin(BG_AV_ObjectPos[i+8][3]/2), cos(BG_AV_ObjectPos[i+8][3]/2),RESPAWN_ONE_DAY)
1254                    || !AddObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)),BG_AV_OBJECTID_TOWER_BANNER_A,BG_AV_ObjectPos[i+8][0],BG_AV_ObjectPos[i+8][1],BG_AV_ObjectPos[i+8][2],BG_AV_ObjectPos[i+8][3], 0, 0, sin(BG_AV_ObjectPos[i+8][3]/2), cos(BG_AV_ObjectPos[i+8][3]/2),RESPAWN_ONE_DAY)
1255                    || !AddObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)),BG_AV_OBJECTID_TOWER_BANNER_PH,BG_AV_ObjectPos[i+8][0],BG_AV_ObjectPos[i+8][1],BG_AV_ObjectPos[i+8][2],BG_AV_ObjectPos[i+8][3], 0, 0, sin(BG_AV_ObjectPos[i+8][3]/2), cos(BG_AV_ObjectPos[i+8][3]/2),RESPAWN_ONE_DAY))
1256                {
1257                    sLog.outError("BatteGroundAV: Failed to spawn some object BattleGround not created!3");
1258                    return false;
1259                }
1260            }
1261            else //horde towers
1262            {
1263                if(     !AddObject(i+7,BG_AV_OBJECTID_BANNER_CONT_A,BG_AV_ObjectPos[i][0],BG_AV_ObjectPos[i][1],BG_AV_ObjectPos[i][2],BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2),RESPAWN_ONE_DAY)
1264                    || !AddObject(i+29,BG_AV_OBJECTID_BANNER_H,BG_AV_ObjectPos[i][0],BG_AV_ObjectPos[i][1],BG_AV_ObjectPos[i][2],BG_AV_ObjectPos[i][3], 0, 0, sin(BG_AV_ObjectPos[i][3]/2), cos(BG_AV_ObjectPos[i][3]/2),RESPAWN_ONE_DAY)
1265                    || !AddObject(BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)),BG_AV_OBJECTID_AURA_N,BG_AV_ObjectPos[i+8][0],BG_AV_ObjectPos[i+8][1],BG_AV_ObjectPos[i+8][2],BG_AV_ObjectPos[i+8][3], 0, 0, sin(BG_AV_ObjectPos[i+8][3]/2), cos(BG_AV_ObjectPos[i+8][3]/2),RESPAWN_ONE_DAY)
1266                    || !AddObject(BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)),BG_AV_OBJECTID_AURA_H,BG_AV_ObjectPos[i+8][0],BG_AV_ObjectPos[i+8][1],BG_AV_ObjectPos[i+8][2],BG_AV_ObjectPos[i+8][3], 0, 0, sin(BG_AV_ObjectPos[i+8][3]/2), cos(BG_AV_ObjectPos[i+8][3]/2),RESPAWN_ONE_DAY)
1267                    || !AddObject(BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)),BG_AV_OBJECTID_TOWER_BANNER_PA,BG_AV_ObjectPos[i+8][0],BG_AV_ObjectPos[i+8][1],BG_AV_ObjectPos[i+8][2],BG_AV_ObjectPos[i+8][3], 0, 0, sin(BG_AV_ObjectPos[i+8][3]/2), cos(BG_AV_ObjectPos[i+8][3]/2),RESPAWN_ONE_DAY)
1268                    || !AddObject(BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH+(2*(i-BG_AV_NODES_DUNBALDAR_SOUTH)),BG_AV_OBJECTID_TOWER_BANNER_H,BG_AV_ObjectPos[i+8][0],BG_AV_ObjectPos[i+8][1],BG_AV_ObjectPos[i+8][2],BG_AV_ObjectPos[i+8][3], 0, 0, sin(BG_AV_ObjectPos[i+8][3]/2), cos(BG_AV_ObjectPos[i+8][3]/2),RESPAWN_ONE_DAY))
1269                {
1270                    sLog.outError("BatteGroundAV: Failed to spawn some object BattleGround not created!4");
1271                    return false;
1272                }
1273            }
1274            for(uint8 j=0; j<=9; j++) //burning aura
1275            {
1276                if(!AddObject(BG_AV_OBJECT_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j,BG_AV_OBJECTID_FIRE,BG_AV_ObjectPos[AV_OPLACE_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j][0],BG_AV_ObjectPos[AV_OPLACE_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j][1],BG_AV_ObjectPos[AV_OPLACE_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j][2],BG_AV_ObjectPos[AV_OPLACE_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j][3], 0, 0, sin(BG_AV_ObjectPos[AV_OPLACE_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_BURN_DUNBALDAR_SOUTH+((i-BG_AV_NODES_DUNBALDAR_SOUTH)*10)+j][3]/2),RESPAWN_ONE_DAY))
1277                {
1278                    sLog.outError("BatteGroundAV: Failed to spawn some object BattleGround not created!5.%i",i);
1279                    return false;
1280                }
1281            }
1282        }
1283    }
1284    for(uint8 i=0;i<2;i++) //burning aura for buildings
1285    {
1286        for(uint8 j=0; j<=9; j++)
1287        {
1288            if(j<5)
1289            {
1290                if(!AddObject(BG_AV_OBJECT_BURN_BUILDING_ALLIANCE+(i*10)+j,BG_AV_OBJECTID_SMOKE,BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][0],BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][1],BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][2],BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][3], 0, 0, sin(BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][3]/2),RESPAWN_ONE_DAY))
1291                {
1292                    sLog.outError("BatteGroundAV: Failed to spawn some object BattleGround not created!6.%i",i);
1293                    return false;
1294                }
1295            }
1296            else
1297            {
1298                if(!AddObject(BG_AV_OBJECT_BURN_BUILDING_ALLIANCE+(i*10)+j,BG_AV_OBJECTID_FIRE,BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][0],BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][1],BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][2],BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][3], 0, 0, sin(BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_BURN_BUILDING_A+(i*10)+j][3]/2),RESPAWN_ONE_DAY))
1299                {
1300                    sLog.outError("BatteGroundAV: Failed to spawn some object BattleGround not created!7.%i",i);
1301                    return false;
1302                }
1303            }
1304        }
1305    }
1306    for(uint16 i= 0; i<=(BG_AV_OBJECT_MINE_SUPPLY_N_MAX-BG_AV_OBJECT_MINE_SUPPLY_N_MIN);i++)
1307    {
1308        if(!AddObject(BG_AV_OBJECT_MINE_SUPPLY_N_MIN+i,BG_AV_OBJECTID_MINE_N,BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_N_MIN+i][0],BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_N_MIN+i][1],BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_N_MIN+i][2],BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_N_MIN+i][3], 0, 0, sin(BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_N_MIN+i][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_N_MIN+i][3]/2),RESPAWN_ONE_DAY))
1309        {
1310            sLog.outError("BatteGroundAV: Failed to spawn some mine supplies BattleGround not created!7.5.%i",i);
1311            return false;
1312        }
1313    }
1314    for(uint16 i= 0 ; i<=(BG_AV_OBJECT_MINE_SUPPLY_S_MAX-BG_AV_OBJECT_MINE_SUPPLY_S_MIN);i++)
1315    {
1316        if(!AddObject(BG_AV_OBJECT_MINE_SUPPLY_S_MIN+i,BG_AV_OBJECTID_MINE_S,BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i][0],BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i][1],BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i][2],BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i][3], 0, 0, sin(BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_MINE_SUPPLY_S_MIN+i][3]/2),RESPAWN_ONE_DAY))
1317        {
1318            sLog.outError("BatteGroundAV: Failed to spawn some mine supplies BattleGround not created!7.6.%i",i);
1319            return false;
1320        }
1321    }
1322
1323    if(!AddObject(BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE, BG_AV_OBJECTID_BANNER_SNOWFALL_N ,BG_AV_ObjectPos[BG_AV_NODES_SNOWFALL_GRAVE][0],BG_AV_ObjectPos[BG_AV_NODES_SNOWFALL_GRAVE][1],BG_AV_ObjectPos[BG_AV_NODES_SNOWFALL_GRAVE][2],BG_AV_ObjectPos[BG_AV_NODES_SNOWFALL_GRAVE][3],0,0,sin(BG_AV_ObjectPos[BG_AV_NODES_SNOWFALL_GRAVE][3]/2), cos(BG_AV_ObjectPos[BG_AV_NODES_SNOWFALL_GRAVE][3]/2), RESPAWN_ONE_DAY))
1324    {
1325        sLog.outError("BatteGroundAV: Failed to spawn some object BattleGround not created!8");
1326        return false;
1327    }
1328    for(uint8 i = 0; i < 4; i++)
1329    {
1330        if(!AddObject(BG_AV_OBJECT_SNOW_EYECANDY_A+i, BG_AV_OBJECTID_SNOWFALL_CANDY_A ,BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][0],BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][1],BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][2],BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3],0,0,sin(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3]/2), RESPAWN_ONE_DAY)
1331            || !AddObject(BG_AV_OBJECT_SNOW_EYECANDY_PA+i, BG_AV_OBJECTID_SNOWFALL_CANDY_PA ,BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][0],BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][1],BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][2],BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3],0,0,sin(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3]/2), RESPAWN_ONE_DAY)
1332            || !AddObject(BG_AV_OBJECT_SNOW_EYECANDY_H+i, BG_AV_OBJECTID_SNOWFALL_CANDY_H ,BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][0],BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][1],BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][2],BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3],0,0,sin(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3]/2), RESPAWN_ONE_DAY)
1333            || !AddObject(BG_AV_OBJECT_SNOW_EYECANDY_PH+i, BG_AV_OBJECTID_SNOWFALL_CANDY_PH ,BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][0],BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][1],BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][2],BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3],0,0,sin(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3]/2), cos(BG_AV_ObjectPos[AV_OPLACE_SNOW_1+i][3]/2), RESPAWN_ONE_DAY))
1334        {
1335            sLog.outError("BatteGroundAV: Failed to spawn some object BattleGround not created!9.%i",i);
1336            return false;
1337        }
1338    }
1339    return true;
1340}
1341
1342const char* BattleGroundAV::GetNodeName(BG_AV_Nodes node)
1343{
1344    switch (node)
1345    {
1346        case BG_AV_NODES_FIRSTAID_STATION:  return GetTrinityString(LANG_BG_AV_NODE_GRAVE_STORM_AID);
1347        case BG_AV_NODES_DUNBALDAR_SOUTH:   return GetTrinityString(LANG_BG_AV_NODE_TOWER_DUN_S);
1348        case BG_AV_NODES_DUNBALDAR_NORTH:   return GetTrinityString(LANG_BG_AV_NODE_TOWER_DUN_N);
1349        case BG_AV_NODES_STORMPIKE_GRAVE:   return GetTrinityString(LANG_BG_AV_NODE_GRAVE_STORMPIKE);
1350        case BG_AV_NODES_ICEWING_BUNKER:    return GetTrinityString(LANG_BG_AV_NODE_TOWER_ICEWING);
1351        case BG_AV_NODES_STONEHEART_GRAVE:  return GetTrinityString(LANG_BG_AV_NODE_GRAVE_STONE);
1352        case BG_AV_NODES_STONEHEART_BUNKER: return GetTrinityString(LANG_BG_AV_NODE_TOWER_STONE);
1353        case BG_AV_NODES_SNOWFALL_GRAVE:    return GetTrinityString(LANG_BG_AV_NODE_GRAVE_SNOW);
1354        case BG_AV_NODES_ICEBLOOD_TOWER:    return GetTrinityString(LANG_BG_AV_NODE_TOWER_ICE);
1355        case BG_AV_NODES_ICEBLOOD_GRAVE:    return GetTrinityString(LANG_BG_AV_NODE_GRAVE_ICE);
1356        case BG_AV_NODES_TOWER_POINT:       return GetTrinityString(LANG_BG_AV_NODE_TOWER_POINT);
1357        case BG_AV_NODES_FROSTWOLF_GRAVE:   return GetTrinityString(LANG_BG_AV_NODE_GRAVE_FROST);
1358        case BG_AV_NODES_FROSTWOLF_ETOWER:  return GetTrinityString(LANG_BG_AV_NODE_TOWER_FROST_E);
1359        case BG_AV_NODES_FROSTWOLF_WTOWER:  return GetTrinityString(LANG_BG_AV_NODE_TOWER_FROST_W);
1360        case BG_AV_NODES_FROSTWOLF_HUT:     return GetTrinityString(LANG_BG_AV_NODE_GRAVE_FROST_HUT);
1361        default:
1362            {
1363            sLog.outError("tried to get name for node %u%",node);
1364            return "Unknown";
1365            break;
1366            }
1367    }
1368}
1369
1370void BattleGroundAV::AssaultNode(BG_AV_Nodes node, uint16 team)
1371{
1372    assert(m_Nodes[node].TotalOwner != team);
1373    assert(m_Nodes[node].Owner != team);
1374    assert(m_Nodes[node].State != POINT_DESTROYED);
1375    assert(m_Nodes[node].State != POINT_ASSAULTED || !m_Nodes[node].TotalOwner ); //only assault an assaulted node if no totalowner exists
1376    //the timer gets another time, if the previous owner was 0==Neutral
1377    m_Nodes[node].Timer      = (m_Nodes[node].PrevOwner)? BG_AV_CAPTIME : BG_AV_SNOWFALL_FIRSTCAP;
1378    m_Nodes[node].PrevOwner  = m_Nodes[node].Owner;
1379    m_Nodes[node].Owner      = team;
1380    m_Nodes[node].PrevState  = m_Nodes[node].State;
1381    m_Nodes[node].State      = POINT_ASSAULTED;
1382}
1383
1384void BattleGroundAV::DestroyNode(BG_AV_Nodes node)
1385{
1386    assert(m_Nodes[node].State == POINT_ASSAULTED);
1387
1388    m_Nodes[node].TotalOwner = m_Nodes[node].Owner;
1389    m_Nodes[node].PrevOwner  = m_Nodes[node].Owner;
1390    m_Nodes[node].PrevState  = m_Nodes[node].State;
1391    m_Nodes[node].State      = (m_Nodes[node].Tower)? POINT_DESTROYED : POINT_CONTROLED;
1392    m_Nodes[node].Timer      = 0;
1393}
1394
1395void BattleGroundAV::InitNode(BG_AV_Nodes node, uint16 team, bool tower)
1396{
1397    m_Nodes[node].TotalOwner = team;
1398    m_Nodes[node].Owner      = team;
1399    m_Nodes[node].PrevOwner  = 0;
1400    m_Nodes[node].State      = POINT_CONTROLED;
1401    m_Nodes[node].PrevState  = m_Nodes[node].State;
1402    m_Nodes[node].State      = POINT_CONTROLED;
1403    m_Nodes[node].Timer      = 0;
1404    m_Nodes[node].Tower      = tower;
1405}
1406
1407void BattleGroundAV::DefendNode(BG_AV_Nodes node, uint16 team)
1408{
1409    assert(m_Nodes[node].TotalOwner == team);
1410    assert(m_Nodes[node].Owner != team);
1411    assert(m_Nodes[node].State != POINT_CONTROLED && m_Nodes[node].State != POINT_DESTROYED);
1412    m_Nodes[node].PrevOwner  = m_Nodes[node].Owner;
1413    m_Nodes[node].Owner      = team;
1414    m_Nodes[node].PrevState  = m_Nodes[node].State;
1415    m_Nodes[node].State      = POINT_CONTROLED;
1416    m_Nodes[node].Timer      = 0;
1417}
1418
1419void BattleGroundAV::ResetBGSubclass()
1420{
1421    m_MaxLevel=0;
1422    for(uint8 i=0; i<2; i++) //forloop for both teams (it just make 0==alliance and 1==horde also for both mines 0=north 1=south
1423    {
1424        for(uint8 j=0; j<9; j++)
1425            m_Team_QuestStatus[i][j]=0;
1426        m_Team_Scores[i]=BG_AV_SCORE_INITIAL_POINTS;
1427        m_IsInformedNearVictory[i]=false;
1428        m_CaptainAlive[i] = true;
1429        m_CaptainBuffTimer[i] = 120000 + urand(0,4)* 60; //as far as i could see, the buff is randomly so i make 2minutes (thats the duration of the buff itself) + 0-4minutes TODO get the right times
1430        m_Mine_Owner[i] = AV_NEUTRAL_TEAM;
1431        m_Mine_PrevOwner[i] = m_Mine_Owner[i];
1432    }
1433    for(BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_STONEHEART_GRAVE; ++i) //alliance graves
1434        InitNode(i,ALLIANCE,false);
1435        for(BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_STONEHEART_BUNKER; ++i) //alliance towers
1436        InitNode(i,ALLIANCE,true);
1437    for(BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_GRAVE; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i) //horde graves
1438        InitNode(i,HORDE,false);
1439    for(BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_TOWER; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i) //horde towers
1440        InitNode(i,HORDE,true);
1441    InitNode(BG_AV_NODES_SNOWFALL_GRAVE,AV_NEUTRAL_TEAM,false); //give snowfall neutral owner
1442
1443    m_Mine_Timer=AV_MINE_TICK_TIMER;
1444    for(uint16 i = 0; i < AV_CPLACE_MAX+AV_STATICCPLACE_MAX; i++)
1445        if(m_BgCreatures[i])
1446            DelCreature(i);
1447
1448}
1449
Note: See TracBrowser for help on using the browser.