diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp index 761e12b226c07..768f163f4d304 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.cpp @@ -22,91 +22,394 @@ #include "OutdoorPvPMgr.h" #include "WorldPacket.h" -OutdoorPvPNA::OutdoorPvPNA() +OPvPCapturePointNA::OPvPCapturePointNA(OutdoorPvP* pvp) : OPvPCapturePoint(pvp), + _capturable(true), + _guardsAlive(0), + _wyvernStateNorth(0), + _wyvernStateSouth(0), + _wyvernStateEast(0), + _wyvernStateWest(0), + _halaaState(HALAA_N), + _respawnTimer(NA_RESPAWN_TIME), + _guardCheckTimer(NA_GUARD_CHECK_TIME) { - m_TypeId = OUTDOOR_PVP_NA; - m_obj = NULL; + SetCapturePointData(182210, 530, -1572.57f, 7945.3f, -22.475f, 2.05949f, 0.0f, 0.0f, 0.857167f, 0.515038f); } -void OutdoorPvPNA::HandleKillImpl(Player* player, Unit* killed) +void OPvPCapturePointNA::FillInitialWorldStates(WorldPacket& data) { - if (killed->GetTypeId() == TYPEID_PLAYER && player->GetTeam() != killed->ToPlayer()->GetTeam()) + data << NA_UI_HORDE_GUARDS_SHOW << uint32(m_team == TEAM_HORDE); + data << NA_UI_ALLIANCE_GUARDS_SHOW << uint32(m_team == TEAM_ALLIANCE); + + data << NA_UI_GUARDS_MAX << NA_GUARDS_MAX; + data << NA_UI_GUARDS_LEFT << uint32(_guardsAlive); + + data << NA_MAP_WYVERN_NORTH_NEU_H << uint32((_wyvernStateNorth & WYVERN_NEU_HORDE) != 0); + data << NA_MAP_WYVERN_NORTH_NEU_A << uint32((_wyvernStateNorth & WYVERN_NEU_ALLIANCE) != 0); + data << NA_MAP_WYVERN_NORTH_H << uint32((_wyvernStateNorth & WYVERN_HORDE) != 0); + data << NA_MAP_WYVERN_NORTH_A << uint32((_wyvernStateNorth & WYVERN_ALLIANCE) != 0); + + data << NA_MAP_WYVERN_SOUTH_NEU_H << uint32((_wyvernStateSouth & WYVERN_NEU_HORDE) != 0); + data << NA_MAP_WYVERN_SOUTH_NEU_A << uint32((_wyvernStateSouth & WYVERN_NEU_ALLIANCE) != 0); + data << NA_MAP_WYVERN_SOUTH_H << uint32((_wyvernStateSouth & WYVERN_HORDE) != 0); + data << NA_MAP_WYVERN_SOUTH_A << uint32((_wyvernStateSouth & WYVERN_ALLIANCE) != 0); + + data << NA_MAP_WYVERN_WEST_NEU_H << uint32((_wyvernStateWest & WYVERN_NEU_HORDE) != 0); + data << NA_MAP_WYVERN_WEST_NEU_A << uint32((_wyvernStateWest & WYVERN_NEU_ALLIANCE) != 0); + data << NA_MAP_WYVERN_WEST_H << uint32((_wyvernStateWest & WYVERN_HORDE) != 0); + data << NA_MAP_WYVERN_WEST_A << uint32((_wyvernStateWest & WYVERN_ALLIANCE) != 0); + + data << NA_MAP_WYVERN_EAST_NEU_H << uint32((_wyvernStateEast & WYVERN_NEU_HORDE) != 0); + data << NA_MAP_WYVERN_EAST_NEU_A << uint32((_wyvernStateEast & WYVERN_NEU_ALLIANCE) != 0); + data << NA_MAP_WYVERN_EAST_H << uint32((_wyvernStateEast & WYVERN_HORDE) != 0); + data << NA_MAP_WYVERN_EAST_A << uint32((_wyvernStateEast & WYVERN_ALLIANCE) != 0); + + data << NA_MAP_HALAA_NEUTRAL << uint32((_halaaState & HALAA_N) != 0); + data << NA_MAP_HALAA_NEU_A << uint32((_halaaState & HALAA_N_A) != 0); + data << NA_MAP_HALAA_NEU_H << uint32((_halaaState & HALAA_N_H) != 0); + data << NA_MAP_HALAA_HORDE << uint32((_halaaState & HALAA_H) != 0); + data << NA_MAP_HALAA_ALLIANCE << uint32((_halaaState & HALAA_A) != 0); +} + +bool OPvPCapturePointNA::HandleCustomSpell(Player* player, uint32 spellId, GameObject* /*go*/) +{ + uint32 index; + + switch (spellId) { - player->KilledMonsterCredit(NA_CREDIT_MARKER); // 0 guid, btw it isn't even used in killedmonster function :S - if (player->GetTeam() == ALLIANCE) - player->CastSpell(player, NA_KILL_TOKEN_ALLIANCE, true); + case NA_SPELL_FLY_NORTH: + index = NA_ROOST_N; + break; + case NA_SPELL_FLY_SOUTH: + index = NA_ROOST_S; + break; + case NA_SPELL_FLY_WEST: + index = NA_ROOST_W; + break; + case NA_SPELL_FLY_EAST: + index = NA_ROOST_E; + break; + default: + return false; + } + + player->ActivateTaxiPathTo(FlightPathNodes[index]); + player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP); + player->UpdatePvP(true, true); + + player->AddItem(24538, 10); + return true; +} + +int32 OPvPCapturePointNA::HandleOpenGo(Player* player, ObjectGuid guid) +{ + int32 retval = OPvPCapturePoint::HandleOpenGo(player, guid); + if (retval >= 0) + { + go_type const* gos = nullptr; + if (m_team == TEAM_ALLIANCE) + gos = AllianceControlGOs; + else if (m_team == TEAM_HORDE) + gos = HordeControlGOs; else - player->CastSpell(player, NA_KILL_TOKEN_HORDE, true); + return -1; + + int32 del = -1; + int32 del2 = -1; + int32 add = -1; + int32 add2 = -1; + + switch (retval) + { + case NA_DESTROYED_ROOST_S: + del = NA_DESTROYED_ROOST_S; + add = NA_ROOST_S; + add2 = NA_BOMB_WAGON_S; + if (m_team == TEAM_HORDE) + _wyvernStateSouth = WYVERN_ALLIANCE; + else + _wyvernStateSouth = WYVERN_HORDE; + UpdateWyvernRoostWorldState(NA_ROOST_S); + break; + case NA_DESTROYED_ROOST_N: + del = NA_DESTROYED_ROOST_N; + add = NA_ROOST_N; + add2 = NA_BOMB_WAGON_N; + if (m_team == TEAM_HORDE) + _wyvernStateNorth = WYVERN_ALLIANCE; + else + _wyvernStateNorth = WYVERN_HORDE; + UpdateWyvernRoostWorldState(NA_ROOST_N); + break; + case NA_DESTROYED_ROOST_W: + del = NA_DESTROYED_ROOST_W; + add = NA_ROOST_W; + add2 = NA_BOMB_WAGON_W; + if (m_team == TEAM_HORDE) + _wyvernStateWest = WYVERN_ALLIANCE; + else + _wyvernStateWest = WYVERN_HORDE; + UpdateWyvernRoostWorldState(NA_ROOST_W); + break; + case NA_DESTROYED_ROOST_E: + del = NA_DESTROYED_ROOST_E; + add = NA_ROOST_E; + add2 = NA_BOMB_WAGON_E; + if (m_team == TEAM_HORDE) + _wyvernStateEast = WYVERN_ALLIANCE; + else + _wyvernStateEast = WYVERN_HORDE; + UpdateWyvernRoostWorldState(NA_ROOST_E); + break; + case NA_BOMB_WAGON_S: + del = NA_BOMB_WAGON_S; + del2 = NA_ROOST_S; + add = NA_DESTROYED_ROOST_S; + if (m_team == TEAM_HORDE) + _wyvernStateSouth = WYVERN_NEU_ALLIANCE; + else + _wyvernStateSouth = WYVERN_NEU_HORDE; + UpdateWyvernRoostWorldState(NA_ROOST_S); + break; + case NA_BOMB_WAGON_N: + del = NA_BOMB_WAGON_N; + del2 = NA_ROOST_N; + add = NA_DESTROYED_ROOST_N; + if (m_team == TEAM_HORDE) + _wyvernStateNorth = WYVERN_NEU_ALLIANCE; + else + _wyvernStateNorth = WYVERN_NEU_HORDE; + UpdateWyvernRoostWorldState(NA_ROOST_N); + break; + case NA_BOMB_WAGON_W: + del = NA_BOMB_WAGON_W; + del2 = NA_ROOST_W; + add = NA_DESTROYED_ROOST_W; + if (m_team == TEAM_HORDE) + _wyvernStateWest = WYVERN_NEU_ALLIANCE; + else + _wyvernStateWest = WYVERN_NEU_HORDE; + UpdateWyvernRoostWorldState(NA_ROOST_W); + break; + case NA_BOMB_WAGON_E: + del = NA_BOMB_WAGON_E; + del2 = NA_ROOST_E; + add = NA_DESTROYED_ROOST_E; + if (m_team == TEAM_HORDE) + _wyvernStateEast = WYVERN_NEU_ALLIANCE; + else + _wyvernStateEast = WYVERN_NEU_HORDE; + UpdateWyvernRoostWorldState(NA_ROOST_E); + break; + default: + return -1; + } + + if (del > -1) + DelObject(del); + + if (del2 > -1) + DelObject(del2); + + if (add > -1) + AddObject(add, gos[add].entry, gos[add].map, gos[add].x, gos[add].y, gos[add].z, gos[add].o, gos[add].rot0, gos[add].rot1, gos[add].rot2, gos[add].rot3); + + if (add2 > -1) + AddObject(add2, gos[add2].entry, gos[add2].map, gos[add2].x, gos[add2].y, gos[add2].z, gos[add2].o, gos[add2].rot0, gos[add2].rot1, gos[add2].rot2, gos[add2].rot3); } + + return retval; +} + +bool OPvPCapturePointNA::Update(uint32 diff) +{ + // let the controlling faction advance in phase + bool capturable = false; + if (m_team == TEAM_ALLIANCE && m_activePlayers[TEAM_ALLIANCE].size() > m_activePlayers[TEAM_HORDE].size()) + capturable = true; + else if (m_team == TEAM_HORDE && m_activePlayers[TEAM_ALLIANCE].size() < m_activePlayers[TEAM_HORDE].size()) + capturable = true; + + if (_guardCheckTimer < diff) + { + _guardCheckTimer = NA_GUARD_CHECK_TIME; + uint32 count = GetAliveGuardsCount(); + if (count != _guardsAlive) + { + _guardsAlive = count; + if (!_guardsAlive) + _capturable = true; + // update the guard count for the players in zone + m_PvP->SendUpdateWorldState(NA_UI_GUARDS_LEFT, _guardsAlive); + } + } + else + _guardCheckTimer -= diff; + + if (_capturable || capturable) + { + if (_respawnTimer < diff) + { + // if the guards have been killed, then the challenger has one hour to take over halaa. + // in case they fail to do it, the guards are respawned, and they have to start again. + ChangeTeam(m_team); + _respawnTimer = NA_RESPAWN_TIME; + } + else + _respawnTimer -= diff; + + return OPvPCapturePoint::Update(diff); + } + return false; +} + +void OPvPCapturePointNA::ChangeState() +{ + uint32 artkit = 21; + switch (m_State) + { + case OBJECTIVESTATE_NEUTRAL: + _halaaState = HALAA_N; + break; + case OBJECTIVESTATE_ALLIANCE: + _halaaState = HALAA_A; + artkit = 2; + break; + case OBJECTIVESTATE_HORDE: + _halaaState = HALAA_H; + artkit = 1; + break; + case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE: + _halaaState = HALAA_N_A; + break; + case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE: + _halaaState = HALAA_N_H; + break; + case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE: + _halaaState = HALAA_N_A; + artkit = 2; + break; + case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE: + _halaaState = HALAA_N_H; + artkit = 1; + break; + } + + if (GameObject* flag = HashMapHolder::Find(m_capturePointGUID)) + flag->SetGoArtKit(artkit); + + UpdateHalaaWorldState(); +} + +void OPvPCapturePointNA::ChangeTeam(TeamId oldTeam) +{ + sObjectMgr->RemoveGraveYardLink(NA_HALAA_GRAVEYARD, NA_HALAA_GRAVEYARD_ZONE, oldTeam == TEAM_ALLIANCE ? ALLIANCE : HORDE, false); + sObjectMgr->AddGraveYardLink(NA_HALAA_GRAVEYARD, NA_HALAA_GRAVEYARD_ZONE, m_team == TEAM_ALLIANCE ? ALLIANCE : HORDE, false); + + DeleteSpawns(); + SpawnGOsForTeam(m_team); + SpawnNPCsForTeam(m_team); + _guardsAlive = NA_GUARDS_MAX; + _capturable = false; + UpdateHalaaWorldState(); + + if (m_team != TEAM_NEUTRAL) + m_PvP->TeamApplyBuff(m_team, NA_CAPTURE_BUFF); + + if (m_team == TEAM_ALLIANCE) + { + _wyvernStateSouth = WYVERN_NEU_HORDE; + _wyvernStateNorth = WYVERN_NEU_HORDE; + _wyvernStateEast = WYVERN_NEU_HORDE; + _wyvernStateWest = WYVERN_NEU_HORDE; + m_PvP->SendUpdateWorldState(NA_UI_HORDE_GUARDS_SHOW, 0); + m_PvP->SendUpdateWorldState(NA_UI_ALLIANCE_GUARDS_SHOW, 1); + m_PvP->SendUpdateWorldState(NA_UI_GUARDS_LEFT, _guardsAlive); + m_PvP->SendDefenseMessage(NA_HALAA_GRAVEYARD_ZONE, TEXT_HALAA_TAKEN_ALLIANCE); + } + else + { + _wyvernStateSouth = WYVERN_NEU_ALLIANCE; + _wyvernStateNorth = WYVERN_NEU_ALLIANCE; + _wyvernStateEast = WYVERN_NEU_ALLIANCE; + _wyvernStateWest = WYVERN_NEU_ALLIANCE; + m_PvP->SendUpdateWorldState(NA_UI_HORDE_GUARDS_SHOW, 1); + m_PvP->SendUpdateWorldState(NA_UI_ALLIANCE_GUARDS_SHOW, 0); + m_PvP->SendUpdateWorldState(NA_UI_GUARDS_LEFT, _guardsAlive); + m_PvP->SendDefenseMessage(NA_HALAA_GRAVEYARD_ZONE, TEXT_HALAA_TAKEN_HORDE); + } + UpdateWyvernRoostWorldState(NA_ROOST_S); + UpdateWyvernRoostWorldState(NA_ROOST_N); + UpdateWyvernRoostWorldState(NA_ROOST_W); + UpdateWyvernRoostWorldState(NA_ROOST_E); } uint32 OPvPCapturePointNA::GetAliveGuardsCount() { - uint32 cnt = 0; + uint32 count = 0; for (std::map::iterator itr = m_Creatures.begin(); itr != m_Creatures.end(); ++itr) { switch (itr->first) { - case NA_NPC_GUARD_01: - case NA_NPC_GUARD_02: - case NA_NPC_GUARD_03: - case NA_NPC_GUARD_04: - case NA_NPC_GUARD_05: - case NA_NPC_GUARD_06: - case NA_NPC_GUARD_07: - case NA_NPC_GUARD_08: - case NA_NPC_GUARD_09: - case NA_NPC_GUARD_10: - case NA_NPC_GUARD_11: - case NA_NPC_GUARD_12: - case NA_NPC_GUARD_13: - case NA_NPC_GUARD_14: - case NA_NPC_GUARD_15: - if (Creature const* const cr = HashMapHolder::Find(itr->second)) - if (cr->IsAlive()) - ++cnt; - break; - default: - break; + case NA_NPC_GUARD_01: + case NA_NPC_GUARD_02: + case NA_NPC_GUARD_03: + case NA_NPC_GUARD_04: + case NA_NPC_GUARD_05: + case NA_NPC_GUARD_06: + case NA_NPC_GUARD_07: + case NA_NPC_GUARD_08: + case NA_NPC_GUARD_09: + case NA_NPC_GUARD_10: + case NA_NPC_GUARD_11: + case NA_NPC_GUARD_12: + case NA_NPC_GUARD_13: + case NA_NPC_GUARD_14: + case NA_NPC_GUARD_15: + if (Creature const* creature = HashMapHolder::Find(itr->second)) + if (creature->IsAlive()) + ++count; + break; + default: + break; } } - return cnt; + return count; } -uint32 OPvPCapturePointNA::GetControllingFaction() const +void OPvPCapturePointNA::DeleteSpawns() { - return m_ControllingFaction; + for (auto i = m_Objects.begin(); i != m_Objects.end(); ++i) + DelObject(i->first); + for (auto i = m_Creatures.begin(); i != m_Creatures.end(); ++i) + DelCreature(i->first); } -void OPvPCapturePointNA::SpawnNPCsForTeam(uint32 team) +void OPvPCapturePointNA::SpawnNPCsForTeam(TeamId teamId) { creature_type const* creatures = nullptr; - if (team == ALLIANCE) + if (teamId == TEAM_ALLIANCE) creatures = AllianceControlNPCs; - else if (team == HORDE) + else if (teamId == TEAM_HORDE) creatures = HordeControlNPCs; else return; - for (int i = 0; i < NA_CONTROL_NPC_NUM; ++i) - AddCreature(i, creatures[i].entry, creatures[i].map, creatures[i].x, creatures[i].y, creatures[i].z, creatures[i].o, OutdoorPvP::GetTeamIdByTeam(team), 1000000); -} -void OPvPCapturePointNA::DeSpawnNPCs() -{ - for (int i = 0; i < NA_CONTROL_NPC_NUM; ++i) - DelCreature(i); + for (uint8 i = 0; i < NA_CONTROL_NPC_NUM; ++i) + AddCreature(i, creatures[i].entry, creatures[i].map, creatures[i].x, creatures[i].y, creatures[i].z, creatures[i].o, teamId, 1000000); } -void OPvPCapturePointNA::SpawnGOsForTeam(uint32 team) +void OPvPCapturePointNA::SpawnGOsForTeam(TeamId teamId) { - const go_type * gos = NULL; - if (team == ALLIANCE) - gos=AllianceControlGOs; - else if (team == HORDE) - gos=HordeControlGOs; + go_type const* gos = nullptr; + if (teamId == TEAM_ALLIANCE) + gos = AllianceControlGOs; + else if (teamId == TEAM_HORDE) + gos = HordeControlGOs; else return; - for (int i = 0; i < NA_CONTROL_GO_NUM; ++i) + + for (uint8 i = 0; i < NA_CONTROL_GO_NUM; ++i) { if (i == NA_ROOST_S || i == NA_ROOST_W || @@ -121,84 +424,70 @@ void OPvPCapturePointNA::SpawnGOsForTeam(uint32 team) } } -void OPvPCapturePointNA::DeSpawnGOs() +void OPvPCapturePointNA::UpdateHalaaWorldState() { - for (int i = 0; i < NA_CONTROL_GO_NUM; ++i) - { - DelObject(i); - } + m_PvP->SendUpdateWorldState(NA_MAP_HALAA_NEUTRAL, uint32((_halaaState & HALAA_N) != 0)); + m_PvP->SendUpdateWorldState(NA_MAP_HALAA_NEU_A, uint32((_halaaState & HALAA_N_A) != 0)); + m_PvP->SendUpdateWorldState(NA_MAP_HALAA_NEU_H, uint32((_halaaState & HALAA_N_H) != 0)); + m_PvP->SendUpdateWorldState(NA_MAP_HALAA_HORDE, uint32((_halaaState & HALAA_H) != 0)); + m_PvP->SendUpdateWorldState(NA_MAP_HALAA_ALLIANCE, uint32((_halaaState & HALAA_A) != 0)); } -void OPvPCapturePointNA::FactionTakeOver(uint32 team) +void OPvPCapturePointNA::UpdateWyvernRoostWorldState(uint32 roost) { - if (m_ControllingFaction) - sObjectMgr->RemoveGraveYardLink(NA_HALAA_GRAVEYARD, NA_HALAA_GRAVEYARD_ZONE, m_ControllingFaction, false); - - m_ControllingFaction = team; - if (m_ControllingFaction) - sObjectMgr->AddGraveYardLink(NA_HALAA_GRAVEYARD, NA_HALAA_GRAVEYARD_ZONE, m_ControllingFaction, false); - DeSpawnGOs(); - DeSpawnNPCs(); - SpawnGOsForTeam(team); - SpawnNPCsForTeam(team); - m_GuardsAlive = NA_GUARDS_MAX; - m_capturable = false; - this->UpdateHalaaWorldState(); - if (team == ALLIANCE) - { - m_WyvernStateSouth = WYVERN_NEU_HORDE; - m_WyvernStateNorth = WYVERN_NEU_HORDE; - m_WyvernStateEast = WYVERN_NEU_HORDE; - m_WyvernStateWest = WYVERN_NEU_HORDE; - m_PvP->TeamApplyBuff(TEAM_ALLIANCE, NA_CAPTURE_BUFF); - m_PvP->SendUpdateWorldState(NA_UI_HORDE_GUARDS_SHOW, 0); - m_PvP->SendUpdateWorldState(NA_UI_ALLIANCE_GUARDS_SHOW, 1); - m_PvP->SendUpdateWorldState(NA_UI_GUARDS_LEFT, m_GuardsAlive); - m_PvP->SendDefenseMessage(NA_HALAA_GRAVEYARD_ZONE, TEXT_HALAA_TAKEN_ALLIANCE); - } - else + switch (roost) { - m_WyvernStateSouth = WYVERN_NEU_ALLIANCE; - m_WyvernStateNorth = WYVERN_NEU_ALLIANCE; - m_WyvernStateEast = WYVERN_NEU_ALLIANCE; - m_WyvernStateWest = WYVERN_NEU_ALLIANCE; - m_PvP->TeamApplyBuff(TEAM_HORDE, NA_CAPTURE_BUFF); - m_PvP->SendUpdateWorldState(NA_UI_HORDE_GUARDS_SHOW, 1); - m_PvP->SendUpdateWorldState(NA_UI_ALLIANCE_GUARDS_SHOW, 0); - m_PvP->SendUpdateWorldState(NA_UI_GUARDS_LEFT, m_GuardsAlive); - m_PvP->SendDefenseMessage(NA_HALAA_GRAVEYARD_ZONE, TEXT_HALAA_TAKEN_HORDE); + case NA_ROOST_S: + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_NEU_H, uint32((_wyvernStateSouth & WYVERN_NEU_HORDE) != 0)); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_NEU_A, uint32((_wyvernStateSouth & WYVERN_NEU_ALLIANCE) != 0)); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_H, uint32((_wyvernStateSouth & WYVERN_HORDE) != 0)); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_A, uint32((_wyvernStateSouth & WYVERN_ALLIANCE) != 0)); + break; + case NA_ROOST_N: + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_NEU_H, uint32((_wyvernStateNorth & WYVERN_NEU_HORDE) != 0)); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_NEU_A, uint32((_wyvernStateNorth & WYVERN_NEU_ALLIANCE) != 0)); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_H, uint32((_wyvernStateNorth & WYVERN_HORDE) != 0)); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_A, uint32((_wyvernStateNorth & WYVERN_ALLIANCE) != 0)); + break; + case NA_ROOST_W: + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_NEU_H, uint32((_wyvernStateWest & WYVERN_NEU_HORDE) != 0)); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_NEU_A, uint32((_wyvernStateWest & WYVERN_NEU_ALLIANCE) != 0)); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_H, uint32((_wyvernStateWest & WYVERN_HORDE) != 0)); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_A, uint32((_wyvernStateWest & WYVERN_ALLIANCE) != 0)); + break; + case NA_ROOST_E: + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_NEU_H, uint32((_wyvernStateEast & WYVERN_NEU_HORDE) != 0)); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_NEU_A, uint32((_wyvernStateEast & WYVERN_NEU_ALLIANCE) != 0)); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_H, uint32((_wyvernStateEast & WYVERN_HORDE) != 0)); + m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_A, uint32((_wyvernStateEast & WYVERN_ALLIANCE) != 0)); + break; + default: + break; } - UpdateWyvernRoostWorldState(NA_ROOST_S); - UpdateWyvernRoostWorldState(NA_ROOST_N); - UpdateWyvernRoostWorldState(NA_ROOST_W); - UpdateWyvernRoostWorldState(NA_ROOST_E); } -OPvPCapturePointNA::OPvPCapturePointNA(OutdoorPvP* pvp) : -OPvPCapturePoint(pvp), m_capturable(true), m_GuardsAlive(0), m_ControllingFaction(0), -m_WyvernStateNorth(0), m_WyvernStateSouth(0), m_WyvernStateEast(0), m_WyvernStateWest(0), -m_HalaaState(HALAA_N), m_RespawnTimer(NA_RESPAWN_TIME), m_GuardCheckTimer(NA_GUARD_CHECK_TIME) +OutdoorPvPNA::OutdoorPvPNA() { - SetCapturePointData(182210, 530, -1572.57f, 7945.3f, -22.475f, 2.05949f, 0.0f, 0.0f, 0.857167f, 0.515038f); + m_TypeId = OUTDOOR_PVP_NA; + _capturePoint = nullptr; } bool OutdoorPvPNA::SetupOutdoorPvP() { -// m_TypeId = OUTDOOR_PVP_NA; _MUST_ be set in ctor, because of spawns cleanup // add the zones affected by the pvp buff RegisterZone(NA_BUFF_ZONE); // halaa - m_obj = new OPvPCapturePointNA(this); + _capturePoint = new OPvPCapturePointNA(this); - AddCapturePoint(m_obj); + AddCapturePoint(_capturePoint); return true; } void OutdoorPvPNA::HandlePlayerEnterZone(Player* player, uint32 zone) { // add buffs - if (player->GetTeam() == m_obj->GetControllingFaction()) + if (player->GetTeamId() == _capturePoint->GetTeamId()) player->CastSpell(player, NA_CAPTURE_BUFF, true); OutdoorPvP::HandlePlayerEnterZone(player, zone); } @@ -210,57 +499,14 @@ void OutdoorPvPNA::HandlePlayerLeaveZone(Player* player, uint32 zone) OutdoorPvP::HandlePlayerLeaveZone(player, zone); } -void OutdoorPvPNA::FillInitialWorldStates(WorldPacket &data) +bool OutdoorPvPNA::Update(uint32 diff) { - m_obj->FillInitialWorldStates(data); + return _capturePoint->Update(diff); } -void OPvPCapturePointNA::FillInitialWorldStates(WorldPacket &data) +void OutdoorPvPNA::FillInitialWorldStates(WorldPacket &data) { - if (m_ControllingFaction == ALLIANCE) - { - data << NA_UI_HORDE_GUARDS_SHOW << uint32(0); - data << NA_UI_ALLIANCE_GUARDS_SHOW << uint32(1); - } - else if (m_ControllingFaction == HORDE) - { - data << NA_UI_HORDE_GUARDS_SHOW << uint32(1); - data << NA_UI_ALLIANCE_GUARDS_SHOW << uint32(0); - } - else - { - data << NA_UI_HORDE_GUARDS_SHOW << uint32(0); - data << NA_UI_ALLIANCE_GUARDS_SHOW << uint32(0); - } - - data << NA_UI_GUARDS_MAX << NA_GUARDS_MAX; - data << NA_UI_GUARDS_LEFT << uint32(m_GuardsAlive); - - data << NA_MAP_WYVERN_NORTH_NEU_H << uint32((m_WyvernStateNorth & WYVERN_NEU_HORDE) != 0); - data << NA_MAP_WYVERN_NORTH_NEU_A << uint32((m_WyvernStateNorth & WYVERN_NEU_ALLIANCE) != 0); - data << NA_MAP_WYVERN_NORTH_H << uint32((m_WyvernStateNorth & WYVERN_HORDE) != 0); - data << NA_MAP_WYVERN_NORTH_A << uint32((m_WyvernStateNorth & WYVERN_ALLIANCE) != 0); - - data << NA_MAP_WYVERN_SOUTH_NEU_H << uint32((m_WyvernStateSouth & WYVERN_NEU_HORDE) != 0); - data << NA_MAP_WYVERN_SOUTH_NEU_A << uint32((m_WyvernStateSouth & WYVERN_NEU_ALLIANCE) != 0); - data << NA_MAP_WYVERN_SOUTH_H << uint32((m_WyvernStateSouth & WYVERN_HORDE) != 0); - data << NA_MAP_WYVERN_SOUTH_A << uint32((m_WyvernStateSouth & WYVERN_ALLIANCE) != 0); - - data << NA_MAP_WYVERN_WEST_NEU_H << uint32((m_WyvernStateWest & WYVERN_NEU_HORDE) != 0); - data << NA_MAP_WYVERN_WEST_NEU_A << uint32((m_WyvernStateWest & WYVERN_NEU_ALLIANCE) != 0); - data << NA_MAP_WYVERN_WEST_H << uint32((m_WyvernStateWest & WYVERN_HORDE) != 0); - data << NA_MAP_WYVERN_WEST_A << uint32((m_WyvernStateWest & WYVERN_ALLIANCE) != 0); - - data << NA_MAP_WYVERN_EAST_NEU_H << uint32((m_WyvernStateEast & WYVERN_NEU_HORDE) != 0); - data << NA_MAP_WYVERN_EAST_NEU_A << uint32((m_WyvernStateEast & WYVERN_NEU_ALLIANCE) != 0); - data << NA_MAP_WYVERN_EAST_H << uint32((m_WyvernStateEast & WYVERN_HORDE) != 0); - data << NA_MAP_WYVERN_EAST_A << uint32((m_WyvernStateEast & WYVERN_ALLIANCE) != 0); - - data << NA_MAP_HALAA_NEUTRAL << uint32((m_HalaaState & HALAA_N) != 0); - data << NA_MAP_HALAA_NEU_A << uint32((m_HalaaState & HALAA_N_A) != 0); - data << NA_MAP_HALAA_NEU_H << uint32((m_HalaaState & HALAA_N_H) != 0); - data << NA_MAP_HALAA_HORDE << uint32((m_HalaaState & HALAA_H) != 0); - data << NA_MAP_HALAA_ALLIANCE << uint32((m_HalaaState & HALAA_A) != 0); + _capturePoint->FillInitialWorldStates(data); } void OutdoorPvPNA::SendRemoveWorldStates(Player* player) @@ -292,327 +538,15 @@ void OutdoorPvPNA::SendRemoveWorldStates(Player* player) player->SendUpdateWorldState(NA_MAP_HALAA_ALLIANCE, 0); } -bool OutdoorPvPNA::Update(uint32 diff) -{ - return m_obj->Update(diff); -} - -bool OPvPCapturePointNA::HandleCustomSpell(Player* player, uint32 spellId, GameObject* /*go*/) -{ - std::vector nodes; - nodes.resize(2); - bool retval = false; - switch (spellId) - { - case NA_SPELL_FLY_NORTH: - nodes[0] = FlightPathStartNodes[NA_ROOST_N]; - nodes[1] = FlightPathEndNodes[NA_ROOST_N]; - player->ActivateTaxiPathTo(nodes); - player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP); - player->UpdatePvP(true, true); - retval = true; - break; - case NA_SPELL_FLY_SOUTH: - nodes[0] = FlightPathStartNodes[NA_ROOST_S]; - nodes[1] = FlightPathEndNodes[NA_ROOST_S]; - player->ActivateTaxiPathTo(nodes); - player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP); - player->UpdatePvP(true, true); - retval = true; - break; - case NA_SPELL_FLY_WEST: - nodes[0] = FlightPathStartNodes[NA_ROOST_W]; - nodes[1] = FlightPathEndNodes[NA_ROOST_W]; - player->ActivateTaxiPathTo(nodes); - player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP); - player->UpdatePvP(true, true); - retval = true; - break; - case NA_SPELL_FLY_EAST: - nodes[0] = FlightPathStartNodes[NA_ROOST_E]; - nodes[1] = FlightPathEndNodes[NA_ROOST_E]; - player->ActivateTaxiPathTo(nodes); - player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP); - player->UpdatePvP(true, true); - retval = true; - break; - default: - break; - } - - if (retval) - { - //Adding items - uint32 noSpaceForCount = 0; - - // check space and find places - ItemPosCountVec dest; - - int32 count = 10; - uint32 itemid = 24538; - // bomb id count - InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemid, count, &noSpaceForCount); - if (msg != EQUIP_ERR_OK) // convert to possible store amount - count -= noSpaceForCount; - - if (count == 0 || dest.empty()) // can't add any - { - return true; - } - - Item* item = player->StoreNewItem(dest, itemid, true); - - if (count > 0 && item) - { - player->SendNewItem(item, count, true, false); - } - - return true; - } - return false; -} - -int32 OPvPCapturePointNA::HandleOpenGo(Player* player, ObjectGuid guid) +void OutdoorPvPNA::HandleKillImpl(Player* player, Unit* killed) { - int32 retval = OPvPCapturePoint::HandleOpenGo(player, guid); - if (retval >= 0) + if (killed->GetTypeId() == TYPEID_PLAYER && player->GetTeam() != killed->ToPlayer()->GetTeam()) { - const go_type * gos = NULL; - if (m_ControllingFaction == ALLIANCE) - gos=AllianceControlGOs; - else if (m_ControllingFaction == HORDE) - gos=HordeControlGOs; + player->KilledMonsterCredit(NA_CREDIT_MARKER); + if (player->GetTeamId() == TEAM_ALLIANCE) + player->CastSpell(player, NA_KILL_TOKEN_ALLIANCE, true); else - return -1; - - int32 del = -1; - int32 del2 = -1; - int32 add = -1; - int32 add2 = -1; - - switch (retval) - { - case NA_DESTROYED_ROOST_S: - del = NA_DESTROYED_ROOST_S; - add = NA_ROOST_S; - add2 = NA_BOMB_WAGON_S; - if (m_ControllingFaction == HORDE) - m_WyvernStateSouth = WYVERN_ALLIANCE; - else - m_WyvernStateSouth = WYVERN_HORDE; - UpdateWyvernRoostWorldState(NA_ROOST_S); - break; - case NA_DESTROYED_ROOST_N: - del = NA_DESTROYED_ROOST_N; - add = NA_ROOST_N; - add2 = NA_BOMB_WAGON_N; - if (m_ControllingFaction == HORDE) - m_WyvernStateNorth = WYVERN_ALLIANCE; - else - m_WyvernStateNorth = WYVERN_HORDE; - UpdateWyvernRoostWorldState(NA_ROOST_N); - break; - case NA_DESTROYED_ROOST_W: - del = NA_DESTROYED_ROOST_W; - add = NA_ROOST_W; - add2 = NA_BOMB_WAGON_W; - if (m_ControllingFaction == HORDE) - m_WyvernStateWest = WYVERN_ALLIANCE; - else - m_WyvernStateWest = WYVERN_HORDE; - UpdateWyvernRoostWorldState(NA_ROOST_W); - break; - case NA_DESTROYED_ROOST_E: - del = NA_DESTROYED_ROOST_E; - add = NA_ROOST_E; - add2 = NA_BOMB_WAGON_E; - if (m_ControllingFaction == HORDE) - m_WyvernStateEast = WYVERN_ALLIANCE; - else - m_WyvernStateEast = WYVERN_HORDE; - UpdateWyvernRoostWorldState(NA_ROOST_E); - break; - case NA_BOMB_WAGON_S: - del = NA_BOMB_WAGON_S; - del2 = NA_ROOST_S; - add = NA_DESTROYED_ROOST_S; - if (m_ControllingFaction == HORDE) - m_WyvernStateSouth = WYVERN_NEU_ALLIANCE; - else - m_WyvernStateSouth = WYVERN_NEU_HORDE; - UpdateWyvernRoostWorldState(NA_ROOST_S); - break; - case NA_BOMB_WAGON_N: - del = NA_BOMB_WAGON_N; - del2 = NA_ROOST_N; - add = NA_DESTROYED_ROOST_N; - if (m_ControllingFaction == HORDE) - m_WyvernStateNorth = WYVERN_NEU_ALLIANCE; - else - m_WyvernStateNorth = WYVERN_NEU_HORDE; - UpdateWyvernRoostWorldState(NA_ROOST_N); - break; - case NA_BOMB_WAGON_W: - del = NA_BOMB_WAGON_W; - del2 = NA_ROOST_W; - add = NA_DESTROYED_ROOST_W; - if (m_ControllingFaction == HORDE) - m_WyvernStateWest = WYVERN_NEU_ALLIANCE; - else - m_WyvernStateWest = WYVERN_NEU_HORDE; - UpdateWyvernRoostWorldState(NA_ROOST_W); - break; - case NA_BOMB_WAGON_E: - del = NA_BOMB_WAGON_E; - del2 = NA_ROOST_E; - add = NA_DESTROYED_ROOST_E; - if (m_ControllingFaction == HORDE) - m_WyvernStateEast = WYVERN_NEU_ALLIANCE; - else - m_WyvernStateEast = WYVERN_NEU_HORDE; - UpdateWyvernRoostWorldState(NA_ROOST_E); - break; - default: - return -1; - break; - } - - if (del>-1) - DelObject(del); - - if (del2>-1) - DelObject(del2); - - if (add>-1) - AddObject(add, gos[add].entry, gos[add].map, gos[add].x, gos[add].y, gos[add].z, gos[add].o, gos[add].rot0, gos[add].rot1, gos[add].rot2, gos[add].rot3); - - if (add2>-1) - AddObject(add2, gos[add2].entry, gos[add2].map, gos[add2].x, gos[add2].y, gos[add2].z, gos[add2].o, gos[add2].rot0, gos[add2].rot1, gos[add2].rot2, gos[add2].rot3); - - return retval; - } - return -1; -} - -bool OPvPCapturePointNA::Update(uint32 diff) -{ - // let the controlling faction advance in phase - bool capturable = false; - if (m_ControllingFaction == ALLIANCE && m_activePlayers[0].size() > m_activePlayers[1].size()) - capturable = true; - else if (m_ControllingFaction == HORDE && m_activePlayers[0].size() < m_activePlayers[1].size()) - capturable = true; - - if (m_GuardCheckTimer < diff) - { - m_GuardCheckTimer = NA_GUARD_CHECK_TIME; - uint32 cnt = GetAliveGuardsCount(); - if (cnt != m_GuardsAlive) - { - m_GuardsAlive = cnt; - if (m_GuardsAlive == 0) - m_capturable = true; - // update the guard count for the players in zone - m_PvP->SendUpdateWorldState(NA_UI_GUARDS_LEFT, m_GuardsAlive); - } - } else m_GuardCheckTimer -= diff; - - if (m_capturable || capturable) - { - if (m_RespawnTimer < diff) - { - // if the guards have been killed, then the challenger has one hour to take over halaa. - // in case they fail to do it, the guards are respawned, and they have to start again. - if (m_ControllingFaction) - FactionTakeOver(m_ControllingFaction); - m_RespawnTimer = NA_RESPAWN_TIME; - } else m_RespawnTimer -= diff; - - return OPvPCapturePoint::Update(diff); - } - return false; -} - -void OPvPCapturePointNA::ChangeState() -{ - uint32 artkit = 21; - switch (m_State) - { - case OBJECTIVESTATE_NEUTRAL: - m_HalaaState = HALAA_N; - break; - case OBJECTIVESTATE_ALLIANCE: - m_HalaaState = HALAA_A; - FactionTakeOver(ALLIANCE); - artkit = 2; - break; - case OBJECTIVESTATE_HORDE: - m_HalaaState = HALAA_H; - FactionTakeOver(HORDE); - artkit = 1; - break; - case OBJECTIVESTATE_NEUTRAL_ALLIANCE_CHALLENGE: - m_HalaaState = HALAA_N_A; - break; - case OBJECTIVESTATE_NEUTRAL_HORDE_CHALLENGE: - m_HalaaState = HALAA_N_H; - break; - case OBJECTIVESTATE_ALLIANCE_HORDE_CHALLENGE: - m_HalaaState = HALAA_N_A; - artkit = 2; - break; - case OBJECTIVESTATE_HORDE_ALLIANCE_CHALLENGE: - m_HalaaState = HALAA_N_H; - artkit = 1; - break; - } - - GameObject* flag = HashMapHolder::Find(m_capturePointGUID); - if (flag) - { - flag->SetGoArtKit(artkit); - } - - UpdateHalaaWorldState(); -} - -void OPvPCapturePointNA::UpdateHalaaWorldState() -{ - m_PvP->SendUpdateWorldState(NA_MAP_HALAA_NEUTRAL, uint32((m_HalaaState & HALAA_N) != 0)); - m_PvP->SendUpdateWorldState(NA_MAP_HALAA_NEU_A, uint32((m_HalaaState & HALAA_N_A) != 0)); - m_PvP->SendUpdateWorldState(NA_MAP_HALAA_NEU_H, uint32((m_HalaaState & HALAA_N_H) != 0)); - m_PvP->SendUpdateWorldState(NA_MAP_HALAA_HORDE, uint32((m_HalaaState & HALAA_H) != 0)); - m_PvP->SendUpdateWorldState(NA_MAP_HALAA_ALLIANCE, uint32((m_HalaaState & HALAA_A) != 0)); -} - -void OPvPCapturePointNA::UpdateWyvernRoostWorldState(uint32 roost) -{ - switch (roost) - { - case NA_ROOST_S: - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_NEU_H, uint32((m_WyvernStateSouth & WYVERN_NEU_HORDE) != 0)); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_NEU_A, uint32((m_WyvernStateSouth & WYVERN_NEU_ALLIANCE) != 0)); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_H, uint32((m_WyvernStateSouth & WYVERN_HORDE) != 0)); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_SOUTH_A, uint32((m_WyvernStateSouth & WYVERN_ALLIANCE) != 0)); - break; - case NA_ROOST_N: - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_NEU_H, uint32((m_WyvernStateNorth & WYVERN_NEU_HORDE) != 0)); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_NEU_A, uint32((m_WyvernStateNorth & WYVERN_NEU_ALLIANCE) != 0)); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_H, uint32((m_WyvernStateNorth & WYVERN_HORDE) != 0)); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_NORTH_A, uint32((m_WyvernStateNorth & WYVERN_ALLIANCE) != 0)); - break; - case NA_ROOST_W: - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_NEU_H, uint32((m_WyvernStateWest & WYVERN_NEU_HORDE) != 0)); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_NEU_A, uint32((m_WyvernStateWest & WYVERN_NEU_ALLIANCE) != 0)); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_H, uint32((m_WyvernStateWest & WYVERN_HORDE) != 0)); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_WEST_A, uint32((m_WyvernStateWest & WYVERN_ALLIANCE) != 0)); - break; - case NA_ROOST_E: - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_NEU_H, uint32((m_WyvernStateEast & WYVERN_NEU_HORDE) != 0)); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_NEU_A, uint32((m_WyvernStateEast & WYVERN_NEU_ALLIANCE) != 0)); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_H, uint32((m_WyvernStateEast & WYVERN_HORDE) != 0)); - m_PvP->SendUpdateWorldState(NA_MAP_WYVERN_EAST_A, uint32((m_WyvernStateEast & WYVERN_ALLIANCE) != 0)); - break; + player->CastSpell(player, NA_KILL_TOKEN_HORDE, true); } } diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.h b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.h index fac9d8fa35767..a220c496a8c4a 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.h +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.h @@ -34,96 +34,101 @@ enum DefenseMessages enum OutdoorPvPNASpells { - NA_KILL_TOKEN_ALLIANCE = 33005, - NA_KILL_TOKEN_HORDE = 33004, - NA_CAPTURE_BUFF = 33795 // strength of the halaani + NA_KILL_TOKEN_ALLIANCE = 33005, + NA_KILL_TOKEN_HORDE = 33004, + NA_CAPTURE_BUFF = 33795 // strength of the halaani }; // kill credit for pks -const uint32 NA_CREDIT_MARKER = 24867; +uint32 const NA_CREDIT_MARKER = 24867; -const uint32 NA_GUARDS_MAX = 15; +uint32 const NA_GUARDS_MAX = 15; -const uint32 NA_BUFF_ZONE = 3518; +uint32 const NA_BUFF_ZONE = 3518; -const uint32 NA_HALAA_GRAVEYARD = 993; +uint32 const NA_HALAA_GRAVEYARD = 993; -const uint32 NA_HALAA_GRAVEYARD_ZONE = 3518; // need to add zone id, not area id +uint32 const NA_HALAA_GRAVEYARD_ZONE = 3518; // need to add zone id, not area id -const uint32 NA_RESPAWN_TIME = 3600000; // one hour to capture after defeating all guards +uint32 const NA_RESPAWN_TIME = 3600000; // one hour to capture after defeating all guards -const uint32 NA_GUARD_CHECK_TIME = 500; // every half second +uint32 const NA_GUARD_CHECK_TIME = 500; // every half second enum OutdoorPvPNAWorldStates { - NA_UI_HORDE_GUARDS_SHOW = 2503, - NA_UI_ALLIANCE_GUARDS_SHOW = 2502, - NA_UI_GUARDS_MAX = 2493, - NA_UI_GUARDS_LEFT = 2491, - - NA_MAP_WYVERN_NORTH_NEU_H = 2762, - NA_MAP_WYVERN_NORTH_NEU_A = 2662, - NA_MAP_WYVERN_NORTH_H = 2663, - NA_MAP_WYVERN_NORTH_A = 2664, - - NA_MAP_WYVERN_SOUTH_NEU_H = 2760, - NA_MAP_WYVERN_SOUTH_NEU_A = 2670, - NA_MAP_WYVERN_SOUTH_H = 2668, - NA_MAP_WYVERN_SOUTH_A = 2669, - - NA_MAP_WYVERN_WEST_NEU_H = 2761, - NA_MAP_WYVERN_WEST_NEU_A = 2667, - NA_MAP_WYVERN_WEST_H = 2665, - NA_MAP_WYVERN_WEST_A = 2666, - - NA_MAP_WYVERN_EAST_NEU_H = 2763, - NA_MAP_WYVERN_EAST_NEU_A = 2659, - NA_MAP_WYVERN_EAST_H = 2660, - NA_MAP_WYVERN_EAST_A = 2661, - - NA_MAP_HALAA_NEUTRAL = 2671, - NA_MAP_HALAA_NEU_A = 2676, - NA_MAP_HALAA_NEU_H = 2677, - NA_MAP_HALAA_HORDE = 2672, - NA_MAP_HALAA_ALLIANCE = 2673 + NA_UI_HORDE_GUARDS_SHOW = 2503, + NA_UI_ALLIANCE_GUARDS_SHOW = 2502, + NA_UI_GUARDS_MAX = 2493, + NA_UI_GUARDS_LEFT = 2491, + + NA_MAP_WYVERN_NORTH_NEU_H = 2762, + NA_MAP_WYVERN_NORTH_NEU_A = 2662, + NA_MAP_WYVERN_NORTH_H = 2663, + NA_MAP_WYVERN_NORTH_A = 2664, + + NA_MAP_WYVERN_SOUTH_NEU_H = 2760, + NA_MAP_WYVERN_SOUTH_NEU_A = 2670, + NA_MAP_WYVERN_SOUTH_H = 2668, + NA_MAP_WYVERN_SOUTH_A = 2669, + + NA_MAP_WYVERN_WEST_NEU_H = 2761, + NA_MAP_WYVERN_WEST_NEU_A = 2667, + NA_MAP_WYVERN_WEST_H = 2665, + NA_MAP_WYVERN_WEST_A = 2666, + + NA_MAP_WYVERN_EAST_NEU_H = 2763, + NA_MAP_WYVERN_EAST_NEU_A = 2659, + NA_MAP_WYVERN_EAST_H = 2660, + NA_MAP_WYVERN_EAST_A = 2661, + + NA_MAP_HALAA_NEUTRAL = 2671, + NA_MAP_HALAA_NEU_A = 2676, + NA_MAP_HALAA_NEU_H = 2677, + NA_MAP_HALAA_HORDE = 2672, + NA_MAP_HALAA_ALLIANCE = 2673 }; -const uint32 FLIGHT_NODES_NUM = 4; - // used to access the elements of Horde/AllyControlGOs enum ControlGOTypes { - NA_ROOST_S = 0, - NA_ROOST_W = 1, - NA_ROOST_N = 2, - NA_ROOST_E = 3, - - NA_BOMB_WAGON_S = 4, - NA_BOMB_WAGON_W = 5, - NA_BOMB_WAGON_N = 6, - NA_BOMB_WAGON_E = 7, - - NA_DESTROYED_ROOST_S = 8, - NA_DESTROYED_ROOST_W = 9, - NA_DESTROYED_ROOST_N = 10, - NA_DESTROYED_ROOST_E = 11, - - NA_CONTROL_GO_NUM = 12 + NA_ROOST_S = 0, + NA_ROOST_W = 1, + NA_ROOST_N = 2, + NA_ROOST_E = 3, + + NA_BOMB_WAGON_S = 4, + NA_BOMB_WAGON_W = 5, + NA_BOMB_WAGON_N = 6, + NA_BOMB_WAGON_E = 7, + + NA_DESTROYED_ROOST_S = 8, + NA_DESTROYED_ROOST_W = 9, + NA_DESTROYED_ROOST_N = 10, + NA_DESTROYED_ROOST_E = 11, + + NA_CONTROL_GO_NUM = 12 }; -const uint32 FlightPathStartNodes[FLIGHT_NODES_NUM] = {103, 105, 107, 109}; -const uint32 FlightPathEndNodes[FLIGHT_NODES_NUM] = {104, 106, 108, 110}; +uint32 const FLIGHT_NODES_NUM = 4; +std::vector const FlightPathNodes[FLIGHT_NODES_NUM] = +{ + // start, end + { 103, 104 }, + { 105, 106 }, + { 107, 108 }, + { 109, 110 } +}; enum FlightSpellsNA { - NA_SPELL_FLY_SOUTH = 32059, - NA_SPELL_FLY_WEST = 32068, - NA_SPELL_FLY_NORTH = 32075, - NA_SPELL_FLY_EAST = 32081 + NA_SPELL_FLY_SOUTH = 32059, + NA_SPELL_FLY_WEST = 32068, + NA_SPELL_FLY_NORTH = 32075, + NA_SPELL_FLY_EAST = 32081 }; // spawned when the alliance is attacking, horde is in control -const go_type HordeControlGOs[NA_CONTROL_GO_NUM] = +go_type const HordeControlGOs[NA_CONTROL_GO_NUM] = { {182267, 530, -1815.8f, 8036.51f, -26.2354f, -2.89725f, 0.0f, 0.0f, 0.992546f, -0.121869f}, //ALLY_ROOST_SOUTH {182280, 530, -1507.95f, 8132.1f, -19.5585f, -1.3439f, 0.0f, 0.0f, 0.622515f, -0.782608f}, //ALLY_ROOST_WEST @@ -142,7 +147,7 @@ const go_type HordeControlGOs[NA_CONTROL_GO_NUM] = }; // spawned when the horde is attacking, alliance is in control -const go_type AllianceControlGOs[NA_CONTROL_GO_NUM] = +go_type const AllianceControlGOs[NA_CONTROL_GO_NUM] = { {182301, 530, -1815.8f, 8036.51f, -26.2354f, -2.89725f, 0.0f, 0.0f, 0.992546f, -0.121869f}, //HORDE_ROOST_SOUTH {182302, 530, -1507.95f, 8132.1f, -19.5585f, -1.3439f, 0.0f, 0.0f, 0.622515f, -0.782608f}, //HORDE_ROOST_WEST @@ -237,73 +242,68 @@ const creature_type AllianceControlNPCs[NA_CONTROL_NPC_NUM] = enum WyvernStates { - WYVERN_NEU_HORDE = 1, + WYVERN_NEU_HORDE = 1, WYVERN_NEU_ALLIANCE = 2, - WYVERN_HORDE = 4, - WYVERN_ALLIANCE = 8 + WYVERN_HORDE = 4, + WYVERN_ALLIANCE = 8 }; enum HalaaStates { - HALAA_N = 1, - HALAA_N_A = 2, - HALAA_A = 4, - HALAA_N_H = 8, - HALAA_H = 16 + HALAA_N = 1, + HALAA_N_A = 2, + HALAA_A = 4, + HALAA_N_H = 8, + HALAA_H = 16 }; class Unit; class Creature; class OutdoorPvPNA; + class OPvPCapturePointNA : public OPvPCapturePoint { public: OPvPCapturePointNA(OutdoorPvP* pvp); - bool Update(uint32 diff) override; - - void ChangeState() override; - - void FillInitialWorldStates(WorldPacket & data) override; + void FillInitialWorldStates(WorldPacket& data) override; bool HandleCustomSpell(Player* player, uint32 spellId, GameObject* go) override; int32 HandleOpenGo(Player* player, ObjectGuid guid) override; + bool Update(uint32 diff) override; + + void ChangeState() override; + void ChangeTeam(TeamId oldTeam) override; + + TeamId GetTeamId() const { return m_team; } uint32 GetAliveGuardsCount(); - uint32 GetControllingFaction() const; protected: - // called when a faction takes control - void FactionTakeOver(uint32 team); + void DeleteSpawns() override; - void DeSpawnNPCs(); - void DeSpawnGOs(); + void SpawnNPCsForTeam(TeamId teamId); + void SpawnGOsForTeam(TeamId teamId); - void SpawnNPCsForTeam(uint32 team); - void SpawnGOsForTeam(uint32 team); - - void UpdateWyvernRoostWorldState(uint32 roost); void UpdateHalaaWorldState(); + void UpdateWyvernRoostWorldState(uint32 roost); private: - bool m_capturable; - - uint32 m_GuardsAlive; + bool _capturable; - uint32 m_ControllingFaction; + uint32 _guardsAlive; - uint32 m_WyvernStateNorth; - uint32 m_WyvernStateSouth; - uint32 m_WyvernStateEast; - uint32 m_WyvernStateWest; + uint32 _wyvernStateNorth; + uint32 _wyvernStateSouth; + uint32 _wyvernStateEast; + uint32 _wyvernStateWest; - uint32 m_HalaaState; + uint32 _halaaState; - uint32 m_RespawnTimer; - - uint32 m_GuardCheckTimer; + uint32 _respawnTimer; + uint32 _guardCheckTimer; }; class OutdoorPvPNA : public OutdoorPvP @@ -311,21 +311,21 @@ class OutdoorPvPNA : public OutdoorPvP public: OutdoorPvPNA(); - bool SetupOutdoorPvP(); + bool SetupOutdoorPvP() override; - void HandlePlayerEnterZone(Player* player, uint32 zone); - void HandlePlayerLeaveZone(Player* player, uint32 zone); + void HandlePlayerEnterZone(Player* player, uint32 zone) override; + void HandlePlayerLeaveZone(Player* player, uint32 zone) override; - bool Update(uint32 diff); + bool Update(uint32 diff) override; - void FillInitialWorldStates(WorldPacket &data); + void FillInitialWorldStates(WorldPacket& data) override; - void SendRemoveWorldStates(Player* player); + void SendRemoveWorldStates(Player* player) override; - void HandleKillImpl(Player* player, Unit* killed); + void HandleKillImpl(Player* killer, Unit* killed) override; private: - OPvPCapturePointNA * m_obj; + OPvPCapturePointNA* _capturePoint; }; -#endif +#endif // OUTDOOR_PVP_NA_