Changeset 283 for trunk

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

Location:
trunk
Files:
2 added
21 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/bindings/scripts/scripts/npc/npcs_special.cpp

    r282 r283  
    826826} 
    827827 
    828 struct TRINITY_DLL_DECL npc_steam_tonkAI : public ScriptedAI 
    829 { 
    830     npc_steam_tonkAI(Creature *c) : ScriptedAI(c) {Reset();} 
    831  
    832     void Reset() {} 
    833     void Aggro(Unit *who) {} 
    834      
    835     void OnPossess(bool apply) 
    836     { 
    837         if (apply) 
    838         { 
    839             // Initialize the action bar without the melee attack command 
    840             m_creature->InitCharmInfo(m_creature); 
    841             m_creature->GetCharmInfo()->InitEmptyActionBar(false); 
    842  
    843             m_creature->SetAggressive(false); 
    844         } 
    845         else 
    846             m_creature->SetAggressive(true); 
    847     } 
    848  
    849 }; 
    850  
    851 CreatureAI* GetAI_npc_steam_tonk(Creature *_Creature) 
    852 { 
    853     return new npc_steam_tonkAI(_Creature); 
    854 } 
    855  
    856 #define SPELL_TONK_MINE_DETONATE 25099    
    857  
    858 struct TRINITY_DLL_DECL npc_tonk_mineAI : public ScriptedAI 
    859 { 
    860     npc_tonk_mineAI(Creature *c) : ScriptedAI(c)  
    861     { 
    862         m_creature->SetAggressive(false); 
    863         Reset(); 
    864     } 
    865  
    866     uint32 ExplosionTimer; 
    867  
    868     void Reset() 
    869     { 
    870         ExplosionTimer = 3000; 
    871     } 
    872  
    873     void Aggro(Unit *who) {} 
    874     void AttackStart(Unit *who) {} 
    875     void MoveInLineOfSight(Unit *who) {} 
    876  
    877     void UpdateAI(const uint32 diff) 
    878     { 
    879         if (ExplosionTimer < diff) 
    880         { 
    881             m_creature->CastSpell(m_creature, SPELL_TONK_MINE_DETONATE, true); 
    882             m_creature->setDeathState(DEAD); // unsummon it 
    883         } else 
    884             ExplosionTimer -= diff; 
    885     } 
    886 }; 
    887  
    888 CreatureAI* GetAI_npc_tonk_mine(Creature *_Creature) 
    889 { 
    890     return new npc_tonk_mineAI(_Creature); 
    891 } 
    892  
    893828void AddSC_npcs_special() 
    894829{ 
     
    941876    newscript->pGossipSelect = &GossipSelect_npc_sayge; 
    942877    newscript->RegisterSelf(); 
    943  
    944     newscript = new Script; 
    945     newscript->Name="npc_steam_tonk"; 
    946     newscript->GetAI = &GetAI_npc_steam_tonk; 
    947     newscript->RegisterSelf(); 
    948  
    949     newscript = new Script; 
    950     newscript->Name="npc_tonk_mine"; 
    951     newscript->GetAI = &GetAI_npc_tonk_mine; 
    952     newscript->RegisterSelf(); 
    953 } 
     878} 
  • trunk/src/game/BattleGround.cpp

    r230 r283  
    362362    } 
    363363} 
     364 
     365void BattleGround::YellToAll(Creature* creature, const char* text, uint32 language) 
     366{ 
     367    for(std::map<uint64, BattleGroundPlayer>::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) 
     368    { 
     369        WorldPacket data(SMSG_MESSAGECHAT, 200); 
     370        Player *plr = objmgr.GetPlayer(itr->first); 
     371        if(!plr) 
     372        { 
     373            sLog.outError("BattleGround: Player " I64FMTD " not found!", itr->first); 
     374            continue; 
     375        } 
     376        creature->BuildMonsterChat(&data,CHAT_MSG_MONSTER_YELL,text,language,creature->GetName(),itr->first); 
     377        plr->GetSession()->SendPacket(&data); 
     378    } 
     379} 
     380 
    364381 
    365382void BattleGround::RewardHonorToTeam(uint32 Honor, uint32 TeamID) 
     
    12191236} 
    12201237 
     1238GameObject* BattleGround::GetBGObject(uint32 type) 
     1239{ 
     1240    GameObject *obj = HashMapHolder<GameObject>::Find(m_BgObjects[type]); 
     1241    if(!obj) 
     1242        sLog.outError("couldn't get gameobject %i",type); 
     1243    return obj; 
     1244} 
     1245 
     1246Creature* BattleGround::GetBGCreature(uint32 type) 
     1247{ 
     1248    Creature *creature = HashMapHolder<Creature>::Find(m_BgCreatures[type]); 
     1249    if(!creature) 
     1250        sLog.outError("couldn't get creature %i",type); 
     1251    return creature; 
     1252} 
     1253 
    12211254void BattleGround::SpawnBGObject(uint32 type, uint32 respawntime) 
    12221255{ 
     
    12701303    } 
    12711304 
     1305    CreatureData &data = objmgr.NewOrExistCreatureData(pCreature->GetDBTableGUIDLow()); 
     1306     
     1307    data.id             = entry; 
     1308//    data.mapid          = GetMapId(); 
     1309    data.posX           = x; 
     1310    data.posY           = y; 
     1311    data.posZ           = z; 
     1312    data.orientation    = o; 
     1313    data.spawndist      = 15; 
     1314 
    12721315    pCreature->AIM_Initialize(); 
    12731316 
     
    12881331        return false; 
    12891332    } 
     1333    //TODO: only delete creature after not in combat 
    12901334    cr->CleanupsBeforeDelete(); 
    12911335    cr->AddObjectToRemoveList(); 
     
    14751519        m_HonorMode = BG_NORMAL; 
    14761520} 
     1521 
     1522int32 BattleGround::GetObjectType(uint64 guid) 
     1523{ 
     1524    for(uint32 i = 0;i <= m_BgObjects.size(); i++) 
     1525        if(m_BgObjects[i] == guid) 
     1526            return i; 
     1527    sLog.outError("BattleGround: cheating? a player used a gameobject which isnt supposed to be a usable object!"); 
     1528    return -1; 
     1529} 
     1530 
     1531void BattleGround::HandleKillUnit(Creature *creature, Player *killer) 
     1532{ 
     1533} 
  • trunk/src/game/BattleGround.h

    r279 r283  
    355355        void StartBattleGround(); 
    356356 
     357        GameObject* GetBGObject(uint32 type); 
     358        Creature* GetBGCreature(uint32 type); 
    357359        /* Location */ 
    358360        void SetMapId(uint32 MapID) { m_MapId = MapID; } 
     
    374376        void SendPacketToTeam(uint32 TeamID, WorldPacket *packet, Player *sender = NULL, bool self = true); 
    375377        void SendPacketToAll(WorldPacket *packet); 
     378        void YellToAll(Creature* creature, const char* text, uint32 language); 
    376379        void PlaySoundToTeam(uint32 SoundID, uint32 TeamID); 
    377380        void PlaySoundToAll(uint32 SoundID); 
     
    424427        // must be implemented in BG subclass if need AND call base class generic code 
    425428        virtual void HandleKillPlayer(Player *player, Player *killer); 
     429        virtual void HandleKillUnit(Creature* /*unit*/, Player* /*killer*/); 
    426430 
    427431        /* Battleground events */ 
     
    453457        bool DelObject(uint32 type); 
    454458        bool AddSpiritGuide(uint32 type, float x, float y, float z, float o, uint32 team); 
     459        int32 GetObjectType(uint64 guid); 
    455460 
    456461        void DoorOpen(uint32 type); 
  • 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 
  • trunk/src/game/BattleGroundAV.h

    r102 r283  
    2424class BattleGround; 
    2525 
     26#define LANG_BG_AV_A_CAPTAIN_BUFF       "Begone. Uncouth scum! The Alliance shall prevail in Alterac Valley!" 
     27#define LANG_BG_AV_H_CAPTAIN_BUFF       "Now is the time to attack! For the Horde!" 
     28#define LANG_BG_AV_S_MINE_BOSS_CLAIMS   "Snivvle is here! Snivvle claims the Coldtooth Mine!" 
     29 
     30#define BG_AV_CAPTIME                    240000  //4:00 
     31#define BG_AV_SNOWFALL_FIRSTCAP          300000  //5:00 but i also have seen 4:05 
     32 
     33#define BG_AV_SCORE_INITIAL_POINTS       600 
     34#define SEND_MSG_NEAR_LOSE               120 
     35 
     36#define BG_AV_KILL_BOSS                 4 
     37#define BG_AV_REP_BOSS                  350 
     38 
     39#define BG_AV_KILL_CAPTAIN              3 
     40#define BG_AV_REP_CAPTAIN               125 
     41#define BG_AV_RES_CAPTAIN               100 
     42 
     43#define BG_AV_KILL_TOWER                3 
     44#define BG_AV_REP_TOWER                 12 
     45#define BG_AV_RES_TOWER                 75 
     46 
     47#define BG_AV_GET_COMMANDER            1 //for a safely returned wingcommander 
     48//bonushonor at the end 
     49#define BG_AV_KILL_SURVIVING_TOWER      2 
     50#define BG_AV_REP_SURVIVING_TOWER       12 
     51 
     52#define BG_AV_KILL_SURVIVING_CAPTAIN    2 
     53#define BG_AV_REP_SURVIVING_CAPTAIN     125 
     54 
     55enum BG_AV_Sounds 
     56{ //TODO: get out if there comes a sound when neutral team captures mine 
     57 
     58/* 
     598212: 
     60    alliance grave assault 
     61    alliance tower assault 
     62    drek "mlanzenabschaum! In meiner Burg?! Toetet sie all" - nicht immer der sound 
     638333: 
     64    galv "sterbt fuer euch ist kein platz hier" 
     65 
     668332: 
     67    bal "Verschwinde, dreckiger Abschaum! Die Allianz wird im Alteractal " 
     688174: 
     69    horde tower assault 
     70    horde grave assault 
     71    van "es Sturmlanzenklans, euer General wird angegriffen! Ich fordere Unterst" 
     728173: 
     73    ally grave capture/defend 
     74    tower destroy 
     75    mine capture 
     76    ally wins 
     778192: 
     78    ally tower destroy(only iceblood - found a bug^^) 
     79    ally tower  defend 
     80    horde tower defend 
     818213 
     82horde: 
     83    grave defend/capture 
     84    tower destroy 
     85    mine capture 
     86    horde wins 
     87    */ 
     88 
     89    AV_SOUND_NEAR_VICTORY                   = 8456, //not confirmed yet 
     90 
     91    AV_SOUND_ALLIANCE_ASSAULTS              = 8212, //tower,grave + enemy boss if someone tries to attack him 
     92    AV_SOUND_HORDE_ASSAULTS                 = 8174, 
     93    AV_SOUND_ALLIANCE_GOOD                  = 8173, //if something good happens for the team:  wins(maybe only through killing the boss), captures mine or grave, destroys tower and defends grave 
     94    AV_SOUND_HORDE_GOOD                     = 8213, 
     95    AV_SOUND_BOTH_TOWER_DEFEND              = 8192, 
     96 
     97    AV_SOUND_ALLIANCE_CAPTAIN               = 8232, //gets called when someone attacks them and at the beginning after 3min+rand(x)*10sec (maybe buff) 
     98    AV_SOUND_HORDE_CAPTAIN                  = 8333, 
     99 
     100 
     101}; 
     102 
     103enum BG_AV_OTHER_VALUES 
     104{ 
     105    AV_STATICCPLACE_MAX        = 123, 
     106    AV_NORTH_MINE              = 0, 
     107    AV_SOUTH_MINE              = 1, 
     108    AV_MINE_TICK_TIMER         = 45000, 
     109    AV_MINE_RECLAIM_TIMER      = 1200000, //TODO: get the right value.. this is currently 20 minutes 
     110    AV_NEUTRAL_TEAM            = 0 //this is the neutral owner of snowfall 
     111}; 
     112enum BG_AV_ObjectIds 
     113{ 
     114    //cause the mangos-system is a bit different, we don't use the right go-ids for every node.. if we want to be 100% like another big server, we must take one object for every node 
     115    //snowfall 4flags as eyecandy 179424 (alliance neutral) 
     116    //Banners - stolen from battleground_AB.h ;-) 
     117    BG_AV_OBJECTID_BANNER_A             = 178925, // can only be used by horde 
     118    BG_AV_OBJECTID_BANNER_H             = 178943, // can only be used by alliance 
     119    BG_AV_OBJECTID_BANNER_CONT_A        = 178940, // can only be used by horde 
     120    BG_AV_OBJECTID_BANNER_CONT_H        = 179435, // can only be used by alliance 
     121 
     122    BG_AV_OBJECTID_BANNER_A_B           = 178365, 
     123    BG_AV_OBJECTID_BANNER_H_B           = 178364, 
     124    BG_AV_OBJECTID_BANNER_CONT_A_B      = 179286, 
     125    BG_AV_OBJECTID_BANNER_CONT_H_B      = 179287, 
     126    BG_AV_OBJECTID_BANNER_SNOWFALL_N    = 180418, 
     127 
     128    //snowfall eyecandy banner: 
     129    BG_AV_OBJECTID_SNOWFALL_CANDY_A     = 179044, 
     130    BG_AV_OBJECTID_SNOWFALL_CANDY_PA    = 179424, 
     131    BG_AV_OBJECTID_SNOWFALL_CANDY_H     = 179064, 
     132    BG_AV_OBJECTID_SNOWFALL_CANDY_PH    = 179425, 
     133 
     134    //banners on top of towers: 
     135    BG_AV_OBJECTID_TOWER_BANNER_A  = 178927, //[PH] Alliance A1 Tower Banner BIG 
     136    BG_AV_OBJECTID_TOWER_BANNER_H  = 178955, //[PH] Horde H1 Tower Banner BIG 
     137    BG_AV_OBJECTID_TOWER_BANNER_PA = 179446, //[PH] Alliance H1 Tower Pre-Banner BIG 
     138    BG_AV_OBJECTID_TOWER_BANNER_PH = 179436, //[PH] Horde A1 Tower Pre-Banner BIG 
     139 
     140    //Auras 
     141    BG_AV_OBJECTID_AURA_A               = 180421, 
     142    BG_AV_OBJECTID_AURA_H               = 180422, 
     143    BG_AV_OBJECTID_AURA_N               = 180423, 
     144    BG_AV_OBJECTID_AURA_A_S             = 180100, 
     145    BG_AV_OBJECTID_AURA_H_S             = 180101, 
     146    BG_AV_OBJECTID_AURA_N_S             = 180102, 
     147 
     148    BG_AV_OBJECTID_GATE_A               = 180424, 
     149    BG_AV_OBJECTID_GATE_H               = 180424, 
     150 
     151    //mine supplies 
     152    BG_AV_OBJECTID_MINE_N        = 178785, 
     153    BG_AV_OBJECTID_MINE_S       = 178784, 
     154 
     155    BG_AV_OBJECTID_FIRE                 = 179065, 
     156    BG_AV_OBJECTID_SMOKE                 = 179066 
     157}; 
     158 
     159enum BG_AV_Nodes 
     160{ 
     161    BG_AV_NODES_FIRSTAID_STATION        = 0, 
     162    BG_AV_NODES_STORMPIKE_GRAVE         = 1, 
     163    BG_AV_NODES_STONEHEART_GRAVE        = 2, 
     164    BG_AV_NODES_SNOWFALL_GRAVE          = 3, 
     165    BG_AV_NODES_ICEBLOOD_GRAVE          = 4, 
     166    BG_AV_NODES_FROSTWOLF_GRAVE         = 5, 
     167    BG_AV_NODES_FROSTWOLF_HUT           = 6, 
     168    BG_AV_NODES_DUNBALDAR_SOUTH         = 7, 
     169    BG_AV_NODES_DUNBALDAR_NORTH         = 8, 
     170    BG_AV_NODES_ICEWING_BUNKER          = 9, 
     171    BG_AV_NODES_STONEHEART_BUNKER       = 10, 
     172    BG_AV_NODES_ICEBLOOD_TOWER          = 11, 
     173    BG_AV_NODES_TOWER_POINT             = 12, 
     174    BG_AV_NODES_FROSTWOLF_ETOWER        = 13, 
     175    BG_AV_NODES_FROSTWOLF_WTOWER        = 14, 
     176 
     177    BG_AV_NODES_MAX                     = 15 
     178}; 
     179 
     180enum BG_AV_ObjectTypes 
     181{ 
     182    BG_AV_OBJECT_FLAG_A_FIRSTAID_STATION    = 0, 
     183    BG_AV_OBJECT_FLAG_A_STORMPIKE_GRAVE     = 1, 
     184    BG_AV_OBJECT_FLAG_A_STONEHEART_GRAVE    = 2, 
     185    BG_AV_OBJECT_FLAG_A_SNOWFALL_GRAVE      = 3, 
     186    BG_AV_OBJECT_FLAG_A_ICEBLOOD_GRAVE      = 4, 
     187    BG_AV_OBJECT_FLAG_A_FROSTWOLF_GRAVE     = 5, 
     188    BG_AV_OBJECT_FLAG_A_FROSTWOLF_HUT       = 6, 
     189    BG_AV_OBJECT_FLAG_A_DUNBALDAR_SOUTH     = 7, 
     190    BG_AV_OBJECT_FLAG_A_DUNBALDAR_NORTH     = 8, 
     191    BG_AV_OBJECT_FLAG_A_ICEWING_BUNKER      = 9, 
     192    BG_AV_OBJECT_FLAG_A_STONEHEART_BUNKER   = 10, 
     193 
     194    BG_AV_OBJECT_FLAG_C_A_FIRSTAID_STATION    = 11, 
     195    BG_AV_OBJECT_FLAG_C_A_STORMPIKE_GRAVE     = 12, 
     196    BG_AV_OBJECT_FLAG_C_A_STONEHEART_GRAVE    = 13, 
     197    BG_AV_OBJECT_FLAG_C_A_SNOWFALL_GRAVE      = 14, 
     198    BG_AV_OBJECT_FLAG_C_A_ICEBLOOD_GRAVE      = 15, 
     199    BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_GRAVE     = 16, 
     200    BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_HUT       = 17, 
     201    BG_AV_OBJECT_FLAG_C_A_ICEBLOOD_TOWER      = 18, 
     202    BG_AV_OBJECT_FLAG_C_A_TOWER_POINT         = 19, 
     203    BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_ETOWER    = 20, 
     204    BG_AV_OBJECT_FLAG_C_A_FROSTWOLF_WTOWER    = 21, 
     205 
     206    BG_AV_OBJECT_FLAG_C_H_FIRSTAID_STATION    = 22, 
     207    BG_AV_OBJECT_FLAG_C_H_STORMPIKE_GRAVE     = 23, 
     208    BG_AV_OBJECT_FLAG_C_H_STONEHEART_GRAVE    = 24, 
     209    BG_AV_OBJECT_FLAG_C_H_SNOWFALL_GRAVE      = 25, 
     210    BG_AV_OBJECT_FLAG_C_H_ICEBLOOD_GRAVE      = 26, 
     211    BG_AV_OBJECT_FLAG_C_H_FROSTWOLF_GRAVE     = 27, 
     212    BG_AV_OBJECT_FLAG_C_H_FROSTWOLF_HUT       = 28, 
     213    BG_AV_OBJECT_FLAG_C_H_DUNBALDAR_SOUTH     = 29, 
     214    BG_AV_OBJECT_FLAG_C_H_DUNBALDAR_NORTH     = 30, 
     215    BG_AV_OBJECT_FLAG_C_H_ICEWING_BUNKER      = 31, 
     216    BG_AV_OBJECT_FLAG_C_H_STONEHEART_BUNKER   = 32, 
     217 
     218    BG_AV_OBJECT_FLAG_H_FIRSTAID_STATION    = 33, 
     219    BG_AV_OBJECT_FLAG_H_STORMPIKE_GRAVE     = 34, 
     220    BG_AV_OBJECT_FLAG_H_STONEHEART_GRAVE    = 35, 
     221    BG_AV_OBJECT_FLAG_H_SNOWFALL_GRAVE      = 36, 
     222    BG_AV_OBJECT_FLAG_H_ICEBLOOD_GRAVE      = 37, 
     223    BG_AV_OBJECT_FLAG_H_FROSTWOLF_GRAVE     = 38, 
     224    BG_AV_OBJECT_FLAG_H_FROSTWOLF_HUT       = 39, 
     225    BG_AV_OBJECT_FLAG_H_ICEBLOOD_TOWER      = 40, 
     226    BG_AV_OBJECT_FLAG_H_TOWER_POINT         = 41, 
     227    BG_AV_OBJECT_FLAG_H_FROSTWOLF_ETOWER    = 42, 
     228    BG_AV_OBJECT_FLAG_H_FROSTWOLF_WTOWER    = 43, 
     229 
     230    BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE      = 44, 
     231 
     232    BG_AV_OBJECT_DOOR_H                     = 45, 
     233    BG_AV_OBJECT_DOOR_A                     = 46, 
     234//auras for graveyards (3auras per graveyard neutral,alliance,horde) 
     235    BG_AV_OBJECT_AURA_N_FIRSTAID_STATION    = 47, 
     236    BG_AV_OBJECT_AURA_A_FIRSTAID_STATION    = 48, 
     237    BG_AV_OBJECT_AURA_H_FIRSTAID_STATION    = 49, 
     238    BG_AV_OBJECT_AURA_N_STORMPIKE_GRAVE     = 50, 
     239    BG_AV_OBJECT_AURA_A_STORMPIKE_GRAVE     = 51, 
     240    BG_AV_OBJECT_AURA_H_STORMPIKE_GRAVE     = 52, 
     241    BG_AV_OBJECT_AURA_N_STONEHEART_GRAVE    = 53, 
     242    BG_AV_OBJECT_AURA_A_STONEHEART_GRAVE    = 54, 
     243    BG_AV_OBJECT_AURA_H_STONEHEART_GRAVE    = 55, 
     244    BG_AV_OBJECT_AURA_N_SNOWFALL_GRAVE      = 56, 
     245    BG_AV_OBJECT_AURA_A_SNOWFALL_GRAVE      = 57, 
     246    BG_AV_OBJECT_AURA_H_SNOWFALL_GRAVE      = 58, 
     247    BG_AV_OBJECT_AURA_N_ICEBLOOD_GRAVE      = 59, 
     248    BG_AV_OBJECT_AURA_A_ICEBLOOD_GRAVE      = 60, 
     249    BG_AV_OBJECT_AURA_H_ICEBLOOD_GRAVE      = 61, 
     250    BG_AV_OBJECT_AURA_N_FROSTWOLF_GRAVE     = 62, 
     251    BG_AV_OBJECT_AURA_A_FROSTWOLF_GRAVE     = 63, 
     252    BG_AV_OBJECT_AURA_H_FROSTWOLF_GRAVE     = 64, 
     253    BG_AV_OBJECT_AURA_N_FROSTWOLF_HUT       = 65, 
     254    BG_AV_OBJECT_AURA_A_FROSTWOLF_HUT       = 66, 
     255    BG_AV_OBJECT_AURA_H_FROSTWOLF_HUT       = 67, 
     256 
     257    //big flags on top of towers 2 flags on each (contested,(alliance | horde)) + 2 auras 
     258    BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH     = 67, 
     259    BG_AV_OBJECT_TFLAG_H_DUNBALDAR_SOUTH     = 68, 
     260    BG_AV_OBJECT_TFLAG_A_DUNBALDAR_NORTH     = 69, 
     261    BG_AV_OBJECT_TFLAG_H_DUNBALDAR_NORTH     = 70, 
     262    BG_AV_OBJECT_TFLAG_A_ICEWING_BUNKER      = 71, 
     263    BG_AV_OBJECT_TFLAG_H_ICEWING_BUNKER      = 72, 
     264    BG_AV_OBJECT_TFLAG_A_STONEHEART_BUNKER   = 73, 
     265    BG_AV_OBJECT_TFLAG_H_STONEHEART_BUNKER   = 74, 
     266    BG_AV_OBJECT_TFLAG_A_ICEBLOOD_TOWER      = 75, 
     267    BG_AV_OBJECT_TFLAG_H_ICEBLOOD_TOWER      = 76, 
     268    BG_AV_OBJECT_TFLAG_A_TOWER_POINT         = 77, 
     269    BG_AV_OBJECT_TFLAG_H_TOWER_POINT         = 78, 
     270    BG_AV_OBJECT_TFLAG_A_FROSTWOLF_ETOWER    = 79, 
     271    BG_AV_OBJECT_TFLAG_H_FROSTWOLF_ETOWER    = 80, 
     272    BG_AV_OBJECT_TFLAG_A_FROSTWOLF_WTOWER    = 81, 
     273    BG_AV_OBJECT_TFLAG_H_FROSTWOLF_WTOWER    = 82, 
     274    BG_AV_OBJECT_TAURA_A_DUNBALDAR_SOUTH     = 83, 
     275    BG_AV_OBJECT_TAURA_H_DUNBALDAR_SOUTH     = 84, 
     276    BG_AV_OBJECT_TAURA_A_DUNBALDAR_NORTH     = 85, 
     277    BG_AV_OBJECT_TAURA_H_DUNBALDAR_NORTH     = 86, 
     278    BG_AV_OBJECT_TAURA_A_ICEWING_BUNKER      = 87, 
     279    BG_AV_OBJECT_TAURA_H_ICEWING_BUNKER      = 88, 
     280    BG_AV_OBJECT_TAURA_A_STONEHEART_BUNKER   = 89, 
     281    BG_AV_OBJECT_TAURA_H_STONEHEART_BUNKER   = 90, 
     282    BG_AV_OBJECT_TAURA_A_ICEBLOOD_TOWER      = 91, 
     283    BG_AV_OBJECT_TAURA_H_ICEBLOOD_TOWER      = 92, 
     284    BG_AV_OBJECT_TAURA_A_TOWER_POINT         = 93, 
     285    BG_AV_OBJECT_TAURA_H_TOWER_POINT         = 94, 
     286    BG_AV_OBJECT_TAURA_A_FROSTWOLF_ETOWER    = 95, 
     287    BG_AV_OBJECT_TAURA_H_FROSTWOLF_ETOWER    = 96, 
     288    BG_AV_OBJECT_TAURA_A_FROSTWOLF_WTOWER    = 97, 
     289    BG_AV_OBJECT_TAURA_H_FROSTWOLF_WTOWER    = 98, 
     290 
     291    BG_AV_OBJECT_BURN_DUNBALDAR_SOUTH        = 99, 
     292    BG_AV_OBJECT_BURN_DUNBALDAR_NORTH        = 109, 
     293    BG_AV_OBJECT_BURN_ICEWING_BUNKER         = 119, 
     294    BG_AV_OBJECT_BURN_STONEHEART_BUNKER      = 129, 
     295    BG_AV_OBJECT_BURN_ICEBLOOD_TOWER         = 139, 
     296    BG_AV_OBJECT_BURN_TOWER_POINT            = 149, 
     297    BG_AV_OBJECT_BURN_FROSTWOLF_ETWOER       = 159, 
     298    BG_AV_OBJECT_BURN_FROSTWOLF_WTOWER       = 169, 
     299    BG_AV_OBJECT_BURN_BUILDING_ALLIANCE      = 179, 
     300    BG_AV_OBJECT_BURN_BUILDING_HORDE         = 189, 
     301    BG_AV_OBJECT_SNOW_EYECANDY_A             = 199, 
     302    BG_AV_OBJECT_SNOW_EYECANDY_PA            = 203, 
     303    BG_AV_OBJECT_SNOW_EYECANDY_H             = 207, 
     304    BG_AV_OBJECT_SNOW_EYECANDY_PH            = 211, 
     305    BG_AV_OBJECT_MINE_SUPPLY_N_MIN           = 215, 
     306    BG_AV_OBJECT_MINE_SUPPLY_N_MAX           = 224, 
     307    BG_AV_OBJECT_MINE_SUPPLY_S_MIN           = 225, 
     308    BG_AV_OBJECT_MINE_SUPPLY_S_MAX           = 236, 
     309 
     310    BG_AV_OBJECT_MAX                          = 237 
     311}; 
     312 
     313 
     314 
     315enum BG_AV_OBJECTS 
     316{ 
     317    AV_OPLACE_FIRSTAID_STATION          = 0, 
     318    AV_OPLACE_STORMPIKE_GRAVE         = 1, 
     319    AV_OPLACE_STONEHEART_GRAVE        = 2, 
     320    AV_OPLACE_SNOWFALL_GRAVE          = 3, 
     321    AV_OPLACE_ICEBLOOD_GRAVE          = 4, 
     322    AV_OPLACE_FROSTWOLF_GRAVE         = 5, 
     323    AV_OPLACE_FROSTWOLF_HUT           = 6, 
     324    AV_OPLACE_DUNBALDAR_SOUTH         = 7, 
     325    AV_OPLACE_DUNBALDAR_NORTH         = 8, 
     326    AV_OPLACE_ICEWING_BUNKER          = 9, 
     327    AV_OPLACE_STONEHEART_BUNKER       = 10, 
     328    AV_OPLACE_ICEBLOOD_TOWER          = 11, 
     329    AV_OPLACE_TOWER_POINT             = 12, 
     330    AV_OPLACE_FROSTWOLF_ETOWER        = 13, 
     331    AV_OPLACE_FROSTWOLF_WTOWER        = 14, 
     332    AV_OPLACE_BIGBANNER_DUNBALDAR_SOUTH         = 15, 
     333    AV_OPLACE_BIGBANNER_DUNBALDAR_NORTH         = 16, 
     334    AV_OPLACE_BIGBANNER_ICEWING_BUNKER          = 17, 
     335    AV_OPLACE_BIGBANNER_STONEHEART_BUNKER       = 18, 
     336    AV_OPLACE_BIGBANNER_ICEBLOOD_TOWER          = 19, 
     337    AV_OPLACE_BIGBANNER_TOWER_POINT             = 20, 
     338    AV_OPLACE_BIGBANNER_FROSTWOLF_ETOWER        = 21, 
     339    AV_OPLACE_BIGBANNER_FROSTWOLF_WTOWER        = 22, 
     340 
     341    AV_OPLACE_BURN_DUNBALDAR_SOUTH         = 23, 
     342    AV_OPLACE_BURN_DUNBALDAR_NORTH         = 33, 
     343    AV_OPLACE_BURN_ICEWING_BUNKER          = 43, 
     344    AV_OPLACE_BURN_STONEHEART_BUNKER       = 53, 
     345    AV_OPLACE_BURN_ICEBLOOD_TOWER          = 63, 
     346    AV_OPLACE_BURN_TOWER_POINT             = 73, 
     347    AV_OPLACE_BURN_FROSTWOLF_ETOWER        = 83, 
     348    AV_OPLACE_BURN_FROSTWOLF_WTOWER        = 93, 
     349    AV_OPLACE_BURN_BUILDING_A        = 103, 
     350    AV_OPLACE_BURN_BUILDING_H        = 113, 
     351    AV_OPLACE_SNOW_1                      = 123, 
     352    AV_OPLACE_SNOW_2                      = 124, 
     353    AV_OPLACE_SNOW_3                      = 125, 
     354    AV_OPLACE_SNOW_4                      = 126, 
     355    AV_OPLACE_MINE_SUPPLY_N_MIN           = 127, 
     356    AV_OPLACE_MINE_SUPPLY_N_MAX           = 136, 
     357    AV_OPLACE_MINE_SUPPLY_S_MIN           = 137, 
     358    AV_OPLACE_MINE_SUPPLY_S_MAX           = 148, 
     359 
     360    AV_OPLACE_MAX                         = 149 
     361}; 
     362const float BG_AV_ObjectPos[AV_OPLACE_MAX][4] = { 
     363    {638.592f,-32.422f,46.0608f,-1.62316f },//firstaid station 
     364    {669.007f,-294.078f,30.2909f,2.77507f },//stormpike 
     365    {77.8013f,-404.7f,46.7549f,-0.872665f },//stone grave 
     366    {-202.581f,-112.73f,78.4876f,-0.715585f },//snowfall 
     367    {-611.962f,-396.17f,60.8351f,2.53682f},  //iceblood grave 
     368    {-1082.45f,-346.823f,54.9219f,-1.53589f },//frostwolf grave 
     369    {-1402.21f,-307.431f,89.4424f,0.191986f },//frostwolf hut 
     370    {553.779f,-78.6566f,51.9378f,-1.22173f }, //dunnbaldar south 
     371    {674.001f,-143.125f,63.6615f,0.994838f }, //dunbaldar north 
     372    {203.281f,-360.366f,56.3869f,-0.925024f }, //icew 
     373    {-152.437f,-441.758f,40.3982f,-1.95477f }, //stone 
     374    {-571.88f,-262.777f,75.0087f,-0.802851f }, //ice tower 
     375    {-768.907f,-363.71f,90.8949f,1.07991f},  //tower point 
     376    {-1302.9f,-316.981f,113.867f,2.00713f }, //frostwolf etower 
     377    {-1297.5f,-266.767f,114.15f,3.31044f},   //frostwolf wtower 
     378    //bigbanner: 
     379    {555.848f,-84.4151f,64.4397f,3.12414f }, //duns 
     380    {679.339f,-136.468f,73.9626f,-2.16421f }, //dunn 
     381    {208.973f,-365.971f,66.7409f,-0.244346f }, //icew 
     382    {-155.832f,-449.401f,52.7306f,0.610865f }, //stone 
     383    {-572.329f,-262.476f,88.6496f,-0.575959f }, //icetower 
     384    {-768.199f,-363.105f,104.537f,0.10472f }, //towerp 
     385    {-1302.84f,-316.582f,127.516f,0.122173f }, //etower 
     386    {-1297.87f,-266.762f,127.796f,0.0698132f }, //wtower 
     387    //burning auras towers have 9*179065 captain-buildings have 5*179066+5*179065 
     388    //dunns 
     389    {562.632f,-88.1815f,61.993f,0.383972f }, 
     390    {562.523f,-74.5028f,37.9474f,-0.0523599f }, 
     391    {558.097f,-70.9842f,52.4876f,0.820305f }, 
     392    {578.167f,-71.8191f,38.1514f,2.72271f }, 
     393    {556.028f,-94.9242f,44.8191f,3.05433f }, 
     394    {572.451f,-94.3655f,37.9443f,-1.72788f }, 
     395    {549.263f,-79.3645f,44.8191f,0.436332f }, 
     396    {543.513f,-94.4006f,52.4819f,0.0349066f }, 
     397    {572.149f,-93.7862f,52.5726f,0.541052f }, 
     398    {582.162f,-81.2375f,37.9216f,0.0872665f }, 
     399    //dunn 
     400    {664.797f,-143.65f,64.1784f,-0.453786f}, 
     401    {664.505f,-139.452f,49.6696f,-0.0349067f}, 
     402    {676.067f,-124.319f,49.6726f,-1.01229f}, 
     403    {693.004f,-144.025f,64.1755f,2.44346f}, 
     404    {661.175f,-117.691f,49.645f,1.91986f}, 
     405    {684.423f,-146.582f,63.6662f,0.994838f}, 
     406    {682.791f,-127.769f,62.4155f,1.09956f}, 
     407    {674.576f,-147.101f,56.5425f,-1.6057f}, 
     408    {655.719f,-126.673f,49.8138f,2.80998f}, 
     409    {0,0,0,0}, 
     410    //icew 
     411    {231.503f,-356.688f,42.3704f,0.296706f}, 
     412    {224.989f,-348.175f,42.5607f,1.50098f}, 
     413    {205.782f,-351.335f,56.8998f,1.01229f}, 
     414    {196.605f,-369.187f,56.3914f,2.46091f}, 
     415    {210.619f,-376.938f,49.2677f,2.86234f}, 
     416    {209.647f,-352.632f,42.3959f,-0.698132f}, 
     417    {220.65f,-368.132f,42.3978f,-0.2618f}, 
     418    {224.682f,-374.031f,57.0679f,0.541052f}, 
     419    {200.26f,-359.968f,49.2677f,-2.89725f}, 
     420    {196.619f,-378.016f,56.9131f,1.01229f}, 
     421    //stone 
     422    {-155.488f,-437.356f,33.2796f,2.60054f}, 
     423    {-163.441f,-454.188f,33.2796f,1.93732f}, 
     424    {-143.977f,-445.148f,26.4097f,-1.8675f}, 
     425    {-135.764f,-464.708f,26.3823f,2.25147f}, 
     426    {-154.076f,-466.929f,41.0636f,-1.8675f}, 
     427    {-149.908f,-460.332f,26.4083f,-2.09439f}, 
     428    {-151.638f,-439.521f,40.3797f,0.436332f}, 
     429    {-131.301f,-454.905f,26.5771f,2.93215f}, 
     430    {-171.291f,-444.684f,40.9211f,2.30383f}, 
     431    {-143.591f,-439.75f,40.9275f,-1.72788f}, 
     432    //iceblood 
     433    {-572.667f,-267.923f,56.8542f,2.35619f}, 
     434    {-561.021f,-262.689f,68.4589f,1.37881f}, 
     435    {-572.538f,-262.649f,88.6197f,1.8326f}, 
     436    {-574.77f,-251.45f,74.9422f,-1.18682f}, 
     437    {-578.625f,-267.571f,68.4696f,0.506145f}, 
     438    {-571.476f,-257.234f,63.3223f,3.10669f}, 
     439    {-566.035f,-273.907f,52.9582f,-0.890118f}, 
     440    {-580.948f,-259.77f,68.4696f,1.46608f}, 
     441    {-568.318f,-267.1f,75.0008f,1.01229f}, 
     442    {-559.621f,-268.597f,52.8986f,0.0523599f}, 
     443    //towerp 
     444    {-776.072f,-368.046f,84.3558f,2.63545f}, 
     445    {-777.564f,-368.521f,90.6701f,1.72788f}, 
     446    {-765.461f,-357.711f,90.888f,0.314159f}, 
     447    {-768.763f,-362.735f,104.612f,1.81514f}, 
     448    {-760.356f,-358.896f,84.3558f,2.1293f}, 
     449    {-771.967f,-352.838f,84.3484f,1.74533f}, 
     450    {-773.333f,-364.653f,79.2351f,-1.64061f}, 
     451    {-764.109f,-366.069f,70.0934f,0.383972f}, 
     452    {-767.103f,-350.737f,68.7933f,2.80998f}, 
     453    {-760.115f,-353.845f,68.8633f,1.79769f}, 
     454    //froste 
     455    {-1304.87f,-304.525f,91.8366f,-0.680679f}, 
     456    {-1301.77f,-310.974f,95.8252f,0.907571f}, 
     457    {-1305.58f,-320.625f,102.166f,-0.558505f}, 
     458    {-1294.27f,-323.468f,113.893f,-1.67552f}, 
     459    {-1302.65f,-317.192f,127.487f,2.30383f}, 
     460    {-1293.89f,-313.478f,107.328f,1.6057f}, 
     461    {-1312.41f,-312.999f,107.328f,1.5708f}, 
     462    {-1311.57f,-308.08f,91.7666f,-1.85005f}, 
     463    {-1314.7f,-322.131f,107.36f,0.645772f}, 
     464    {-1304.6f,-310.754f,113.859f,-0.401426f}, 
     465    //frostw 
     466    {-1308.24f,-273.26f,92.0514f,-0.139626f}, 
     467    {-1302.26f,-262.858f,95.9269f,0.418879f}, 
     468    {-1297.28f,-267.773f,126.756f,2.23402f}, 
     469    {-1299.08f,-256.89f,114.108f,-2.44346f}, 
     470    {-1303.41f,-268.237f,114.151f,-1.23918f}, 
     471    {-1304.43f,-273.682f,107.612f,0.244346f}, 
     472    {-1309.53f,-265.951f,92.1418f,-2.49582f}, 
     473    {-1295.55f,-263.865f,105.033f,0.925024f}, 
     474    {-1294.71f,-281.466f,107.664f,-1.50098f}, 
     475    {-1289.69f,-259.521f,107.612f,-2.19912f}, 
     476 
     477    //the two buildings of the captains 
     478    //alliance 
     479    {-64.4987f,-289.33f,33.4616f,-2.82743f}, 
     480    {-5.98025f,-326.144f,38.8538f,0}, 
     481    {-2.67893f,-306.998f,33.4165f,0}, 
     482    {-60.25f,-309.232f,50.2408f,-1.46608f}, 
     483    {-48.7941f,-266.533f,47.7916f,2.44346f}, 
     484    {-3.40929f,-306.288f,33.34f,0}, 
     485    {-48.619f,-266.917f,47.8168f,0}, 
     486    {-62.9474f,-286.212f,66.7288f,0}, 
     487    {-5.05132f,-325.323f,38.8536f,0}, 
     488    {-64.2677f,-289.412f,33.469f,0}, 
     489//horde 
     490    {-524.276f,-199.6f,82.8733f,-1.46608f}, 
     491    {-518.196f,-173.085f,102.43f,0}, 
     492    {-500.732f,-145.358f,88.5337f,2.44346f}, 
     493    {-501.084f,-150.784f,80.8506f,0}, 
     494    {-518.309f,-163.963f,102.521f,2.96706f}, 
     495    {-517.053f,-200.429f,80.759f,0}, 
     496    {-514.361f,-163.864f,104.163f,0}, 
     497    {-568.04f,-188.707f,81.55f,0}, 
     498    {-501.775f,-151.581f,81.2027f,0}, 
     499    {-509.975f,-191.652f,83.2978f,0}, 
     500 
     501//snowfall eyecandy 
     502    {-191.153f,-129.868f,78.5595f,-1.25664f }, 
     503    {-201.282f,-134.319f,78.6753f,-0.942478f }, 
     504    {-215.981f,-91.4101f,80.8702f,-1.74533f }, 
     505    {-200.465f,-96.418f,79.7587f,1.36136f }, 
     506    //mine supplies 
     507    //irondeep 
     508    {870.899f,-388.434f,61.6406f,-1.22173f}, 
     509    {825.214f,-320.174f,63.712f,-2.82743f}, 
     510    {837.117f,-452.556f,47.2331f,-3.12414f}, 
     511    {869.755f,-448.867f,52.5448f,-0.855212f}, 
     512    {949.877f,-458.198f,56.4874f,0.314159f}, 
     513    {900.35f,-479.024f,58.3553f,0.122173f}, 
     514    {854.449f,-442.255f,50.6589f,0.401426f}, 
     515    {886.685f,-442.358f,54.6962f,-1.22173f}, 
     516    {817.509f,-457.331f,48.4666f,2.07694f}, 
     517    {793.411f,-326.281f,63.1117f,-2.79253f}, 
     518    //coldtooth 
     519    {-934.212f,-57.3517f,80.277f,-0.0174535f}, 
     520    {-916.281f,-36.8579f,77.0227f,0.122173f}, 
     521    {-902.73f,-103.868f,75.4378f,-1.58825f}, 
     522    {-900.514f,-143.527f,75.9686f,1.8675f}, 
     523    {-862.882f,-0.353299f,72.1526f,-2.51327f}, 
     524    {-854.932f,-85.9184f,68.6056f,-2.04204f}, 
     525    {-851.833f,-118.959f,63.8672f,-0.0698131f}, 
     526    {-849.832f,-20.8421f,70.4672f,-1.81514f}, 
     527    {-844.25f,-60.0374f,72.1031f,-2.19912f}, 
     528    {-820.644f,-136.043f,63.1977f,2.40855f}, 
     529    {-947.642f,-208.807f,77.0101f,1.36136f}, 
     530    {-951.394f,-193.695f,67.634f,0.802851f} 
     531}; 
     532 
     533const float BG_AV_DoorPositons[2][4] = { 
     534    {780.487f, -493.024f, 99.9553f, 3.0976f},   //alliance 
     535    {-1375.193f, -538.981f, 55.2824f, 0.72178f} //horde 
     536}; 
     537 
     538 
     539//creaturestuff starts here 
     540//is related to BG_AV_CreaturePos 
     541enum BG_AV_CreaturePlace 
     542{ 
     543    AV_CPLACE_SPIRIT_STORM_AID      = 0, 
     544    AV_CPLACE_SPIRIT_STORM_GRAVE    = 1, 
     545    AV_CPLACE_SPIRIT_STONE_GRAVE    = 2, 
     546    AV_CPLACE_SPIRIT_SNOWFALL       = 3, 
     547    AV_CPLACE_SPIRIT_ICE_GRAVE      = 4, 
     548    AV_CPLACE_SPIRIT_FROSTWOLF      = 5, 
     549    AV_CPLACE_SPIRIT_FROST_HUT      = 6, 
     550    AV_CPLACE_SPIRIT_MAIN_ALLIANCE  = 7, 
     551    AV_CPLACE_SPIRIT_MAIN_HORDE     = 8, 
     552//i don't will add for all 4 positions a variable.. i think one is enough to compute the rest 
     553    AV_CPLACE_DEFENSE_STORM_AID      = 9, 
     554    AV_CPLACE_DEFEMSE_STORM_GRAVE    = 13, 
     555    AV_CPLACE_DEFENSE_STONE_GRAVE    = 17, 
     556    AV_CPLACE_DEFENSE_SNOWFALL       = 21, 
     557    AV_CPLACE_DEFENSE_FROSTWOLF      = 25, 
     558    AV_CPLACE_DEFENSE_ICE_GRAVE      = 29, 
     559    AV_CPLACE_DEFENSE_FROST_HUT      = 33, 
     560 
     561    AV_CPLACE_DEFENSE_DUN_S          = 37, 
     562    AV_CPLACE_DEFENSE_DUN_N          = 41, 
     563    AV_CPLACE_DEFENSE_ICEWING        = 45, 
     564    AV_CPLACE_DEFENSE_STONE_TOWER    = 49, 
     565    AV_CPLACE_DEFENSE_ICE_TOWER      = 53, 
     566    AV_CPLACE_DEFENSE_TOWERPOINT     = 57, 
     567    AV_CPLACE_DEFENSE_FROST_E        = 61, 
     568    AV_CPLACE_DEFENSE_FROST_t        = 65, 
     569 
     570    AV_CPLACE_A_MARSHAL_SOUTH       = 69, 
     571    AV_CPLACE_A_MARSHAL_NORTH       = 70, 
     572    AV_CPLACE_A_MARSHAL_ICE         = 71, 
     573    AV_CPLACE_A_MARSHAL_STONE       = 72, 
     574    AV_CPLACE_H_MARSHAL_ICE         = 73, 
     575    AV_CPLACE_H_MARSHAL_TOWER       = 74, 
     576    AV_CPLACE_H_MARSHAL_ETOWER      = 75, 
     577    AV_CPLACE_H_MARSHAL_WTOWER      = 76, 
     578    //irondeep 
     579    //miner: 
     580    AV_CPLACE_MINE_N_1_MIN      = 77, 
     581    AV_CPLACE_MINE_N_1_MAX      = 136, 
     582    //special types 
     583    AV_CPLACE_MINE_N_2_MIN      = 137, 
     584    AV_CPLACE_MINE_N_2_MAX      = 192, 
     585    //boss 
     586    AV_CPLACE_MINE_N_3          = 193, 
     587    //coldtooth 
     588    //miner: 
     589    AV_CPLACE_MINE_S_1_MIN      = 194, 
     590    AV_CPLACE_MINE_S_1_MAX      = 250, 
     591    //special types 
     592    AV_CPLACE_MINE_S_2_MIN      = 251, 
     593    AV_CPLACE_MINE_S_2_MAX      = 289, 
     594    //vermin 
     595    AV_CPLACE_MINE_S_S_MIN      = 290, 
     596    AV_CPLACE_MINE_S_S_MAX      = 299, 
     597    //boss 
     598    AV_CPLACE_MINE_S_3          = 300, 
     599 
     600    //herald 
     601    AV_CPLACE_HERALD          = 301, 
     602 
     603    AV_CPLACE_MAX = 302 
     604}; 
     605 
     606//x, y, z, o 
     607const float BG_AV_CreaturePos[AV_CPLACE_MAX][4] = { 
     608    //spiritguides 
     609    {643.000000f,44.000000f,69.740196f,-0.001854f}, 
     610    {676.000000f,-374.000000f,30.000000f,-0.001854f}, 
     611    {73.417755f,-496.433105f,48.731918f,-0.001854f}, 
     612    {-157.409195f,31.206272f,77.050598f,-0.001854f}, 
     613    {-531.217834f,-405.231384f,49.551376f,-0.001854f}, 
     614    {-1090.476807f,-253.308670f,57.672371f,-0.001854f}, 
     615    {-1496.065063f,-333.338409f,101.134804f,-0.001854f}, 
     616    {873.001770f,-491.283630f,96.541931f,-0.001854f}, 
     617    {-1437.670044f,-610.088989f,51.161900f,-0.001854f}, 
     618 //grave 
     619 //firstaid 
     620    {635.17f,-29.5594f,46.5056f,4.81711f}, 
     621    {642.488f,-32.9437f,46.365f,4.67748f}, 
     622    {642.326f,-27.9442f,46.9211f,4.59022f}, 
     623    {635.945f,-33.6171f,45.7164f,4.97419f}, 
     624   //stormpike 
     625    {669.272f,-297.304f,30.291f,4.66604f}, 
     626    {674.08f,-292.328f,30.4817f,0.0918785f}, 
     627    {667.01f,-288.532f,29.8809f,1.81583f}, 
     628    {664.153f,-294.042f,30.2851f,3.28531f}, 
     629  //stone 
     630    {81.7027f,-406.135f,47.7843f,0.598464f}, 
     631    {78.1431f,-409.215f,48.0401f,5.05953f}, 
     632    {73.4135f,-407.035f,46.7527f,3.34736f}, 
     633    {78.2258f,-401.859f,46.4202f,2.05852f}, 
     634  //snowfall 
     635    {-207.412f,-110.616f,78.7959f,2.43251f}, 
     636    {-197.95f,-112.205f,78.5686f,6.22441f}, 
     637    {-202.709f,-116.829f,78.4358f,5.13742f}, 
     638    {-202.059f,-108.314f,78.5783f,5.91968f}, 
     639  //ice 
     640    {-615.501f,-393.802f,60.4299f,3.06147f}, 
     641    {-608.513f,-392.717f,62.5724f,2.06323f}, 
     642    {-609.769f,-400.072f,60.7174f,5.22367f}, 
     643    {-616.093f,-398.293f,60.5628f,3.73613f}, 
     644  //frost 
     645    {-1077.7f,-340.21f,55.4682f,6.25569f}, 
     646    {-1082.74f,-333.821f,54.7962f,2.05459f}, 
     647    {-1090.66f,-341.267f,54.6768f,3.27746f}, 
     648    {-1081.58f,-344.63f,55.256f,4.75636f}, 
     649  //frost hut 
     650    {-1408.95f,-311.69f,89.2536f,4.49954f}, 
     651    {-1407.15f,-305.323f,89.1993f,2.86827f}, 
     652    {-1400.64f,-304.3f,89.7008f,1.0595f}, 
     653    {-1400.4f,-311.35f,89.3028f,4.99434f}, 
     654  //towers 
     655  //dun south - OK 
     656    {569.395f,-101.064f,52.8296f,2.34974f}, 
     657    {574.85f,-92.9842f,52.5869f,3.09325f}, 
     658    {575.411f,-83.597f,52.3626f,6.26573f}, 
     659    {571.352f,-75.6582f,52.479f,0.523599f}, 
     660    //dun north - OK 
     661    {668.60f,-122.53f,64.12f,2.34f}, //not 100% ok 
     662    {662.253f,-129.105f,64.1794f,2.77507f}, 
     663    {661.209f,-138.877f,64.2251f,3.38594f}, 
     664    {665.481f,-146.857f,64.1271f,3.75246f}, 
     665    //icewing - OK 
     666    {225.228f,-368.909f,56.9983f,6.23806f}, 
     667    {191.36f,-369.899f,57.1524f,3.24631f}, 
     668    {215.518f,-384.019f,56.9889f,5.09636f}, 
     669    {199.625f,-382.177f,56.8691f,4.08407f}, 
     670    //stone 
     671    {-172.851f,-452.366f,40.8725f,3.31829f}, 
     672    {-147.147f,-435.053f,40.8022f,0.599238f}, 
     673    {-169.456f,-440.325f,40.985f,2.59101f}, 
     674    {-163.494f,-434.904f,41.0725f,1.84174f}, 
     675    //ice - OK 
     676    {-573.522f,-271.854f,75.0078f,3.9619f}, 
     677    {-565.616f,-269.051f,74.9952f,5.02655f}, 
     678    {-562.825f,-261.087f,74.9898f,5.95157f}, 
     679    {-569.176f,-254.446f,74.8771f,0.820305f}, 
     680    //towerpoint 
     681    {-763.04f,-371.032f,90.7933f,5.25979f}, 
     682    {-759.764f,-358.264f,90.8681f,0.289795f}, 
     683    {-768.808f,-353.056f,90.8811f,1.52601f}, 
     684    {-775.944f,-362.639f,90.8949f,2.59573f}, 
     685    //frost etower 
     686    {-1294.13f,-313.045f,107.328f,0.270162f}, 
     687    {-1306.5f,-308.105f,113.767f,1.78755f}, 
     688    {-1294.78f,-319.966f,113.79f,5.94545f}, 
     689    {-1294.83f,-312.241f,113.799f,0.295293f}, 
     690    //frost wtower 
     691    {-1300.96f,-275.111f,114.058f,4.12804f}, 
     692    {-1302.41f,-259.256f,114.065f,1.67602f}, 
     693    {-1287.97f,-262.087f,114.165f,6.18264f}, 
     694    {-1291.59f,-271.166f,114.151f,5.28257f}, 
     695 
     696    //alliance marshall 
     697    {721.104f,-7.64155f,50.7046f,3.45575f},// south 
     698    {723.058f,-14.1548f,50.7046f,3.40339f},// north 
     699    {715.691f,-4.72233f,50.2187f,3.47321f},// icewing 
     700    {720.046f,-19.9413f,50.2187f,3.36849f},// stone 
     701//horde  (coords not 100% ok) 
     702    {-1363.99f,-221.99f,98.4053f,4.93012f}, 
     703    {-1370.96f,-223.532f,98.4266f,4.93012f}, 
     704    {-1378.37f,-228.614f,99.3546f,5.38565f}, 
     705    {-1358.02f,-228.998f,98.868f,3.87768f}, 
     706 
     707 //irondeep mine 
     708 //Irondeep Trogg 
     709    {971.671f,-442.657f,57.6951f,3.1765f}, 
     710    {969.979f,-457.148f,58.1119f,4.5204f}, 
     711    {958.692f,-333.477f,63.2276f,5.77704f}, 
     712    {957.113f,-325.92f,61.7589f,1.13446f}, 
     713    {948.25f,-448.268f,56.9009f,5.60251f}, 
     714    {934.727f,-385.802f,63.0344f,3.75246f}, 
     715    {931.751f,-403.458f,59.6737f,5.63741f}, 
     716    {931.146f,-359.666f,66.0294f,3.9619f}, 
     717    {929.702f,-412.401f,56.8776f,5.89921f}, 
     718    {926.849f,-379.074f,63.5286f,2.0944f}, 
     719    {921.972f,-358.597f,66.4313f,2.93215f}, 
     720    {921.449f,-341.981f,67.1264f,3.4383f}, 
     721    {921.1f,-395.812f,60.4615f,2.71695f}, 
     722    {919.274f,-394.986f,60.3478f,2.71696f}, 
     723    {916.852f,-393.891f,60.1726f,2.71695f}, 
     724    {914.568f,-326.21f,66.1733f,2.25147f}, 
     725    {913.064f,-395.773f,60.1364f,4.41568f}, 
     726    {909.246f,-474.576f,58.2067f,0.226893f}, 
     727    {909.246f,-474.576f,58.2901f,0.226893f}, 
     728    {907.209f,-428.267f,59.8065f,1.8675f}, 
     729    {905.973f,-459.528f,58.7594f,1.37189f}, 
     730    {905.067f,-396.074f,60.2085f,5.07891f}, 
     731    {901.809f,-457.709f,59.0116f,3.52557f}, 
     732    {900.962f,-427.44f,59.0842f,1.50098f}, 
     733    {897.929f,-471.742f,59.7729f,2.54818f}, 
     734    {893.376f,-343.171f,68.1499f,5.35816f}, 
     735    {890.584f,-406.049f,61.1925f,5.67232f}, 
     736    {888.208f,-332.564f,68.148f,1.93732f}, 
     737    {887.647f,-391.537f,61.8734f,1.37881f}, 
     738    {885.109f,-343.338f,67.0867f,3.78979f}, 
     739    {881.618f,-419.948f,53.5228f,0.593412f}, 
     740    {878.675f,-345.36f,66.1052f,3.45651f}, 
     741    {877.127f,-351.8f,66.5296f,5.74213f}, 
     742    {876.778f,-345.97f,65.7724f,3.45262f}, 
     743    {874.577f,-414.786f,52.7817f,1.67552f}, 
     744    {868.247f,-343.136f,64.9894f,1.6057f}, 
     745    {859.03f,-367.231f,47.4655f,0.0174533f}, 
     746    {857.513f,-351.817f,65.1867f,4.39823f}, 
     747    {852.632f,-372.416f,48.1657f,3.66519f}, 
     748    {849.86f,-340.944f,66.2447f,0.401426f}, 
     749    {847.99f,-386.287f,60.9277f,2.32374f}, 
     750    {847.601f,-423.072f,50.0852f,4.57276f}, 
     751    {847.135f,-411.307f,50.2106f,1.5708f}, 
     752    {835.077f,-379.418f,48.2755f,5.93412f}, 
     753    {834.87f,-453.304f,47.9075f,0.226893f}, 
     754    {834.634f,-365.981f,62.8801f,1.32645f}, 
     755    {834.354f,-355.526f,48.1491f,6.07375f}, 
     756    {833.702f,-327.506f,65.0439f,0.331613f}, 
     757    {833.151f,-374.228f,63.0938f,3.66519f}, 
     758    {831.711f,-346.785f,47.2975f,0.226893f}, 
     759    {827.874f,-413.624f,48.5818f,1.49241f}, 
     760    {827.728f,-415.483f,48.5593f,1.49238f}, 
     761    {827.016f,-424.543f,48.2856f,1.49236f}, 
     762    {823.222f,-334.283f,65.6306f,4.88692f}, 
     763    {821.892f,-464.723f,48.9451f,4.66003f}, 
     764    {821.006f,-387.635f,49.0728f,3.15905f}, 
     765    {817.26f,-447.432f,49.4308f,2.18166f}, 
     766    {805.399f,-320.146f,52.7712f,0.296706f}, 
     767    {801.405f,-328.055f,53.0195f,4.31096f}, 
     768    //irondeep skullthumber irondeep shaman 
     769    {955.812f,-440.302f,55.3411f,3.19395f}, 
     770    {937.378f,-377.816f,65.3919f,3.56047f}, 
     771    {925.059f,-331.347f,65.7564f,3.66519f}, 
     772    {922.918f,-396.634f,60.3942f,2.71695f}, 
     773    {909.99f,-462.154f,59.0811f,3.7001f}, 
     774    {907.893f,-388.787f,61.7923f,5.74213f}, 
     775    {898.801f,-437.105f,58.5266f,0.959931f}, 
     776    {884.237f,-407.597f,61.566f,0.820305f}, 
     777    {880.744f,-344.683f,66.4086f,3.4644f}, 
     778    {876.047f,-341.857f,65.8743f,4.45059f}, 
     779    {874.674f,-402.077f,61.7573f,0.26341f}, 
     780    {871.914f,-404.209f,62.1269f,6.06163f}, 
     781    {871.606f,-403.665f,62.0795f,0.765774f}, 
     782    {871.561f,-404.114f,62.1297f,0.00981727f}, 
     783    {871.528f,-404.248f,62.1455f,0.498032f}, 
     784    {871.493f,-404.122f,62.1331f,5.65727f}, 
     785    {871.282f,-403.843f,62.1108f,0.788382f}, 
     786    {868.294f,-392.395f,61.4772f,4.38685f}, 
     787    {868.256f,-392.363f,61.4803f,0.732738f}, 
     788    {867.804f,-392.51f,61.5089f,2.30167f}, 
     789    {867.612f,-392.371f,61.524f,2.86149f}, 
     790    {858.593f,-439.614f,50.2184f,0.872665f}, 
     791    {851.471f,-362.52f,47.314f,4.06662f}, 
     792    {846.939f,-347.279f,66.2876f,0.942478f}, 
     793    {842.08f,-421.775f,48.2659f,1.0821f}, 
     794    {838.358f,-371.212f,63.3299f,4.04916f}, 
     795    {827.57f,-417.483f,48.4538f,1.49237f}, 
     796    {827.012f,-457.397f,48.9331f,2.35619f}, 
     797    {825.535f,-322.373f,63.9357f,4.76475f}, 
     798    {867.635f,-443.605f,51.3347f,1.38626f}, 
     799    {957.293f,-455.039f,56.7395f,5.79449f}, 
     800    {950.077f,-326.672f,61.6552f,5.48033f}, 
     801    {936.692f,-356.78f,65.9835f,2.75762f}, 
     802    {926.475f,-419.345f,56.1833f,2.0944f}, 
     803    {924.729f,-397.453f,60.213f,2.71695f}, 
     804    {902.195f,-475.891f,58.312f,1.39626f}, 
     805    {897.464f,-338.758f,68.1715f,2.94961f}, 
     806    {884.237f,-407.597f,61.566f,0.820305f}, 
     807    {882.517f,-344.111f,66.7887f,3.46962f}, 
     808    {881.437f,-400.254f,61.2028f,0.263427f}, 
     809    {880.156f,-400.678f,61.3113f,3.41373f}, 
     810    {877.989f,-418.051f,52.9753f,4.46804f}, 
     811    {871.212f,-404.12f,62.1433f,3.6554f}, 
     812    {871.036f,-404.119f,62.2237f,4.50295f}, 
     813    {857.396f,-395.766f,61.263f,4.78684f}, 
     814    {857.276f,-395.395f,61.2418f,0.0845553f}, 
     815    {857.231f,-394.577f,61.2174f,1.96817f}, 
     816    {857.108f,-395.682f,61.2317f,4.87022f}, 
     817    {856.709f,-395.28f,61.1814f,2.54913f}, 
     818    {850.922f,-390.399f,60.8771f,2.85405f}, 
     819    {847.556f,-388.228f,60.9438f,2.56872f}, 
     820    {842.031f,-384.663f,61.6028f,2.56871f}, 
     821    {832.035f,-389.301f,47.5567f,2.11185f}, 
     822    {827.415f,-419.468f,48.3322f,1.49232f}, 
     823    {826.402f,-349.454f,47.2722f,1.51844f}, 
     824    {817.83f,-455.715f,48.4207f,0.925025f}, 
     825    {808.953f,-325.964f,52.4043f,3.01942f}, 
     826    // Morloch 
     827    {865.554f,-438.735f,50.7333f,2.12431f}, 
     828    //coldtooth mine 
     829    //miner/digger 
     830    {-917.648f,-46.8922f,77.0872f,5.27089f}, 
     831    {-912.689f,-45.4494f,76.2277f,4.60767f}, 
     832    {-905.455f,-84.5179f,75.3642f,3.29867f}, 
     833    {-904.332f,-111.509f,75.5925f,2.47837f}, 
     834    {-904.27f,-160.419f,61.9876f,3.61192f}, 
     835    {-904.023f,-90.4558f,75.3706f,3.40339f}, 
     836    {-978.678f,-37.3136f,75.8364f,2.84489f}, 
     837    {-973.076f,-36.5013f,77.5047f,1.0821f}, 
     838    {-963.951f,-87.734f,81.5555f,0.575959f}, 
     839    {-961.941f,-90.7252f,81.6629f,0.820305f}, 
     840    {-957.623f,-186.582f,66.6021f,1.95477f}, 
     841    {-952.476f,-179.778f,78.6771f,4.5204f}, 
     842    {-950.427f,-115.007f,79.6127f,3.68264f}, 
     843    {-950.25f,-151.95f,79.4598f,-1.81423f}, 
     844    {-950.169f,-188.099f,66.6184f,5.55015f}, 
     845    {-949.944f,-142.977f,80.5382f,2.70526f}, 
     846    {-947.854f,-170.5f,79.7618f,0.942478f}, 
     847    {-946.738f,-139.567f,80.0904f,2.3911f}, 
     848    {-945.503f,-65.0654f,79.7907f,5.02655f}, 
     849    {-943.678f,-110.986f,80.2557f,0.959931f}, 
     850    {-942.993f,-56.9881f,79.8915f,5.65487f}, 
     851    {-938.197f,-155.838f,61.3111f,1.65806f}, 
     852    {-930.488f,-214.524f,72.1431f,2.1236f}, 
     853    {-929.947f,-154.449f,61.5084f,1.67552f}, 
     854    {-927.412f,-135.313f,61.1987f,3.29867f}, 
     855    {-920.677f,-156.859f,62.8033f,3.15306f}, 
     856    {-916.75f,-136.094f,62.2357f,0.0698132f}, 
     857    {-915.319f,-132.718f,62.562f,1.16984f}, 
     858    {-913.589f,-146.794f,76.9366f,1.8675f}, 
     859    {-907.572f,-148.937f,76.6898f,4.76475f}, 
     860    {-902.02f,-64.6174f,73.9707f,1.19169f}, 
     861    {-899.489f,-61.7252f,73.2498f,5.09636f}, 
     862    {-894.792f,-127.141f,75.3834f,6.14356f}, 
     863    {-892.408f,-162.525f,64.1212f,2.69884f}, 
     864    {-892.326f,-123.158f,76.0318f,5.5676f}, 
     865    {-888.468f,-148.462f,61.8012f,1.65806f}, 
     866    {-883.268f,-159.738f,63.5311f,5.20108f}, 
     867    {-877.76f,-118.07f,65.215f,2.94961f}, 
     868    {-876.792f,-128.646f,64.1045f,3.40339f}, 
     869    {-874.901f,-36.6579f,69.4246f,2.00713f}, 
     870    {-874.856f,-151.351f,62.7537f,3.57875f}, 
     871    {-872.135f,-150.08f,62.7513f,3.57201f}, 
     872    {-870.288f,-149.217f,62.5413f,3.56624f}, 
     873    {-870.03f,-6.27443f,70.3867f,2.3911f}, 
     874    {-869.023f,-82.2118f,69.5848f,3.22886f}, 
     875    {-866.354f,-40.2455f,70.842f,0.0698132f}, 
     876    {-865.305f,-152.302f,63.5044f,4.86947f}, 
     877    {-861.926f,-79.0519f,71.4178f,0.20944f}, 
     878    {-857.292f,-152.277f,63.2114f,4.18879f}, 
     879    {-853.357f,-0.696194f,72.0655f,0.994838f}, 
     880    {-850.685f,-14.2596f,70.2298f,0.20944f}, 
     881    {-839.987f,-67.7695f,72.7916f,4.93928f}, 
     882    {-839.199f,-57.0558f,73.4891f,1.67552f}, 
     883    {-836.963f,-153.224f,63.3821f,4.46804f}, 
     884    {-832.721f,-67.7555f,72.9062f,4.99164f}, 
     885    {-821.496f,-143.095f,63.1292f,0.541052f}, 
     886    {-818.829f,-153.004f,62.1757f,6.12611f}, 
     887    //special 
     888    {-954.622f,-110.958f,80.7911f,6.24828f}, 
     889    {-951.477f,-53.9647f,80.0235f,5.32325f}, 
     890    {-946.812f,-126.04f,78.8601f,5.15265f}, 
     891    {-940.689f,-140.707f,79.9225f,2.79253f}, 
     892    {-933.954f,-159.632f,60.778f,2.56563f}, 
     893    {-922.537f,-130.291f,61.3756f,4.95674f}, 
     894    {-915.862f,-151.74f,76.9427f,0.942478f}, 
     895    {-888.321f,-159.831f,62.5303f,1.20428f}, 
     896    {-874.361f,-42.4751f,69.4316f,0.785398f}, 
     897    {-873.19f,-50.4899f,70.0568f,-2.41288f}, 
     898    {-868.511f,-148.386f,62.3547f,3.57875f}, 
     899    {-868.44f,-121.649f,64.5056f,3.33358f}, 
     900    {-868.324f,-77.7196f,71.4768f,5.41052f}, 
     901    {-859.846f,-19.6549f,70.7304f,1.97222f}, 
     902    {-828.05f,-150.508f,62.2019f,2.14675f}, 
     903    {-826.254f,-58.6911f,72.0041f,3.68264f}, 
     904    {-976.086f,-44.1775f,76.029f,1.46608f}, 
     905    {-971.864f,-87.4223f,81.4954f,5.8294f}, 
     906    {-966.551f,-74.1111f,80.0243f,4.2129f}, 
     907    {-958.509f,-173.652f,77.9013f,6.24828f}, 
     908    {-951.511f,-181.242f,65.529f,4.39823f}, 
     909    {-940.967f,-186.243f,77.698f,1.28164f}, 
     910    {-930.004f,-65.0898f,79.077f,0.0581657f}, 
     911    {-920.864f,-40.2009f,78.256f,5.16617f}, 
     912    {-919.089f,-148.021f,62.0317f,2.59327f}, 
     913    {-901.516f,-116.329f,75.6876f,0.471239f}, 
     914    {-897.864f,-84.4348f,74.083f,3.00197f}, 
     915    {-897.617f,-52.0457f,71.9503f,4.36332f}, 
     916    {-894.891f,-153.951f,61.6827f,3.23569f}, 
     917    {-893.933f,-111.625f,75.6591f,4.22536f}, 
     918    {-883.265f,-152.854f,61.8384f,0.0941087f}, 
     919    {-868.293f,-147.243f,62.1097f,3.2056f}, 
     920    {-867.501f,-11.8709f,70.018f,6.14356f}, 
     921    {-866.699f,-147.54f,62.1646f,3.57878f}, 
     922    {-866.566f,-91.1916f,67.4414f,4.56707f}, 
     923    {-857.272f,-141.142f,61.7356f,4.17134f}, 
     924    {-847.446f,-98.0061f,68.5131f,3.24631f}, 
     925    {-837.026f,-140.729f,62.5141f,5.51524f}, 
     926    {-824.204f,-65.053f,72.3381f,3.01942f}, 
     927    //vermin (s.th special for this mine) 
     928    {-951.955f,-197.5f,77.212f,5.63741f}, 
     929    {-944.837f,-199.608f,77.0737f,4.97419f}, 
     930    {-933.494f,-209.063f,73.7803f,5.88176f}, 
     931    {-929.666f,-201.308f,73.7032f,5.02655f}, 
     932    {-978.997f,-249.356f,65.4345f,5.05464f}, 
     933    {-974.565f,-224.828f,69.5858f,4.88846f}, 
     934    {-946.514f,-259.239f,66.0874f,3.78132f}, 
     935    {-918.402f,-250.439f,69.5271f,2.21352f}, 
     936    {-910.14f,-229.959f,72.9279f,0.27677f}, 
     937    {-851.563f,-88.6527f,68.5983f,3.61896f}, 
     938    //boss 
     939    {-848.902f,-92.931f,68.6325f,3.33350}, 
     940    //herald 
     941    {-48.459f,-288.802f,55.47f,1.0} 
     942 
     943}; 
     944 
     945 
     946enum BG_AV_CreatureIds 
     947{ 
     948 
     949    AV_NPC_A_GRAVEDEFENSE0 = 0,     // stormpike Defender 
     950    AV_NPC_A_GRAVEDEFENSE1 = 1,     // seasoned defender 
     951    AV_NPC_A_GRAVEDEFENSE2 = 2,     // veteran defender 
     952    AV_NPC_A_GRAVEDEFENSE3 = 3,     // champion defender 
     953    AV_NPC_A_TOWERDEFENSE  = 4,     // stormpike bowman 
     954    AV_NPC_A_CAPTAIN       = 5,     // balinda 
     955    AV_NPC_A_BOSS          = 6,     // vanndar 
     956 
     957    AV_NPC_H_GRAVEDEFENSE0 = 7,     // frostwolf guardian 
     958    AV_NPC_H_GRAVEDEFENSE1 = 8,     // seasoned guardian 
     959    AV_NPC_H_GRAVEDEFENSE2 = 9,     // veteran guardian 
     960    AV_NPC_H_GRAVEDEFENSE3 = 10,    // champion guardian 
     961    AV_NPC_H_TOWERDEFENSE  = 11,    // frostwolf bowman 
     962    AV_NPC_H_CAPTAIN       = 12,    // galvangar 
     963    AV_NPC_H_BOSS          = 13,    // drek thar 
     964 
     965    AV_NPC_A_MARSHAL_SOUTH = 14, 
     966    AV_NPC_MARSHAL_NORTH   = 15, 
     967    AV_NPC_A_MARSHAL_ICE   = 16, 
     968    AV_NPC_A_MARSHAL_STONE = 17, 
     969    AV_NPC_H_MARSHAL_ICE   = 18, 
     970    AV_NPC_H_MARSHAL_TOWER = 19, 
     971    AV_NPC_MARSHAL_ETOWER  = 20, 
     972    AV_NPC_H_MARSHAL_WTOWER= 21, 
     973    AV_NPC_N_MINE_N_1      = 22, 
     974    AV_NPC_N_MINE_N_2      = 23, 
     975    AV_NPC_N_MINE_N_3      = 24, 
     976    AV_NPC_N_MINE_N_4      = 25, 
     977    AV_NPC_N_MINE_A_1      = 26, 
     978    AV_NPC_N_MINE_A_2      = 27, 
     979    AV_NPC_N_MINE_A_3      = 28, 
     980    AV_NPC_N_MINE_A_4      = 29, 
     981    AV_NPC_N_MINE_H_1      = 30, 
     982    AV_NPC_N_MINE_H_2      = 31, 
     983    AV_NPC_N_MINE_H_3      = 32, 
     984    AV_NPC_N_MINE_H_4      = 33, 
     985    AV_NPC_S_MINE_N_1      = 34, 
     986    AV_NPC_S_MINE_N_2      = 35, 
     987    AV_NPC_S_MINE_N_3      = 36, 
     988    AV_NPC_S_MINE_N_4      = 37, 
     989    AV_NPC_S_MINE_N_S      = 38, 
     990    AV_NPC_S_MINE_A_1      = 39, 
     991    AV_NPC_S_MINE_A_2      = 40, 
     992    AV_NPC_S_MINE_A_3      = 41, 
     993    AV_NPC_S_MINE_A_4      = 42, 
     994    AV_NPC_S_MINE_H_1      = 43, 
     995    AV_NPC_S_MINE_H_2      = 44, 
     996    AV_NPC_S_MINE_H_3      = 45, 
     997    AV_NPC_S_MINE_H_4      = 46, 
     998    AV_NPC_HERALD          = 47, 
     999    AV_NPC_INFO_MAX        = 48 
     1000 
     1001}; 
     1002 
     1003//entry, team, minlevel, maxlevel 
     1004//TODO this array should be removed, the only needed things are the entrys (for spawning(?) and handlekillunit) 
     1005const uint32 BG_AV_CreatureInfo[AV_NPC_INFO_MAX][4] = { 
     1006    { 12050, 1216, 58, 58 }, //Stormpike Defender 
     1007    { 13326, 1216, 59, 59 }, //Seasoned Defender 
     1008    { 13331, 1216, 60, 60 }, //Veteran Defender 
     1009    { 13422, 1216, 61, 61 }, //Champion Defender 
     1010    { 13358, 1216, 59, 60 }, //Stormpike Bowman //i think its 60,61 and 69,70.. but this is until now not possible TODO look if this is ok 
     1011    { 11949,469,0,0},//not spawned with this data, but used for handlekillunit 
     1012    { 11948,469,0,0},//not spawned with this data, but used for handlekillunit 
     1013    { 12053, 1214, 58, 58 }, //Frostwolf Guardian 
     1014    { 13328, 1214, 59, 59 }, //Seasoned Guardian 
     1015    { 13332, 1214, 60, 60 }, //Veteran Guardian 
     1016    { 13421, 1214, 61, 61 }, //Champion Guardian 
     1017    { 13359, 1214, 59, 60 }, //Frostwolf Bowman 
     1018    { 11947,67,0,0}, //not spawned with this data, but used for handlekillunit 
     1019    { 11946,67,0,0}, //not spawned with this data, but used for handlekillunit 
     1020    { 14763, 1534, 60, 60 }, //Dun Baldar South Marshal 
     1021    { 14762, 1534, 60, 60 }, //Dun Baldar North Marshal 
     1022    { 14764, 1534, 60, 60 }, //Icewing Marshal 
     1023    { 14765, 1534, 60, 60 }, //Stonehearth Marshal 
     1024 
     1025    { 14773, 1214, 60, 60 }, //Iceblood Warmaster 
     1026    { 14776, 1214, 60, 60 }, //Tower Point Warmaster 
     1027    { 14772, 1214, 60, 60 }, //East Frostwolf Warmaster 
     1028    { 14777, 1214, 60, 60 }, //West Frostwolf Warmaster 
     1029 
     1030    { 10987, 59, 52, 53 }, //Irondeep Trogg 
     1031    { 11600, 59, 53, 54 }, //Irondeep Shaman 
     1032    { 11602, 59, 54, 55 }, //Irondeep Skullthumper 
     1033    { 11657, 59, 58, 58 }, //Morloch 
     1034 
     1035    {13396,469,52,53}, //irondeep alliance TODO: get the right ids 
     1036    {13080,469,53,54}, 
     1037    {13098,469,54,55}, 
     1038    {13078,469,58,58}, 
     1039 
     1040    {13397,67,52,53}, //irondeep horde 
     1041    {13099,67,53,54}, 
     1042    {13081,67,54,55}, 
     1043    {13079,67,58,58}, 
     1044 
     1045    { 11603, 59, 52, 53 }, //south mine neutral 
     1046    { 11604, 59, 53, 54 }, 
     1047    { 11605, 59, 54, 55 }, 
     1048    { 11677, 59, 58, 58 }, 
     1049    { 10982, 59, 52, 53 }, //vermin 
     1050 
     1051    {13317,469,52,53}, //alliance 
     1052    {13096,469,54,55}, //explorer 
     1053    {13087,469,54,55}, //invader 
     1054    {13086,469,58,58}, 
     1055 
     1056    {13316,67,52,53}, //horde 
     1057    {13097,67,54,55}, //surveypr 
     1058    {13089,67,54,55}, //guard 
     1059    {13088,67,58,58}, 
     1060    {14848,67,58,58} //Herald 
     1061 
     1062}; 
     1063 
     1064//x,y,z,o,static_creature_info-id 
     1065const float BG_AV_StaticCreaturePos[AV_STATICCPLACE_MAX][5] = { //static creatures 
     1066    {-1235.31f,-340.777f,60.5088f,3.31613f,0 },//2225 - Zora Guthrek 
     1067    {-1244.02f,-323.795f,61.0485f,5.21853f,1 },//3343 - Grelkor 
     1068    {-1235.16f,-332.302f,60.2985f,2.96706f,2 },//3625 - Rarck 
     1069    {587.303f,-42.8257f,37.5615f,5.23599f,3 },//4255 - Brogus Thunderbrew 
     1070    {643.635f,-58.3987f,41.7405f,4.72984f,4 },//4257 - Lana Thunderbrew 
     1071    {591.464f,-44.452f,37.6166f,5.65487f,5 },//5134 - Jonivera Farmountain 
     1072    {608.515f,-33.3935f,42.0003f,5.41052f,6 },//5135 - Svalbrad Farmountain 
     1073    {617.656f,-32.0701f,42.7168f,4.06662f,7 },//5139 - Kurdrum Barleybeard 
     1074    {-1183.76f,-268.295f,72.8233f,3.28122f,8 },//10364 - Yaelika Farclaw 
     1075    {-1187.86f,-275.31f,73.0481f,3.63028f,9 },//10367 - Shrye Ragefist 
     1076    {-1008.42f,-368.006f,55.3426f,5.95647f,10 },//10981 - Frostwolf 
     1077    {-1091.92f,-424.28f,53.0139f,2.93958f,10 },//10981 - Frostwolf 
     1078    {-558.455f,-198.768f,58.1755f,4.97946f,10 },//10981 - Frostwolf 
     1079    {-861.247f,-312.51f,55.1427f,3.35382f,10 },//10981 - Frostwolf 
     1080    {-1003.81f,-395.913f,50.4736f,2.85631f,10 },//10981 - Frostwolf 
     1081    {-904.5f,-289.815f,65.1222f,5.7847f,10 },//10981 - Frostwolf 
     1082    {-1064.41f,-438.839f,51.3614f,1.88857f,10 },//10981 - Frostwolf 
     1083    {258.814f,76.2017f,18.6468f,6.19052f,11 },//10986 - Snowblind Harpy 
     1084    {265.838f,-315.846f,-16.5429f,3.15917f,11 },//10986 - Snowblind Harpy 
     1085    {426.485f,-51.1927f,-5.66286f,1.60347f,11 },//10986 - Snowblind Harpy 
     1086    {452.044f,-33.9594f,-0.044651f,2.72815f,11 },//10986 - Snowblind Harpy 
     1087    {266.032f,-315.639f,-16.5429f,4.67962f,11 },//10986 - Snowblind Harpy 
     1088    {532.64f,-54.5863f,20.7024f,2.93215f,11 },//10986 - Snowblind Harpy 
     1089    {295.183f,-299.908f,-34.6123f,0.135851f,12 },//10990 - Alterac Ram 
     1090    {421.08f,-225.006f,-23.73f,0.166754f,12 },//10990 - Alterac Ram 
     1091    {-55.7766f,-192.498f,20.4352f,6.12221f,12 },//10990 - Alterac Ram 
     1092    {527.887f,-477.223f,62.3559f,0.170935f,12 },//10990 - Alterac Ram 
     1093    {389.144f,-346.508f,-30.334f,4.14117f,12 },//10990 - Alterac Ram 
     1094    {108.121f,-322.248f,37.5655f,4.46788f,12 },//10990 - Alterac Ram 
     1095    {507.479f,-67.9403f,10.3571f,3.26304f,12 },//10990 - Alterac Ram 
     1096    {329.071f,-185.016f,-29.1542f,0.356943f,12 },//10990 - Alterac Ram 
     1097    {252.449f,-422.313f,35.1404f,4.53771f,12 },//10990 - Alterac Ram 
     1098    {358.882f,-118.061f,-24.9119f,2.29257f,12 },//10990 - Alterac Ram 
     1099    {487.151f,-174.229f,14.7558f,4.73192f,12 },//10990 - Alterac Ram 
     1100    {449.652f,-123.561f,6.14273f,6.12029f,12 },//10990 - Alterac Ram 
     1101    {272.419f,-261.802f,-41.8835f,3.66559f,12 },//10990 - Alterac Ram 
     1102    {359.021f,-210.954f,-29.3483f,4.31339f,12 },//10990 - Alterac Ram 
     1103    {450.598f,-318.048f,-37.7548f,0.655219f,12 },//10990 - Alterac Ram 
     1104    {509.333f,-218.2f,3.05439f,3.66292f,12 },//10990 - Alterac Ram 
     1105    {485.771f,-223.613f,-1.53f,2.04862f,12 },//10990 - Alterac Ram 
     1106    {486.636f,-452.172f,39.6592f,2.3341f,12 },//10990 - Alterac Ram 
     1107    {702.783f,-257.494f,25.9777f,1.68329f,12 },//10990 - Alterac Ram 
     1108    {460.942f,-199.263f,-6.0149f,0.380506f,12 },//10990 - Alterac Ram 
     1109    {483.108f,-115.307f,10.1056f,3.69701f,12 },//10990 - Alterac Ram 
     1110    {471.601f,-154.174f,14.0702f,5.5807f,12 },//10990 - Alterac Ram 
     1111    {213.938f,-420.793f,41.2549f,5.71394f,12 },//10990 - Alterac Ram 
     1112    {289.387f,-294.685f,-33.9073f,0.555494f,12 },//10990 - Alterac Ram 
     1113    {155.649f,-402.891f,43.3915f,5.94838f,12 },//10990 - Alterac Ram 
     1114    {517.184f,-295.105f,-9.78195f,6.05668f,12 },//10990 - Alterac Ram 
     1115    {102.334f,-332.165f,38.9812f,3.31445f,12 },//10990 - Alterac Ram 
     1116    {320.244f,-107.793f,-42.6357f,-1.00311f,12 },//10990 - Alterac Ram 
     1117    {217.976f,110.774f,15.7603f,4.56793f,13 },//11675 - Snowblind Windcaller 
     1118    {269.872f,6.66684f,20.7592f,0.381212f,13 },//11675 - Snowblind Windcaller 
     1119    {313.528f,-319.041f,-27.2373f,0.554098f,13 },//11675 - Snowblind Windcaller 
     1120    {435.441f,-39.9289f,-0.169651f,0.549454f,13 },//11675 - Snowblind Windcaller 
     1121    {315.115f,-317.62f,-29.1123f,0.90111f,13 },//11675 - Snowblind Windcaller 
     1122    {428.091f,-122.731f,3.40332f,6.05901f,14 },//11678 - Snowblind Ambusher 
     1123    {235.05f,85.5705f,18.3079f,-0.914255f,14 },//11678 - Snowblind Ambusher 
     1124    {-1553.04f,-344.342f,64.4163f,6.09933f,15 },//11839 - Wildpaw Brute 
     1125    {-545.23f,-165.35f,57.7886f,3.01145f,16 },//11947 - Captain Galvangar 
     1126    {722.43f,-10.9982f,50.7046f,3.42085f,17 },//11948 - Vanndar Stormpike 
     1127    {-57.7891f,-286.597f,15.6479f,6.02139f,18 },//11949 - Captain Balinda Stonehearth 
     1128    {930.498f,-520.755f,93.7334f,1.8326f,19 },//11997 - Stormpike Herald 
     1129    {-776.092f,-345.161f,67.4092f,1.89257f,20 },//12051 - Frostwolf Legionnaire 
     1130    {-1224.63f,-308.144f,65.0087f,4.01139f,20 },//12051 - Frostwolf Legionnaire 
     1131    {-713.039f,-442.515f,82.8638f,0.68724f,20 },//12051 - Frostwolf Legionnaire 
     1132    {-711.783f,-444.061f,82.7039f,0.683494f,20 },//12051 - Frostwolf Legionnaire 
     1133    {587.633f,-45.9816f,37.5438f,5.81195f,21 },//12096 - Stormpike Quartermaster 
     1134    {-1293.79f,-194.407f,72.4398f,5.84685f,22 },//12097 - Frostwolf Quartermaster 
     1135    {446.163f,-377.119f,-1.12725f,0.209526f,23 },//12127 - Stormpike Guardsman 
     1136    {549.348f,-399.254f,53.3537f,3.24729f,23 },//12127 - Stormpike Guardsman 
     1137    {549.801f,-401.217f,53.8305f,3.24729f,23 },//12127 - Stormpike Guardsman 
     1138    {192.704f,-406.874f,42.9183f,6.10696f,23 },//12127 - Stormpike Guardsman 
     1139    {441.305f,-435.765f,28.2385f,2.14472f,23 },//12127 - Stormpike Guardsman 
     1140    {192.982f,-404.891f,43.0132f,6.1061f,23 },//12127 - Stormpike Guardsman 
     1141    {355.342f,-391.989f,-0.486707f,3.00643f,23 },//12127 - Stormpike Guardsman 
     1142    {446.035f,-375.104f,-1.12725f,0.21033f,23 },//12127 - Stormpike Guardsman 
     1143    {697.864f,-433.238f,62.7914f,1.65776f,23 },//12127 - Stormpike Guardsman 
     1144    {610.74f,-331.585f,30.8021f,5.14253f,23 },//12127 - Stormpike Guardsman 
     1145    {609.815f,-329.775f,30.9271f,-2.38829f,23 },//12127 - Stormpike Guardsman 
     1146    {695.874f,-433.434f,62.8543f,1.65776f,23 },//12127 - Stormpike Guardsman 
     1147    {443.337f,-435.283f,28.6842f,2.13768f,23 },//12127 - Stormpike Guardsman 
     1148    {-1251.5f,-316.327f,62.6565f,5.02655f,24 },//13176 - Smith Regzar 
     1149    {-1332.0f,-331.243f,91.2631f,1.50098f,25 },//13179 - Wing Commander Guse 
     1150    {569.983f,-94.9992f,38.0325f,1.39626f,26 },//13216 - Gaelden Hammersmith 
     1151    {-1244.92f,-308.916f,63.2525f,1.62316f,27 },//13218 - Grunnda Wolfheart 
     1152    {-1319.56f,-342.675f,60.3404f,1.20428f,28 },//13236 - Primalist Thurloga 
     1153    {647.61f,-61.1548f,41.7405f,4.24115f,29 },//13257 - Murgot Deepforge 
     1154    {-1321.64f,-343.73f,60.4833f,1.01229f,30 },//13284 - Frostwolf Shaman 
     1155    {-1317.61f,-342.853f,60.3726f,2.47837f,30 },//13284 - Frostwolf Shaman 
     1156    {-1319.31f,-344.475f,60.3825f,1.72788f,30 },//13284 - Frostwolf Shaman 
     1157    {569.963f,-42.0218f,37.7581f,4.27606f,31 },//13438 - Wing Commander Slidore 
     1158    {729.2f,-78.812f,51.6335f,3.97935f,32 },//13442 - Arch Druid Renferal 
     1159    {729.118f,-82.8713f,51.6335f,2.53073f,33 },//13443 - Druid of the Grove 
     1160    {725.554f,-79.4973f,51.6335f,5.27089f,33 },//13443 - Druid of the Grove 
     1161    {724.768f,-84.1642f,51.6335f,0.733038f,33 },//13443 - Druid of the Grove 
     1162    {596.68f,-83.0633f,39.0051f,6.24828f,34 },//13447 - Corporal Noreg Stormpike 
     1163    {600.032f,-2.92475f,42.0788f,5.00909f,35 },//13577 - Stormpike Ram Rider Commander 
     1164    {610.239f,-21.8454f,43.272f,4.90438f,36 },//13617 - Stormpike Stable Master 
     1165    {613.422f,-150.764f,33.4517f,5.55015f,37 },//13797 - Mountaineer Boombellow 
     1166    {-1213.91f,-370.619f,56.4455f,0.837758f,38 },//13798 - Jotek 
     1167    {704.35f,-22.9071f,50.2187f,0.785398f,39 },//13816 - Prospector Stonehewer 
     1168    {-1271.24f,-335.766f,62.3971f,5.75959f,40 },//14185 - Najak Hexxen 
     1169    {-1268.64f,-332.688f,62.6171f,5.28835f,41 },//14186 - Ravak Grimtotem 
     1170    {648.363f,-65.2233f,41.7405f,3.12414f,42 },//14187 - Athramanis 
     1171    {648.238f,-67.8931f,41.7405f,2.60054f,43 },//14188 - Dirk Swindle 
     1172    {-1223.44f,-309.833f,64.9331f,4.0131f,44 },//14282 - Frostwolf Bloodhound 
     1173    {-1226.4f,-307.136f,64.9706f,4.0145f,44 },//14282 - Frostwolf Bloodhound 
     1174    {356.001f,-389.969f,-0.438796f,3.0334f,45 },//14283 - Stormpike Owl 
     1175    {355.835f,-394.005f,-0.60149f,3.02498f,45 },//14283 - Stormpike Owl 
     1176    {882.266f,-496.378f,96.7707f,4.83248f,45 },//14283 - Stormpike Owl 
     1177    {878.649f,-495.917f,96.6171f,4.67693f,45 },//14283 - Stormpike Owl 
     1178    {932.851f,-511.017f,93.6748f,3.61004f,45 },//14283 - Stormpike Owl 
     1179    {935.806f,-513.983f,93.7436f,3.61788f,45 },//14283 - Stormpike Owl 
     1180    {947.412f,-509.982f,95.1098f,2.82743f,46 },//14284 - Stormpike Battleguard 
     1181    {934.557f,-512.395f,93.662f,3.61004f,46 },//14284 - Stormpike Battleguard 
     1182    {939.42f,-502.777f,94.5887f,5.14872f,46 },//14284 - Stormpike Battleguard 
     1183    {854.276f,-494.241f,96.8017f,5.44543f,46 },//14284 - Stormpike Battleguard 
     1184    {776.621f,-487.775f,99.4049f,3.50811f,46 },//14284 - Stormpike Battleguard 
     1185    {880.169f,-495.699f,96.6204f,4.8325f,46 },//14284 - Stormpike Battleguard 
     1186    {773.651f,-497.482f,99.0408f,2.11185f,46 },//14284 - Stormpike Battleguard 
     1187    {949.1f,-506.913f,95.4237f,3.31613f,46 },//14284 - Stormpike Battleguard 
     1188    {-1370.9f,-219.793f,98.4258f,5.04381f,47}, //drek thar 
     1189 
     1190}; 
     1191 
     1192const uint32 BG_AV_StaticCreatureInfo[51][4] = { 
     1193    { 2225, 1215, 55, 55 }, //Zora Guthrek 
     1194    { 3343, 1215, 55, 55 }, //Grelkor 
     1195    { 3625, 1215, 55, 55 }, //Rarck 
     1196    { 4255, 1217, 55, 55 }, //Brogus Thunderbrew 
     1197    { 4257, 1217, 55, 55 }, //Lana Thunderbrew 
     1198    { 5134, 1217, 55, 55 }, //Jonivera Farmountain 
     1199    { 5135, 1217, 55, 55 }, //Svalbrad Farmountain 
     1200    { 5139, 1217, 55, 55 }, //Kurdrum Barleybeard 
     1201    { 10364, 1215, 55, 55 }, //Yaelika Farclaw 
     1202    { 10367, 1215, 55, 55 }, //Shrye Ragefist 
     1203    { 10981, 38, 50, 51 }, //Frostwolf 
     1204    { 10986, 514, 52, 53 }, //Snowblind Harpy 
     1205    { 10990, 1274, 50, 51 }, //Alterac Ram 
     1206    { 11675, 514, 53, 53 }, //Snowblind Windcaller 
     1207    { 11678, 14, 52, 53 }, //Snowblind Ambusher 
     1208    { 11839, 39, 56, 56 }, //Wildpaw Brute 
     1209    { 11947, 1214, 61, 61 }, //Captain Galvangar --TODO: doubled 
     1210    { 11948, 1216, 63, 63 }, //Vanndar Stormpike 
     1211    { 11949, 1216, 61, 61 }, //Captain Balinda Stonehearth 
     1212    { 11997, 1334, 60, 60 }, //Stormpike Herald 
     1213    { 12051, 1214, 57, 57 }, //Frostwolf Legionnaire 
     1214    { 12096, 1217, 55, 55 }, //Stormpike Quartermaster 
     1215    { 12097, 1215, 55, 55 }, //Frostwolf Quartermaster 
     1216    { 12127, 1216, 57, 57 }, //Stormpike Guardsman 
     1217    { 13176, 1215, 60, 60 }, //Smith Regzar 
     1218    { 13179, 1215, 59, 59 }, //Wing Commander Guse 
     1219    { 13216, 1217, 58, 58 }, //Gaelden Hammersmith 
     1220    { 13218, 1215, 58, 58 }, //Grunnda Wolfheart 
     1221    { 13236, 1214, 60, 60 }, //Primalist Thurloga 
     1222    { 13257, 1216, 60, 60 }, //Murgot Deepforge 
     1223    { 13284, 1214, 58, 58 }, //Frostwolf Shaman 
     1224    { 13438, 1217, 58, 58 }, //Wing Commander Slidore 
     1225    { 13442, 1216, 60, 60 }, //Arch Druid Renferal 
     1226    { 13443, 1216, 60, 60 }, //Druid of the Grove 
     1227    { 13447, 1216, 58, 58 }, //Corporal Noreg Stormpike 
     1228    { 13577, 1216, 60, 60 }, //Stormpike Ram Rider Commander 
     1229    { 13617, 1216, 60, 60 }, //Stormpike Stable Master 
     1230    { 13797, 32, 60, 61 }, //Mountaineer Boombellow 
     1231    { 13798, 1214, 60, 61 }, //Jotek 
     1232    { 13816, 1216, 61, 61 }, //Prospector Stonehewer 
     1233    { 14185, 877, 59, 59 }, //Najak Hexxen 
     1234    { 14186, 105, 60, 60 }, //Ravak Grimtotem 
     1235    { 14187, 1594, 60, 60 }, //Athramanis 
     1236    { 14188, 57, 59, 59 }, //Dirk Swindle 
     1237    { 14282, 1214, 53, 54 }, //Frostwolf Bloodhound 
     1238    { 14283, 1216, 53, 54 }, //Stormpike Owl 
     1239    { 14284, 1216, 61, 61 }, //Stormpike Battleguard 
     1240    { 11946, 1214, 63, 63 }, //Drek'Thar //TODO: make the levels right (boss=0 maybe) 
     1241    { 11948, 1216, 63, 63 }, //Vanndar Stormpike 
     1242    { 11947, 1214, 61, 61 }, //Captain Galvangar 
     1243    { 11949, 1216, 61, 61 } //Captain Balinda Stonehearth 
     1244}; 
     1245 
     1246enum BG_AV_Graveyards 
     1247{ 
     1248    AV_GRAVE_STORM_AID         = 751, 
     1249    AV_GRAVE_STORM_GRAVE       = 689, 
     1250    AV_GRAVE_STONE_GRAVE       = 729, 
     1251    AV_GRAVE_SNOWFALL          = 169, 
     1252    AV_GRAVE_ICE_GRAVE         = 749, 
     1253    AV_GRAVE_FROSTWOLF         = 690, 
     1254    AV_GRAVE_FROST_HUT         = 750, 
     1255    AV_GRAVE_MAIN_ALLIANCE     = 611, 
     1256    AV_GRAVE_MAIN_HORDE        = 610 
     1257}; 
     1258 
     1259 
     1260 
     1261const uint32 BG_AV_GraveyardIds[9]= { 
     1262  AV_GRAVE_STORM_AID, 
     1263  AV_GRAVE_STORM_GRAVE, 
     1264  AV_GRAVE_STONE_GRAVE, 
     1265  AV_GRAVE_SNOWFALL, 
     1266  AV_GRAVE_ICE_GRAVE, 
     1267  AV_GRAVE_FROSTWOLF, 
     1268  AV_GRAVE_FROST_HUT, 
     1269  AV_GRAVE_MAIN_ALLIANCE, 
     1270  AV_GRAVE_MAIN_HORDE 
     1271}; 
     1272 
     1273enum BG_AV_BUFF 
     1274{ //TODO add all other buffs here 
     1275    AV_BUFF_ARMOR = 21163, 
     1276    AV_BUFF_A_CAPTAIN = 23693, //the buff which the alliance captain does 
     1277    AV_BUFF_H_CAPTAIN = 22751 //the buff which the horde captain does 
     1278}; 
     1279enum BG_AV_States 
     1280{ 
     1281    POINT_NEUTRAL              =  0, 
     1282    POINT_ASSAULTED            =  1, 
     1283    POINT_DESTROYED            =  2, 
     1284    POINT_CONTROLED            =  3 
     1285}; 
     1286 
     1287enum BG_AV_WorldStates 
     1288{ 
     1289    AV_Alliance_Score               = 3127, 
     1290    AV_Horde_Score                  = 3128, 
     1291    AV_SHOW_H_SCORE                 = 3133, 
     1292    AV_SHOW_A_SCORE                 = 3134, 
     1293 
     1294/* 
     1295    //the comments behind the state shows which icon overlaps the other.. but is, until now, unused and maybe not a good solution (but give few performance (: ) 
     1296 
     1297// Graves 
     1298 
     1299    // Alliance 
     1300    //Stormpike first aid station 
     1301    AV_AID_A_C                      = 1325, 
     1302    AV_AID_A_A                      = 1326, 
     1303    AV_AID_H_C                      = 1327, 
     1304    AV_AID_H_A                      = 1328, 
     1305    //Stormpike Graveyard 
     1306    AV_PIKEGRAVE_A_C                = 1333, 
     1307    AV_PIKEGRAVE_A_A                = 1335, 
     1308    AV_PIKEGRAVE_H_C                = 1334, 
     1309    AV_PIKEGRAVE_H_A                = 1336, 
     1310    //Stoneheart Grave 
     1311    AV_STONEHEART_A_C               = 1302, 
     1312    AV_STONEHEART_A_A               = 1304, //over hc 
     1313    AV_STONEHEART_H_C               = 1301, //over ac 
     1314    AV_STONEHEART_H_A               = 1303, //over aa 
     1315    //Neutral 
     1316    //Snowfall Grave 
     1317*/ 
     1318    AV_SNOWFALL_N                   = 1966, //over aa 
     1319/* 
     1320    AV_SNOWFALL_A_C                 = 1341, //over hc 
     1321    AV_SNOWFALL_A_A                 = 1343, //over ha 
     1322    AV_SNOWFALL_H_C                 = 1342, 
     1323    AV_SNOWFALL_H_A                 = 1344, //over ac 
     1324    //Horde 
     1325    //Iceblood grave 
     1326    AV_ICEBLOOD_A_C                 = 1346, //over hc 
     1327    AV_ICEBLOOD_A_A                 = 1348, //over ac 
     1328    AV_ICEBLOOD_H_C                 = 1347, 
     1329    AV_ICEBLOOD_H_A                 = 1349, //over aa 
     1330    //Frostwolf Grave 
     1331    AV_FROSTWOLF_A_C                = 1337, //over hc 
     1332    AV_FROSTWOLF_A_A                = 1339, //over ac 
     1333    AV_FROSTWOLF_H_C                = 1338, 
     1334    AV_FROSTWOLF_H_A                = 1340, //over aa 
     1335    //Frostwolf Hut 
     1336    AV_FROSTWOLFHUT_A_C             = 1329, //over hc 
     1337    AV_FROSTWOLFHUT_A_A             = 1331, //over ha 
     1338    AV_FROSTWOLFHUT_H_C             = 1330, 
     1339    AV_FROSTWOLFHUT_H_A             = 1332, //over ac 
     1340 
     1341 
     1342//Towers 
     1343    //Alliance 
     1344    //Dunbaldar South Bunker 
     1345    AV_DUNS_CONTROLLED              = 1361, 
     1346    AV_DUNS_DESTROYED               = 1370, 
     1347    AV_DUNS_ASSAULTED               = 1378, 
     1348    //Dunbaldar North Bunker 
     1349    AV_DUNN_CONTROLLED              = 1362, 
     1350    AV_DUNN_DESTROYED               = 1371, 
     1351    AV_DUNN_ASSAULTED               = 1379, 
     1352    //Icewing Bunker 
     1353    AV_ICEWING_CONTROLLED           = 1363, 
     1354    AV_ICEWING_DESTROYED            = 1372, 
     1355    AV_ICEWING_ASSAULTED            = 1380, 
     1356    //Stoneheart Bunker 
     1357    AV_STONEH_CONTROLLED            = 1364, 
     1358    AV_STONEH_DESTROYED             = 1373, 
     1359    AV_STONEH_ASSAULTED             = 1381, 
     1360    //Horde 
     1361    //Iceblood Tower 
     1362    AV_ICEBLOOD_CONTROLLED          = 1385, 
     1363    AV_ICEBLOOD_DESTROYED           = 1368, 
     1364    AV_ICEBLOOD_ASSAULTED           = 1390, 
     1365    //Tower Point 
     1366    AV_TOWERPOINT_CONTROLLED        = 1384, 
     1367    AV_TOWERPOINT_DESTROYED         = 1367, //goes over controlled 
     1368    AV_TOWERPOINT_ASSAULTED         = 1389, //goes over destroyed 
     1369    //Frostwolf West 
     1370    AV_FROSTWOLFW_CONTROLLED        = 1382, 
     1371    AV_FROSTWOLFW_DESTROYED         = 1365, //over controlled 
     1372    AV_FROSTWOLFW_ASSAULTED         = 1387, //over destroyed 
     1373    //Frostwolf East 
     1374    AV_FROSTWOLFE_CONTROLLED        = 1383, 
     1375    AV_FROSTWOLFE_DESTROYED         = 1366, 
     1376    AV_FROSTWOLFE_ASSAULTED         = 1388, 
     1377 
     1378//mines 
     1379 
     1380    AV_N_MINE_N              = 1360, 
     1381    AV_N_MINE_A              = 1358, 
     1382    AV_N_MINE_H              = 1359, 
     1383 
     1384    AV_S_MINE_N                     = 1357, 
     1385    AV_S_MINE_A                     = 1355, 
     1386    AV_S_MINE_H                     = 1356, 
     1387 
     1388//towers assaulted by own team (unused) 
     1389    AV_STONEH_UNUSED                = 1377, 
     1390    AV_ICEWING_UNUSED               = 1376, 
     1391    AV_DUNS_UNUSED                  = 1375, 
     1392    AV_DUNN_UNUSED                  = 1374, 
     1393 
     1394    AV_ICEBLOOD_UNUSED              = 1395, 
     1395    AV_TOWERPOINT_UNUSED            = 1394, 
     1396    AV_FROSTWOLFE_UNUSED            = 1393, 
     1397    AV_FROSTWOLFW_UNUSED            = 1392 
     1398*/ 
     1399 
     1400}; 
     1401 
     1402//alliance_control neutral_control horde_control 
     1403const uint32 BG_AV_MineWorldStates[2][3] = { 
     1404    {1358, 1360,1359}, 
     1405    {1355, 1357,1356} 
     1406}; 
     1407 
     1408 
     1409//alliance_control alliance_assault h_control h_assault 
     1410const uint32 BG_AV_NodeWorldStates[16][4] = { 
     1411    //Stormpike first aid station 
     1412    {1325, 1326,1327,1328}, 
     1413    //Stormpike Graveyard 
     1414    {1333,1335,1334,1336}, 
     1415    //Stoneheart Grave 
     1416    {1302,1304,1301,1303}, 
     1417    //Snowfall Grave 
     1418    {1341,1343,1342,1344}, 
     1419    //Iceblood grave 
     1420    {1346,1348,1347,1349}, 
     1421    //Frostwolf Grave 
     1422    {1337,1339,1338,1340}, 
     1423    //Frostwolf Hut 
     1424    {1329,1331,1330,1332}, 
     1425    //Dunbaldar South Bunker 
     1426    {1361,1375,1370,1378}, 
     1427    //Dunbaldar North Bunker 
     1428    {1362,1374,1371,1379}, 
     1429    //Icewing Bunker 
     1430    {1363,1376,1372,1380}, 
     1431    //Stoneheart Bunker 
     1432    {1364,1377,1373,1381}, 
     1433    //Iceblood Tower 
     1434    {1368,1390,1385,1395}, 
     1435    //Tower Point 
     1436    {1367,1389,1384,1394}, 
     1437    //Frostwolf East 
     1438    {1366,1388,1383,1393}, 
     1439    //Frostwolf West 
     1440    {1365,1387,1382,1392}, 
     1441}; 
     1442 
     1443enum BG_AV_QuestIds 
     1444{ 
     1445    AV_QUEST_A_SCRAPS1      = 7223, 
     1446    AV_QUEST_A_SCRAPS2      = 6781, 
     1447    AV_QUEST_H_SCRAPS1      = 7224, 
     1448    AV_QUEST_H_SCRAPS2      = 6741, 
     1449    AV_QUEST_A_COMMANDER1   = 6942, //soldier 
     1450    AV_QUEST_H_COMMANDER1   = 6825, 
     1451    AV_QUEST_A_COMMANDER2   = 6941, //leutnant 
     1452    AV_QUEST_H_COMMANDER2   = 6826, 
     1453    AV_QUEST_A_COMMANDER3   = 6943, //commander 
     1454    AV_QUEST_H_COMMANDER3   = 6827, 
     1455    AV_QUEST_A_BOSS1        = 7386, // 5 cristal/blood 
     1456    AV_QUEST_H_BOSS1        = 7385, 
     1457    AV_QUEST_A_BOSS2        = 6881, // 1 
     1458    AV_QUEST_H_BOSS2        = 6801, 
     1459    AV_QUEST_A_NEAR_MINE    = 5892, //the mine near start location of team 
     1460    AV_QUEST_H_NEAR_MINE    = 5893, 
     1461    AV_QUEST_A_OTHER_MINE   = 6982, //the other mine ;) 
     1462    AV_QUEST_H_OTHER_MINE   = 6985, 
     1463    AV_QUEST_A_RIDER_HIDE   = 7026, 
     1464    AV_QUEST_H_RIDER_HIDE   = 7002, 
     1465    AV_QUEST_A_RIDER_TAME   = 7027, 
     1466    AV_QUEST_H_RIDER_TAME   = 7001 
     1467}; 
     1468 
     1469struct BG_AV_NodeInfo 
     1470{ 
     1471    uint16       TotalOwner; 
     1472    uint16       Owner; 
     1473    uint16       PrevOwner; 
     1474    BG_AV_States State; 
     1475    BG_AV_States PrevState; 
     1476    int          Timer; 
     1477    bool         Tower; 
     1478}; 
     1479 
     1480inline BG_AV_Nodes &operator++(BG_AV_Nodes &i){ return i = BG_AV_Nodes(i + 1); } 
     1481 
    261482class BattleGroundAVScore : public BattleGroundScore 
    271483{ 
     
    521508        void RemovePlayer(Player *plr,uint64 guid); 
    531509        void HandleAreaTrigger(Player *Source, uint32 Trigger); 
    54         //bool SetupBattleGround(); 
    55  
    56         /* Scorekeeping */ 
    57         void UpdatePlayerScore(Player *Source, uint32 type, uint32 value); 
     1510        bool SetupBattleGround(); 
     1511        virtual void ResetBGSubclass(); 
     1512 
     1513        /*general stuff*/ 
     1514        void UpdateScore(uint16 team, int16 points); 
     1515       void UpdatePlayerScore(Player *Source, uint32 type, uint32 value); 
     1516 
     1517        /*handlestuff*/ //these are functions which get called from extern 
     1518        virtual void EventPlayerClickedOnFlag(Player *source, GameObject* target_obj); 
     1519        void HandleKillPlayer(Player* player, Player *killer); 
     1520        void HandleKillUnit(Creature *unit, Player *killer); 
     1521        void HandleQuestComplete(uint32 questid, Player *player); 
     1522        bool PlayerCanDoMineQuest(int32 GOId,uint32 team); 
     1523 
     1524 
     1525        void EndBattleGround(uint32 winner); 
     1526 
     1527        virtual WorldSafeLocsEntry const* GetClosestGraveYard(float x, float y, float z, uint32 team); 
    581528 
    591529    private: 
    60 }; 
     1530        /* Nodes occupying */ 
     1531        void EventPlayerAssaultsPoint(Player* player, uint32 object); 
     1532        void EventPlayerDefendsPoint(Player* player, uint32 object); 
     1533        void EventPlayerDestroyedPoint(BG_AV_Nodes node); 
     1534 
     1535        void AssaultNode(BG_AV_Nodes node,uint16 team); 
     1536        void DestroyNode(BG_AV_Nodes node); 
     1537        void InitNode(BG_AV_Nodes node, uint16 team, bool tower); 
     1538        void DefendNode(BG_AV_Nodes node, uint16 team); 
     1539 
     1540        void PopulateNode(BG_AV_Nodes node); 
     1541        void DePopulateNode(BG_AV_Nodes node); 
     1542 
     1543        const BG_AV_Nodes GetNodeThroughObject(uint32 object); 
     1544        const uint32 GetObjectThroughNode(BG_AV_Nodes node); 
     1545        const char* GetNodeName(BG_AV_Nodes node); 
     1546        const bool IsTower(BG_AV_Nodes node) {   return m_Nodes[node].Tower; } 
     1547 
     1548 
     1549        /*mine*/ 
     1550        void ChangeMineOwner(uint8 mine, uint32 team, bool initial=false); 
     1551 
     1552        /*worldstates*/ 
     1553        void FillInitialWorldStates(WorldPacket& data); 
     1554        const uint8 GetWorldStateType(uint8 state, uint16 team); 
     1555        void SendMineWorldStates(uint32 mine); 
     1556        void UpdateNodeWorldState(BG_AV_Nodes node); 
     1557 
     1558        /*general */ 
     1559        Creature* AddAVCreature(uint16 cinfoid, uint16 type); 
     1560        const uint16 GetBonusHonor(uint8 kills); //TODO remove this when mangos handles this right 
     1561 
     1562        /*variables */ 
     1563        int32 m_Team_Scores[2]; 
     1564        uint32 m_Team_QuestStatus[2][9]; //[x][y] x=team y=questcounter 
     1565 
     1566        BG_AV_NodeInfo m_Nodes[BG_AV_NODES_MAX]; 
     1567 
     1568        uint32 m_Mine_Owner[2]; 
     1569        uint32 m_Mine_PrevOwner[2]; //only for worldstates needed 
     1570        int32 m_Mine_Timer; //ticks for both teams 
     1571        uint32 m_Mine_Reclaim_Timer[2]; 
     1572        uint32 m_CaptainBuffTimer[2]; 
     1573        bool m_CaptainAlive[2]; 
     1574 
     1575        uint8 m_MaxLevel; //TODO remove this when battleground-getmaxlevel() returns something usefull 
     1576        bool m_IsInformedNearVictory[2]; 
     1577 
     1578 
     1579}; 
     1580 
    611581#endif 
  • trunk/src/game/Creature.cpp

    r279 r283  
    148148    i_AI = NULL; 
    149149 
    150     if (i_AI_possessed) 
    151     { 
    152         delete i_AI_possessed; 
    153         i_AI_possessed = NULL; 
    154     } 
     150    DeletePossessedAI(); 
    155151} 
    156152 
     
    567563} 
    568564 
    569 void Creature::DisablePossessedAI() 
     565void Creature::DeletePossessedAI() 
    570566{ 
    571567    if (!i_AI_possessed) return; 
     568 
     569    delete i_AI_possessed; 
     570    i_AI_possessed = NULL; 
    572571 
    573572    // Signal the old AI that it's been re-enabled 
     
    579578    SetMapId(map->GetId()); 
    580579    SetInstanceId(map->GetInstanceId()); 
     580    m_DBTableGuid = guidlow; 
    581581 
    582582    //oX = x;     oY = y;    dX = x;    dY = y;    m_moveTime = 0;    m_startMove = 0; 
     
    605605        LoadCreaturesAddon(); 
    606606    } 
    607  
    608607    return bResult; 
    609608} 
  • trunk/src/game/Creature.h

    r279 r283  
    461461        bool AIM_Initialize(); 
    462462        void InitPossessedAI(); 
    463         void DisablePossessedAI(); 
     463        void DeletePossessedAI(); 
    464464 
    465465        void AI_SendMoveToPacket(float x, float y, float z, uint32 time, uint32 MovementFlags, uint8 type); 
     
    612612 
    613613        uint32 GetGlobalCooldown() const { return m_GlobalCooldown; } 
    614  
    615614    protected: 
    616615        bool CreateFromProto(uint32 guidlow,uint32 Entry,uint32 team, const CreatureData *data = NULL); 
     
    661660        float CombatStartY; 
    662661        float CombatStartZ; 
     662 
    663663    private: 
    664664        GridReference<Creature> m_gridRef; 
  • trunk/src/game/GameObject.cpp

    r279 r283  
    3838#include "InstanceData.h" 
    3939#include "BattleGround.h" 
     40#include "Util.h" 
    4041#include "OutdoorPvPMgr.h" 
    41 #include "Util.h" 
     42#include "BattleGroundAV.h" 
    4243 
    4344GameObject::GameObject() : WorldObject() 
     
    755756        { 
    756757            if(LootTemplates_Gameobject.HaveQuestLootForPlayer(GetLootId(), pTarget)) 
     758            { 
     759                //TODO: fix this hack 
     760                //look for battlegroundAV for some objects which are only activated after mine gots captured by own team 
     761                if(GetEntry() == BG_AV_OBJECTID_MINE_N || GetEntry() == BG_AV_OBJECTID_MINE_S) 
     762                    if(BattleGround *bg = pTarget->GetBattleGround()) 
     763                        if(bg->GetTypeID() == BATTLEGROUND_AV && !(((BattleGroundAV*)bg)->PlayerCanDoMineQuest(GetEntry(),pTarget->GetTeam()))) 
     764                            return false; 
    757765                return true; 
     766            } 
    758767            break; 
    759768        } 
  • trunk/src/game/Language.h

    r230 r283  
    645645    LANG_YOUR_BG_LEVEL_REQ_ERROR        = 715, 
    646646    LANG_YOUR_ARENA_TEAM_FULL           = 716, 
    647     // Room for BG/ARENA                  717-799 not used 
     647 
     648    LANG_BG_AV_ALLY                     = 717, 
     649    LANG_BG_AV_HORDE                    = 718, 
     650    LANG_BG_AV_TOWER_TAKEN              = 719, 
     651    LANG_BG_AV_TOWER_ASSAULTED          = 720, 
     652    LANG_BG_AV_TOWER_DEFENDED           = 721, 
     653    LANG_BG_AV_GRAVE_TAKEN              = 722, 
     654    LANG_BG_AV_GRAVE_DEFENDED           = 723, 
     655    LANG_BG_AV_GRAVE_ASSAULTED          = 724, 
     656 
     657    LANG_BG_AV_MINE_TAKEN               = 725, 
     658    LANG_BG_AV_MINE_NORTH               = 726, 
     659    LANG_BG_AV_MINE_SOUTH               = 727, 
     660 
     661    LANG_BG_AV_NODE_GRAVE_STORM_AID     = 728, 
     662    LANG_BG_AV_NODE_TOWER_DUN_S         = 729, 
     663    LANG_BG_AV_NODE_TOWER_DUN_N         = 730, 
     664    LANG_BG_AV_NODE_GRAVE_STORMPIKE     = 731, 
     665    LANG_BG_AV_NODE_TOWER_ICEWING       = 732, 
     666    LANG_BG_AV_NODE_GRAVE_STONE         = 733, 
     667    LANG_BG_AV_NODE_TOWER_STONE         = 734, 
     668    LANG_BG_AV_NODE_GRAVE_SNOW          = 735, 
     669    LANG_BG_AV_NODE_TOWER_ICE           = 736, 
     670    LANG_BG_AV_NODE_GRAVE_ICE           = 737, 
     671    LANG_BG_AV_NODE_TOWER_POINT         = 738, 
     672    LANG_BG_AV_NODE_GRAVE_FROST         = 739, 
     673    LANG_BG_AV_NODE_TOWER_FROST_E       = 740, 
     674    LANG_BG_AV_NODE_TOWER_FROST_W       = 741, 
     675    LANG_BG_AV_NODE_GRAVE_FROST_HUT     = 742, 
     676 
     677    LANG_BG_AV_ONEMINTOSTART            = 743, 
     678    LANG_BG_AV_HALFMINTOSTART           = 744, 
     679    LANG_BG_AV_STARTED                  = 745, 
     680    LANG_BG_AV_A_NEAR_LOSE              = 746, 
     681    LANG_BG_AV_H_NEAR_LOSE              = 747, 
     682    LANG_BG_AV_H_CAPTAIN_DEAD           = 748, 
     683    LANG_BG_AV_A_CAPTAIN_DEAD           = 749, 
     684 
     685    // Room for BG/ARENA                  750-799 not used 
    648686 
    649687    LANG_ARENA_YOUR_TEAM_ONLY           = 730, 
  • trunk/src/game/LootHandler.cpp

    r102 r283  
    7070 
    7171        loot = &pItem->loot; 
     72    } 
     73    else if (IS_CORPSE_GUID(lguid)) 
     74    { 
     75        Corpse *bones = ObjectAccessor::GetCorpse(*player, lguid); 
     76        if (!bones) 
     77        { 
     78            player->SendLootRelease(lguid); 
     79            return; 
     80        } 
     81        loot = &bones->loot; 
    7282    } 
    7383    else 
  • trunk/src/game/PetHandler.cpp

    r277 r283  
    9898                case COMMAND_ATTACK:                        //spellid=1792  //ATTACK 
    9999                { 
    100                     // Can't attack if owner is pacified 
    101                     if (_player->HasAuraType(SPELL_AURA_MOD_PACIFY)) 
    102                     { 
    103                         //pet->SendPetCastFail(spellid, SPELL_FAILED_PACIFIED); 
    104                         //TODO: Send proper error message to client 
    105                         return; 
    106                     } 
    107100                    // only place where pet can be player 
    108101                    pet->clearUnitState(UNIT_STAT_FOLLOW); 
  • trunk/src/game/Player.cpp

    r279 r283  
    5555#include "Weather.h" 
    5656#include "BattleGround.h" 
     57#include "BattleGroundAV.h" 
    5758#include "BattleGroundMgr.h" 
    5859#include "OutdoorPvP.h" 
     
    41614162    BattleGround *bg = sBattleGroundMgr.GetBattleGround(GetBattleGroundId()); 
    41624163 
    4163     if(bg && (bg->GetTypeID() == BATTLEGROUND_AB || bg->GetTypeID() == BATTLEGROUND_EY)) 
     4164    if(bg && (bg->GetTypeID() == BATTLEGROUND_AB || bg->GetTypeID() == BATTLEGROUND_EY || bg->GetTypeID() == BATTLEGROUND_AV)) 
    41644165        ClosestGrave = bg->GetClosestGraveYard(GetPositionX(), GetPositionY(), GetPositionZ(), GetTeam()); 
    41654166    else 
     
    72167217            uint32 lootid =  go->GetLootId(); 
    72177218 
     7219            //TODO: fix this big hack 
     7220            if((go->GetEntry() == BG_AV_OBJECTID_MINE_N || go->GetEntry() == BG_AV_OBJECTID_MINE_S)) 
     7221                if( BattleGround *bg = GetBattleGround()) 
     7222                    if(bg->GetTypeID() == BATTLEGROUND_AV) 
     7223                        if(!(((BattleGroundAV*)bg)->PlayerCanDoMineQuest(go->GetEntry(),GetTeam()))) 
     7224                        { 
     7225                            SendLootRelease(guid); 
     7226                            return; 
     7227                        } 
     7228 
    72187229            if(lootid) 
    72197230            { 
     
    72927303            uint32 pLevel = bones->loot.gold; 
    72937304            bones->loot.clear(); 
     7305            if(GetBattleGround()->GetTypeID() == BATTLEGROUND_AV) 
     7306                loot->FillLoot(1, LootTemplates_Creature, this); 
    72947307            // It may need a better formula 
    72957308            // Now it works like this: lvl10: ~6copper, lvl70: ~9silver 
     
    76657678            break; 
    76667679        case 2597:                                          // AV 
    7667             data << uint32(0x7ae) << uint32(0x1);           // 7 
    7668             data << uint32(0x532) << uint32(0x1);           // 8 
    7669             data << uint32(0x531) << uint32(0x0);           // 9 
    7670             data << uint32(0x52e) << uint32(0x0);           // 10 
    7671             data << uint32(0x571) << uint32(0x0);           // 11 
    7672             data << uint32(0x570) << uint32(0x0);           // 12 
    7673             data << uint32(0x567) << uint32(0x1);           // 13 
    7674             data << uint32(0x566) << uint32(0x1);           // 14 
    7675             data << uint32(0x550) << uint32(0x1);           // 15 
    7676             data << uint32(0x544) << uint32(0x0);           // 16 
    7677             data << uint32(0x536) << uint32(0x0);           // 17 
    7678             data << uint32(0x535) << uint32(0x1);           // 18 
    7679             data << uint32(0x518) << uint32(0x0);           // 19 
    7680             data << uint32(0x517) << uint32(0x0);           // 20 
    7681             data << uint32(0x574) << uint32(0x0);           // 21 
    7682             data << uint32(0x573) << uint32(0x0);           // 22 
    7683             data << uint32(0x572) << uint32(0x0);           // 23 
    7684             data << uint32(0x56f) << uint32(0x0);           // 24 
    7685             data << uint32(0x56e) << uint32(0x0);           // 25 
    7686             data << uint32(0x56d) << uint32(0x0);           // 26 
    7687             data << uint32(0x56c) << uint32(0x0);           // 27 
    7688             data << uint32(0x56b) << uint32(0x0);           // 28 
    7689             data << uint32(0x56a) << uint32(0x1);           // 29 
    7690             data << uint32(0x569) << uint32(0x1);           // 30 
    7691             data << uint32(0x568) << uint32(0x1);           // 13 
    7692             data << uint32(0x565) << uint32(0x0);           // 32 
    7693             data << uint32(0x564) << uint32(0x0);           // 33 
    7694             data << uint32(0x563) << uint32(0x0);           // 34 
    7695             data << uint32(0x562) << uint32(0x0);           // 35 
    7696             data << uint32(0x561) << uint32(0x0);           // 36 
    7697             data << uint32(0x560) << uint32(0x0);           // 37 
    7698             data << uint32(0x55f) << uint32(0x0);           // 38 
    7699             data << uint32(0x55e) << uint32(0x0);           // 39 
    7700             data << uint32(0x55d) << uint32(0x0);           // 40 
    7701             data << uint32(0x3c6) << uint32(0x4);           // 41 
    7702             data << uint32(0x3c4) << uint32(0x6);           // 42 
    7703             data << uint32(0x3c2) << uint32(0x4);           // 43 
    7704             data << uint32(0x516) << uint32(0x1);           // 44 
    7705             data << uint32(0x515) << uint32(0x0);           // 45 
    7706             data << uint32(0x3b6) << uint32(0x6);           // 46 
    7707             data << uint32(0x55c) << uint32(0x0);           // 47 
    7708             data << uint32(0x55b) << uint32(0x0);           // 48 
    7709             data << uint32(0x55a) << uint32(0x0);           // 49 
    7710             data << uint32(0x559) << uint32(0x0);           // 50 
    7711             data << uint32(0x558) << uint32(0x0);           // 51 
    7712             data << uint32(0x557) << uint32(0x0);           // 52 
    7713             data << uint32(0x556) << uint32(0x0);           // 53 
    7714             data << uint32(0x555) << uint32(0x0);           // 54 
    7715             data << uint32(0x554) << uint32(0x1);           // 55 
    7716             data << uint32(0x553) << uint32(0x1);           // 56 
    7717             data << uint32(0x552) << uint32(0x1);           // 57 
    7718             data << uint32(0x551) << uint32(0x1);           // 58 
    7719             data << uint32(0x54f) << uint32(0x0);           // 59 
    7720             data << uint32(0x54e) << uint32(0x0);           // 60 
    7721             data << uint32(0x54d) << uint32(0x1);           // 61 
    7722             data << uint32(0x54c) << uint32(0x0);           // 62 
    7723             data << uint32(0x54b) << uint32(0x0);           // 63 
    7724             data << uint32(0x545) << uint32(0x0);           // 64 
    7725             data << uint32(0x543) << uint32(0x1);           // 65 
    7726             data << uint32(0x542) << uint32(0x0);           // 66 
    7727             data << uint32(0x540) << uint32(0x0);           // 67 
    7728             data << uint32(0x53f) << uint32(0x0);           // 68 
    7729             data << uint32(0x53e) << uint32(0x0);           // 69 
    7730             data << uint32(0x53d) << uint32(0x0);           // 70 
    7731             data << uint32(0x53c) << uint32(0x0);           // 71 
    7732             data << uint32(0x53b) << uint32(0x0);           // 72 
    7733             data << uint32(0x53a) << uint32(0x1);           // 73 
    7734             data << uint32(0x539) << uint32(0x0);           // 74 
    7735             data << uint32(0x538) << uint32(0x0);           // 75 
    7736             data << uint32(0x537) << uint32(0x0);           // 76 
    7737             data << uint32(0x534) << uint32(0x0);           // 77 
    7738             data << uint32(0x533) << uint32(0x0);           // 78 
    7739             data << uint32(0x530) << uint32(0x0);           // 79 
    7740             data << uint32(0x52f) << uint32(0x0);           // 80 
    7741             data << uint32(0x52d) << uint32(0x1);           // 81 
     7680            if (bg && bg->GetTypeID() == BATTLEGROUND_AV) 
     7681                bg->FillInitialWorldStates(data); 
     7682            else 
     7683            { 
     7684                data << uint32(0x7ae) << uint32(0x1);           // 7 snowfall n 
     7685                data << uint32(0x532) << uint32(0x1);           // 8 frostwolfhut hc 
     7686                data << uint32(0x531) << uint32(0x0);           // 9 frostwolfhut ac 
     7687                data << uint32(0x52e) << uint32(0x0);           // 10 stormpike firstaid a_a 
     7688                data << uint32(0x571) << uint32(0x0);           // 11 east frostwolf tower horde assaulted -unused 
     7689                data << uint32(0x570) << uint32(0x0);           // 12 west frostwolf tower horde assaulted - unused 
     7690                data << uint32(0x567) << uint32(0x1);           // 13 frostwolfe c 
     7691                data << uint32(0x566) << uint32(0x1);           // 14 frostwolfw c 
     7692                data << uint32(0x550) << uint32(0x1);           // 15 irondeep (N) ally 
     7693                data << uint32(0x544) << uint32(0x0);           // 16 ice grave a_a 
     7694                data << uint32(0x536) << uint32(0x0);           // 17 stormpike grave h_c 
     7695                data << uint32(0x535) << uint32(0x1);           // 18 stormpike grave a_c 
     7696                data << uint32(0x518) << uint32(0x0);           // 19 stoneheart grave a_a 
     7697                data << uint32(0x517) << uint32(0x0);           // 20 stoneheart grave h_a 
     7698                data << uint32(0x574) << uint32(0x0);           // 21 1396 unk 
     7699                data << uint32(0x573) << uint32(0x0);           // 22 iceblood tower horde assaulted -unused 
     7700                data << uint32(0x572) << uint32(0x0);           // 23 towerpoint horde assaulted - unused 
     7701                data << uint32(0x56f) << uint32(0x0);           // 24 1391 unk 
     7702                data << uint32(0x56e) << uint32(0x0);           // 25 iceblood a 
     7703                data << uint32(0x56d) << uint32(0x0);           // 26 towerp a 
     7704                data << uint32(0x56c) << uint32(0x0);           // 27 frostwolfe a 
     7705                data << uint32(0x56b) << uint32(0x0);           // 28 froswolfw a 
     7706                data << uint32(0x56a) << uint32(0x1);           // 29 1386 unk 
     7707                data << uint32(0x569) << uint32(0x1);           // 30 iceblood c 
     7708                data << uint32(0x568) << uint32(0x1);           // 31 towerp c 
     7709                data << uint32(0x565) << uint32(0x0);           // 32 stoneh tower a 
     7710                data << uint32(0x564) << uint32(0x0);           // 33 icewing tower a 
     7711                data << uint32(0x563) << uint32(0x0);           // 34 dunn a 
     7712                data << uint32(0x562) << uint32(0x0);           // 35 duns a 
     7713                data << uint32(0x561) << uint32(0x0);           // 36 stoneheart bunker alliance assaulted - unused 
     7714                data << uint32(0x560) << uint32(0x0);           // 37 icewing bunker alliance assaulted - unused 
     7715                data << uint32(0x55f) << uint32(0x0);           // 38 dunbaldar south alliance assaulted - unused 
     7716                data << uint32(0x55e) << uint32(0x0);           // 39 dunbaldar north alliance assaulted - unused 
     7717                data << uint32(0x55d) << uint32(0x0);           // 40 stone tower d 
     7718                data << uint32(0x3c6) << uint32(0x0);           // 41 966 unk 
     7719                data << uint32(0x3c4) << uint32(0x0);           // 42 964 unk 
     7720                data << uint32(0x3c2) << uint32(0x0);           // 43 962 unk 
     7721                data << uint32(0x516) << uint32(0x1);           // 44 stoneheart grave a_c 
     7722                data << uint32(0x515) << uint32(0x0);           // 45 stonheart grave h_c 
     7723                data << uint32(0x3b6) << uint32(0x0);           // 46 950 unk 
     7724                data << uint32(0x55c) << uint32(0x0);           // 47 icewing tower d 
     7725                data << uint32(0x55b) << uint32(0x0);           // 48 dunn d 
     7726                data << uint32(0x55a) << uint32(0x0);           // 49 duns d 
     7727                data << uint32(0x559) << uint32(0x0);           // 50 1369 unk 
     7728                data << uint32(0x558) << uint32(0x0);           // 51 iceblood d 
     7729                data << uint32(0x557) << uint32(0x0);           // 52 towerp d 
     7730                data << uint32(0x556) << uint32(0x0);           // 53 frostwolfe d 
     7731                data << uint32(0x555) << uint32(0x0);           // 54 frostwolfw d 
     7732                data << uint32(0x554) << uint32(0x1);           // 55 stoneh tower c 
     7733                data << uint32(0x553) << uint32(0x1);           // 56 icewing tower c 
     7734                data << uint32(0x552) << uint32(0x1);           // 57 dunn c 
     7735                data << uint32(0x551) << uint32(0x1);           // 58 duns c 
     7736                data << uint32(0x54f) << uint32(0x0);           // 59 irondeep (N) horde 
     7737                data << uint32(0x54e) << uint32(0x0);           // 60 irondeep (N) ally 
     7738                data << uint32(0x54d) << uint32(0x1);           // 61 mine (S) neutral 
     7739                data << uint32(0x54c) << uint32(0x0);           // 62 mine (S) horde 
     7740                data << uint32(0x54b) << uint32(0x0);           // 63 mine (S) ally 
     7741                data << uint32(0x545) << uint32(0x0);           // 64 iceblood h_a 
     7742                data << uint32(0x543) << uint32(0x1);           // 65 iceblod h_c 
     7743                data << uint32(0x542) << uint32(0x0);           // 66 iceblood a_c 
     7744                data << uint32(0x540) << uint32(0x0);           // 67 snowfall h_a 
     7745                data << uint32(0x53f) << uint32(0x0);           // 68 snowfall a_a 
     7746                data << uint32(0x53e) << uint32(0x0);           // 69 snowfall h_c 
     7747                data << uint32(0x53d) << uint32(0x0);           // 70 snowfall a_c 
     7748                data << uint32(0x53c) << uint32(0x0);           // 71 frostwolf g h_a 
     7749                data << uint32(0x53b) << uint32(0x0);           // 72 frostwolf g a_a 
     7750                data << uint32(0x53a) << uint32(0x1);           // 73 frostwolf g h_c 
     7751                data << uint32(0x539) << uint32(0x0);           // 74 frostwolf g a_c 
     7752                data << uint32(0x538) << uint32(0x0);           // 75 stormpike grave h_a 
     7753                data << uint32(0x537) << uint32(0x0);           // 76 stormpike grave a_a 
     7754                data << uint32(0x534) << uint32(0x0);           // 77 frostwolf hut h_a 
     7755                data << uint32(0x533) << uint32(0x0);           // 78 frostwolf hut a_a 
     7756                data << uint32(0x530) << uint32(0x0);           // 79 stormpike first aid h_a 
     7757                data << uint32(0x52f) << uint32(0x0);           // 80 stormpike first aid h_c 
     7758                data << uint32(0x52d) << uint32(0x1);           // 81 stormpike first aid a_c 
     7759            } 
    77427760            break; 
    77437761        case 3277:                                          // WS 
     
    1335113369            // hide quest if player is in raid-group and quest is no raid quest 
    1335213370            if(GetGroup() && GetGroup()->isRaidGroup() && qinfo->GetType() != QUEST_TYPE_RAID) 
    13353                 continue; 
     13371                if(!InBattleGround()) //there are two ways.. we can make every bg-quest a raidquest, or add this code here.. i don't know if this can be exploited by other quests, but i think all other quests depend on a specific area.. but keep this in mind, if something strange happens later 
     13372                    continue; 
    1335413373 
    1335513374            // There should be no mixed ReqItem/ReqSource drop 
     
    1804618065} 
    1804718066 
     18067//TODO make this more generic - current implementation is wrong 
    1804818068uint32 Player::GetBattleGroundQueueIdFromLevel() const 
    1804918069{ 
     
    1893718957                target->AddThreat(this, 1000000.0f); 
    1893818958        } 
    18939         // Disable the assigned possessed AI 
    18940         ((Creature*)target)->DisablePossessedAI(); 
     18959        // Delete the assigned possessed AI 
     18960        ((Creature*)target)->DeletePossessedAI(); 
    1894118961    } 
    1894218962} 
  • trunk/src/game/PossessedAI.cpp

    r277 r283  
    2525void PossessedAI::AttackStart(Unit *u) 
    2626{ 
    27     if( !u || i_pet.GetCharmer()->HasAuraType(SPELL_AURA_MOD_PACIFY)) 
     27    if( !u ) 
    2828        return; 
    2929 
     
    9696            return; 
    9797        } 
    98         else if(i_pet.IsWithinCombatDist(i_pet.getVictim(), ATTACK_DISTANCE) && i_pet.isAttackReady() && !i_pet.GetCharmer()->HasAuraType(SPELL_AURA_MOD_PACIFY)) 
     98        else if(i_pet.IsWithinCombatDist(i_pet.getVictim(), ATTACK_DISTANCE) && i_pet.isAttackReady()) 
    9999        { 
    100100            i_pet.AttackerStateUpdate(i_pet.getVictim()); 
  • trunk/src/game/QuestHandler.cpp

    r207 r283  
    3232#include "ScriptCalls.h" 
    3333#include "Group.h" 
     34#include "BattleGround.h" 
     35#include "BattleGroundAV.h" 
    3436 
    3537void WorldSession::HandleQuestgiverStatusQueryOpcode( WorldPacket & recv_data ) 
     
    402404    if( pQuest ) 
    403405    { 
     406        // TODO: need a virtual function 
     407        if(GetPlayer()->InBattleGround()) 
     408            if(BattleGround* bg = GetPlayer()->GetBattleGround()) 
     409                if(bg->GetTypeID() == BATTLEGROUND_AV) 
     410                    ((BattleGroundAV*)bg)->HandleQuestComplete(quest, GetPlayer()); 
     411 
    404412        if( _player->GetQuestStatus( quest ) != QUEST_STATUS_COMPLETE ) 
    405413        { 
  • trunk/src/game/SharedDefines.h

    r279 r283  
    20702070    SUMMON_TYPE_CRITTER3    = 307, 
    20712071    SUMMON_TYPE_UNKNOWN5    = 409, 
    2072     SUMMON_TYPE_POSESSED3   = 427, 
     2072    SUMMON_TYPE_UNKNOWN2    = 427, 
    20732073    SUMMON_TYPE_POSESSED2   = 428 
    20742074}; 
  • trunk/src/game/Spell.cpp

    r279 r283  
    15341534        case TARGET_SCRIPT: 
    15351535        case TARGET_SCRIPT_COORDINATES: 
    1536         case TARGET_UNIT_AREA_SCRIPT: 
    15371536        { 
    15381537            SpellScriptTarget::const_iterator lower = spellmgr.GetBeginSpellScriptTarget(m_spellInfo->Id); 
     
    38673866                    case SUMMON_TYPE_POSESSED: 
    38683867                    case SUMMON_TYPE_POSESSED2: 
    3869                     case SUMMON_TYPE_POSESSED3: 
    38703868                    case SUMMON_TYPE_DEMON: 
    38713869                    case SUMMON_TYPE_SUMMON: 
  • trunk/src/game/SpellAuras.cpp

    r279 r283  
    5050#include "GridNotifiersImpl.h" 
    5151#include "CellImpl.h" 
     52#include "TemporarySummon.h" 
    5253 
    5354#define NULL_AURA_SLOT 0xFF 
     
    20242025            return; 
    20252026        } 
     2027 
     2028        // Eye of Kilrogg, unsummon eye when aura is gone 
     2029        if(GetId() == 126 && caster->GetTypeId() == TYPEID_PLAYER && caster->GetCharm()) 
     2030        { 
     2031            ((TemporarySummon*)caster->GetCharm())->UnSummon(); 
     2032            return; 
     2033        } 
    20262034    } 
    20272035 
  • trunk/src/game/SpellEffects.cpp

    r279 r283  
    28872887            { 
    28882888                // check if it's correct bg 
    2889                 if(bg && bg->GetTypeID() == BATTLEGROUND_AB) 
     2889                if(bg->GetTypeID() == BATTLEGROUND_AB || bg->GetTypeID() == BATTLEGROUND_AV) 
    28902890                    bg->EventPlayerClickedOnFlag(player, gameObjTarget); 
    28912891                return; 
     
    31513151        case SUMMON_TYPE_POSESSED: 
    31523152        case SUMMON_TYPE_POSESSED2: 
    3153         case SUMMON_TYPE_POSESSED3: 
    31543153            EffectSummonPossessed(i); 
    31553154            break; 
     
    31763175            break; 
    31773176        case SUMMON_TYPE_UNKNOWN1: 
     3177        case SUMMON_TYPE_UNKNOWN2: 
    31783178        case SUMMON_TYPE_UNKNOWN3: 
    31793179        case SUMMON_TYPE_UNKNOWN4: 
  • trunk/src/game/SpellHandler.cpp

    r279 r283  
    3434#include "ScriptCalls.h" 
    3535#include "Totem.h" 
    36 #include "TemporarySummon.h" 
    3736 
    3837void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket) 
     
    378377                return; 
    379378            } 
    380             else if (spellInfo->Effect[i] == SPELL_EFFECT_SUMMON &&  
    381                 (spellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED ||  
    382                  spellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED2 ||  
    383                  spellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED3)) 
    384             { 
    385                 // Possession is removed in the UnSummon function 
    386                 ((TemporarySummon*)_player->GetCharm())->UnSummon(); 
    387             } 
    388379        } 
    389380    } 
  • trunk/src/game/Unit.cpp

    r279 r283  
    4747#include "CellImpl.h" 
    4848#include "Path.h" 
    49 #include "TemporarySummon.h" 
    5049 
    5150#include <math.h> 
     
    831830 
    832831        // battleground things (do this at the end, so the death state flag will be properly set to handle in the bg->handlekill) 
    833         if(pVictim->GetTypeId() == TYPEID_PLAYER && (((Player*)pVictim)->InBattleGround())) 
    834         { 
    835             Player *killed = ((Player*)pVictim); 
    836             Player *killer = NULL; 
    837             if(GetTypeId() == TYPEID_PLAYER) 
    838                 killer = ((Player*)this); 
    839             else if(GetTypeId() == TYPEID_UNIT && ((Creature*)this)->isPet()) 
    840             { 
    841                 Unit *owner = GetOwner(); 
    842                 if(owner && owner->GetTypeId() == TYPEID_PLAYER) 
    843                     killer = ((Player*)owner); 
    844             } 
    845  
    846             if(killer) 
    847                 if(BattleGround *bg = killed->GetBattleGround()) 
    848                     bg->HandleKillPlayer(killed, killer);   // drop flags and etc 
     832        if(player && player->InBattleGround()) 
     833        { 
     834            if(BattleGround *bg = player->GetBattleGround()) 
     835            { 
     836                if(pVictim->GetTypeId() == TYPEID_PLAYER) 
     837                    bg->HandleKillPlayer((Player*)pVictim, player); 
     838                else 
     839                    bg->HandleKillUnit((Creature*)pVictim, player); 
     840            } 
    849841        } 
    850842    } 
     
    34203412    if (m_currentSpells[CURRENT_CHANNELED_SPELL] && (!spell_id || m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->Id==spell_id)) 
    34213413    { 
    3422         // Unsummon any summoned as possessed creatures on channel interrupt 
    3423         SpellEntry const *spellInfo = m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo; 
    3424         for (int i = 0; i < 3; i++) 
    3425         { 
    3426             if (spellInfo->Effect[i] == SPELL_EFFECT_SUMMON &&  
    3427                 (spellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED ||  
    3428                  spellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED2 ||  
    3429                  spellInfo->EffectMiscValueB[i] == SUMMON_TYPE_POSESSED3)) 
    3430             { 
    3431                 // Possession is removed in the UnSummon function 
    3432                 if (GetCharm()) 
    3433                     ((TemporarySummon*)GetCharm())->UnSummon();  
    3434             } 
    3435         } 
    3436  
    34373414        if (m_currentSpells[CURRENT_CHANNELED_SPELL]->getState() != SPELL_STATE_FINISHED) 
    34383415            m_currentSpells[CURRENT_CHANNELED_SPELL]->cancel(); 
     
    98149791 
    98159792CharmInfo::CharmInfo(Unit* unit) 
    9816 : m_unit(unit), m_CommandState(COMMAND_FOLLOW), m_reactState(REACT_PASSIVE), m_petnumber(0), m_barInit(false) 
     9793: m_unit(unit), m_CommandState(COMMAND_FOLLOW), m_reactState(REACT_PASSIVE), m_petnumber(0) 
    98179794{ 
    98189795    for(int i =0; i<4; ++i) 
     
    98259802void CharmInfo::InitPetActionBar() 
    98269803{ 
    9827     if (m_barInit) 
    9828         return; 
    9829  
    98309804    // the first 3 SpellOrActions are attack, follow and stay 
    98319805    for(uint32 i = 0; i < 3; i++) 
     
    98429816        PetActionBar[i + 3].SpellOrAction = 0; 
    98439817    } 
    9844     m_barInit = true; 
    9845 } 
    9846  
    9847 void CharmInfo::InitEmptyActionBar(bool withAttack) 
    9848 { 
    9849     if (m_barInit) 
    9850         return; 
    9851  
    9852     for(uint32 x = 0; x < 10; ++x) 
     9818} 
     9819 
     9820void CharmInfo::InitEmptyActionBar() 
     9821{ 
     9822    for(uint32 x = 1; x < 10; ++x) 
    98539823    { 
    98549824        PetActionBar[x].Type = ACT_CAST; 
    98559825        PetActionBar[x].SpellOrAction = 0; 
    98569826    } 
    9857     if (withAttack) 
    9858     { 
    9859         PetActionBar[0].Type = ACT_COMMAND; 
    9860         PetActionBar[0].SpellOrAction = COMMAND_ATTACK; 
    9861     } 
    9862     m_barInit = true; 
     9827    PetActionBar[0].Type = ACT_COMMAND; 
     9828    PetActionBar[0].SpellOrAction = COMMAND_ATTACK; 
    98639829} 
    98649830 
  • trunk/src/game/Unit.h

    r279 r283  
    641641typedef std::list<Player*> SharedVisionList; 
    642642 
    643 struct TRINITY_DLL_SPEC CharmInfo 
     643struct CharmInfo 
    644644{ 
    645645    public: 
     
    658658        void InitCharmCreateSpells(); 
    659659        void InitPetActionBar(); 
    660         void InitEmptyActionBar(bool withAttack = true); 
     660        void InitEmptyActionBar(); 
    661661                                                            //return true if successful 
    662662        bool AddSpellToAB(uint32 oldid, uint32 newid, ActiveStates newstate = ACT_DECIDE); 
     
    672672        ReactStates     m_reactState; 
    673673        uint32          m_petnumber; 
    674         bool            m_barInit; 
    675674}; 
    676675