diff --git a/src/game/BattleGroundAB.cpp b/src/game/BattleGroundAB.cpp index 7c4876b45..ea10e3dee 100644 --- a/src/game/BattleGroundAB.cpp +++ b/src/game/BattleGroundAB.cpp @@ -31,7 +31,6 @@ BattleGroundAB::BattleGroundAB() { m_BuffChange = true; m_BgObjects.resize(BG_AB_OBJECT_MAX); - m_BgCreatures.resize(BG_AB_ALL_NODES_COUNT); m_StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_AB_START_TWO_MINUTES; m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_AB_START_ONE_MINUTE; @@ -51,7 +50,7 @@ void BattleGroundAB::Update(uint32 diff) { int team_points[BG_TEAMS_COUNT] = { 0, 0 }; - for (int node = 0; node < BG_AB_DYNAMIC_NODES_COUNT; ++node) + for (int node = 0; node < BG_AB_NODES_MAX; ++node) { // 3 sec delay to spawn new banner instead previous despawned one if (m_BannerTimers[node].timer) @@ -77,8 +76,6 @@ void BattleGroundAB::Update(uint32 diff) uint8 teamIndex = m_Nodes[node]-1; m_prevNodes[node] = m_Nodes[node]; m_Nodes[node] += 2; - // burn current contested banner - _DelBanner(node, BG_AB_NODE_TYPE_CONTESTED, teamIndex); // create new occupied banner _CreateBanner(node, BG_AB_NODE_TYPE_OCCUPIED, teamIndex, true); _SendNodeUpdate(node); @@ -87,13 +84,11 @@ void BattleGroundAB::Update(uint32 diff) if (teamIndex == 0) { - // FIXME: team and node names not localized SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN,CHAT_MSG_BG_SYSTEM_ALLIANCE,NULL,LANG_BG_AB_ALLY,_GetNodeNameId(node)); PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_ALLIANCE); } else { - // FIXME: team and node names not localized SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN,CHAT_MSG_BG_SYSTEM_HORDE,NULL,LANG_BG_AB_HORDE,_GetNodeNameId(node)); PlaySoundToAll(BG_AB_SOUND_NODE_CAPTURED_HORDE); } @@ -164,36 +159,20 @@ void BattleGroundAB::Update(uint32 diff) void BattleGroundAB::StartingEventCloseDoors() { - // despawn banners, auras and buffs - for (int obj = BG_AB_OBJECT_BANNER_NEUTRAL; obj < BG_AB_DYNAMIC_NODES_COUNT * 8; ++obj) - SpawnBGObject(m_BgObjects[obj], RESPAWN_ONE_DAY); - for (int i = 0; i < BG_AB_DYNAMIC_NODES_COUNT * 3; ++i) + // despawn buffs + for (int i = 0; i < BG_AB_NODES_MAX * 3; ++i) SpawnBGObject(m_BgObjects[BG_AB_OBJECT_SPEEDBUFF_STABLES + i], RESPAWN_ONE_DAY); - - // Starting doors - DoorClose(m_BgObjects[BG_AB_OBJECT_GATE_A]); - DoorClose(m_BgObjects[BG_AB_OBJECT_GATE_H]); - SpawnBGObject(m_BgObjects[BG_AB_OBJECT_GATE_A], RESPAWN_IMMEDIATELY); - SpawnBGObject(m_BgObjects[BG_AB_OBJECT_GATE_H], RESPAWN_IMMEDIATELY); - - // Starting base spirit guides - _NodeOccupied(BG_AB_SPIRIT_ALIANCE,ALLIANCE); - _NodeOccupied(BG_AB_SPIRIT_HORDE,HORDE); } void BattleGroundAB::StartingEventOpenDoors() { - // spawn neutral banners - for (int banner = BG_AB_OBJECT_BANNER_NEUTRAL, i = 0; i < 5; banner += 8, ++i) - SpawnBGObject(m_BgObjects[banner], RESPAWN_IMMEDIATELY); - for (int i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) + for (int i = 0; i < BG_AB_NODES_MAX; ++i) { //randomly select buff to spawn uint8 buff = urand(0, 2); SpawnBGObject(m_BgObjects[BG_AB_OBJECT_SPEEDBUFF_STABLES + buff + i * 3], RESPAWN_IMMEDIATELY); } - DoorOpen(m_BgObjects[BG_AB_OBJECT_GATE_A]); - DoorOpen(m_BgObjects[BG_AB_OBJECT_GATE_H]); + OpenDoorEvent(BG_EVENT_DOOR); } void BattleGroundAB::AddPlayer(Player *plr) @@ -257,27 +236,12 @@ void BattleGroundAB::_CreateBanner(uint8 node, uint8 type, uint8 teamIndex, bool return; } - uint8 obj = node*8 + type + teamIndex; + // cause the node-type is in the generic form + // please see in the headerfile for the ids + if (type != BG_AB_NODE_TYPE_NEUTRAL) + type += teamIndex; - SpawnBGObject(m_BgObjects[obj], RESPAWN_IMMEDIATELY); - - // handle aura with banner - if (!type) - return; - obj = node * 8 + ((type == BG_AB_NODE_TYPE_OCCUPIED) ? (5 + teamIndex) : 7); - SpawnBGObject(m_BgObjects[obj], RESPAWN_IMMEDIATELY); -} - -void BattleGroundAB::_DelBanner(uint8 node, uint8 type, uint8 teamIndex) -{ - uint8 obj = node*8 + type + teamIndex; - SpawnBGObject(m_BgObjects[obj], RESPAWN_ONE_DAY); - - // handle aura with banner - if (!type) - return; - obj = node * 8 + ((type == BG_AB_NODE_TYPE_OCCUPIED) ? (5 + teamIndex) : 7); - SpawnBGObject(m_BgObjects[obj], RESPAWN_ONE_DAY); + SpawnEvent(node, type, true); // will automaticly despawn other events } int32 BattleGroundAB::_GetNodeNameId(uint8 node) @@ -300,17 +264,17 @@ void BattleGroundAB::FillInitialWorldStates(WorldPacket& data) const uint8 plusArray[] = {0, 2, 3, 0, 1}; // Node icons - for (uint8 node = 0; node < BG_AB_DYNAMIC_NODES_COUNT; ++node) + for (uint8 node = 0; node < BG_AB_NODES_MAX; ++node) data << uint32(BG_AB_OP_NODEICONS[node]) << uint32((m_Nodes[node]==0)?1:0); // Node occupied states - for (uint8 node = 0; node < BG_AB_DYNAMIC_NODES_COUNT; ++node) - for (uint8 i = 1; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) + for (uint8 node = 0; node < BG_AB_NODES_MAX; ++node) + for (uint8 i = 1; i < BG_AB_NODES_MAX; ++i) data << uint32(BG_AB_OP_NODESTATES[node] + plusArray[i]) << uint32((m_Nodes[node]==i)?1:0); // How many bases each team owns uint8 ally = 0, horde = 0; - for (uint8 node = 0; node < BG_AB_DYNAMIC_NODES_COUNT; ++node) + for (uint8 node = 0; node < BG_AB_NODES_MAX; ++node) if (m_Nodes[node] == BG_AB_NODE_STATUS_ALLY_OCCUPIED) ++ally; else if (m_Nodes[node] == BG_AB_NODE_STATUS_HORDE_OCCUPIED) @@ -343,7 +307,7 @@ void BattleGroundAB::_SendNodeUpdate(uint8 node) // How many bases each team owns uint8 ally = 0, horde = 0; - for (uint8 i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) + for (uint8 i = 0; i < BG_AB_NODES_MAX; ++i) if (m_Nodes[i] == BG_AB_NODE_STATUS_ALLY_OCCUPIED) ++ally; else if (m_Nodes[i] == BG_AB_NODE_STATUS_HORDE_OCCUPIED) @@ -355,12 +319,8 @@ void BattleGroundAB::_SendNodeUpdate(uint8 node) void BattleGroundAB::_NodeOccupied(uint8 node,Team team) { - if (!AddSpiritGuide(node, BG_AB_SpiritGuidePos[node][0], BG_AB_SpiritGuidePos[node][1], BG_AB_SpiritGuidePos[node][2], BG_AB_SpiritGuidePos[node][3], team)) - sLog.outError("Failed to spawn spirit guide! point: %u, team: %u,", node, team); -// SpawnBGCreature(node,RESPAWN_IMMEDIATELY); - uint8 capturedNodes = 0; - for (uint8 i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) + for (uint8 i = 0; i < BG_AB_NODES_MAX; ++i) { if (m_Nodes[node] == GetTeamIndexByTeamId(team) + BG_AB_NODE_TYPE_OCCUPIED && !m_NodeTimers[i]) ++capturedNodes; @@ -371,78 +331,39 @@ void BattleGroundAB::_NodeOccupied(uint8 node,Team team) CastSpellOnTeam(SPELL_AB_QUEST_REWARD_4_BASES, team); } -void BattleGroundAB::_NodeDeOccupied(uint8 node) -{ - if (node >= BG_AB_DYNAMIC_NODES_COUNT) - return; - - // Those who are waiting to resurrect at this node are taken to the closest own node's graveyard - std::vector ghost_list = m_ReviveQueue[m_BgCreatures[node]]; - if (!ghost_list.empty()) - { - WorldSafeLocsEntry const *ClosestGrave = NULL; - for (std::vector::const_iterator itr = ghost_list.begin(); itr != ghost_list.end(); ++itr) - { - Player* plr = objmgr.GetPlayer(*itr); - if (!plr) - continue; - - if (!ClosestGrave) // cache - ClosestGrave = GetClosestGraveYard(plr); - - if (ClosestGrave) - plr->TeleportTo(GetMapId(), ClosestGrave->x, ClosestGrave->y, ClosestGrave->z, plr->GetOrientation()); - } - } - - if (m_BgCreatures[node]) - DelCreature(node); - - // buff object isn't despawned -} - /* Invoked if a player used a banner as a gameobject */ -void BattleGroundAB::EventPlayerClickedOnFlag(Player *source, GameObject* /*target_obj*/) +void BattleGroundAB::EventPlayerClickedOnFlag(Player *source, GameObject* target_obj) { if (GetStatus() != STATUS_IN_PROGRESS) return; - uint8 node = BG_AB_NODE_STABLES; - GameObject* obj=HashMapHolder::Find(m_BgObjects[node*8+7]); - while ( (node < BG_AB_DYNAMIC_NODES_COUNT) && ((!obj) || (!source->IsWithinDistInMap(obj,10)))) - { - ++node; - obj=HashMapHolder::Find(m_BgObjects[node*8+BG_AB_OBJECT_AURA_CONTESTED]); - } - - if (node == BG_AB_DYNAMIC_NODES_COUNT) - { - // this means our player isn't close to any of banners - maybe cheater ?? + uint8 event = (sBattleGroundMgr.GetGameObjectEventIndex(target_obj->GetDBTableGUIDLow())).event1; + if (event >= BG_AB_NODES_MAX) // not a node return; - } + BG_AB_Nodes node = BG_AB_Nodes(event); BattleGroundTeamId teamIndex = GetTeamIndexByTeamId(source->GetTeam()); // Check if player really could use this banner, not cheated - if (!(m_Nodes[node] == 0 || teamIndex == m_Nodes[node]%2)) + if (!(m_Nodes[node] == 0 || teamIndex == m_Nodes[node] % 2)) return; source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT); uint32 sound = 0; + + // TODO in the following code we should restructure a bit to avoid + // duplication (or maybe write functions?) // If node is neutral, change to contested if (m_Nodes[node] == BG_AB_NODE_TYPE_NEUTRAL) { UpdatePlayerScore(source, SCORE_BASES_ASSAULTED, 1); m_prevNodes[node] = m_Nodes[node]; m_Nodes[node] = teamIndex + 1; - // burn current neutral banner - _DelBanner(node, BG_AB_NODE_TYPE_NEUTRAL, 0); // create new contested banner _CreateBanner(node, BG_AB_NODE_TYPE_CONTESTED, teamIndex, true); _SendNodeUpdate(node); m_NodeTimers[node] = BG_AB_FLAG_CAPTURING_TIME; - // FIXME: team and node names not localized if (teamIndex == 0) SendMessage2ToAll(LANG_BG_AB_NODE_CLAIMED,CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node), LANG_BG_AB_ALLY); else @@ -459,14 +380,11 @@ void BattleGroundAB::EventPlayerClickedOnFlag(Player *source, GameObject* /*targ UpdatePlayerScore(source, SCORE_BASES_ASSAULTED, 1); m_prevNodes[node] = m_Nodes[node]; m_Nodes[node] = teamIndex + BG_AB_NODE_TYPE_CONTESTED; - // burn current contested banner - _DelBanner(node, BG_AB_NODE_TYPE_CONTESTED, !teamIndex); // create new contested banner _CreateBanner(node, BG_AB_NODE_TYPE_CONTESTED, teamIndex, true); _SendNodeUpdate(node); m_NodeTimers[node] = BG_AB_FLAG_CAPTURING_TIME; - // FIXME: node names not localized if (teamIndex == BG_TEAM_ALLIANCE) SendMessage2ToAll(LANG_BG_AB_NODE_ASSAULTED,CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node)); else @@ -478,15 +396,12 @@ void BattleGroundAB::EventPlayerClickedOnFlag(Player *source, GameObject* /*targ UpdatePlayerScore(source, SCORE_BASES_DEFENDED, 1); m_prevNodes[node] = m_Nodes[node]; m_Nodes[node] = teamIndex + BG_AB_NODE_TYPE_OCCUPIED; - // burn current contested banner - _DelBanner(node, BG_AB_NODE_TYPE_CONTESTED, !teamIndex); // create new occupied banner _CreateBanner(node, BG_AB_NODE_TYPE_OCCUPIED, teamIndex, true); _SendNodeUpdate(node); m_NodeTimers[node] = 0; _NodeOccupied(node,(teamIndex == BG_TEAM_ALLIANCE) ? ALLIANCE:HORDE); - // FIXME: node names not localized if (teamIndex == BG_TEAM_ALLIANCE) SendMessage2ToAll(LANG_BG_AB_NODE_DEFENDED,CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node)); else @@ -500,15 +415,11 @@ void BattleGroundAB::EventPlayerClickedOnFlag(Player *source, GameObject* /*targ UpdatePlayerScore(source, SCORE_BASES_ASSAULTED, 1); m_prevNodes[node] = m_Nodes[node]; m_Nodes[node] = teamIndex + BG_AB_NODE_TYPE_CONTESTED; - // burn current occupied banner - _DelBanner(node, BG_AB_NODE_TYPE_OCCUPIED, !teamIndex); // create new contested banner _CreateBanner(node, BG_AB_NODE_TYPE_CONTESTED, teamIndex, true); _SendNodeUpdate(node); - _NodeDeOccupied(node); m_NodeTimers[node] = BG_AB_FLAG_CAPTURING_TIME; - // FIXME: node names not localized if (teamIndex == BG_TEAM_ALLIANCE) SendMessage2ToAll(LANG_BG_AB_NODE_ASSAULTED,CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node)); else @@ -520,7 +431,6 @@ void BattleGroundAB::EventPlayerClickedOnFlag(Player *source, GameObject* /*targ // If node is occupied again, send "X has taken the Y" msg. if (m_Nodes[node] >= BG_AB_NODE_TYPE_OCCUPIED) { - // FIXME: team and node names not localized if (teamIndex == BG_TEAM_ALLIANCE) SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN,CHAT_MSG_BG_SYSTEM_ALLIANCE, NULL, LANG_BG_AB_ALLY, _GetNodeNameId(node)); else @@ -531,31 +441,8 @@ void BattleGroundAB::EventPlayerClickedOnFlag(Player *source, GameObject* /*targ bool BattleGroundAB::SetupBattleGround() { - for (int i = 0 ; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) - { - if (!AddObject(BG_AB_OBJECT_BANNER_NEUTRAL + 8*i,BG_AB_OBJECTID_NODE_BANNER_0 + i,BG_AB_NodePositions[i][0],BG_AB_NodePositions[i][1],BG_AB_NodePositions[i][2],BG_AB_NodePositions[i][3], 0, 0, sin(BG_AB_NodePositions[i][3]/2), cos(BG_AB_NodePositions[i][3]/2),RESPAWN_ONE_DAY) - || !AddObject(BG_AB_OBJECT_BANNER_CONT_A + 8*i,BG_AB_OBJECTID_BANNER_CONT_A,BG_AB_NodePositions[i][0],BG_AB_NodePositions[i][1],BG_AB_NodePositions[i][2],BG_AB_NodePositions[i][3], 0, 0, sin(BG_AB_NodePositions[i][3]/2), cos(BG_AB_NodePositions[i][3]/2),RESPAWN_ONE_DAY) - || !AddObject(BG_AB_OBJECT_BANNER_CONT_H + 8*i,BG_AB_OBJECTID_BANNER_CONT_H,BG_AB_NodePositions[i][0],BG_AB_NodePositions[i][1],BG_AB_NodePositions[i][2],BG_AB_NodePositions[i][3], 0, 0, sin(BG_AB_NodePositions[i][3]/2), cos(BG_AB_NodePositions[i][3]/2),RESPAWN_ONE_DAY) - || !AddObject(BG_AB_OBJECT_BANNER_ALLY + 8*i,BG_AB_OBJECTID_BANNER_A,BG_AB_NodePositions[i][0],BG_AB_NodePositions[i][1],BG_AB_NodePositions[i][2],BG_AB_NodePositions[i][3], 0, 0, sin(BG_AB_NodePositions[i][3]/2), cos(BG_AB_NodePositions[i][3]/2),RESPAWN_ONE_DAY) - || !AddObject(BG_AB_OBJECT_BANNER_HORDE + 8*i,BG_AB_OBJECTID_BANNER_H,BG_AB_NodePositions[i][0],BG_AB_NodePositions[i][1],BG_AB_NodePositions[i][2],BG_AB_NodePositions[i][3], 0, 0, sin(BG_AB_NodePositions[i][3]/2), cos(BG_AB_NodePositions[i][3]/2),RESPAWN_ONE_DAY) - || !AddObject(BG_AB_OBJECT_AURA_ALLY + 8*i,BG_AB_OBJECTID_AURA_A,BG_AB_NodePositions[i][0],BG_AB_NodePositions[i][1],BG_AB_NodePositions[i][2],BG_AB_NodePositions[i][3], 0, 0, sin(BG_AB_NodePositions[i][3]/2), cos(BG_AB_NodePositions[i][3]/2),RESPAWN_ONE_DAY) - || !AddObject(BG_AB_OBJECT_AURA_HORDE + 8*i,BG_AB_OBJECTID_AURA_H,BG_AB_NodePositions[i][0],BG_AB_NodePositions[i][1],BG_AB_NodePositions[i][2],BG_AB_NodePositions[i][3], 0, 0, sin(BG_AB_NodePositions[i][3]/2), cos(BG_AB_NodePositions[i][3]/2),RESPAWN_ONE_DAY) - || !AddObject(BG_AB_OBJECT_AURA_CONTESTED + 8*i,BG_AB_OBJECTID_AURA_C,BG_AB_NodePositions[i][0],BG_AB_NodePositions[i][1],BG_AB_NodePositions[i][2],BG_AB_NodePositions[i][3], 0, 0, sin(BG_AB_NodePositions[i][3]/2), cos(BG_AB_NodePositions[i][3]/2),RESPAWN_ONE_DAY) - ) - { - sLog.outErrorDb("BatteGroundAB: Failed to spawn some object BattleGround not created!"); - return false; - } - } - if (!AddObject(BG_AB_OBJECT_GATE_A,BG_AB_OBJECTID_GATE_A,BG_AB_DoorPositions[0][0],BG_AB_DoorPositions[0][1],BG_AB_DoorPositions[0][2],BG_AB_DoorPositions[0][3],BG_AB_DoorPositions[0][4],BG_AB_DoorPositions[0][5],BG_AB_DoorPositions[0][6],BG_AB_DoorPositions[0][7],RESPAWN_IMMEDIATELY) - || !AddObject(BG_AB_OBJECT_GATE_H,BG_AB_OBJECTID_GATE_H,BG_AB_DoorPositions[1][0],BG_AB_DoorPositions[1][1],BG_AB_DoorPositions[1][2],BG_AB_DoorPositions[1][3],BG_AB_DoorPositions[1][4],BG_AB_DoorPositions[1][5],BG_AB_DoorPositions[1][6],BG_AB_DoorPositions[1][7],RESPAWN_IMMEDIATELY) - ) - { - sLog.outErrorDb("BatteGroundAB: Failed to spawn door object BattleGround not created!"); - return false; - } //buffs - for (int i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) + for (int i = 0; i < BG_AB_NODES_MAX; ++i) { if (!AddObject(BG_AB_OBJECT_SPEEDBUFF_STABLES + 3 * i, Buff_Entries[0], BG_AB_BuffPositions[i][0], BG_AB_BuffPositions[i][1], BG_AB_BuffPositions[i][2], BG_AB_BuffPositions[i][3], 0, 0, sin(BG_AB_BuffPositions[i][3]/2), cos(BG_AB_BuffPositions[i][3]/2), RESPAWN_ONE_DAY) || !AddObject(BG_AB_OBJECT_SPEEDBUFF_STABLES + 3 * i + 1, Buff_Entries[1], BG_AB_BuffPositions[i][0], BG_AB_BuffPositions[i][1], BG_AB_BuffPositions[i][2], BG_AB_BuffPositions[i][3], 0, 0, sin(BG_AB_BuffPositions[i][3]/2), cos(BG_AB_BuffPositions[i][3]/2), RESPAWN_ONE_DAY) @@ -572,32 +459,31 @@ void BattleGroundAB::Reset() //call parent's class reset BattleGround::Reset(); - m_TeamScores[BG_TEAM_ALLIANCE] = 0; - m_TeamScores[BG_TEAM_HORDE] = 0; - m_lastTick[BG_TEAM_ALLIANCE] = 0; - m_lastTick[BG_TEAM_HORDE] = 0; - m_HonorScoreTics[BG_TEAM_ALLIANCE] = 0; - m_HonorScoreTics[BG_TEAM_HORDE] = 0; - m_ReputationScoreTics[BG_TEAM_ALLIANCE] = 0; - m_ReputationScoreTics[BG_TEAM_HORDE] = 0; + for (uint8 i = 0; i <= BG_TEAMS_COUNT; ++i) + { + m_TeamScores[i] = 0; + m_lastTick[i] = 0; + m_HonorScoreTics[i] = 0; + m_ReputationScoreTics[i] = 0; + m_TeamScores500Disadvantage[i] = false; + } + m_IsInformedNearVictory = false; bool isBGWeekend = sBattleGroundMgr.IsBGWeekend(GetTypeID()); m_HonorTics = (isBGWeekend) ? BG_AB_ABBGWeekendHonorTicks : BG_AB_NotABBGWeekendHonorTicks; m_ReputationTics = (isBGWeekend) ? BG_AB_ABBGWeekendReputationTicks : BG_AB_NotABBGWeekendReputationTicks; - m_TeamScores500Disadvantage[BG_TEAM_ALLIANCE] = false; - m_TeamScores500Disadvantage[BG_TEAM_HORDE] = false; - for (uint8 i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) + for (uint8 i = 0; i < BG_AB_NODES_MAX; ++i) { m_Nodes[i] = 0; m_prevNodes[i] = 0; m_NodeTimers[i] = 0; m_BannerTimers[i].timer = 0; + + // all nodes owned by neutral team at beginning + m_ActiveEvents[i] = BG_AB_NODE_TYPE_NEUTRAL; } - for (uint8 i = 0; i < BG_AB_ALL_NODES_COUNT; ++i) - if (m_BgCreatures[i]) - DelCreature(i); } void BattleGroundAB::EndBattleGround(uint32 winner) @@ -620,7 +506,7 @@ WorldSafeLocsEntry const* BattleGroundAB::GetClosestGraveYard(Player* player) // Is there any occupied node for this team? std::vector nodes; - for (uint8 i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) + for (uint8 i = 0; i < BG_AB_NODES_MAX; ++i) if (m_Nodes[i] == teamIndex + 3) nodes.push_back(i); @@ -676,10 +562,10 @@ void BattleGroundAB::UpdatePlayerScore(Player *Source, uint32 type, uint32 value bool BattleGroundAB::IsAllNodesConrolledByTeam(uint32 team) const { uint32 count = 0; - for(int i = 0; i < BG_AB_DYNAMIC_NODES_COUNT; ++i) + for (int i = 0; i < BG_AB_NODES_MAX; ++i) if ((team == ALLIANCE && m_Nodes[i] == BG_AB_NODE_STATUS_ALLY_OCCUPIED) || (team == HORDE && m_Nodes[i] == BG_AB_NODE_STATUS_HORDE_OCCUPIED)) ++count; - return count == BG_AB_DYNAMIC_NODES_COUNT; + return count == BG_AB_NODES_MAX; } diff --git a/src/game/BattleGroundAB.h b/src/game/BattleGroundAB.h index e01e78f66..22718e4f8 100644 --- a/src/game/BattleGroundAB.h +++ b/src/game/BattleGroundAB.h @@ -62,64 +62,32 @@ const uint32 BG_AB_OP_NODESTATES[5] = {1767, 1782, 1772, 1792, 1787}; const uint32 BG_AB_OP_NODEICONS[5] = {1842, 1846, 1845, 1844, 1843}; -/* Note: code uses that these IDs follow each other */ -enum BG_AB_NodeObjectId -{ - BG_AB_OBJECTID_NODE_BANNER_0 = 180087, // Stables banner - BG_AB_OBJECTID_NODE_BANNER_1 = 180088, // Blacksmith banner - BG_AB_OBJECTID_NODE_BANNER_2 = 180089, // Farm banner - BG_AB_OBJECTID_NODE_BANNER_3 = 180090, // Lumber mill banner - BG_AB_OBJECTID_NODE_BANNER_4 = 180091 // Gold mine banner -}; - enum BG_AB_ObjectType { - // for all 5 node points 8*5=40 objects - BG_AB_OBJECT_BANNER_NEUTRAL = 0, - BG_AB_OBJECT_BANNER_CONT_A = 1, - BG_AB_OBJECT_BANNER_CONT_H = 2, - BG_AB_OBJECT_BANNER_ALLY = 3, - BG_AB_OBJECT_BANNER_HORDE = 4, - BG_AB_OBJECT_AURA_ALLY = 5, - BG_AB_OBJECT_AURA_HORDE = 6, - BG_AB_OBJECT_AURA_CONTESTED = 7, - //gates - BG_AB_OBJECT_GATE_A = 40, - BG_AB_OBJECT_GATE_H = 41, + // TODO drop them (pool-system should be used for this) //buffs - BG_AB_OBJECT_SPEEDBUFF_STABLES = 42, - BG_AB_OBJECT_REGENBUFF_STABLES = 43, - BG_AB_OBJECT_BERSERKBUFF_STABLES = 44, - BG_AB_OBJECT_SPEEDBUFF_BLACKSMITH = 45, - BG_AB_OBJECT_REGENBUFF_BLACKSMITH = 46, - BG_AB_OBJECT_BERSERKBUFF_BLACKSMITH = 47, - BG_AB_OBJECT_SPEEDBUFF_FARM = 48, - BG_AB_OBJECT_REGENBUFF_FARM = 49, - BG_AB_OBJECT_BERSERKBUFF_FARM = 50, - BG_AB_OBJECT_SPEEDBUFF_LUMBER_MILL = 51, - BG_AB_OBJECT_REGENBUFF_LUMBER_MILL = 52, - BG_AB_OBJECT_BERSERKBUFF_LUMBER_MILL = 53, - BG_AB_OBJECT_SPEEDBUFF_GOLD_MINE = 54, - BG_AB_OBJECT_REGENBUFF_GOLD_MINE = 55, - BG_AB_OBJECT_BERSERKBUFF_GOLD_MINE = 56, - BG_AB_OBJECT_MAX = 57, + BG_AB_OBJECT_SPEEDBUFF_STABLES = 1, + BG_AB_OBJECT_REGENBUFF_STABLES = 2, + BG_AB_OBJECT_BERSERKBUFF_STABLES = 3, + BG_AB_OBJECT_SPEEDBUFF_BLACKSMITH = 4, + BG_AB_OBJECT_REGENBUFF_BLACKSMITH = 5, + BG_AB_OBJECT_BERSERKBUFF_BLACKSMITH = 6, + BG_AB_OBJECT_SPEEDBUFF_FARM = 7, + BG_AB_OBJECT_REGENBUFF_FARM = 8, + BG_AB_OBJECT_BERSERKBUFF_FARM = 9, + BG_AB_OBJECT_SPEEDBUFF_LUMBER_MILL = 10, + BG_AB_OBJECT_REGENBUFF_LUMBER_MILL = 11, + BG_AB_OBJECT_BERSERKBUFF_LUMBER_MILL = 12, + BG_AB_OBJECT_SPEEDBUFF_GOLD_MINE = 13, + BG_AB_OBJECT_REGENBUFF_GOLD_MINE = 14, + BG_AB_OBJECT_BERSERKBUFF_GOLD_MINE = 15, + BG_AB_OBJECT_MAX = 16, }; -/* Object id templates from DB */ -enum BG_AB_ObjectTypes -{ - BG_AB_OBJECTID_BANNER_A = 180058, - BG_AB_OBJECTID_BANNER_CONT_A = 180059, - BG_AB_OBJECTID_BANNER_H = 180060, - BG_AB_OBJECTID_BANNER_CONT_H = 180061, - BG_AB_OBJECTID_AURA_A = 180100, - BG_AB_OBJECTID_AURA_H = 180101, - BG_AB_OBJECTID_AURA_C = 180102, - - BG_AB_OBJECTID_GATE_A = 180255, - BG_AB_OBJECTID_GATE_H = 180256 -}; +/* node events */ +// node-events are just event1=BG_AB_Nodes, event2=BG_AB_NodeStatus +// so we don't need to define the constants here :) enum BG_AB_Timers { @@ -133,22 +101,18 @@ enum BG_AB_Score }; /* do NOT change the order, else wrong behaviour */ -enum BG_AB_BattleGroundNodes +enum BG_AB_Nodes { BG_AB_NODE_STABLES = 0, BG_AB_NODE_BLACKSMITH = 1, BG_AB_NODE_FARM = 2, BG_AB_NODE_LUMBER_MILL = 3, BG_AB_NODE_GOLD_MINE = 4, - - BG_AB_DYNAMIC_NODES_COUNT = 5, // dynamic nodes that can be captured - - BG_AB_SPIRIT_ALIANCE = 5, - BG_AB_SPIRIT_HORDE = 6, - - BG_AB_ALL_NODES_COUNT = 7, // all nodes (dynamic and static) + BG_AB_NODES_ERROR = 255 }; +#define BG_AB_NODES_MAX 5 + enum BG_AB_NodeStatus { BG_AB_NODE_TYPE_NEUTRAL = 0, @@ -175,30 +139,15 @@ enum BG_AB_Sounds #define BG_AB_NotABBGWeekendReputationTicks 200 #define BG_AB_ABBGWeekendReputationTicks 150 -// x, y, z, o -const float BG_AB_NodePositions[BG_AB_DYNAMIC_NODES_COUNT][4] = { - {1166.785f, 1200.132f, -56.70859f, 0.9075713f}, // stables - {977.0156f, 1046.616f, -44.80923f, -2.600541f}, // blacksmith - {806.1821f, 874.2723f, -55.99371f, -2.303835f}, // farm - {856.1419f, 1148.902f, 11.18469f, -2.303835f}, // lumber mill - {1146.923f, 848.1782f, -110.917f, -0.7330382f} // gold mine -}; - -// x, y, z, o, rot0, rot1, rot2, rot3 -const float BG_AB_DoorPositions[2][8] = { - {1284.597f, 1281.167f, -15.97792f, 0.7068594f, 0.012957f, -0.060288f, 0.344959f, 0.93659f}, - {708.0903f, 708.4479f, -17.8342f, -2.391099f, 0.050291f, 0.015127f, 0.929217f, -0.365784f} -}; - // Tick intervals and given points: case 0,1,2,3,4,5 captured nodes const uint32 BG_AB_TickIntervals[6] = {0, 12000, 9000, 6000, 3000, 1000}; const uint32 BG_AB_TickPoints[6] = {0, 10, 10, 10, 10, 30}; // WorldSafeLocs ids for 5 nodes, and for ally, and horde starting location -const uint32 BG_AB_GraveyardIds[BG_AB_ALL_NODES_COUNT] = {895, 894, 893, 897, 896, 898, 899}; +const uint32 BG_AB_GraveyardIds[7] = {895, 894, 893, 897, 896, 898, 899}; // x, y, z, o -const float BG_AB_BuffPositions[BG_AB_DYNAMIC_NODES_COUNT][4] = { +const float BG_AB_BuffPositions[BG_AB_NODES_MAX][4] = { {1185.71f, 1185.24f, -56.36f, 2.56f}, // stables {990.75f, 1008.18f, -42.60f, 2.43f}, // blacksmith {817.66f, 843.34f, -56.54f, 3.01f}, // farm @@ -206,17 +155,6 @@ const float BG_AB_BuffPositions[BG_AB_DYNAMIC_NODES_COUNT][4] = { {1146.62f, 816.94f, -98.49f, 6.14f} // gold mine }; -// x, y, z, o -const float BG_AB_SpiritGuidePos[BG_AB_ALL_NODES_COUNT][4] = { - {1200.03f, 1171.09f, -56.47f, 5.15f}, // stables - {1017.43f, 960.61f, -42.95f, 4.88f}, // blacksmith - {833.00f, 793.00f, -57.25f, 5.27f}, // farm - {775.17f, 1206.40f, 15.79f, 1.90f}, // lumber mill - {1207.48f, 787.00f, -83.36f, 5.51f}, // gold mine - {1354.05f, 1275.48f, -11.30f, 4.77f}, // alliance starting base - {714.61f, 646.15f, -10.87f, 4.34f} // horde starting base -}; - struct BG_AB_BannerTimer { uint32 timer; @@ -272,7 +210,6 @@ class BattleGroundAB : public BattleGround /* Creature spawning/despawning */ // TODO: working, scripted peons spawning void _NodeOccupied(uint8 node,Team team); - void _NodeDeOccupied(uint8 node); int32 _GetNodeNameId(uint8 node); @@ -282,10 +219,10 @@ class BattleGroundAB : public BattleGround 2: horde contested 3: ally occupied 4: horde occupied */ - uint8 m_Nodes[BG_AB_DYNAMIC_NODES_COUNT]; - uint8 m_prevNodes[BG_AB_DYNAMIC_NODES_COUNT]; - BG_AB_BannerTimer m_BannerTimers[BG_AB_DYNAMIC_NODES_COUNT]; - uint32 m_NodeTimers[BG_AB_DYNAMIC_NODES_COUNT]; + uint8 m_Nodes[BG_AB_NODES_MAX]; + uint8 m_prevNodes[BG_AB_NODES_MAX]; // used for performant wordlstate-updating + BG_AB_BannerTimer m_BannerTimers[BG_AB_NODES_MAX]; + uint32 m_NodeTimers[BG_AB_NODES_MAX]; uint32 m_lastTick[BG_TEAMS_COUNT]; uint32 m_HonorScoreTics[BG_TEAMS_COUNT]; uint32 m_ReputationScoreTics[BG_TEAMS_COUNT]; diff --git a/src/game/BattleGroundBE.cpp b/src/game/BattleGroundBE.cpp index 482b15387..fddc8bc45 100644 --- a/src/game/BattleGroundBE.cpp +++ b/src/game/BattleGroundBE.cpp @@ -26,8 +26,6 @@ BattleGroundBE::BattleGroundBE() { - m_BgObjects.resize(BG_BE_OBJECT_MAX); - m_StartDelayTimes[BG_STARTING_EVENT_FIRST] = BG_START_DELAY_1M; m_StartDelayTimes[BG_STARTING_EVENT_SECOND] = BG_START_DELAY_30S; m_StartDelayTimes[BG_STARTING_EVENT_THIRD] = BG_START_DELAY_15S; @@ -56,20 +54,11 @@ void BattleGroundBE::Update(uint32 diff) void BattleGroundBE::StartingEventCloseDoors() { - for(uint32 i = BG_BE_OBJECT_DOOR_1; i <= BG_BE_OBJECT_DOOR_4; ++i) - SpawnBGObject(m_BgObjects[i], RESPAWN_IMMEDIATELY); - - for(uint32 i = BG_BE_OBJECT_BUFF_1; i <= BG_BE_OBJECT_BUFF_2; ++i) - SpawnBGObject(m_BgObjects[i], RESPAWN_ONE_DAY); } void BattleGroundBE::StartingEventOpenDoors() { - for(uint32 i = BG_BE_OBJECT_DOOR_1; i <= BG_BE_OBJECT_DOOR_2; ++i) - DoorOpen(m_BgObjects[i]); - - for(uint32 i = BG_BE_OBJECT_BUFF_1; i <= BG_BE_OBJECT_BUFF_2; ++i) - SpawnBGObject(m_BgObjects[i], 60); + OpenDoorEvent(BG_EVENT_DOOR); } void BattleGroundBE::AddPlayer(Player *plr) @@ -161,19 +150,6 @@ void BattleGroundBE::Reset() bool BattleGroundBE::SetupBattleGround() { - // gates - if (!AddObject(BG_BE_OBJECT_DOOR_1, BG_BE_OBJECT_TYPE_DOOR_1, 6287.277f, 282.1877f, 3.810925f, -2.260201f, 0, 0, 0.9044551f, -0.4265689f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_BE_OBJECT_DOOR_2, BG_BE_OBJECT_TYPE_DOOR_2, 6189.546f, 241.7099f, 3.101481f, 0.8813917f, 0, 0, 0.4265689f, 0.9044551f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_BE_OBJECT_DOOR_3, BG_BE_OBJECT_TYPE_DOOR_3, 6299.116f, 296.5494f, 3.308032f, 0.8813917f, 0, 0, 0.4265689f, 0.9044551f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_BE_OBJECT_DOOR_4, BG_BE_OBJECT_TYPE_DOOR_4, 6177.708f, 227.3481f, 3.604374f, -2.260201f, 0, 0, 0.9044551f, -0.4265689f, RESPAWN_IMMEDIATELY) - // buffs - || !AddObject(BG_BE_OBJECT_BUFF_1, BG_BE_OBJECT_TYPE_BUFF_1, 6249.042f, 275.3239f, 11.22033f, -1.448624f, 0, 0, 0.6626201f, -0.7489557f, 120) - || !AddObject(BG_BE_OBJECT_BUFF_2, BG_BE_OBJECT_TYPE_BUFF_2, 6228.26f, 249.566f, 11.21812f, -0.06981307f, 0, 0, 0.03489945f, -0.9993908f, 120)) - { - sLog.outErrorDb("BatteGroundBE: Failed to spawn some object!"); - return false; - } - return true; } diff --git a/src/game/BattleGroundBE.h b/src/game/BattleGroundBE.h index 0fea026e5..bbc130503 100644 --- a/src/game/BattleGroundBE.h +++ b/src/game/BattleGroundBE.h @@ -20,27 +20,6 @@ class BattleGround; -enum BattleGroundBEObjectTypes -{ - BG_BE_OBJECT_DOOR_1 = 0, - BG_BE_OBJECT_DOOR_2 = 1, - BG_BE_OBJECT_DOOR_3 = 2, - BG_BE_OBJECT_DOOR_4 = 3, - BG_BE_OBJECT_BUFF_1 = 4, - BG_BE_OBJECT_BUFF_2 = 5, - BG_BE_OBJECT_MAX = 6 -}; - -enum BattleGroundBEObjects -{ - BG_BE_OBJECT_TYPE_DOOR_1 = 183971, - BG_BE_OBJECT_TYPE_DOOR_2 = 183973, - BG_BE_OBJECT_TYPE_DOOR_3 = 183970, - BG_BE_OBJECT_TYPE_DOOR_4 = 183972, - BG_BE_OBJECT_TYPE_BUFF_1 = 184663, - BG_BE_OBJECT_TYPE_BUFF_2 = 184664 -}; - class BattleGroundBEScore : public BattleGroundScore { public: diff --git a/src/game/BattleGroundEY.cpp b/src/game/BattleGroundEY.cpp index 2de51699a..d9855e150 100644 --- a/src/game/BattleGroundEY.cpp +++ b/src/game/BattleGroundEY.cpp @@ -31,7 +31,7 @@ BattleGroundEY::BattleGroundEY() { m_BuffChange = true; m_BgObjects.resize(BG_EY_OBJECT_MAX); - m_BgCreatures.resize(BG_EY_CREATURES_MAX); + m_Points_Trigger[FEL_REALVER] = TR_FEL_REALVER_BUFF; m_Points_Trigger[BLOOD_ELF] = TR_BLOOD_ELF_BUFF; m_Points_Trigger[DRAENEI_RUINS] = TR_DRAENEI_RUINS_BUFF; @@ -95,21 +95,14 @@ void BattleGroundEY::Update(uint32 diff) void BattleGroundEY::StartingEventCloseDoors() { - SpawnBGObject(m_BgObjects[BG_EY_OBJECT_DOOR_A], RESPAWN_IMMEDIATELY); - SpawnBGObject(m_BgObjects[BG_EY_OBJECT_DOOR_H], RESPAWN_IMMEDIATELY); - - for(uint32 i = BG_EY_OBJECT_A_BANNER_FEL_REALVER_CENTER; i < BG_EY_OBJECT_MAX; ++i) - SpawnBGObject(m_BgObjects[i], RESPAWN_ONE_DAY); } void BattleGroundEY::StartingEventOpenDoors() { - SpawnBGObject(m_BgObjects[BG_EY_OBJECT_DOOR_A], RESPAWN_ONE_DAY); - SpawnBGObject(m_BgObjects[BG_EY_OBJECT_DOOR_H], RESPAWN_ONE_DAY); + // eye-doors are despawned, not opened + SpawnEvent(BG_EVENT_DOOR, 0, false); - for(uint32 i = BG_EY_OBJECT_N_BANNER_FEL_REALVER_CENTER; i <= BG_EY_OBJECT_FLAG_NETHERSTORM; ++i) - SpawnBGObject(m_BgObjects[i], RESPAWN_IMMEDIATELY); - for(uint32 i = 0; i < EY_POINTS_MAX; ++i) + for(uint32 i = 0; i < BG_EY_NODES_MAX; ++i) { //randomly spawn buff uint8 buff = urand(0, 2); @@ -132,37 +125,33 @@ void BattleGroundEY::AddPoints(uint32 Team, uint32 Points) void BattleGroundEY::CheckSomeoneJoinedPoint() { - GameObject *obj = NULL; - for (uint8 i = 0; i < EY_POINTS_MAX; ++i) + for (uint8 i = 0; i < BG_EY_NODES_MAX; ++i) { - obj = HashMapHolder::Find(m_BgObjects[BG_EY_OBJECT_TOWER_CAP_FEL_REALVER + i]); - if (obj) + uint8 j = 0; + while (j < m_PlayersNearPoint[BG_EY_NODES_MAX].size()) { - uint8 j = 0; - while (j < m_PlayersNearPoint[EY_POINTS_MAX].size()) + Player *plr = objmgr.GetPlayer(m_PlayersNearPoint[BG_EY_NODES_MAX][j]); + if (!plr) { - Player *plr = objmgr.GetPlayer(m_PlayersNearPoint[EY_POINTS_MAX][j]); - if (!plr) - { - sLog.outError("BattleGroundEY: Player (GUID: %u) not found!", GUID_LOPART(m_PlayersNearPoint[EY_POINTS_MAX][j])); - ++j; - continue; - } - if (plr->CanCaptureTowerPoint() && plr->IsWithinDistInMap(obj, BG_EY_POINT_RADIUS)) - { - //player joined point! - //show progress bar - UpdateWorldStateForPlayer(PROGRESS_BAR_PERCENT_GREY, BG_EY_PROGRESS_BAR_PERCENT_GREY, plr); - UpdateWorldStateForPlayer(PROGRESS_BAR_STATUS, m_PointBarStatus[i], plr); - UpdateWorldStateForPlayer(PROGRESS_BAR_SHOW, BG_EY_PROGRESS_BAR_SHOW, plr); - //add player to point - m_PlayersNearPoint[i].push_back(m_PlayersNearPoint[EY_POINTS_MAX][j]); - //remove player from "free space" - m_PlayersNearPoint[EY_POINTS_MAX].erase(m_PlayersNearPoint[EY_POINTS_MAX].begin() + j); - } - else - ++j; + sLog.outError("BattleGroundEY: Player (GUID: %u) not found!", GUID_LOPART(m_PlayersNearPoint[BG_EY_NODES_MAX][j])); + ++j; + continue; } + if (plr->CanCaptureTowerPoint() && + plr->IsWithinDist3d(BG_EY_NodePositions[i][0], BG_EY_NodePositions[i][1], BG_EY_NodePositions[i][2], BG_EY_POINT_RADIUS)) + { + //player joined point! + //show progress bar + UpdateWorldStateForPlayer(PROGRESS_BAR_PERCENT_GREY, BG_EY_PROGRESS_BAR_PERCENT_GREY, plr); + UpdateWorldStateForPlayer(PROGRESS_BAR_STATUS, m_PointBarStatus[i], plr); + UpdateWorldStateForPlayer(PROGRESS_BAR_SHOW, BG_EY_PROGRESS_BAR_SHOW, plr); + //add player to point + m_PlayersNearPoint[i].push_back(m_PlayersNearPoint[BG_EY_NODES_MAX][j]); + //remove player from "free space" + m_PlayersNearPoint[BG_EY_NODES_MAX].erase(m_PlayersNearPoint[BG_EY_NODES_MAX].begin() + j); + } + else + ++j; } } } @@ -170,40 +159,36 @@ void BattleGroundEY::CheckSomeoneJoinedPoint() void BattleGroundEY::CheckSomeoneLeftPoint() { //reset current point counts - for (uint8 i = 0; i < 2*EY_POINTS_MAX; ++i) + for (uint8 i = 0; i < 2*BG_EY_NODES_MAX; ++i) m_CurrentPointPlayersCount[i] = 0; - GameObject *obj = NULL; - for(uint8 i = 0; i < EY_POINTS_MAX; ++i) + for(uint8 i = 0; i < BG_EY_NODES_MAX; ++i) { - obj = HashMapHolder::Find(m_BgObjects[BG_EY_OBJECT_TOWER_CAP_FEL_REALVER + i]); - if (obj) + uint8 j = 0; + while (j < m_PlayersNearPoint[i].size()) { - uint8 j = 0; - while (j < m_PlayersNearPoint[i].size()) + Player *plr = objmgr.GetPlayer(m_PlayersNearPoint[i][j]); + if (!plr) { - Player *plr = objmgr.GetPlayer(m_PlayersNearPoint[i][j]); - if (!plr) - { - sLog.outError("BattleGroundEY: Player (GUID: %u) not found!", GUID_LOPART(m_PlayersNearPoint[i][j])); - //move not existed player to "free space" - this will cause many error showing in log, but it is a very important bug - m_PlayersNearPoint[EY_POINTS_MAX].push_back(m_PlayersNearPoint[i][j]); - m_PlayersNearPoint[i].erase(m_PlayersNearPoint[i].begin() + j); - ++j; - continue; - } - if (!plr->CanCaptureTowerPoint() || !plr->IsWithinDistInMap(obj, BG_EY_POINT_RADIUS)) - //move player out of point (add him to players that are out of points - { - m_PlayersNearPoint[EY_POINTS_MAX].push_back(m_PlayersNearPoint[i][j]); - m_PlayersNearPoint[i].erase(m_PlayersNearPoint[i].begin() + j); - UpdateWorldStateForPlayer(PROGRESS_BAR_SHOW, BG_EY_PROGRESS_BAR_DONT_SHOW, plr); - } - else - { - //player is neat flag, so update count: - m_CurrentPointPlayersCount[2 * i + GetTeamIndexByTeamId(plr->GetTeam())]++; - ++j; - } + sLog.outError("BattleGroundEY: Player (GUID: %u) not found!", GUID_LOPART(m_PlayersNearPoint[i][j])); + //move not existed player to "free space" - this will cause many error showing in log, but it is a very important bug + m_PlayersNearPoint[BG_EY_NODES_MAX].push_back(m_PlayersNearPoint[i][j]); + m_PlayersNearPoint[i].erase(m_PlayersNearPoint[i].begin() + j); + ++j; + continue; + } + if (!plr->CanCaptureTowerPoint() || + !plr->IsWithinDist3d(BG_EY_NodePositions[i][0], BG_EY_NodePositions[i][1], BG_EY_NodePositions[i][2], BG_EY_POINT_RADIUS)) + //move player out of point (add him to players that are out of points + { + m_PlayersNearPoint[BG_EY_NODES_MAX].push_back(m_PlayersNearPoint[i][j]); + m_PlayersNearPoint[i].erase(m_PlayersNearPoint[i].begin() + j); + UpdateWorldStateForPlayer(PROGRESS_BAR_SHOW, BG_EY_PROGRESS_BAR_DONT_SHOW, plr); + } + else + { + //player is neat flag, so update count: + m_CurrentPointPlayersCount[2 * i + GetTeamIndexByTeamId(plr->GetTeam())]++; + ++j; } } } @@ -211,7 +196,7 @@ void BattleGroundEY::CheckSomeoneLeftPoint() void BattleGroundEY::UpdatePointStatuses() { - for(uint8 point = 0; point < EY_POINTS_MAX; ++point) + for(uint8 point = 0; point < BG_EY_NODES_MAX; ++point) { if (m_PlayersNearPoint[point].empty()) continue; @@ -309,19 +294,19 @@ void BattleGroundEY::UpdatePointsIcons(uint32 Team, uint32 Point) //we MUST firstly send 0, after that we can send 1!!! if (m_PointState[Point] == EY_POINT_UNDER_CONTROL) { - UpdateWorldState(m_PointsIconStruct[Point].WorldStateControlIndex, 0); + UpdateWorldState(PointsIconStruct[Point].WorldStateControlIndex, 0); if (Team == ALLIANCE) - UpdateWorldState(m_PointsIconStruct[Point].WorldStateAllianceControlledIndex, 1); + UpdateWorldState(PointsIconStruct[Point].WorldStateAllianceControlledIndex, 1); else - UpdateWorldState(m_PointsIconStruct[Point].WorldStateHordeControlledIndex, 1); + UpdateWorldState(PointsIconStruct[Point].WorldStateHordeControlledIndex, 1); } else { if (Team == ALLIANCE) - UpdateWorldState(m_PointsIconStruct[Point].WorldStateAllianceControlledIndex, 0); + UpdateWorldState(PointsIconStruct[Point].WorldStateAllianceControlledIndex, 0); else - UpdateWorldState(m_PointsIconStruct[Point].WorldStateHordeControlledIndex, 0); - UpdateWorldState(m_PointsIconStruct[Point].WorldStateControlIndex, 1); + UpdateWorldState(PointsIconStruct[Point].WorldStateHordeControlledIndex, 0); + UpdateWorldState(PointsIconStruct[Point].WorldStateControlIndex, 1); } } @@ -331,7 +316,7 @@ void BattleGroundEY::AddPlayer(Player *plr) //create score and add it to map BattleGroundEYScore* sc = new BattleGroundEYScore; - m_PlayersNearPoint[EY_POINTS_MAX].push_back(plr->GetGUID()); + m_PlayersNearPoint[BG_EY_NODES_MAX].push_back(plr->GetGUID()); m_PlayerScores[plr->GetGUID()] = sc; } @@ -339,7 +324,7 @@ void BattleGroundEY::AddPlayer(Player *plr) void BattleGroundEY::RemovePlayer(Player *plr, uint64 guid) { // sometimes flag aura not removed :( - for (int j = EY_POINTS_MAX; j >= 0; --j) + for (int j = BG_EY_NODES_MAX; j >= 0; --j) { for(size_t i = 0; i < m_PlayersNearPoint[j].size(); ++i) if (m_PlayersNearPoint[j][i] == guid) @@ -373,22 +358,22 @@ void BattleGroundEY::HandleAreaTrigger(Player *Source, uint32 Trigger) case TR_BLOOD_ELF_POINT: if (m_PointState[BLOOD_ELF] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[BLOOD_ELF] == Source->GetTeam()) if (m_FlagState && GetFlagPickerGUID() == Source->GetGUID()) - EventPlayerCapturedFlag(Source, BG_EY_OBJECT_FLAG_BLOOD_ELF); + EventPlayerCapturedFlag(Source, BG_EY_NODE_BLOOD_ELF); break; case TR_FEL_REALVER_POINT: if (m_PointState[FEL_REALVER] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[FEL_REALVER] == Source->GetTeam()) if (m_FlagState && GetFlagPickerGUID() == Source->GetGUID()) - EventPlayerCapturedFlag(Source, BG_EY_OBJECT_FLAG_FEL_REALVER); + EventPlayerCapturedFlag(Source, BG_EY_NODE_FEL_REALVER); break; case TR_MAGE_TOWER_POINT: if (m_PointState[MAGE_TOWER] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[MAGE_TOWER] == Source->GetTeam()) if (m_FlagState && GetFlagPickerGUID() == Source->GetGUID()) - EventPlayerCapturedFlag(Source, BG_EY_OBJECT_FLAG_MAGE_TOWER); + EventPlayerCapturedFlag(Source, BG_EY_NODE_MAGE_TOWER); break; case TR_DRAENEI_RUINS_POINT: if (m_PointState[DRAENEI_RUINS] == EY_POINT_UNDER_CONTROL && m_PointOwnedByTeam[DRAENEI_RUINS] == Source->GetTeam()) if (m_FlagState && GetFlagPickerGUID() == Source->GetGUID()) - EventPlayerCapturedFlag(Source, BG_EY_OBJECT_FLAG_DRAENEI_RUINS); + EventPlayerCapturedFlag(Source, BG_EY_NODE_DRAENEI_RUINS); break; case 4512: case 4515: @@ -410,67 +395,8 @@ void BattleGroundEY::HandleAreaTrigger(Player *Source, uint32 Trigger) bool BattleGroundEY::SetupBattleGround() { - // doors - if (!AddObject(BG_EY_OBJECT_DOOR_A, BG_OBJECT_A_DOOR_EY_ENTRY, 2527.6f, 1596.91f, 1262.13f, -3.12414f, -0.173642f, -0.001515f, 0.98477f, -0.008594f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_EY_OBJECT_DOOR_H, BG_OBJECT_H_DOOR_EY_ENTRY, 1803.21f, 1539.49f, 1261.09f, 3.14159f, 0.173648f, 0, 0.984808f, 0, RESPAWN_IMMEDIATELY) - // banners (alliance) - || !AddObject(BG_EY_OBJECT_A_BANNER_FEL_REALVER_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2057.46f, 1735.07f, 1187.91f, -0.925024f, 0, 0, 0.446198f, -0.894934f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_FEL_REALVER_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2032.25f, 1729.53f, 1190.33f, 1.8675f, 0, 0, 0.803857f, 0.594823f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_FEL_REALVER_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2092.35f, 1775.46f, 1187.08f, -0.401426f, 0, 0, 0.199368f, -0.979925f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_BLOOD_ELF_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2047.19f, 1349.19f, 1189.0f, -1.62316f, 0, 0, 0.725374f, -0.688354f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_BLOOD_ELF_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2074.32f, 1385.78f, 1194.72f, 0.488692f, 0, 0, 0.241922f, 0.970296f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_BLOOD_ELF_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2025.13f, 1386.12f, 1192.74f, 2.3911f, 0, 0, 0.930418f, 0.366501f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2276.8f, 1400.41f, 1196.33f, 2.44346f, 0, 0, 0.939693f, 0.34202f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2305.78f, 1404.56f, 1199.38f, 1.74533f, 0, 0, 0.766044f, 0.642788f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2245.4f, 1366.41f, 1195.28f, 2.21657f, 0, 0, 0.894934f, 0.446198f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_MAGE_TOWER_CENTER, BG_OBJECT_A_BANNER_EY_ENTRY, 2270.84f, 1784.08f, 1186.76f, 2.42601f, 0, 0, 0.936672f, 0.350207f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_MAGE_TOWER_LEFT, BG_OBJECT_A_BANNER_EY_ENTRY, 2269.13f, 1737.7f, 1186.66f, 0.994838f, 0, 0, 0.477159f, 0.878817f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_A_BANNER_MAGE_TOWER_RIGHT, BG_OBJECT_A_BANNER_EY_ENTRY, 2300.86f, 1741.25f, 1187.7f, -0.785398f, 0, 0, 0.382683f, -0.92388f, RESPAWN_ONE_DAY) - // banners (horde) - || !AddObject(BG_EY_OBJECT_H_BANNER_FEL_REALVER_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2057.46f, 1735.07f, 1187.91f, -0.925024f, 0, 0, 0.446198f, -0.894934f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_FEL_REALVER_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2032.25f, 1729.53f, 1190.33f, 1.8675f, 0, 0, 0.803857f, 0.594823f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_FEL_REALVER_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2092.35f, 1775.46f, 1187.08f, -0.401426f, 0, 0, 0.199368f, -0.979925f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_BLOOD_ELF_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2047.19f, 1349.19f, 1189.0f, -1.62316f, 0, 0, 0.725374f, -0.688354f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_BLOOD_ELF_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2074.32f, 1385.78f, 1194.72f, 0.488692f, 0, 0, 0.241922f, 0.970296f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_BLOOD_ELF_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2025.13f, 1386.12f, 1192.74f, 2.3911f, 0, 0, 0.930418f, 0.366501f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2276.8f, 1400.41f, 1196.33f, 2.44346f, 0, 0, 0.939693f, 0.34202f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2305.78f, 1404.56f, 1199.38f, 1.74533f, 0, 0, 0.766044f, 0.642788f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2245.4f, 1366.41f, 1195.28f, 2.21657f, 0, 0, 0.894934f, 0.446198f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_MAGE_TOWER_CENTER, BG_OBJECT_H_BANNER_EY_ENTRY, 2270.84f, 1784.08f, 1186.76f, 2.42601f, 0, 0, 0.936672f, 0.350207f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_MAGE_TOWER_LEFT, BG_OBJECT_H_BANNER_EY_ENTRY, 2269.13f, 1737.7f, 1186.66f, 0.994838f, 0, 0, 0.477159f, 0.878817f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_H_BANNER_MAGE_TOWER_RIGHT, BG_OBJECT_H_BANNER_EY_ENTRY, 2300.86f, 1741.25f, 1187.7f, -0.785398f, 0, 0, 0.382683f, -0.92388f, RESPAWN_ONE_DAY) - // banners (natural) - || !AddObject(BG_EY_OBJECT_N_BANNER_FEL_REALVER_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2057.46f, 1735.07f, 1187.91f, -0.925024f, 0, 0, 0.446198f, -0.894934f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_FEL_REALVER_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2032.25f, 1729.53f, 1190.33f, 1.8675f, 0, 0, 0.803857f, 0.594823f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_FEL_REALVER_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2092.35f, 1775.46f, 1187.08f, -0.401426f, 0, 0, 0.199368f, -0.979925f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2047.19f, 1349.19f, 1189.0f, -1.62316f, 0, 0, 0.725374f, -0.688354f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2074.32f, 1385.78f, 1194.72f, 0.488692f, 0, 0, 0.241922f, 0.970296f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2025.13f, 1386.12f, 1192.74f, 2.3911f, 0, 0, 0.930418f, 0.366501f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2276.8f, 1400.41f, 1196.33f, 2.44346f, 0, 0, 0.939693f, 0.34202f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2305.78f, 1404.56f, 1199.38f, 1.74533f, 0, 0, 0.766044f, 0.642788f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2245.4f, 1366.41f, 1195.28f, 2.21657f, 0, 0, 0.894934f, 0.446198f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_CENTER, BG_OBJECT_N_BANNER_EY_ENTRY, 2270.84f, 1784.08f, 1186.76f, 2.42601f, 0, 0, 0.936672f, 0.350207f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_LEFT, BG_OBJECT_N_BANNER_EY_ENTRY, 2269.13f, 1737.7f, 1186.66f, 0.994838f, 0, 0, 0.477159f, 0.878817f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_RIGHT, BG_OBJECT_N_BANNER_EY_ENTRY, 2300.86f, 1741.25f, 1187.7f, -0.785398f, 0, 0, 0.382683f, -0.92388f, RESPAWN_ONE_DAY) - // flags - || !AddObject(BG_EY_OBJECT_FLAG_NETHERSTORM, BG_OBJECT_FLAG2_EY_ENTRY, 2174.782227f, 1569.054688f, 1160.361938f, -1.448624f, 0, 0, 0.662620f, -0.748956f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_FLAG_FEL_REALVER, BG_OBJECT_FLAG1_EY_ENTRY, 2044.28f, 1729.68f, 1189.96f, -0.017453f, 0, 0, 0.008727f, -0.999962f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_FLAG_BLOOD_ELF, BG_OBJECT_FLAG1_EY_ENTRY, 2048.83f, 1393.65f, 1194.49f, 0.20944f, 0, 0, 0.104528f, 0.994522f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_FLAG_DRAENEI_RUINS, BG_OBJECT_FLAG1_EY_ENTRY, 2286.56f, 1402.36f, 1197.11f, 3.72381f, 0, 0, 0.957926f, -0.287016f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_FLAG_MAGE_TOWER, BG_OBJECT_FLAG1_EY_ENTRY, 2284.48f, 1731.23f, 1189.99f, 2.89725f, 0, 0, 0.992546f, 0.121869f, RESPAWN_ONE_DAY) - // tower cap - || !AddObject(BG_EY_OBJECT_TOWER_CAP_FEL_REALVER, BG_OBJECT_FR_TOWER_CAP_EY_ENTRY, 2024.600708f, 1742.819580f, 1195.157715f, 2.443461f, 0, 0, 0.939693f, 0.342020f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_TOWER_CAP_BLOOD_ELF, BG_OBJECT_BE_TOWER_CAP_EY_ENTRY, 2050.493164f, 1372.235962f, 1194.563477f, 1.710423f, 0, 0, 0.754710f, 0.656059f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_TOWER_CAP_DRAENEI_RUINS, BG_OBJECT_DR_TOWER_CAP_EY_ENTRY, 2301.010498f, 1386.931641f, 1197.183472f, 1.570796f, 0, 0, 0.707107f, 0.707107f, RESPAWN_ONE_DAY) - || !AddObject(BG_EY_OBJECT_TOWER_CAP_MAGE_TOWER, BG_OBJECT_HU_TOWER_CAP_EY_ENTRY, 2282.121582f, 1760.006958f, 1189.707153f, 1.919862f, 0, 0, 0.819152f, 0.573576f, RESPAWN_ONE_DAY) - ) - { - sLog.outErrorDb("BatteGroundEY: Failed to spawn some object BattleGround not created!"); - return false; - } - //buffs - for (int i = 0; i < EY_POINTS_MAX; ++i) + for (int i = 0; i < BG_EY_NODES_MAX; ++i) { AreaTriggerEntry const* at = sAreaTriggerStore.LookupEntry(m_Points_Trigger[i]); if (!at) @@ -485,21 +411,6 @@ bool BattleGroundEY::SetupBattleGround() sLog.outError("BattleGroundEY: Cannot spawn buff"); } - WorldSafeLocsEntry const *sg = NULL; - sg = sWorldSafeLocsStore.LookupEntry(EY_GRAVEYARD_MAIN_ALLIANCE); - if (!sg || !AddSpiritGuide(EY_SPIRIT_MAIN_ALLIANCE, sg->x, sg->y, sg->z, 3.124139f, ALLIANCE)) - { - sLog.outErrorDb("BatteGroundEY: Failed to spawn spirit guide! BattleGround not created!"); - return false; - } - - sg = sWorldSafeLocsStore.LookupEntry(EY_GRAVEYARD_MAIN_HORDE); - if (!sg || !AddSpiritGuide(EY_SPIRIT_MAIN_HORDE, sg->x, sg->y, sg->z, 3.193953f, HORDE)) - { - sLog.outErrorDb("BatteGroundEY: Failed to spawn spirit guide! BattleGround not created!"); - return false; - } - return true; } @@ -515,7 +426,6 @@ void BattleGroundEY::Reset() m_HonorScoreTics[BG_TEAM_ALLIANCE] = 0; m_HonorScoreTics[BG_TEAM_HORDE] = 0; m_FlagState = BG_EY_FLAG_STATE_ON_BASE; - m_FlagCapturedBgObjectType = 0; m_FlagKeeper = 0; m_DroppedFlagGUID = 0; m_PointAddingTimer = 0; @@ -523,26 +433,27 @@ void BattleGroundEY::Reset() bool isBGWeekend = sBattleGroundMgr.IsBGWeekend(GetTypeID()); m_HonorTics = (isBGWeekend) ? BG_EY_EYWeekendHonorTicks : BG_EY_NotEYWeekendHonorTicks; - for(uint8 i = 0; i < EY_POINTS_MAX; ++i) + for(uint8 i = 0; i < BG_EY_NODES_MAX; ++i) { m_PointOwnedByTeam[i] = EY_POINT_NO_OWNER; m_PointState[i] = EY_POINT_STATE_UNCONTROLLED; m_PointBarStatus[i] = BG_EY_PROGRESS_BAR_STATE_MIDDLE; m_PlayersNearPoint[i].clear(); m_PlayersNearPoint[i].reserve(15); //tip size + m_ActiveEvents[i] = BG_EYE_NEUTRAL_TEAM; // neutral team owns every node } + // the flag in the middle is spawned at beginning + m_ActiveEvents[BG_EY_EVENT_CAPTURE_FLAG] = BG_EY_EVENT2_FLAG_CENTER; + m_PlayersNearPoint[EY_PLAYERS_OUT_OF_POINTS].clear(); m_PlayersNearPoint[EY_PLAYERS_OUT_OF_POINTS].reserve(30); } void BattleGroundEY::RespawnFlag(bool send_message) { - if (m_FlagCapturedBgObjectType > 0) - SpawnBGObject(m_BgObjects[m_FlagCapturedBgObjectType], RESPAWN_ONE_DAY); - - m_FlagCapturedBgObjectType = 0; m_FlagState = BG_EY_FLAG_STATE_ON_BASE; - SpawnBGObject(m_BgObjects[BG_EY_OBJECT_FLAG_NETHERSTORM], RESPAWN_IMMEDIATELY); + // will despawn captured flags at the node and spawn in center + SpawnEvent(BG_EY_EVENT_CAPTURE_FLAG, BG_EY_EVENT2_FLAG_CENTER, true); if (send_message) { @@ -631,7 +542,9 @@ void BattleGroundEY::EventPlayerClickedOnFlag(Player *Source, GameObject* target UpdateWorldState(NETHERSTORM_FLAG, 0); m_FlagState = BG_EY_FLAG_STATE_ON_PLAYER; - SpawnBGObject(m_BgObjects[BG_EY_OBJECT_FLAG_NETHERSTORM], RESPAWN_ONE_DAY); + // despawn center-flag + SpawnEvent(BG_EY_EVENT_CAPTURE_FLAG, BG_EY_EVENT2_FLAG_CENTER, false); + SetFlagPicker(Source->GetGUID()); //get flag aura on player Source->CastSpell(Source, BG_EY_NETHERSTORM_FLAG_SPELL, true); @@ -648,40 +561,30 @@ void BattleGroundEY::EventTeamLostPoint(Player *Source, uint32 Point) if (GetStatus() != STATUS_IN_PROGRESS) return; - //Natural point + // neutral node uint32 Team = m_PointOwnedByTeam[Point]; if (!Team) return; if (Team == ALLIANCE) - { m_TeamPointsCount[BG_TEAM_ALLIANCE]--; - SpawnBGObject(m_BgObjects[m_LoosingPointTypes[Point].DespawnObjectTypeAlliance], RESPAWN_ONE_DAY); - SpawnBGObject(m_BgObjects[m_LoosingPointTypes[Point].DespawnObjectTypeAlliance + 1], RESPAWN_ONE_DAY); - SpawnBGObject(m_BgObjects[m_LoosingPointTypes[Point].DespawnObjectTypeAlliance + 2], RESPAWN_ONE_DAY); - } else - { m_TeamPointsCount[BG_TEAM_HORDE]--; - SpawnBGObject(m_BgObjects[m_LoosingPointTypes[Point].DespawnObjectTypeHorde], RESPAWN_ONE_DAY); - SpawnBGObject(m_BgObjects[m_LoosingPointTypes[Point].DespawnObjectTypeHorde + 1], RESPAWN_ONE_DAY); - SpawnBGObject(m_BgObjects[m_LoosingPointTypes[Point].DespawnObjectTypeHorde + 2], RESPAWN_ONE_DAY); - } - - SpawnBGObject(m_BgObjects[m_LoosingPointTypes[Point].SpawnNeutralObjectType], RESPAWN_IMMEDIATELY); - SpawnBGObject(m_BgObjects[m_LoosingPointTypes[Point].SpawnNeutralObjectType + 1], RESPAWN_IMMEDIATELY); - SpawnBGObject(m_BgObjects[m_LoosingPointTypes[Point].SpawnNeutralObjectType + 2], RESPAWN_IMMEDIATELY); - - //buff isn't despawned + // it's important to set the OwnedBy before despawning spiritguides, else + // player won't get teleported away m_PointOwnedByTeam[Point] = EY_POINT_NO_OWNER; m_PointState[Point] = EY_POINT_NO_OWNER; + SpawnEvent(Point, BG_EYE_NEUTRAL_TEAM, true); // will despawn alliance/horde + + //buff isn't despawned + if (Team == ALLIANCE) - SendMessageToAll(m_LoosingPointTypes[Point].MessageIdAlliance,CHAT_MSG_BG_SYSTEM_ALLIANCE, Source); + SendMessageToAll(LoosingPointTypes[Point].MessageIdAlliance,CHAT_MSG_BG_SYSTEM_ALLIANCE, Source); else - SendMessageToAll(m_LoosingPointTypes[Point].MessageIdHorde,CHAT_MSG_BG_SYSTEM_HORDE, Source); + SendMessageToAll(LoosingPointTypes[Point].MessageIdHorde,CHAT_MSG_BG_SYSTEM_HORDE, Source); UpdatePointsIcons(Team, Point); UpdatePointsCount(Team); @@ -694,24 +597,8 @@ void BattleGroundEY::EventTeamCapturedPoint(Player *Source, uint32 Point) uint32 Team = Source->GetTeam(); - SpawnBGObject(m_BgObjects[m_CapturingPointTypes[Point].DespawnNeutralObjectType], RESPAWN_ONE_DAY); - SpawnBGObject(m_BgObjects[m_CapturingPointTypes[Point].DespawnNeutralObjectType + 1], RESPAWN_ONE_DAY); - SpawnBGObject(m_BgObjects[m_CapturingPointTypes[Point].DespawnNeutralObjectType + 2], RESPAWN_ONE_DAY); - - if (Team == ALLIANCE) - { - m_TeamPointsCount[BG_TEAM_ALLIANCE]++; - SpawnBGObject(m_BgObjects[m_CapturingPointTypes[Point].SpawnObjectTypeAlliance], RESPAWN_IMMEDIATELY); - SpawnBGObject(m_BgObjects[m_CapturingPointTypes[Point].SpawnObjectTypeAlliance + 1], RESPAWN_IMMEDIATELY); - SpawnBGObject(m_BgObjects[m_CapturingPointTypes[Point].SpawnObjectTypeAlliance + 2], RESPAWN_IMMEDIATELY); - } - else - { - m_TeamPointsCount[BG_TEAM_HORDE]++; - SpawnBGObject(m_BgObjects[m_CapturingPointTypes[Point].SpawnObjectTypeHorde], RESPAWN_IMMEDIATELY); - SpawnBGObject(m_BgObjects[m_CapturingPointTypes[Point].SpawnObjectTypeHorde + 1], RESPAWN_IMMEDIATELY); - SpawnBGObject(m_BgObjects[m_CapturingPointTypes[Point].SpawnObjectTypeHorde + 2], RESPAWN_IMMEDIATELY); - } + m_TeamPointsCount[GetTeamIndexByTeamId(Team)]++; + SpawnEvent(Point, GetTeamIndexByTeamId(Team), true); //buff isn't respawned @@ -719,26 +606,15 @@ void BattleGroundEY::EventTeamCapturedPoint(Player *Source, uint32 Point) m_PointState[Point] = EY_POINT_UNDER_CONTROL; if (Team == ALLIANCE) - SendMessageToAll(m_CapturingPointTypes[Point].MessageIdAlliance,CHAT_MSG_BG_SYSTEM_ALLIANCE, Source); + SendMessageToAll(CapturingPointTypes[Point].MessageIdAlliance,CHAT_MSG_BG_SYSTEM_ALLIANCE, Source); else - SendMessageToAll(m_CapturingPointTypes[Point].MessageIdHorde,CHAT_MSG_BG_SYSTEM_HORDE, Source); - - if (m_BgCreatures[Point]) - DelCreature(Point); - - WorldSafeLocsEntry const *sg = NULL; - sg = sWorldSafeLocsStore.LookupEntry(m_CapturingPointTypes[Point].GraveYardId); - if (!sg || !AddSpiritGuide(Point, sg->x, sg->y, sg->z, 3.124139f, Team)) - sLog.outError("BatteGroundEY: Failed to spawn spirit guide! point: %u, team: %u, graveyard_id: %u", - Point, Team, m_CapturingPointTypes[Point].GraveYardId); - -// SpawnBGCreature(Point,RESPAWN_IMMEDIATELY); + SendMessageToAll(CapturingPointTypes[Point].MessageIdHorde,CHAT_MSG_BG_SYSTEM_HORDE, Source); UpdatePointsIcons(Team, Point); UpdatePointsCount(Team); } -void BattleGroundEY::EventPlayerCapturedFlag(Player *Source, uint32 BgObjectType) +void BattleGroundEY::EventPlayerCapturedFlag(Player *Source, BG_EY_Nodes node) { if (GetStatus() != STATUS_IN_PROGRESS || GetFlagPickerGUID() != Source->GetGUID()) return; @@ -754,10 +630,9 @@ void BattleGroundEY::EventPlayerCapturedFlag(Player *Source, uint32 BgObjectType else PlaySoundToAll(BG_EY_SOUND_FLAG_CAPTURED_HORDE); - SpawnBGObject(m_BgObjects[BgObjectType], RESPAWN_IMMEDIATELY); + SpawnEvent(BG_EY_EVENT_CAPTURE_FLAG, node, true); m_FlagsTimer = BG_EY_FLAG_RESPAWN_TIME; - m_FlagCapturedBgObjectType = BgObjectType; uint8 team_id = 0; if (Source->GetTeam() == ALLIANCE) @@ -876,13 +751,13 @@ WorldSafeLocsEntry const *BattleGroundEY::GetClosestGraveYard(Player* player) distance = (entry->x - plr_x)*(entry->x - plr_x) + (entry->y - plr_y)*(entry->y - plr_y) + (entry->z - plr_z)*(entry->z - plr_z); nearestDistance = distance; - for(uint8 i = 0; i < EY_POINTS_MAX; ++i) + for(uint8 i = 0; i < BG_EY_NODES_MAX; ++i) { if (m_PointOwnedByTeam[i]==player->GetTeam() && m_PointState[i]==EY_POINT_UNDER_CONTROL) { - entry = sWorldSafeLocsStore.LookupEntry(m_CapturingPointTypes[i].GraveYardId); + entry = sWorldSafeLocsStore.LookupEntry(CapturingPointTypes[i].GraveYardId); if (!entry) - sLog.outError("BattleGroundEY: Not found graveyard: %u",m_CapturingPointTypes[i].GraveYardId); + sLog.outError("BattleGroundEY: Not found graveyard: %u",CapturingPointTypes[i].GraveYardId); else { distance = (entry->x - plr_x)*(entry->x - plr_x) + (entry->y - plr_y)*(entry->y - plr_y) + (entry->z - plr_z)*(entry->z - plr_z); @@ -901,9 +776,9 @@ WorldSafeLocsEntry const *BattleGroundEY::GetClosestGraveYard(Player* player) bool BattleGroundEY::IsAllNodesConrolledByTeam(uint32 team) const { uint32 count = 0; - for(int i = 0; i < EY_POINTS_MAX; ++i) + for(int i = 0; i < BG_EY_NODES_MAX; ++i) if (m_PointOwnedByTeam[i] == team && m_PointState[i] == EY_POINT_UNDER_CONTROL) ++count; - return count == EY_POINTS_MAX; + return count == BG_EY_NODES_MAX; } diff --git a/src/game/BattleGroundEY.h b/src/game/BattleGroundEY.h index 05200658f..7e688f4dd 100644 --- a/src/game/BattleGroundEY.h +++ b/src/game/BattleGroundEY.h @@ -83,22 +83,6 @@ enum BG_EY_Spells BG_EY_PLAYER_DROPPED_FLAG_SPELL = 34991 }; -enum EYBattleGroundObjectEntry -{ - BG_OBJECT_A_DOOR_EY_ENTRY = 184719, //Alliance door - BG_OBJECT_H_DOOR_EY_ENTRY = 184720, //Horde door - BG_OBJECT_FLAG1_EY_ENTRY = 184493, //Netherstorm flag (generic) - BG_OBJECT_FLAG2_EY_ENTRY = 184141, //Netherstorm flag (flagstand) - BG_OBJECT_FLAG3_EY_ENTRY = 184142, //Netherstorm flag (flagdrop) - BG_OBJECT_A_BANNER_EY_ENTRY = 184381, //Visual Banner (Alliance) - BG_OBJECT_H_BANNER_EY_ENTRY = 184380, //Visual Banner (Horde) - BG_OBJECT_N_BANNER_EY_ENTRY = 184382, //Visual Banner (Neutral) - BG_OBJECT_BE_TOWER_CAP_EY_ENTRY = 184080, //BE Tower Cap Pt - BG_OBJECT_FR_TOWER_CAP_EY_ENTRY = 184081, //Fel Reaver Cap Pt - BG_OBJECT_HU_TOWER_CAP_EY_ENTRY = 184082, //Human Tower Cap Pt - BG_OBJECT_DR_TOWER_CAP_EY_ENTRY = 184083 //Draenei Tower Cap Pt -}; - enum EYBattleGroundPointsTrigger { TR_BLOOD_ELF_POINT = 4476, @@ -121,6 +105,7 @@ enum EYBattleGroundGaveyards EY_GRAVEYARD_MAGE_TOWER = 1108 }; +// deprecated enum EYBattleGroundPoints { FEL_REALVER = 0, @@ -129,84 +114,49 @@ enum EYBattleGroundPoints MAGE_TOWER = 3, EY_PLAYERS_OUT_OF_POINTS = 4, - EY_POINTS_MAX = 4 }; -enum EYBattleGroundCreaturesTypes +enum BG_EY_Nodes { - EY_SPIRIT_FEL_REALVER = 0, - EY_SPIRIT_BLOOD_ELF = 1, - EY_SPIRIT_DRAENEI_RUINS = 2, - EY_SPIRIT_MAGE_TOWER = 3, - EY_SPIRIT_MAIN_ALLIANCE = 4, - EY_SPIRIT_MAIN_HORDE = 5, + BG_EY_NODE_FEL_REALVER = 0, + BG_EY_NODE_BLOOD_ELF = 1, + BG_EY_NODE_DRAENEI_RUINS = 2, + BG_EY_NODE_MAGE_TOWER = 3, + BG_EY_NODES_ERROR = 255 +}; +#define BG_EY_NODES_MAX 4 - BG_EY_CREATURES_MAX = 6 +// node-events work like this: event1:nodeid, event2:state (0alliance,1horde,2neutral) +#define BG_EYE_NEUTRAL_TEAM 2 +#define BG_EY_EVENT_CAPTURE_FLAG 4 // event1=4, event2=nodeid or 4 for the default center spawn + #define BG_EY_EVENT2_FLAG_CENTER 4 // maximum node is 3 so 4 for center is ok + // all other event2 are just nodeids, i won't define something here + +// x, y, z +// used to check, when player is in range of a node +const float BG_EY_NodePositions[BG_EY_NODES_MAX][4] = { + {2024.600708f, 1742.819580f, 1195.157715f}, // FEL_REALVER + {2050.493164f, 1372.235962f, 1194.563477f}, // BLOOD_ELF + {2301.010498f, 1386.931641f, 1197.183472f}, // DRAENEI_RUINS + {2282.121582f, 1760.006958f, 1189.707153f} // MAGE_TOWER }; enum EYBattleGroundObjectTypes { - BG_EY_OBJECT_DOOR_A = 0, - BG_EY_OBJECT_DOOR_H = 1, - BG_EY_OBJECT_A_BANNER_FEL_REALVER_CENTER = 2, - BG_EY_OBJECT_A_BANNER_FEL_REALVER_LEFT = 3, - BG_EY_OBJECT_A_BANNER_FEL_REALVER_RIGHT = 4, - BG_EY_OBJECT_A_BANNER_BLOOD_ELF_CENTER = 5, - BG_EY_OBJECT_A_BANNER_BLOOD_ELF_LEFT = 6, - BG_EY_OBJECT_A_BANNER_BLOOD_ELF_RIGHT = 7, - BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_CENTER = 8, - BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_LEFT = 9, - BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_RIGHT = 10, - BG_EY_OBJECT_A_BANNER_MAGE_TOWER_CENTER = 11, - BG_EY_OBJECT_A_BANNER_MAGE_TOWER_LEFT = 12, - BG_EY_OBJECT_A_BANNER_MAGE_TOWER_RIGHT = 13, - BG_EY_OBJECT_H_BANNER_FEL_REALVER_CENTER = 14, - BG_EY_OBJECT_H_BANNER_FEL_REALVER_LEFT = 15, - BG_EY_OBJECT_H_BANNER_FEL_REALVER_RIGHT = 16, - BG_EY_OBJECT_H_BANNER_BLOOD_ELF_CENTER = 17, - BG_EY_OBJECT_H_BANNER_BLOOD_ELF_LEFT = 18, - BG_EY_OBJECT_H_BANNER_BLOOD_ELF_RIGHT = 19, - BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_CENTER = 20, - BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_LEFT = 21, - BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_RIGHT = 22, - BG_EY_OBJECT_H_BANNER_MAGE_TOWER_CENTER = 23, - BG_EY_OBJECT_H_BANNER_MAGE_TOWER_LEFT = 24, - BG_EY_OBJECT_H_BANNER_MAGE_TOWER_RIGHT = 25, - BG_EY_OBJECT_N_BANNER_FEL_REALVER_CENTER = 26, - BG_EY_OBJECT_N_BANNER_FEL_REALVER_LEFT = 27, - BG_EY_OBJECT_N_BANNER_FEL_REALVER_RIGHT = 28, - BG_EY_OBJECT_N_BANNER_BLOOD_ELF_CENTER = 29, - BG_EY_OBJECT_N_BANNER_BLOOD_ELF_LEFT = 30, - BG_EY_OBJECT_N_BANNER_BLOOD_ELF_RIGHT = 31, - BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_CENTER = 32, - BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_LEFT = 33, - BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_RIGHT = 34, - BG_EY_OBJECT_N_BANNER_MAGE_TOWER_CENTER = 35, - BG_EY_OBJECT_N_BANNER_MAGE_TOWER_LEFT = 36, - BG_EY_OBJECT_N_BANNER_MAGE_TOWER_RIGHT = 37, - BG_EY_OBJECT_TOWER_CAP_FEL_REALVER = 38, - BG_EY_OBJECT_TOWER_CAP_BLOOD_ELF = 39, - BG_EY_OBJECT_TOWER_CAP_DRAENEI_RUINS = 40, - BG_EY_OBJECT_TOWER_CAP_MAGE_TOWER = 41, - BG_EY_OBJECT_FLAG_NETHERSTORM = 42, - BG_EY_OBJECT_FLAG_FEL_REALVER = 43, - BG_EY_OBJECT_FLAG_BLOOD_ELF = 44, - BG_EY_OBJECT_FLAG_DRAENEI_RUINS = 45, - BG_EY_OBJECT_FLAG_MAGE_TOWER = 46, //buffs - BG_EY_OBJECT_SPEEDBUFF_FEL_REALVER = 47, - BG_EY_OBJECT_REGENBUFF_FEL_REALVER = 48, - BG_EY_OBJECT_BERSERKBUFF_FEL_REALVER = 49, - BG_EY_OBJECT_SPEEDBUFF_BLOOD_ELF = 50, - BG_EY_OBJECT_REGENBUFF_BLOOD_ELF = 51, - BG_EY_OBJECT_BERSERKBUFF_BLOOD_ELF = 52, - BG_EY_OBJECT_SPEEDBUFF_DRAENEI_RUINS = 53, - BG_EY_OBJECT_REGENBUFF_DRAENEI_RUINS = 54, - BG_EY_OBJECT_BERSERKBUFF_DRAENEI_RUINS = 55, - BG_EY_OBJECT_SPEEDBUFF_MAGE_TOWER = 56, - BG_EY_OBJECT_REGENBUFF_MAGE_TOWER = 57, - BG_EY_OBJECT_BERSERKBUFF_MAGE_TOWER = 58, - BG_EY_OBJECT_MAX = 59 + BG_EY_OBJECT_SPEEDBUFF_FEL_REALVER = 1, + BG_EY_OBJECT_REGENBUFF_FEL_REALVER = 2, + BG_EY_OBJECT_BERSERKBUFF_FEL_REALVER = 3, + BG_EY_OBJECT_SPEEDBUFF_BLOOD_ELF = 4, + BG_EY_OBJECT_REGENBUFF_BLOOD_ELF = 5, + BG_EY_OBJECT_BERSERKBUFF_BLOOD_ELF = 6, + BG_EY_OBJECT_SPEEDBUFF_DRAENEI_RUINS = 7, + BG_EY_OBJECT_REGENBUFF_DRAENEI_RUINS = 8, + BG_EY_OBJECT_BERSERKBUFF_DRAENEI_RUINS = 9, + BG_EY_OBJECT_SPEEDBUFF_MAGE_TOWER = 10, + BG_EY_OBJECT_REGENBUFF_MAGE_TOWER = 11, + BG_EY_OBJECT_BERSERKBUFF_MAGE_TOWER = 12, + BG_EY_OBJECT_MAX = 13 }; #define BG_EY_NotEYWeekendHonorTicks 330 @@ -244,60 +194,48 @@ struct BattleGroundEYPointIconsStruct struct BattleGroundEYLoosingPointStruct { - BattleGroundEYLoosingPointStruct(uint32 _SpawnNeutralObjectType, uint32 _DespawnObjectTypeAlliance, uint32 _MessageIdAlliance, uint32 _DespawnObjectTypeHorde, uint32 _MessageIdHorde) - : SpawnNeutralObjectType(_SpawnNeutralObjectType), - DespawnObjectTypeAlliance(_DespawnObjectTypeAlliance), MessageIdAlliance(_MessageIdAlliance), - DespawnObjectTypeHorde(_DespawnObjectTypeHorde), MessageIdHorde(_MessageIdHorde) + BattleGroundEYLoosingPointStruct(uint32 _MessageIdAlliance, uint32 _MessageIdHorde) + : MessageIdAlliance(_MessageIdAlliance), MessageIdHorde(_MessageIdHorde) {} - uint32 SpawnNeutralObjectType; - uint32 DespawnObjectTypeAlliance; uint32 MessageIdAlliance; - uint32 DespawnObjectTypeHorde; uint32 MessageIdHorde; }; struct BattleGroundEYCapturingPointStruct { - BattleGroundEYCapturingPointStruct(uint32 _DespawnNeutralObjectType, uint32 _SpawnObjectTypeAlliance, uint32 _MessageIdAlliance, uint32 _SpawnObjectTypeHorde, uint32 _MessageIdHorde, uint32 _GraveYardId) - : DespawnNeutralObjectType(_DespawnNeutralObjectType), - SpawnObjectTypeAlliance(_SpawnObjectTypeAlliance), MessageIdAlliance(_MessageIdAlliance), - SpawnObjectTypeHorde(_SpawnObjectTypeHorde), MessageIdHorde(_MessageIdHorde), - GraveYardId(_GraveYardId) + BattleGroundEYCapturingPointStruct(uint32 _MessageIdAlliance, uint32 _MessageIdHorde, uint32 _GraveYardId) + : MessageIdAlliance(_MessageIdAlliance), MessageIdHorde(_MessageIdHorde), GraveYardId(_GraveYardId) {} - - uint32 DespawnNeutralObjectType; - uint32 SpawnObjectTypeAlliance; uint32 MessageIdAlliance; - uint32 SpawnObjectTypeHorde; uint32 MessageIdHorde; uint32 GraveYardId; }; -const uint8 BG_EY_TickPoints[EY_POINTS_MAX] = {1, 2, 5, 10}; -const uint32 BG_EY_FlagPoints[EY_POINTS_MAX] = {75, 85, 100, 500}; +const uint8 BG_EY_TickPoints[BG_EY_NODES_MAX] = {1, 2, 5, 10}; +const uint32 BG_EY_FlagPoints[BG_EY_NODES_MAX] = {75, 85, 100, 500}; //constant arrays: -const BattleGroundEYPointIconsStruct m_PointsIconStruct[EY_POINTS_MAX] = +const BattleGroundEYPointIconsStruct PointsIconStruct[BG_EY_NODES_MAX] = { BattleGroundEYPointIconsStruct(FEL_REAVER_UNCONTROL, FEL_REAVER_ALLIANCE_CONTROL, FEL_REAVER_HORDE_CONTROL), BattleGroundEYPointIconsStruct(BLOOD_ELF_UNCONTROL, BLOOD_ELF_ALLIANCE_CONTROL, BLOOD_ELF_HORDE_CONTROL), BattleGroundEYPointIconsStruct(DRAENEI_RUINS_UNCONTROL, DRAENEI_RUINS_ALLIANCE_CONTROL, DRAENEI_RUINS_HORDE_CONTROL), BattleGroundEYPointIconsStruct(MAGE_TOWER_UNCONTROL, MAGE_TOWER_ALLIANCE_CONTROL, MAGE_TOWER_HORDE_CONTROL) }; -const BattleGroundEYLoosingPointStruct m_LoosingPointTypes[EY_POINTS_MAX] = +const BattleGroundEYLoosingPointStruct LoosingPointTypes[BG_EY_NODES_MAX] = { - BattleGroundEYLoosingPointStruct(BG_EY_OBJECT_N_BANNER_FEL_REALVER_CENTER, BG_EY_OBJECT_A_BANNER_FEL_REALVER_CENTER, LANG_BG_EY_HAS_LOST_A_F_RUINS, BG_EY_OBJECT_H_BANNER_FEL_REALVER_CENTER, LANG_BG_EY_HAS_LOST_H_F_RUINS), - BattleGroundEYLoosingPointStruct(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_CENTER, BG_EY_OBJECT_A_BANNER_BLOOD_ELF_CENTER, LANG_BG_EY_HAS_LOST_A_B_TOWER, BG_EY_OBJECT_H_BANNER_BLOOD_ELF_CENTER, LANG_BG_EY_HAS_LOST_H_B_TOWER), - BattleGroundEYLoosingPointStruct(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_CENTER, BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_CENTER, LANG_BG_EY_HAS_LOST_A_D_RUINS, BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_CENTER, LANG_BG_EY_HAS_LOST_H_D_RUINS), - BattleGroundEYLoosingPointStruct(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_CENTER, BG_EY_OBJECT_A_BANNER_MAGE_TOWER_CENTER, LANG_BG_EY_HAS_LOST_A_M_TOWER, BG_EY_OBJECT_H_BANNER_MAGE_TOWER_CENTER, LANG_BG_EY_HAS_LOST_H_M_TOWER) + BattleGroundEYLoosingPointStruct(LANG_BG_EY_HAS_LOST_A_F_RUINS, LANG_BG_EY_HAS_LOST_H_F_RUINS), + BattleGroundEYLoosingPointStruct(LANG_BG_EY_HAS_LOST_A_B_TOWER, LANG_BG_EY_HAS_LOST_H_B_TOWER), + BattleGroundEYLoosingPointStruct(LANG_BG_EY_HAS_LOST_A_D_RUINS, LANG_BG_EY_HAS_LOST_H_D_RUINS), + BattleGroundEYLoosingPointStruct(LANG_BG_EY_HAS_LOST_A_M_TOWER, LANG_BG_EY_HAS_LOST_H_M_TOWER) }; -const BattleGroundEYCapturingPointStruct m_CapturingPointTypes[EY_POINTS_MAX] = +const BattleGroundEYCapturingPointStruct CapturingPointTypes[BG_EY_NODES_MAX] = { - BattleGroundEYCapturingPointStruct(BG_EY_OBJECT_N_BANNER_FEL_REALVER_CENTER, BG_EY_OBJECT_A_BANNER_FEL_REALVER_CENTER, LANG_BG_EY_HAS_TAKEN_A_F_RUINS, BG_EY_OBJECT_H_BANNER_FEL_REALVER_CENTER, LANG_BG_EY_HAS_TAKEN_H_F_RUINS, EY_GRAVEYARD_FEL_REALVER), - BattleGroundEYCapturingPointStruct(BG_EY_OBJECT_N_BANNER_BLOOD_ELF_CENTER, BG_EY_OBJECT_A_BANNER_BLOOD_ELF_CENTER, LANG_BG_EY_HAS_TAKEN_A_B_TOWER, BG_EY_OBJECT_H_BANNER_BLOOD_ELF_CENTER, LANG_BG_EY_HAS_TAKEN_H_B_TOWER, EY_GRAVEYARD_BLOOD_ELF), - BattleGroundEYCapturingPointStruct(BG_EY_OBJECT_N_BANNER_DRAENEI_RUINS_CENTER, BG_EY_OBJECT_A_BANNER_DRAENEI_RUINS_CENTER, LANG_BG_EY_HAS_TAKEN_A_D_RUINS, BG_EY_OBJECT_H_BANNER_DRAENEI_RUINS_CENTER, LANG_BG_EY_HAS_TAKEN_H_D_RUINS, EY_GRAVEYARD_DRAENEI_RUINS), - BattleGroundEYCapturingPointStruct(BG_EY_OBJECT_N_BANNER_MAGE_TOWER_CENTER, BG_EY_OBJECT_A_BANNER_MAGE_TOWER_CENTER, LANG_BG_EY_HAS_TAKEN_A_M_TOWER, BG_EY_OBJECT_H_BANNER_MAGE_TOWER_CENTER, LANG_BG_EY_HAS_TAKEN_H_M_TOWER, EY_GRAVEYARD_MAGE_TOWER) + BattleGroundEYCapturingPointStruct(LANG_BG_EY_HAS_TAKEN_A_F_RUINS, LANG_BG_EY_HAS_TAKEN_H_F_RUINS, EY_GRAVEYARD_FEL_REALVER), + BattleGroundEYCapturingPointStruct(LANG_BG_EY_HAS_TAKEN_A_B_TOWER, LANG_BG_EY_HAS_TAKEN_H_B_TOWER, EY_GRAVEYARD_BLOOD_ELF), + BattleGroundEYCapturingPointStruct(LANG_BG_EY_HAS_TAKEN_A_D_RUINS, LANG_BG_EY_HAS_TAKEN_H_D_RUINS, EY_GRAVEYARD_DRAENEI_RUINS), + BattleGroundEYCapturingPointStruct(LANG_BG_EY_HAS_TAKEN_A_M_TOWER, LANG_BG_EY_HAS_TAKEN_H_M_TOWER, EY_GRAVEYARD_MAGE_TOWER) }; class BattleGroundEYScore : public BattleGroundScore @@ -350,8 +288,9 @@ class BattleGroundEY : public BattleGround /* achievement req. */ bool IsAllNodesConrolledByTeam(uint32 team) const; + private: - void EventPlayerCapturedFlag(Player *Source, uint32 BgObjectType); + void EventPlayerCapturedFlag(Player *Source, BG_EY_Nodes node); void EventTeamCapturedPoint(Player *Source, uint32 Point); void EventTeamLostPoint(Player *Source, uint32 Point); void UpdatePointsCount(uint32 Team); @@ -372,21 +311,20 @@ class BattleGroundEY : public BattleGround uint32 m_HonorScoreTics[2]; uint32 m_TeamPointsCount[2]; - uint32 m_Points_Trigger[EY_POINTS_MAX]; + uint32 m_Points_Trigger[BG_EY_NODES_MAX]; uint64 m_FlagKeeper; // keepers guid uint64 m_DroppedFlagGUID; - uint32 m_FlagCapturedBgObjectType; // type that should be despawned when flag is captured uint8 m_FlagState; // for checking flag state int32 m_FlagsTimer; int32 m_TowerCapCheckTimer; - uint32 m_PointOwnedByTeam[EY_POINTS_MAX]; - uint8 m_PointState[EY_POINTS_MAX]; - int32 m_PointBarStatus[EY_POINTS_MAX]; + uint32 m_PointOwnedByTeam[BG_EY_NODES_MAX]; + uint8 m_PointState[BG_EY_NODES_MAX]; + int32 m_PointBarStatus[BG_EY_NODES_MAX]; typedef std::vector PlayersNearPointType; - PlayersNearPointType m_PlayersNearPoint[EY_POINTS_MAX + 1]; - uint8 m_CurrentPointPlayersCount[2*EY_POINTS_MAX]; + PlayersNearPointType m_PlayersNearPoint[BG_EY_NODES_MAX + 1]; + uint8 m_CurrentPointPlayersCount[2*BG_EY_NODES_MAX]; int32 m_PointAddingTimer; uint32 m_HonorTics; diff --git a/src/game/BattleGroundNA.cpp b/src/game/BattleGroundNA.cpp index ab3fcc398..ba7e18f97 100644 --- a/src/game/BattleGroundNA.cpp +++ b/src/game/BattleGroundNA.cpp @@ -26,8 +26,6 @@ BattleGroundNA::BattleGroundNA() { - m_BgObjects.resize(BG_NA_OBJECT_MAX); - m_StartDelayTimes[BG_STARTING_EVENT_FIRST] = BG_START_DELAY_1M; m_StartDelayTimes[BG_STARTING_EVENT_SECOND] = BG_START_DELAY_30S; m_StartDelayTimes[BG_STARTING_EVENT_THIRD] = BG_START_DELAY_15S; @@ -56,17 +54,11 @@ void BattleGroundNA::Update(uint32 diff) void BattleGroundNA::StartingEventCloseDoors() { - for(uint32 i = BG_NA_OBJECT_DOOR_1; i <= BG_NA_OBJECT_DOOR_4; ++i) - SpawnBGObject(m_BgObjects[i], RESPAWN_IMMEDIATELY); } void BattleGroundNA::StartingEventOpenDoors() { - for(uint32 i = BG_NA_OBJECT_DOOR_1; i <= BG_NA_OBJECT_DOOR_2; ++i) - DoorOpen(m_BgObjects[i]); - - for(uint32 i = BG_NA_OBJECT_BUFF_1; i <= BG_NA_OBJECT_BUFF_2; ++i) - SpawnBGObject(m_BgObjects[i], 60); + OpenDoorEvent(BG_EVENT_DOOR); } void BattleGroundNA::AddPlayer(Player *plr) @@ -154,19 +146,6 @@ void BattleGroundNA::Reset() bool BattleGroundNA::SetupBattleGround() { - // gates - if (!AddObject(BG_NA_OBJECT_DOOR_1, BG_NA_OBJECT_TYPE_DOOR_1, 4031.854, 2966.833, 12.6462, -2.648788, 0, 0, 0.9697962, -0.2439165, RESPAWN_IMMEDIATELY) - || !AddObject(BG_NA_OBJECT_DOOR_2, BG_NA_OBJECT_TYPE_DOOR_2, 4081.179, 2874.97, 12.39171, 0.4928045, 0, 0, 0.2439165, 0.9697962, RESPAWN_IMMEDIATELY) - || !AddObject(BG_NA_OBJECT_DOOR_3, BG_NA_OBJECT_TYPE_DOOR_3, 4023.709, 2981.777, 10.70117, -2.648788, 0, 0, 0.9697962, -0.2439165, RESPAWN_IMMEDIATELY) - || !AddObject(BG_NA_OBJECT_DOOR_4, BG_NA_OBJECT_TYPE_DOOR_4, 4090.064, 2858.438, 10.23631, 0.4928045, 0, 0, 0.2439165, 0.9697962, RESPAWN_IMMEDIATELY) - // buffs - || !AddObject(BG_NA_OBJECT_BUFF_1, BG_NA_OBJECT_TYPE_BUFF_1, 4009.189941, 2895.250000, 13.052700, -1.448624, 0, 0, 0.6626201, -0.7489557, 120) - || !AddObject(BG_NA_OBJECT_BUFF_2, BG_NA_OBJECT_TYPE_BUFF_2, 4103.330078, 2946.350098, 13.051300, -0.06981307, 0, 0, 0.03489945, -0.9993908, 120)) - { - sLog.outErrorDb("BatteGroundNA: Failed to spawn some object!"); - return false; - } - return true; } diff --git a/src/game/BattleGroundNA.h b/src/game/BattleGroundNA.h index 1d35b839e..f22a21de0 100644 --- a/src/game/BattleGroundNA.h +++ b/src/game/BattleGroundNA.h @@ -20,27 +20,6 @@ class BattleGround; -enum BattleGroundNAObjectTypes -{ - BG_NA_OBJECT_DOOR_1 = 0, - BG_NA_OBJECT_DOOR_2 = 1, - BG_NA_OBJECT_DOOR_3 = 2, - BG_NA_OBJECT_DOOR_4 = 3, - BG_NA_OBJECT_BUFF_1 = 4, - BG_NA_OBJECT_BUFF_2 = 5, - BG_NA_OBJECT_MAX = 6 -}; - -enum BattleGroundNAObjects -{ - BG_NA_OBJECT_TYPE_DOOR_1 = 183978, - BG_NA_OBJECT_TYPE_DOOR_2 = 183980, - BG_NA_OBJECT_TYPE_DOOR_3 = 183977, - BG_NA_OBJECT_TYPE_DOOR_4 = 183979, - BG_NA_OBJECT_TYPE_BUFF_1 = 184663, - BG_NA_OBJECT_TYPE_BUFF_2 = 184664 -}; - class BattleGroundNAScore : public BattleGroundScore { public: diff --git a/src/game/BattleGroundRL.cpp b/src/game/BattleGroundRL.cpp index 9a79c7061..009e0e945 100644 --- a/src/game/BattleGroundRL.cpp +++ b/src/game/BattleGroundRL.cpp @@ -26,8 +26,6 @@ BattleGroundRL::BattleGroundRL() { - m_BgObjects.resize(BG_RL_OBJECT_MAX); - m_StartDelayTimes[BG_STARTING_EVENT_FIRST] = BG_START_DELAY_1M; m_StartDelayTimes[BG_STARTING_EVENT_SECOND] = BG_START_DELAY_30S; m_StartDelayTimes[BG_STARTING_EVENT_THIRD] = BG_START_DELAY_15S; @@ -56,17 +54,11 @@ void BattleGroundRL::Update(uint32 diff) void BattleGroundRL::StartingEventCloseDoors() { - for(uint32 i = BG_RL_OBJECT_DOOR_1; i <= BG_RL_OBJECT_DOOR_2; ++i) - SpawnBGObject(m_BgObjects[i], RESPAWN_IMMEDIATELY); } void BattleGroundRL::StartingEventOpenDoors() { - for(uint32 i = BG_RL_OBJECT_DOOR_1; i <= BG_RL_OBJECT_DOOR_2; ++i) - DoorOpen(m_BgObjects[i]); - - for(uint32 i = BG_RL_OBJECT_BUFF_1; i <= BG_RL_OBJECT_BUFF_2; ++i) - SpawnBGObject(m_BgObjects[i], 60); + OpenDoorEvent(BG_EVENT_DOOR); } void BattleGroundRL::AddPlayer(Player *plr) @@ -155,17 +147,6 @@ void BattleGroundRL::Reset() bool BattleGroundRL::SetupBattleGround() { - // gates - if (!AddObject(BG_RL_OBJECT_DOOR_1, BG_RL_OBJECT_TYPE_DOOR_1, 1293.561, 1601.938, 31.60557, -1.457349, 0, 0, -0.6658813, 0.7460576, RESPAWN_IMMEDIATELY) - || !AddObject(BG_RL_OBJECT_DOOR_2, BG_RL_OBJECT_TYPE_DOOR_2, 1278.648, 1730.557, 31.60557, 1.684245, 0, 0, 0.7460582, 0.6658807, RESPAWN_IMMEDIATELY) - // buffs - || !AddObject(BG_RL_OBJECT_BUFF_1, BG_RL_OBJECT_TYPE_BUFF_1, 1328.719971, 1632.719971, 36.730400, -1.448624, 0, 0, 0.6626201, -0.7489557, 120) - || !AddObject(BG_RL_OBJECT_BUFF_2, BG_RL_OBJECT_TYPE_BUFF_2, 1243.300049, 1699.170044, 34.872601, -0.06981307, 0, 0, 0.03489945, -0.9993908, 120)) - { - sLog.outErrorDb("BatteGroundRL: Failed to spawn some object!"); - return false; - } - return true; } diff --git a/src/game/BattleGroundRL.h b/src/game/BattleGroundRL.h index dd0dfd2af..197fa3e19 100644 --- a/src/game/BattleGroundRL.h +++ b/src/game/BattleGroundRL.h @@ -20,23 +20,6 @@ class BattleGround; -enum BattleGroundRLObjectTypes -{ - BG_RL_OBJECT_DOOR_1 = 0, - BG_RL_OBJECT_DOOR_2 = 1, - BG_RL_OBJECT_BUFF_1 = 2, - BG_RL_OBJECT_BUFF_2 = 3, - BG_RL_OBJECT_MAX = 4 -}; - -enum BattleGroundRLObjects -{ - BG_RL_OBJECT_TYPE_DOOR_1 = 185918, - BG_RL_OBJECT_TYPE_DOOR_2 = 185917, - BG_RL_OBJECT_TYPE_BUFF_1 = 184663, - BG_RL_OBJECT_TYPE_BUFF_2 = 184664 -}; - class BattleGroundRLScore : public BattleGroundScore { public: diff --git a/src/game/BattleGroundWS.cpp b/src/game/BattleGroundWS.cpp index cff5e0476..0816d689a 100644 --- a/src/game/BattleGroundWS.cpp +++ b/src/game/BattleGroundWS.cpp @@ -29,9 +29,6 @@ BattleGroundWS::BattleGroundWS() { - m_BgObjects.resize(BG_WS_OBJECT_MAX); - m_BgCreatures.resize(BG_CREATURES_MAX_WS); - m_StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_BG_WS_START_TWO_MINUTES; m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_BG_WS_START_ONE_MINUTE; m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_BG_WS_START_HALF_MINUTE; @@ -93,29 +90,16 @@ void BattleGroundWS::Update(uint32 diff) void BattleGroundWS::StartingEventCloseDoors() { - for(uint32 i = BG_WS_OBJECT_DOOR_A_1; i <= BG_WS_OBJECT_DOOR_H_4; ++i) - { - DoorClose(m_BgObjects[i]); - SpawnBGObject(m_BgObjects[i], RESPAWN_IMMEDIATELY); - } - for(uint32 i = BG_WS_OBJECT_A_FLAG; i <= BG_WS_OBJECT_BERSERKBUFF_2; ++i) - SpawnBGObject(m_BgObjects[i], RESPAWN_ONE_DAY); } void BattleGroundWS::StartingEventOpenDoors() { - for(uint32 i = BG_WS_OBJECT_DOOR_A_1; i <= BG_WS_OBJECT_DOOR_A_4; ++i) - DoorOpen(m_BgObjects[i]); - for(uint32 i = BG_WS_OBJECT_DOOR_H_1; i <= BG_WS_OBJECT_DOOR_H_2; ++i) - DoorOpen(m_BgObjects[i]); + OpenDoorEvent(BG_EVENT_DOOR); - SpawnBGObject(m_BgObjects[BG_WS_OBJECT_DOOR_A_5], RESPAWN_ONE_DAY); - SpawnBGObject(m_BgObjects[BG_WS_OBJECT_DOOR_A_6], RESPAWN_ONE_DAY); - SpawnBGObject(m_BgObjects[BG_WS_OBJECT_DOOR_H_3], RESPAWN_ONE_DAY); - SpawnBGObject(m_BgObjects[BG_WS_OBJECT_DOOR_H_4], RESPAWN_ONE_DAY); + // TODO implement timer to despawn doors after a short while - for(uint32 i = BG_WS_OBJECT_A_FLAG; i <= BG_WS_OBJECT_BERSERKBUFF_2; ++i) - SpawnBGObject(m_BgObjects[i], RESPAWN_IMMEDIATELY); + SpawnEvent(WS_EVENT_FLAG_A, 0, true); + SpawnEvent(WS_EVENT_FLAG_H, 0, true); } void BattleGroundWS::AddPlayer(Player *plr) @@ -133,18 +117,20 @@ void BattleGroundWS::RespawnFlag(uint32 Team, bool captured) { sLog.outDebug("Respawn Alliance flag"); m_FlagState[BG_TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_BASE; + SpawnEvent(WS_EVENT_FLAG_A, 0, true); } else { sLog.outDebug("Respawn Horde flag"); m_FlagState[BG_TEAM_HORDE] = BG_WS_FLAG_STATE_ON_BASE; + SpawnEvent(WS_EVENT_FLAG_H, 0, true); } if (captured) { //when map_update will be allowed for battlegrounds this code will be useless - SpawnBGObject(m_BgObjects[BG_WS_OBJECT_H_FLAG], RESPAWN_IMMEDIATELY); - SpawnBGObject(m_BgObjects[BG_WS_OBJECT_A_FLAG], RESPAWN_IMMEDIATELY); + SpawnEvent(WS_EVENT_FLAG_A, 0, true); + SpawnEvent(WS_EVENT_FLAG_H, 0, true); SendMessageToAll(LANG_BG_WS_F_PLACED, CHAT_MSG_BG_SYSTEM_NEUTRAL); PlaySoundToAll(BG_WS_SOUND_FLAGS_RESPAWNED); // flag respawned sound... } @@ -155,17 +141,11 @@ void BattleGroundWS::RespawnFlagAfterDrop(uint32 team) if (GetStatus() != STATUS_IN_PROGRESS) return; - RespawnFlag(team,false); + RespawnFlag(team, false); if (team == ALLIANCE) - { - SpawnBGObject(m_BgObjects[BG_WS_OBJECT_A_FLAG], RESPAWN_IMMEDIATELY); SendMessageToAll(LANG_BG_WS_ALLIANCE_FLAG_RESPAWNED, CHAT_MSG_BG_SYSTEM_NEUTRAL); - } else - { - SpawnBGObject(m_BgObjects[BG_WS_OBJECT_H_FLAG], RESPAWN_IMMEDIATELY); SendMessageToAll(LANG_BG_WS_HORDE_FLAG_RESPAWNED, CHAT_MSG_BG_SYSTEM_NEUTRAL); - } PlaySoundToAll(BG_WS_SOUND_FLAGS_RESPAWNED); @@ -217,8 +197,9 @@ void BattleGroundWS::EventPlayerCapturedFlag(Player *Source) //for flag capture is reward 2 honorable kills RewardHonorToTeam(GetBonusHonorFromKill(2), Source->GetTeam()); - SpawnBGObject(m_BgObjects[BG_WS_OBJECT_H_FLAG], BG_WS_FLAG_RESPAWN_TIME); - SpawnBGObject(m_BgObjects[BG_WS_OBJECT_A_FLAG], BG_WS_FLAG_RESPAWN_TIME); + // despawn flags + SpawnEvent(WS_EVENT_FLAG_A, 0, false); + SpawnEvent(WS_EVENT_FLAG_H, 0, false); if (Source->GetTeam() == ALLIANCE) SendMessageToAll(LANG_BG_WS_CAPTURED_HF, CHAT_MSG_BG_SYSTEM_ALLIANCE, Source); @@ -337,14 +318,16 @@ void BattleGroundWS::EventPlayerClickedOnFlag(Player *Source, GameObject* target int32 message_id = 0; ChatMsg type; + uint8 event = (sBattleGroundMgr.GetGameObjectEventIndex(target_obj->GetDBTableGUIDLow())).event1; + //alliance flag picked up from base if(Source->GetTeam() == HORDE && GetFlagState(ALLIANCE) == BG_WS_FLAG_STATE_ON_BASE - && m_BgObjects[BG_WS_OBJECT_A_FLAG] == target_obj->GetGUID()) + && event == WS_EVENT_FLAG_A) { message_id = LANG_BG_WS_PICKEDUP_AF; type = CHAT_MSG_BG_SYSTEM_HORDE; PlaySoundToAll(BG_WS_SOUND_ALLIANCE_FLAG_PICKED_UP); - SpawnBGObject(m_BgObjects[BG_WS_OBJECT_A_FLAG], RESPAWN_ONE_DAY); + SpawnEvent(WS_EVENT_FLAG_A, 0, false); SetAllianceFlagPicker(Source->GetGUID()); m_FlagState[BG_TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_PLAYER; //update world state to show correct flag carrier @@ -355,12 +338,12 @@ void BattleGroundWS::EventPlayerClickedOnFlag(Player *Source, GameObject* target //horde flag picked up from base if (Source->GetTeam() == ALLIANCE && GetFlagState(HORDE) == BG_WS_FLAG_STATE_ON_BASE - && m_BgObjects[BG_WS_OBJECT_H_FLAG] == target_obj->GetGUID()) + && event == WS_EVENT_FLAG_H) { message_id = LANG_BG_WS_PICKEDUP_HF; type = CHAT_MSG_BG_SYSTEM_ALLIANCE; PlaySoundToAll(BG_WS_SOUND_HORDE_FLAG_PICKED_UP); - SpawnBGObject(m_BgObjects[BG_WS_OBJECT_H_FLAG], RESPAWN_ONE_DAY); + SpawnEvent(WS_EVENT_FLAG_H, 0, false); SetHordeFlagPicker(Source->GetGUID()); m_FlagState[BG_TEAM_HORDE] = BG_WS_FLAG_STATE_ON_PLAYER; //update world state to show correct flag carrier @@ -378,7 +361,6 @@ void BattleGroundWS::EventPlayerClickedOnFlag(Player *Source, GameObject* target type = CHAT_MSG_BG_SYSTEM_ALLIANCE; UpdateFlagState(HORDE, BG_WS_FLAG_STATE_WAIT_RESPAWN); RespawnFlag(ALLIANCE, false); - SpawnBGObject(m_BgObjects[BG_WS_OBJECT_A_FLAG], RESPAWN_IMMEDIATELY); PlaySoundToAll(BG_WS_SOUND_FLAG_RETURNED); UpdatePlayerScore(Source, SCORE_FLAG_RETURNS, 1); } @@ -387,7 +369,7 @@ void BattleGroundWS::EventPlayerClickedOnFlag(Player *Source, GameObject* target message_id = LANG_BG_WS_PICKEDUP_AF; type = CHAT_MSG_BG_SYSTEM_HORDE; PlaySoundToAll(BG_WS_SOUND_ALLIANCE_FLAG_PICKED_UP); - SpawnBGObject(m_BgObjects[BG_WS_OBJECT_A_FLAG], RESPAWN_ONE_DAY); + SpawnEvent(WS_EVENT_FLAG_A, 0, false); SetAllianceFlagPicker(Source->GetGUID()); Source->CastSpell(Source, BG_WS_SPELL_SILVERWING_FLAG, true); m_FlagState[BG_TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_PLAYER; @@ -407,7 +389,6 @@ void BattleGroundWS::EventPlayerClickedOnFlag(Player *Source, GameObject* target type = CHAT_MSG_BG_SYSTEM_HORDE; UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_WAIT_RESPAWN); RespawnFlag(HORDE, false); - SpawnBGObject(m_BgObjects[BG_WS_OBJECT_H_FLAG], RESPAWN_IMMEDIATELY); PlaySoundToAll(BG_WS_SOUND_FLAG_RETURNED); UpdatePlayerScore(Source, SCORE_FLAG_RETURNS, 1); } @@ -416,7 +397,7 @@ void BattleGroundWS::EventPlayerClickedOnFlag(Player *Source, GameObject* target message_id = LANG_BG_WS_PICKEDUP_HF; type = CHAT_MSG_BG_SYSTEM_ALLIANCE; PlaySoundToAll(BG_WS_SOUND_HORDE_FLAG_PICKED_UP); - SpawnBGObject(m_BgObjects[BG_WS_OBJECT_H_FLAG], RESPAWN_ONE_DAY); + SpawnEvent(WS_EVENT_FLAG_H, 0, false); SetHordeFlagPicker(Source->GetGUID()); Source->CastSpell(Source, BG_WS_SPELL_WARSONG_FLAG, true); m_FlagState[BG_TEAM_HORDE] = BG_WS_FLAG_STATE_ON_PLAYER; @@ -532,50 +513,6 @@ void BattleGroundWS::HandleAreaTrigger(Player *Source, uint32 Trigger) bool BattleGroundWS::SetupBattleGround() { - // flags - if (!AddObject(BG_WS_OBJECT_A_FLAG, BG_OBJECT_A_FLAG_WS_ENTRY, 1540.423f, 1481.325f, 351.8284f, 3.089233f, 0, 0, 0.9996573f, 0.02617699f, BG_WS_FLAG_RESPAWN_TIME/1000) - || !AddObject(BG_WS_OBJECT_H_FLAG, BG_OBJECT_H_FLAG_WS_ENTRY, 916.0226f, 1434.405f, 345.413f, 0.01745329f, 0, 0, 0.008726535f, 0.9999619f, BG_WS_FLAG_RESPAWN_TIME/1000) - // buffs - || !AddObject(BG_WS_OBJECT_SPEEDBUFF_1, BG_OBJECTID_SPEEDBUFF_ENTRY, 1449.93f, 1470.71f, 342.6346f, -1.64061f, 0, 0, 0.7313537f, -0.6819983f, BUFF_RESPAWN_TIME) - || !AddObject(BG_WS_OBJECT_SPEEDBUFF_2, BG_OBJECTID_SPEEDBUFF_ENTRY, 1005.171f, 1447.946f, 335.9032f, 1.64061f, 0, 0, 0.7313537f, 0.6819984f, BUFF_RESPAWN_TIME) - || !AddObject(BG_WS_OBJECT_REGENBUFF_1, BG_OBJECTID_REGENBUFF_ENTRY, 1317.506f, 1550.851f, 313.2344f, -0.2617996f, 0, 0, 0.1305263f, -0.9914448f, BUFF_RESPAWN_TIME) - || !AddObject(BG_WS_OBJECT_REGENBUFF_2, BG_OBJECTID_REGENBUFF_ENTRY, 1110.451f, 1353.656f, 316.5181f, -0.6806787f, 0, 0, 0.333807f, -0.9426414f, BUFF_RESPAWN_TIME) - || !AddObject(BG_WS_OBJECT_BERSERKBUFF_1, BG_OBJECTID_BERSERKERBUFF_ENTRY, 1320.09f, 1378.79f, 314.7532f, 1.186824f, 0, 0, 0.5591929f, 0.8290376f, BUFF_RESPAWN_TIME) - || !AddObject(BG_WS_OBJECT_BERSERKBUFF_2, BG_OBJECTID_BERSERKERBUFF_ENTRY, 1139.688f, 1560.288f, 306.8432f, -2.443461f, 0, 0, 0.9396926f, -0.3420201f, BUFF_RESPAWN_TIME) - // alliance gates - || !AddObject(BG_WS_OBJECT_DOOR_A_1, BG_OBJECT_DOOR_A_1_WS_ENTRY, 1503.335f, 1493.466f, 352.1888f, 3.115414f, 0, 0, 0.9999143f, 0.01308903f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_WS_OBJECT_DOOR_A_2, BG_OBJECT_DOOR_A_2_WS_ENTRY, 1492.478f, 1457.912f, 342.9689f, 3.115414f, 0, 0, 0.9999143f, 0.01308903f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_WS_OBJECT_DOOR_A_3, BG_OBJECT_DOOR_A_3_WS_ENTRY, 1468.503f, 1494.357f, 351.8618f, 3.115414f, 0, 0, 0.9999143f, 0.01308903f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_WS_OBJECT_DOOR_A_4, BG_OBJECT_DOOR_A_4_WS_ENTRY, 1471.555f, 1458.778f, 362.6332f, 3.115414f, 0, 0, 0.9999143f, 0.01308903f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_WS_OBJECT_DOOR_A_5, BG_OBJECT_DOOR_A_5_WS_ENTRY, 1492.347f, 1458.34f, 342.3712f, -0.03490669f, 0, 0, 0.01745246f, -0.9998477f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_WS_OBJECT_DOOR_A_6, BG_OBJECT_DOOR_A_6_WS_ENTRY, 1503.466f, 1493.367f, 351.7352f, -0.03490669f, 0, 0, 0.01745246f, -0.9998477f, RESPAWN_IMMEDIATELY) - // horde gates - || !AddObject(BG_WS_OBJECT_DOOR_H_1, BG_OBJECT_DOOR_H_1_WS_ENTRY, 949.1663f, 1423.772f, 345.6241f, -0.5756807f, -0.01673368f, -0.004956111f, -0.2839723f, 0.9586737f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_WS_OBJECT_DOOR_H_2, BG_OBJECT_DOOR_H_2_WS_ENTRY, 953.0507f, 1459.842f, 340.6526f, -1.99662f, -0.1971825f, 0.1575096f, -0.8239487f, 0.5073641f, RESPAWN_IMMEDIATELY) - || !AddObject(BG_WS_OBJECT_DOOR_H_3, BG_OBJECT_DOOR_H_3_WS_ENTRY, 949.9523f, 1422.751f, 344.9273f, 0.0f, 0, 0, 0, 1, RESPAWN_IMMEDIATELY) - || !AddObject(BG_WS_OBJECT_DOOR_H_4, BG_OBJECT_DOOR_H_4_WS_ENTRY, 950.7952f, 1459.583f, 342.1523f, 0.05235988f, 0, 0, 0.02617695f, 0.9996573f, RESPAWN_IMMEDIATELY) - ) - { - sLog.outErrorDb("BatteGroundWS: Failed to spawn some object BattleGround not created!"); - return false; - } - - WorldSafeLocsEntry const *sg = sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_MAIN_ALLIANCE); - if (!sg || !AddSpiritGuide(WS_SPIRIT_MAIN_ALLIANCE, sg->x, sg->y, sg->z, 3.124139f, ALLIANCE)) - { - sLog.outErrorDb("BatteGroundWS: Failed to spawn Alliance spirit guide! BattleGround not created!"); - return false; - } - - sg = sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_MAIN_HORDE); - if (!sg || !AddSpiritGuide(WS_SPIRIT_MAIN_HORDE, sg->x, sg->y, sg->z, 3.193953f, HORDE)) - { - sLog.outErrorDb("BatteGroundWS: Failed to spawn Horde spirit guide! BattleGround not created!"); - return false; - } - - sLog.outDebug("BatteGroundWS: BG objects and spirit guides spawned"); - return true; } @@ -584,25 +521,23 @@ void BattleGroundWS::Reset() //call parent's class reset BattleGround::Reset(); - m_FlagKeepers[BG_TEAM_ALLIANCE] = 0; - m_FlagKeepers[BG_TEAM_HORDE] = 0; - m_DroppedFlagGUID[BG_TEAM_ALLIANCE] = 0; - m_DroppedFlagGUID[BG_TEAM_HORDE] = 0; - m_FlagState[BG_TEAM_ALLIANCE] = BG_WS_FLAG_STATE_ON_BASE; - m_FlagState[BG_TEAM_HORDE] = BG_WS_FLAG_STATE_ON_BASE; - m_TeamScores[BG_TEAM_ALLIANCE] = 0; - m_TeamScores[BG_TEAM_HORDE] = 0; + // spiritguides and flags not spawned at beginning + m_ActiveEvents[WS_EVENT_SPIRITGUIDES_SPAWN] = BG_EVENT_NONE; + m_ActiveEvents[WS_EVENT_FLAG_A] = BG_EVENT_NONE; + m_ActiveEvents[WS_EVENT_FLAG_H] = BG_EVENT_NONE; + + for(uint32 i = 0; i < BG_TEAMS_COUNT; ++i) + { + m_DroppedFlagGUID[i] = 0; + m_FlagKeepers[i] = 0; + m_FlagState[i] = BG_WS_FLAG_STATE_ON_BASE; + m_TeamScores[i] = 0; + } bool isBGWeekend = sBattleGroundMgr.IsBGWeekend(GetTypeID()); m_ReputationCapture = (isBGWeekend) ? 45 : 35; m_HonorWinKills = (isBGWeekend) ? 3 : 1; m_HonorEndKills = (isBGWeekend) ? 4 : 2; - /* Spirit nodes is static at this BG and then not required deleting at BG reset. - if (m_BgCreatures[WS_SPIRIT_MAIN_ALLIANCE]) - DelCreature(WS_SPIRIT_MAIN_ALLIANCE); - if (m_BgCreatures[WS_SPIRIT_MAIN_HORDE]) - DelCreature(WS_SPIRIT_MAIN_HORDE); - */ } void BattleGroundWS::EndBattleGround(uint32 winner) diff --git a/src/game/BattleGroundWS.h b/src/game/BattleGroundWS.h index bc393bd70..93df2bc0a 100644 --- a/src/game/BattleGroundWS.h +++ b/src/game/BattleGroundWS.h @@ -56,45 +56,6 @@ enum BG_WS_WorldStates BG_WS_FLAG_STATE_ALLIANCE = 2339 }; -enum BG_WS_ObjectTypes -{ - BG_WS_OBJECT_DOOR_A_1 = 0, - BG_WS_OBJECT_DOOR_A_2 = 1, - BG_WS_OBJECT_DOOR_A_3 = 2, - BG_WS_OBJECT_DOOR_A_4 = 3, - BG_WS_OBJECT_DOOR_A_5 = 4, - BG_WS_OBJECT_DOOR_A_6 = 5, - BG_WS_OBJECT_DOOR_H_1 = 6, - BG_WS_OBJECT_DOOR_H_2 = 7, - BG_WS_OBJECT_DOOR_H_3 = 8, - BG_WS_OBJECT_DOOR_H_4 = 9, - BG_WS_OBJECT_A_FLAG = 10, - BG_WS_OBJECT_H_FLAG = 11, - BG_WS_OBJECT_SPEEDBUFF_1 = 12, - BG_WS_OBJECT_SPEEDBUFF_2 = 13, - BG_WS_OBJECT_REGENBUFF_1 = 14, - BG_WS_OBJECT_REGENBUFF_2 = 15, - BG_WS_OBJECT_BERSERKBUFF_1 = 16, - BG_WS_OBJECT_BERSERKBUFF_2 = 17, - BG_WS_OBJECT_MAX = 18 -}; - -enum BG_WS_ObjectEntry -{ - BG_OBJECT_DOOR_A_1_WS_ENTRY = 179918, - BG_OBJECT_DOOR_A_2_WS_ENTRY = 179919, - BG_OBJECT_DOOR_A_3_WS_ENTRY = 179920, - BG_OBJECT_DOOR_A_4_WS_ENTRY = 179921, - BG_OBJECT_DOOR_A_5_WS_ENTRY = 180322, - BG_OBJECT_DOOR_A_6_WS_ENTRY = 180322, - BG_OBJECT_DOOR_H_1_WS_ENTRY = 179916, - BG_OBJECT_DOOR_H_2_WS_ENTRY = 179917, - BG_OBJECT_DOOR_H_3_WS_ENTRY = 180322, - BG_OBJECT_DOOR_H_4_WS_ENTRY = 180322, - BG_OBJECT_A_FLAG_WS_ENTRY = 179830, - BG_OBJECT_H_FLAG_WS_ENTRY = 179831 -}; - enum BG_WS_FlagState { BG_WS_FLAG_STATE_ON_BASE = 0, @@ -111,14 +72,6 @@ enum BG_WS_Graveyards WS_GRAVEYARD_MAIN_HORDE = 772 }; -enum BG_WS_CreatureTypes -{ - WS_SPIRIT_MAIN_ALLIANCE = 0, - WS_SPIRIT_MAIN_HORDE = 1, - - BG_CREATURES_MAX_WS = 2 -}; - class BattleGroundWGScore : public BattleGroundScore { public: @@ -128,6 +81,15 @@ class BattleGroundWGScore : public BattleGroundScore uint32 FlagReturns; }; + +enum BG_WS_Events +{ + WS_EVENT_FLAG_A = 0, + WS_EVENT_FLAG_H = 1, + // spiritguides will spawn (same moment, like WS_EVENT_DOOR_OPEN) + WS_EVENT_SPIRITGUIDES_SPAWN = 2 +}; + class BattleGroundWS : public BattleGround { friend class BattleGroundMgr; @@ -180,11 +142,12 @@ class BattleGroundWS : public BattleGround void SetTeamPoint(uint32 TeamID, uint32 Points = 0) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] = Points; } void RemovePoint(uint32 TeamID, uint32 Points = 1) { m_TeamScores[GetTeamIndexByTeamId(TeamID)] -= Points; } private: - uint64 m_FlagKeepers[2]; // 0 - alliance, 1 - horde - uint64 m_DroppedFlagGUID[2]; - uint8 m_FlagState[2]; // for checking flag state - int32 m_FlagsTimer[2]; - int32 m_FlagsDropTimer[2]; + uint64 m_FlagKeepers[BG_TEAMS_COUNT]; + + uint64 m_DroppedFlagGUID[BG_TEAMS_COUNT]; + uint8 m_FlagState[BG_TEAMS_COUNT]; + int32 m_FlagsTimer[BG_TEAMS_COUNT]; + int32 m_FlagsDropTimer[BG_TEAMS_COUNT]; uint32 m_ReputationCapture; uint32 m_HonorWinKills;