Show
Ignore:
Timestamp:
11/22/08 01:55:16 (17 years ago)
Author:
yumileroy
Message:

*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

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/game/BattleGroundAV.cpp

    r102 r283  
    1919 */ 
    2020 
    21 #include "Object.h" 
    2221#include "Player.h" 
    2322#include "BattleGround.h" 
    2423#include "BattleGroundAV.h" 
    2524#include "Creature.h" 
     25#include "Chat.h" 
     26#include "Object.h" 
     27#include "ObjectMgr.h" 
     28#include "ObjectAccessor.h" 
    2629#include "MapManager.h" 
    2730#include "Language.h" 
     31#include "SpellAuras.h" 
     32#include "Formulas.h" 
    2833 
    2934BattleGroundAV::BattleGroundAV() 
    3035{ 
    3136 
     37    m_BgObjects.resize(BG_AV_OBJECT_MAX); 
     38    m_BgCreatures.resize(AV_CPLACE_MAX+AV_STATICCPLACE_MAX); 
    3239} 
    3340 
    3441BattleGroundAV::~BattleGroundAV() 
    3542{ 
    36  
     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; 
    37295} 
    38296 
     
    40298{ 
    41299    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    } 
    42468} 
    43469 
     
    47473    //create score and add it to map, default values are set in constructor 
    48474    BattleGroundAVScore* sc = new BattleGroundAVScore; 
    49  
    50475    m_PlayerScores[plr->GetGUID()] = sc; 
    51 } 
    52  
    53 void BattleGroundAV::RemovePlayer(Player* /*plr*/,uint64 /*guid*/) 
    54 { 
    55  
    56 } 
     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 
    57534 
    58535void BattleGroundAV::HandleAreaTrigger(Player *Source, uint32 Trigger) 
     
    66543    { 
    67544        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; 
    68551        case 2606: 
    69         case 2608: 
     552            if(Source->GetTeam() != HORDE) 
     553                Source->GetSession()->SendAreaTriggerMessage("Only The Horde can use that portal"); 
     554            else 
     555                Source->LeaveBattleground(); 
     556            break; 
    70557        case 3326: 
    71558        case 3327: 
     
    74561        case 3330: 
    75562        case 3331: 
     563                        //Source->Unmount(); 
    76564            break; 
    77565        default: 
    78             sLog.outError("WARNING: Unhandled AreaTrigger in Battleground: %u", Trigger); 
    79             Source->GetSession()->SendAreaTriggerMessage("Warning: Unhandled AreaTrigger in Battleground: %u", Trigger); 
     566            sLog.outDebug("WARNING: Unhandled AreaTrigger in Battleground: %u", Trigger); 
     567//            Source->GetSession()->SendAreaTriggerMessage("Warning: Unhandled AreaTrigger in Battleground: %u", Trigger); 
    80568            break; 
    81569    } 
     
    121609    } 
    122610} 
     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