Changeset 283
- Timestamp:
- 11/22/08 01:55:16 (17 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 21 modified
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/bindings/scripts/scripts/npc/npcs_special.cpp
r282 r283 826 826 } 827 827 828 struct TRINITY_DLL_DECL npc_steam_tonkAI : public ScriptedAI829 {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 command840 m_creature->InitCharmInfo(m_creature);841 m_creature->GetCharmInfo()->InitEmptyActionBar(false);842 843 m_creature->SetAggressive(false);844 }845 else846 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 25099857 858 struct TRINITY_DLL_DECL npc_tonk_mineAI : public ScriptedAI859 {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 it883 } else884 ExplosionTimer -= diff;885 }886 };887 888 CreatureAI* GetAI_npc_tonk_mine(Creature *_Creature)889 {890 return new npc_tonk_mineAI(_Creature);891 }892 893 828 void AddSC_npcs_special() 894 829 { … … 941 876 newscript->pGossipSelect = &GossipSelect_npc_sayge; 942 877 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 362 362 } 363 363 } 364 365 void 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 364 381 365 382 void BattleGround::RewardHonorToTeam(uint32 Honor, uint32 TeamID) … … 1219 1236 } 1220 1237 1238 GameObject* 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 1246 Creature* 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 1221 1254 void BattleGround::SpawnBGObject(uint32 type, uint32 respawntime) 1222 1255 { … … 1270 1303 } 1271 1304 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 1272 1315 pCreature->AIM_Initialize(); 1273 1316 … … 1288 1331 return false; 1289 1332 } 1333 //TODO: only delete creature after not in combat 1290 1334 cr->CleanupsBeforeDelete(); 1291 1335 cr->AddObjectToRemoveList(); … … 1475 1519 m_HonorMode = BG_NORMAL; 1476 1520 } 1521 1522 int32 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 1531 void BattleGround::HandleKillUnit(Creature *creature, Player *killer) 1532 { 1533 } -
trunk/src/game/BattleGround.h
r279 r283 355 355 void StartBattleGround(); 356 356 357 GameObject* GetBGObject(uint32 type); 358 Creature* GetBGCreature(uint32 type); 357 359 /* Location */ 358 360 void SetMapId(uint32 MapID) { m_MapId = MapID; } … … 374 376 void SendPacketToTeam(uint32 TeamID, WorldPacket *packet, Player *sender = NULL, bool self = true); 375 377 void SendPacketToAll(WorldPacket *packet); 378 void YellToAll(Creature* creature, const char* text, uint32 language); 376 379 void PlaySoundToTeam(uint32 SoundID, uint32 TeamID); 377 380 void PlaySoundToAll(uint32 SoundID); … … 424 427 // must be implemented in BG subclass if need AND call base class generic code 425 428 virtual void HandleKillPlayer(Player *player, Player *killer); 429 virtual void HandleKillUnit(Creature* /*unit*/, Player* /*killer*/); 426 430 427 431 /* Battleground events */ … … 453 457 bool DelObject(uint32 type); 454 458 bool AddSpiritGuide(uint32 type, float x, float y, float z, float o, uint32 team); 459 int32 GetObjectType(uint64 guid); 455 460 456 461 void DoorOpen(uint32 type); -
trunk/src/game/BattleGroundAV.cpp
r102 r283 19 19 */ 20 20 21 #include "Object.h"22 21 #include "Player.h" 23 22 #include "BattleGround.h" 24 23 #include "BattleGroundAV.h" 25 24 #include "Creature.h" 25 #include "Chat.h" 26 #include "Object.h" 27 #include "ObjectMgr.h" 28 #include "ObjectAccessor.h" 26 29 #include "MapManager.h" 27 30 #include "Language.h" 31 #include "SpellAuras.h" 32 #include "Formulas.h" 28 33 29 34 BattleGroundAV::BattleGroundAV() 30 35 { 31 36 37 m_BgObjects.resize(BG_AV_OBJECT_MAX); 38 m_BgCreatures.resize(AV_CPLACE_MAX+AV_STATICCPLACE_MAX); 32 39 } 33 40 34 41 BattleGroundAV::~BattleGroundAV() 35 42 { 36 43 } 44 45 const 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 50 void 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 59 void 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 122 void 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 226 void 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 249 Creature* 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; 37 295 } 38 296 … … 40 298 { 41 299 BattleGround::Update(diff); 300 if (GetStatus() == STATUS_WAIT_JOIN && GetPlayersSize()) 301 { 302 ModifyStartDelayTime(diff); 303 304 if (!(m_Events & 0x01)) 305 { 306 m_Events |= 0x01; 307 308 #ifdef ARENA_PATCH 309 if(!SetupBattleGround()) 310 { 311 EndNow(); 312 return; 313 } 314 #endif 315 316 uint16 i; 317 sLog.outDebug("Alterac Valley: entering state STATUS_WAIT_JOIN ..."); 318 // Initial Nodes 319 for(i = 0; i < BG_AV_OBJECT_MAX; i++) 320 SpawnBGObject(i, RESPAWN_ONE_DAY); 321 for(i = BG_AV_OBJECT_FLAG_A_FIRSTAID_STATION; i <= BG_AV_OBJECT_FLAG_A_STONEHEART_GRAVE ; i++){ 322 SpawnBGObject(BG_AV_OBJECT_AURA_A_FIRSTAID_STATION+3*i,RESPAWN_IMMEDIATELY); 323 SpawnBGObject(i, RESPAWN_IMMEDIATELY); 324 } 325 for(i = BG_AV_OBJECT_FLAG_A_DUNBALDAR_SOUTH; i <= BG_AV_OBJECT_FLAG_A_STONEHEART_BUNKER ; i++) 326 SpawnBGObject(i, RESPAWN_IMMEDIATELY); 327 for(i = BG_AV_OBJECT_FLAG_H_ICEBLOOD_GRAVE; i <= BG_AV_OBJECT_FLAG_H_FROSTWOLF_WTOWER ; i++){ 328 SpawnBGObject(i, RESPAWN_IMMEDIATELY); 329 if(i<=BG_AV_OBJECT_FLAG_H_FROSTWOLF_HUT) 330 SpawnBGObject(BG_AV_OBJECT_AURA_H_FIRSTAID_STATION+3*GetNodeThroughObject(i),RESPAWN_IMMEDIATELY); 331 } 332 for(i = BG_AV_OBJECT_TFLAG_A_DUNBALDAR_SOUTH; i <= BG_AV_OBJECT_TFLAG_A_STONEHEART_BUNKER; i+=2) 333 { 334 SpawnBGObject(i, RESPAWN_IMMEDIATELY); //flag 335 SpawnBGObject(i+16, RESPAWN_IMMEDIATELY); //aura 336 } 337 for(i = BG_AV_OBJECT_TFLAG_H_ICEBLOOD_TOWER; i <= BG_AV_OBJECT_TFLAG_H_FROSTWOLF_WTOWER; i+=2) 338 { 339 SpawnBGObject(i, RESPAWN_IMMEDIATELY); //flag 340 SpawnBGObject(i+16, RESPAWN_IMMEDIATELY); //aura 341 } 342 //snowfall and the doors 343 for(i = BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE; i <= BG_AV_OBJECT_DOOR_A; i++) 344 SpawnBGObject(i, RESPAWN_IMMEDIATELY); 345 SpawnBGObject(BG_AV_OBJECT_AURA_N_SNOWFALL_GRAVE,RESPAWN_IMMEDIATELY); 346 347 //creatures 348 sLog.outDebug("BG_AV start poputlating nodes"); 349 for(BG_AV_Nodes i= BG_AV_NODES_FIRSTAID_STATION; i < BG_AV_NODES_MAX; ++i ) 350 { 351 if(m_Nodes[i].Owner) 352 PopulateNode(i); 353 } 354 //all creatures which don't get despawned through the script are static 355 sLog.outDebug("BG_AV: start spawning static creatures"); 356 for(i=0; i < AV_STATICCPLACE_MAX; i++ ) 357 AddAVCreature(0,i+AV_CPLACE_MAX); 358 //mainspiritguides: 359 sLog.outDebug("BG_AV: start spawning spiritguides creatures"); 360 AddSpiritGuide(7, BG_AV_CreaturePos[7][0], BG_AV_CreaturePos[7][1], BG_AV_CreaturePos[7][2], BG_AV_CreaturePos[7][3], ALLIANCE); 361 AddSpiritGuide(8, BG_AV_CreaturePos[8][0], BG_AV_CreaturePos[8][1], BG_AV_CreaturePos[8][2], BG_AV_CreaturePos[8][3], HORDE); 362 //spawn the marshals (those who get deleted, if a tower gets destroyed) 363 sLog.outDebug("BG_AV: start spawning marshal creatures"); 364 for(i=AV_NPC_A_MARSHAL_SOUTH; i<= AV_NPC_H_MARSHAL_WTOWER; i++) 365 AddAVCreature(i,AV_CPLACE_A_MARSHAL_SOUTH+(i-AV_NPC_A_MARSHAL_SOUTH)); 366 367 AddAVCreature(AV_NPC_HERALD,AV_CPLACE_HERALD); 368 DoorClose(BG_AV_OBJECT_DOOR_A); 369 DoorClose(BG_AV_OBJECT_DOOR_H); 370 371 SetStartDelayTime(START_DELAY0); 372 } 373 // After 1 minute, warning is signalled 374 else if (GetStartDelayTime() <= START_DELAY1 && !(m_Events & 0x04)) 375 { 376 m_Events |= 0x04; 377 SendMessageToAll(GetTrinityString(LANG_BG_AV_ONEMINTOSTART)); 378 } 379 // After 1,5 minute, warning is signalled 380 else if (GetStartDelayTime() <= START_DELAY2 && !(m_Events & 0x08)) 381 { 382 m_Events |= 0x08; 383 SendMessageToAll(GetTrinityString(LANG_BG_AV_HALFMINTOSTART)); 384 } 385 // After 2 minutes, gates OPEN ! x) 386 else if (GetStartDelayTime() <= 0 && !(m_Events & 0x10)) 387 { 388 UpdateWorldState(AV_SHOW_H_SCORE, 1); 389 UpdateWorldState(AV_SHOW_A_SCORE, 1); 390 m_Events |= 0x10; 391 392 SendMessageToAll(GetTrinityString(LANG_BG_AV_STARTED)); 393 PlaySoundToAll(SOUND_BG_START); 394 SetStatus(STATUS_IN_PROGRESS); 395 396 sLog.outDebug("BG_AV: start spawning mine stuff"); 397 for(uint16 i= BG_AV_OBJECT_MINE_SUPPLY_N_MIN; i<=BG_AV_OBJECT_MINE_SUPPLY_N_MAX;i++) 398 SpawnBGObject(i,RESPAWN_IMMEDIATELY); 399 for(uint16 i= BG_AV_OBJECT_MINE_SUPPLY_S_MIN; i<=BG_AV_OBJECT_MINE_SUPPLY_S_MAX;i++) 400 SpawnBGObject(i,RESPAWN_IMMEDIATELY); 401 for(uint8 mine = AV_NORTH_MINE; mine <= AV_SOUTH_MINE; mine++) //mine population 402 ChangeMineOwner(mine, AV_NEUTRAL_TEAM,true); 403 DoorOpen(BG_AV_OBJECT_DOOR_H); 404 DoorOpen(BG_AV_OBJECT_DOOR_A); 405 406 407 for(BattleGroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) 408 if(Player* plr = objmgr.GetPlayer(itr->first)) 409 plr->RemoveAurasDueToSpell(SPELL_PREPARATION); 410 } 411 } 412 else if(GetStatus() == STATUS_IN_PROGRESS) 413 { 414 for(uint8 i=0; i<=1;i++)//0=alliance, 1=horde 415 { 416 if(!m_CaptainAlive[i]) 417 continue; 418 if(m_CaptainBuffTimer[i] > diff) 419 m_CaptainBuffTimer[i] -= diff; 420 else 421 { 422 if(i==0) 423 { 424 CastSpellOnTeam(AV_BUFF_A_CAPTAIN,ALLIANCE); 425 Creature* creature = GetBGCreature(AV_CPLACE_MAX + 61); 426 if(creature) 427 YellToAll(creature,LANG_BG_AV_A_CAPTAIN_BUFF,LANG_COMMON); 428 } 429 else 430 { 431 CastSpellOnTeam(AV_BUFF_H_CAPTAIN,HORDE); 432 Creature* creature = GetBGCreature(AV_CPLACE_MAX + 59); //TODO: make the captains a dynamic creature 433 if(creature) 434 YellToAll(creature,LANG_BG_AV_H_CAPTAIN_BUFF,LANG_ORCISH); 435 } 436 m_CaptainBuffTimer[i] = 120000 + urand(0,4)* 60000; //as far as i could see, the buff is randomly so i make 2minutes (thats the duration of the buff itself) + 0-4minutes TODO get the right times 437 } 438 } 439 //add points from mine owning, and look if he neutral team wanrts to reclaim the mine 440 m_Mine_Timer -=diff; 441 for(uint8 mine=0; mine <2; mine++) 442 { 443 if(m_Mine_Owner[mine] == ALLIANCE || m_Mine_Owner[mine] == HORDE) 444 { 445 if( m_Mine_Timer <= 0) 446 UpdateScore(m_Mine_Owner[mine],1); 447 448 if(m_Mine_Reclaim_Timer[mine] > diff) 449 m_Mine_Reclaim_Timer[mine] -= diff; 450 else{ //we don't need to set this timer to 0 cause this codepart wont get called when this thing is 0 451 ChangeMineOwner(mine,AV_NEUTRAL_TEAM); 452 } 453 } 454 } 455 if( m_Mine_Timer <= 0) 456 m_Mine_Timer=AV_MINE_TICK_TIMER; //this is at the end, cause we need to update both mines 457 458 //looks for all timers of the nodes and destroy the building (for graveyards the building wont get destroyed, it goes just to the other team 459 for(BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i < BG_AV_NODES_MAX; ++i) 460 if(m_Nodes[i].State == POINT_ASSAULTED) //maybe remove this 461 { 462 if(m_Nodes[i].Timer > diff) 463 m_Nodes[i].Timer -= diff; 464 else 465 EventPlayerDestroyedPoint( i); 466 } 467 } 42 468 } 43 469 … … 47 473 //create score and add it to map, default values are set in constructor 48 474 BattleGroundAVScore* sc = new BattleGroundAVScore; 49 50 475 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 481 void 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 521 void 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 57 534 58 535 void BattleGroundAV::HandleAreaTrigger(Player *Source, uint32 Trigger) … … 66 543 { 67 544 case 95: 545 case 2608: 546 if(Source->GetTeam() != ALLIANCE) 547 Source->GetSession()->SendAreaTriggerMessage("Only The Alliance can use that portal"); 548 else 549 Source->LeaveBattleground(); 550 break; 68 551 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; 70 557 case 3326: 71 558 case 3327: … … 74 561 case 3330: 75 562 case 3331: 563 //Source->Unmount(); 76 564 break; 77 565 default: 78 sLog.out Error("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); 80 568 break; 81 569 } … … 121 609 } 122 610 } 611 612 613 614 void 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 675 void 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 765 bool 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 774 void 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 } 806 void 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 818 const 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 840 const 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 879 void 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 907 void 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 979 void 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 1086 void 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 1125 const 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 1148 void 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 1157 void 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 1185 WorldSafeLocsEntry 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 1215 bool 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 1342 const 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 1370 void 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 1384 void 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 1395 void 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 1407 void 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 1419 void 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 24 24 class BattleGround; 25 25 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 55 enum BG_AV_Sounds 56 { //TODO: get out if there comes a sound when neutral team captures mine 57 58 /* 59 8212: 60 alliance grave assault 61 alliance tower assault 62 drek "mlanzenabschaum! In meiner Burg?! Toetet sie all" - nicht immer der sound 63 8333: 64 galv "sterbt fuer euch ist kein platz hier" 65 66 8332: 67 bal "Verschwinde, dreckiger Abschaum! Die Allianz wird im Alteractal " 68 8174: 69 horde tower assault 70 horde grave assault 71 van "es Sturmlanzenklans, euer General wird angegriffen! Ich fordere Unterst" 72 8173: 73 ally grave capture/defend 74 tower destroy 75 mine capture 76 ally wins 77 8192: 78 ally tower destroy(only iceblood - found a bug^^) 79 ally tower defend 80 horde tower defend 81 8213 82 horde: 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 103 enum 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 }; 112 enum 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 159 enum 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 180 enum 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 315 enum 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 }; 362 const 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 533 const 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 541 enum 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 607 const 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 946 enum 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) 1005 const 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 1065 const 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 1192 const 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 1246 enum 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 1261 const 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 1273 enum 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 }; 1279 enum BG_AV_States 1280 { 1281 POINT_NEUTRAL = 0, 1282 POINT_ASSAULTED = 1, 1283 POINT_DESTROYED = 2, 1284 POINT_CONTROLED = 3 1285 }; 1286 1287 enum 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 1403 const 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 1410 const 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 1443 enum 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 1469 struct 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 1480 inline BG_AV_Nodes &operator++(BG_AV_Nodes &i){ return i = BG_AV_Nodes(i + 1); } 1481 26 1482 class BattleGroundAVScore : public BattleGroundScore 27 1483 { … … 52 1508 void RemovePlayer(Player *plr,uint64 guid); 53 1509 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); 58 1528 59 1529 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 61 1581 #endif -
trunk/src/game/Creature.cpp
r279 r283 148 148 i_AI = NULL; 149 149 150 if (i_AI_possessed) 151 { 152 delete i_AI_possessed; 153 i_AI_possessed = NULL; 154 } 150 DeletePossessedAI(); 155 151 } 156 152 … … 567 563 } 568 564 569 void Creature::D isablePossessedAI()565 void Creature::DeletePossessedAI() 570 566 { 571 567 if (!i_AI_possessed) return; 568 569 delete i_AI_possessed; 570 i_AI_possessed = NULL; 572 571 573 572 // Signal the old AI that it's been re-enabled … … 579 578 SetMapId(map->GetId()); 580 579 SetInstanceId(map->GetInstanceId()); 580 m_DBTableGuid = guidlow; 581 581 582 582 //oX = x; oY = y; dX = x; dY = y; m_moveTime = 0; m_startMove = 0; … … 605 605 LoadCreaturesAddon(); 606 606 } 607 608 607 return bResult; 609 608 } -
trunk/src/game/Creature.h
r279 r283 461 461 bool AIM_Initialize(); 462 462 void InitPossessedAI(); 463 void D isablePossessedAI();463 void DeletePossessedAI(); 464 464 465 465 void AI_SendMoveToPacket(float x, float y, float z, uint32 time, uint32 MovementFlags, uint8 type); … … 612 612 613 613 uint32 GetGlobalCooldown() const { return m_GlobalCooldown; } 614 615 614 protected: 616 615 bool CreateFromProto(uint32 guidlow,uint32 Entry,uint32 team, const CreatureData *data = NULL); … … 661 660 float CombatStartY; 662 661 float CombatStartZ; 662 663 663 private: 664 664 GridReference<Creature> m_gridRef; -
trunk/src/game/GameObject.cpp
r279 r283 38 38 #include "InstanceData.h" 39 39 #include "BattleGround.h" 40 #include "Util.h" 40 41 #include "OutdoorPvPMgr.h" 41 #include " Util.h"42 #include "BattleGroundAV.h" 42 43 43 44 GameObject::GameObject() : WorldObject() … … 755 756 { 756 757 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; 757 765 return true; 766 } 758 767 break; 759 768 } -
trunk/src/game/Language.h
r230 r283 645 645 LANG_YOUR_BG_LEVEL_REQ_ERROR = 715, 646 646 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 648 686 649 687 LANG_ARENA_YOUR_TEAM_ONLY = 730, -
trunk/src/game/LootHandler.cpp
r102 r283 70 70 71 71 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; 72 82 } 73 83 else -
trunk/src/game/PetHandler.cpp
r277 r283 98 98 case COMMAND_ATTACK: //spellid=1792 //ATTACK 99 99 { 100 // Can't attack if owner is pacified101 if (_player->HasAuraType(SPELL_AURA_MOD_PACIFY))102 {103 //pet->SendPetCastFail(spellid, SPELL_FAILED_PACIFIED);104 //TODO: Send proper error message to client105 return;106 }107 100 // only place where pet can be player 108 101 pet->clearUnitState(UNIT_STAT_FOLLOW); -
trunk/src/game/Player.cpp
r279 r283 55 55 #include "Weather.h" 56 56 #include "BattleGround.h" 57 #include "BattleGroundAV.h" 57 58 #include "BattleGroundMgr.h" 58 59 #include "OutdoorPvP.h" … … 4161 4162 BattleGround *bg = sBattleGroundMgr.GetBattleGround(GetBattleGroundId()); 4162 4163 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)) 4164 4165 ClosestGrave = bg->GetClosestGraveYard(GetPositionX(), GetPositionY(), GetPositionZ(), GetTeam()); 4165 4166 else … … 7216 7217 uint32 lootid = go->GetLootId(); 7217 7218 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 7218 7229 if(lootid) 7219 7230 { … … 7292 7303 uint32 pLevel = bones->loot.gold; 7293 7304 bones->loot.clear(); 7305 if(GetBattleGround()->GetTypeID() == BATTLEGROUND_AV) 7306 loot->FillLoot(1, LootTemplates_Creature, this); 7294 7307 // It may need a better formula 7295 7308 // Now it works like this: lvl10: ~6copper, lvl70: ~9silver … … 7665 7678 break; 7666 7679 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 } 7742 7760 break; 7743 7761 case 3277: // WS … … 13351 13369 // hide quest if player is in raid-group and quest is no raid quest 13352 13370 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; 13354 13373 13355 13374 // There should be no mixed ReqItem/ReqSource drop … … 18046 18065 } 18047 18066 18067 //TODO make this more generic - current implementation is wrong 18048 18068 uint32 Player::GetBattleGroundQueueIdFromLevel() const 18049 18069 { … … 18937 18957 target->AddThreat(this, 1000000.0f); 18938 18958 } 18939 // D isable the assigned possessed AI18940 ((Creature*)target)->D isablePossessedAI();18959 // Delete the assigned possessed AI 18960 ((Creature*)target)->DeletePossessedAI(); 18941 18961 } 18942 18962 } -
trunk/src/game/PossessedAI.cpp
r277 r283 25 25 void PossessedAI::AttackStart(Unit *u) 26 26 { 27 if( !u || i_pet.GetCharmer()->HasAuraType(SPELL_AURA_MOD_PACIFY))27 if( !u ) 28 28 return; 29 29 … … 96 96 return; 97 97 } 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()) 99 99 { 100 100 i_pet.AttackerStateUpdate(i_pet.getVictim()); -
trunk/src/game/QuestHandler.cpp
r207 r283 32 32 #include "ScriptCalls.h" 33 33 #include "Group.h" 34 #include "BattleGround.h" 35 #include "BattleGroundAV.h" 34 36 35 37 void WorldSession::HandleQuestgiverStatusQueryOpcode( WorldPacket & recv_data ) … … 402 404 if( pQuest ) 403 405 { 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 404 412 if( _player->GetQuestStatus( quest ) != QUEST_STATUS_COMPLETE ) 405 413 { -
trunk/src/game/SharedDefines.h
r279 r283 2070 2070 SUMMON_TYPE_CRITTER3 = 307, 2071 2071 SUMMON_TYPE_UNKNOWN5 = 409, 2072 SUMMON_TYPE_ POSESSED3= 427,2072 SUMMON_TYPE_UNKNOWN2 = 427, 2073 2073 SUMMON_TYPE_POSESSED2 = 428 2074 2074 }; -
trunk/src/game/Spell.cpp
r279 r283 1534 1534 case TARGET_SCRIPT: 1535 1535 case TARGET_SCRIPT_COORDINATES: 1536 case TARGET_UNIT_AREA_SCRIPT:1537 1536 { 1538 1537 SpellScriptTarget::const_iterator lower = spellmgr.GetBeginSpellScriptTarget(m_spellInfo->Id); … … 3867 3866 case SUMMON_TYPE_POSESSED: 3868 3867 case SUMMON_TYPE_POSESSED2: 3869 case SUMMON_TYPE_POSESSED3:3870 3868 case SUMMON_TYPE_DEMON: 3871 3869 case SUMMON_TYPE_SUMMON: -
trunk/src/game/SpellAuras.cpp
r279 r283 50 50 #include "GridNotifiersImpl.h" 51 51 #include "CellImpl.h" 52 #include "TemporarySummon.h" 52 53 53 54 #define NULL_AURA_SLOT 0xFF … … 2024 2025 return; 2025 2026 } 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 } 2026 2034 } 2027 2035 -
trunk/src/game/SpellEffects.cpp
r279 r283 2887 2887 { 2888 2888 // check if it's correct bg 2889 if(bg && bg->GetTypeID() == BATTLEGROUND_AB)2889 if(bg->GetTypeID() == BATTLEGROUND_AB || bg->GetTypeID() == BATTLEGROUND_AV) 2890 2890 bg->EventPlayerClickedOnFlag(player, gameObjTarget); 2891 2891 return; … … 3151 3151 case SUMMON_TYPE_POSESSED: 3152 3152 case SUMMON_TYPE_POSESSED2: 3153 case SUMMON_TYPE_POSESSED3:3154 3153 EffectSummonPossessed(i); 3155 3154 break; … … 3176 3175 break; 3177 3176 case SUMMON_TYPE_UNKNOWN1: 3177 case SUMMON_TYPE_UNKNOWN2: 3178 3178 case SUMMON_TYPE_UNKNOWN3: 3179 3179 case SUMMON_TYPE_UNKNOWN4: -
trunk/src/game/SpellHandler.cpp
r279 r283 34 34 #include "ScriptCalls.h" 35 35 #include "Totem.h" 36 #include "TemporarySummon.h"37 36 38 37 void WorldSession::HandleUseItemOpcode(WorldPacket& recvPacket) … … 378 377 return; 379 378 } 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 function386 ((TemporarySummon*)_player->GetCharm())->UnSummon();387 }388 379 } 389 380 } -
trunk/src/game/Unit.cpp
r279 r283 47 47 #include "CellImpl.h" 48 48 #include "Path.h" 49 #include "TemporarySummon.h"50 49 51 50 #include <math.h> … … 831 830 832 831 // 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 } 849 841 } 850 842 } … … 3420 3412 if (m_currentSpells[CURRENT_CHANNELED_SPELL] && (!spell_id || m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->Id==spell_id)) 3421 3413 { 3422 // Unsummon any summoned as possessed creatures on channel interrupt3423 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 function3432 if (GetCharm())3433 ((TemporarySummon*)GetCharm())->UnSummon();3434 }3435 }3436 3437 3414 if (m_currentSpells[CURRENT_CHANNELED_SPELL]->getState() != SPELL_STATE_FINISHED) 3438 3415 m_currentSpells[CURRENT_CHANNELED_SPELL]->cancel(); … … 9814 9791 9815 9792 CharmInfo::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) 9817 9794 { 9818 9795 for(int i =0; i<4; ++i) … … 9825 9802 void CharmInfo::InitPetActionBar() 9826 9803 { 9827 if (m_barInit)9828 return;9829 9830 9804 // the first 3 SpellOrActions are attack, follow and stay 9831 9805 for(uint32 i = 0; i < 3; i++) … … 9842 9816 PetActionBar[i + 3].SpellOrAction = 0; 9843 9817 } 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 9820 void CharmInfo::InitEmptyActionBar() 9821 { 9822 for(uint32 x = 1; x < 10; ++x) 9853 9823 { 9854 9824 PetActionBar[x].Type = ACT_CAST; 9855 9825 PetActionBar[x].SpellOrAction = 0; 9856 9826 } 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; 9863 9829 } 9864 9830 -
trunk/src/game/Unit.h
r279 r283 641 641 typedef std::list<Player*> SharedVisionList; 642 642 643 struct TRINITY_DLL_SPECCharmInfo643 struct CharmInfo 644 644 { 645 645 public: … … 658 658 void InitCharmCreateSpells(); 659 659 void InitPetActionBar(); 660 void InitEmptyActionBar( bool withAttack = true);660 void InitEmptyActionBar(); 661 661 //return true if successful 662 662 bool AddSpellToAB(uint32 oldid, uint32 newid, ActiveStates newstate = ACT_DECIDE); … … 672 672 ReactStates m_reactState; 673 673 uint32 m_petnumber; 674 bool m_barInit;675 674 }; 676 675