diff options
author | megamage <none@none> | 2008-12-19 16:05:13 -0600 |
---|---|---|
committer | megamage <none@none> | 2008-12-19 16:05:13 -0600 |
commit | 400f7b859693eef1043a75a18c369dd871ffb721 (patch) | |
tree | 5f480c9380d4125a57cbeb4315ef22ad2ab32a71 /src/game/BattleGroundHandler.cpp | |
parent | cebaa3a703f36efeedc5fd786b6eacb7a93585c2 (diff) |
*Temp fix for crash caused by AV creature. Need to find a way to allow summoned creatures to use RandomMovement.
--HG--
branch : trunk
Diffstat (limited to 'src/game/BattleGroundHandler.cpp')
-rw-r--r-- | src/game/BattleGroundHandler.cpp | 233 |
1 files changed, 70 insertions, 163 deletions
diff --git a/src/game/BattleGroundHandler.cpp b/src/game/BattleGroundHandler.cpp index cd3e5f1907d..fc99fe3f1fe 100644 --- a/src/game/BattleGroundHandler.cpp +++ b/src/game/BattleGroundHandler.cpp @@ -10,12 +10,12 @@ * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "Common.h" @@ -29,11 +29,11 @@ #include "ObjectAccessor.h" #include "Object.h" #include "Chat.h" -#include "Language.h" #include "BattleGroundMgr.h" #include "BattleGroundWS.h" #include "BattleGround.h" #include "ArenaTeam.h" +#include "Language.h" void WorldSession::HandleBattleGroundHelloOpcode( WorldPacket & recv_data ) { @@ -98,7 +98,7 @@ void WorldSession::HandleBattleGroundJoinOpcode( WorldPacket & recv_data ) // can do this, since it's battleground, not arena uint32 bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(bgTypeId, 0); - // ignore if we already in BG or BG queue + // ignore if player is already in BG if(_player->InBattleGround()) return; @@ -146,80 +146,12 @@ void WorldSession::HandleBattleGroundJoinOpcode( WorldPacket & recv_data ) if(!grp) return; uint32 err = grp->CanJoinBattleGroundQueue(bgTypeId, bgQueueTypeId, 0, bg->GetMaxPlayersPerTeam(), false, 0); - switch(err) + if (err != BG_JOIN_ERR_OK) { - // TODO: add error-based feedback to players in all cases - case BG_JOIN_ERR_GROUP_TOO_MANY: - { - WorldPacket data; - ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, GetTrinityString(LANG_BG_GROUP_TOO_LARGE), NULL); - SendPacket(&data); - } - return; - break; - case BG_JOIN_ERR_OFFLINE_MEMBER: - { - WorldPacket data; - ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, GetTrinityString(LANG_BG_GROUP_OFFLINE_MEMBER), NULL); - SendPacket(&data); - } - return; - break; - case BG_JOIN_ERR_MIXED_FACTION: - { - WorldPacket data; - ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, GetTrinityString(LANG_BG_GROUP_MIXED_FACTION), NULL); - SendPacket(&data); - } - return; - break; - case BG_JOIN_ERR_MIXED_LEVELS: - { - WorldPacket data; - ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, GetTrinityString(LANG_BG_GROUP_MIXED_LEVELS), NULL); - SendPacket(&data); - } - return; - break; - case BG_JOIN_ERR_GROUP_MEMBER_ALREADY_IN_QUEUE: - { - WorldPacket data; - ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, GetTrinityString(LANG_BG_GROUP_MEMBER_ALREADY_IN_QUEUE), NULL); - SendPacket(&data); - } + SendBattleGroundOrArenaJoinError(err); return; - break; - case BG_JOIN_ERR_GROUP_DESERTER: - { - WorldPacket data; - ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, GetTrinityString(LANG_BG_GROUP_MEMBER_DESERTER), NULL); - SendPacket(&data); - } - return; - break; - case BG_JOIN_ERR_ALL_QUEUES_USED: - { - WorldPacket data; - ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, GetTrinityString(LANG_BG_GROUP_MEMBER_NO_FREE_QUEUE_SLOTS), NULL); - SendPacket(&data); - } - return; - break; - // all ok, can join - case BG_JOIN_ERR_OK: - break; - // these aren't possible outcomes in bgs - case BG_JOIN_ERR_GROUP_NOT_ENOUGH: - case BG_JOIN_ERR_MIXED_ARENATEAM: - return; - break; - // not the above? shouldn't happen, don't let join - default: - return; - break; - }; + } } - // if we're here, then the conditions to join a bg are met. We can proceed in joining. // _player->GetGroup() was already checked, grp is already initialized @@ -362,7 +294,7 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data ) uint8 type; // arenatype if arena uint8 unk2; // unk, can be 0x0 (may be if was invited?) and 0x1 - uint32 instanceId; + uint32 instanceId; uint32 bgTypeId; // type id from dbc uint16 unk; // 0x1F90 constant? uint8 action; // enter battle 0x1, leave queue 0x0 @@ -400,7 +332,7 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data ) uint8 israted = itrPlayerStatus->second.GroupInfo->IsRated; uint8 status = 0; - + if(!itrPlayerStatus->second.GroupInfo->IsInvitedToBGInstanceGUID) { // not invited to bg, get template @@ -432,7 +364,7 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data ) } uint32 bgQueueTypeId = 0; - // get the bg what we were invited to + // get the bg what we were invited to BattleGroundQueue::QueuedPlayersMap::iterator itrPlayerStatus; bgQueueTypeId = sBattleGroundMgr.BGQueueTypeId(bgTypeId,type); itrPlayerStatus = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].find(_player->GetGUID()); @@ -472,6 +404,7 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data ) uint32 arenatype = 0; uint32 israted = 0; uint32 rating = 0; + uint32 opponentsRating = 0; // get the team info from the queue BattleGroundQueue::QueuedPlayersMap::iterator pitr = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].find(_player->GetGUID()); if(pitr !=sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].m_QueuedPlayers[_player->GetBattleGroundQueueIdFromLevel()].end() @@ -481,6 +414,7 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data ) arenatype = pitr->second.GroupInfo->ArenaType; israted = pitr->second.GroupInfo->IsRated; rating = pitr->second.GroupInfo->ArenaTeamRating; + opponentsRating = pitr->second.GroupInfo->OpponentsTeamRating; } else { @@ -496,7 +430,7 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data ) // resurrect the player if(!_player->isAlive()) { - _player->ResurrectPlayer(1.0f,false); + _player->ResurrectPlayer(1.0f); _player->SpawnCorpseBones(); } // stop taxi flight at port @@ -528,6 +462,19 @@ void WorldSession::HandleBattleGroundPlayerPortOpcode( WorldPacket &recv_data ) break; case 0: // leave queue queueSlot = _player->GetBattleGroundQueueIndex(bgQueueTypeId); + /* + if player leaves rated arena match before match start, it is counted as he played but he lost + */ + if (israted) + { + ArenaTeam * at = objmgr.GetArenaTeamById(team); + if (at) + { + sLog.outDebug("UPDATING memberLost's personal arena rating for %u by opponents rating: %u, because he has left queue!", GUID_LOPART(_player->GetGUID()), opponentsRating); + at->MemberLost(_player, opponentsRating); + at->SaveToDB(); + } + } _player->RemoveBattleGroundQueueId(bgQueueTypeId); // must be called this way, because if you move this call to queue->removeplayer, it causes bugs sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, _player->GetTeam(), queueSlot, STATUS_NONE, 0, 0); sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId].RemovePlayer(_player->GetGUID(), true); @@ -745,7 +692,7 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data ) BattleGround* bg = NULL; if( !(bg = sBattleGroundMgr.GetBattleGroundTemplate(BATTLEGROUND_AA)) ) { - sLog.outError("Battleground: template bg (all arenas) not found"); + sLog.outError("Battleground: template bg (all arenas) not found"); return; } @@ -770,94 +717,16 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data ) if(!grp) return; uint32 err = grp->CanJoinBattleGroundQueue(bgTypeId, bgQueueTypeId, arenatype, arenatype, (bool)isRated, type); - switch(err) + if (err != BG_JOIN_ERR_OK) { - // TODO: add error-based feedback to players in all cases - case BG_JOIN_ERR_GROUP_TOO_MANY: - { - WorldPacket data; - ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, GetTrinityString(LANG_ARENA_GROUP_TOO_LARGE), NULL); - SendPacket(&data); - } - return; - break; - case BG_JOIN_ERR_GROUP_NOT_ENOUGH: - { - WorldPacket data; - ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, GetTrinityString(LANG_ARENA_NOT_ENOUGH_PLAYERS), NULL); - SendPacket(&data); - } - return; - break; - case BG_JOIN_ERR_MIXED_ARENATEAM: - { - WorldPacket data; - ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, GetTrinityString(LANG_ARENA_YOUR_TEAM_ONLY), NULL); - SendPacket(&data); - } - return; - break; - case BG_JOIN_ERR_OFFLINE_MEMBER: - { - WorldPacket data; - ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, GetTrinityString(LANG_BG_GROUP_OFFLINE_MEMBER), NULL); - SendPacket(&data); - } - return; - break; - case BG_JOIN_ERR_MIXED_FACTION: - { - WorldPacket data; - ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, GetTrinityString(LANG_BG_GROUP_MIXED_FACTION), NULL); - SendPacket(&data); - } - return; - break; - case BG_JOIN_ERR_MIXED_LEVELS: - { - WorldPacket data; - ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, GetTrinityString(LANG_BG_GROUP_MIXED_LEVELS), NULL); - SendPacket(&data); - } - return; - break; - case BG_JOIN_ERR_GROUP_MEMBER_ALREADY_IN_QUEUE: - { - WorldPacket data; - ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, GetTrinityString(LANG_BG_GROUP_MEMBER_ALREADY_IN_QUEUE), NULL); - SendPacket(&data); - } - return; - break; - case BG_JOIN_ERR_GROUP_DESERTER: - { - WorldPacket data; - ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, GetTrinityString(LANG_BG_GROUP_MEMBER_DESERTER), NULL); - SendPacket(&data); - } + SendBattleGroundOrArenaJoinError(err); return; - break; - case BG_JOIN_ERR_ALL_QUEUES_USED: - { - WorldPacket data; - ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, GetTrinityString(LANG_BG_GROUP_MEMBER_NO_FREE_QUEUE_SLOTS), NULL); - SendPacket(&data); - } - return; - break; - // all ok, can join - case BG_JOIN_ERR_OK: - break; - // not the above? shouldn't happen, don't let join - default: - return; - break; - }; + } } uint32 ateamId = 0; - if(isRated) + if(isRated) { ateamId = _player->GetArenaTeamId(type); // check real arenateam existence only here (if it was moved to group->CanJoin .. () then we would ahve to get it twice) @@ -883,7 +752,7 @@ void WorldSession::HandleBattleGroundArenaJoin( WorldPacket & recv_data ) if( arenatype ) avg_pers_rating /= arenatype; - // if avg personal rating is more than 150 points below the team’s rating, the team will be queued against an opponent matching or similar to the average personal rating + // if avg personal rating is more than 150 points below the teams rating, the team will be queued against an opponent matching or similar to the average personal rating if(avg_pers_rating + 150 < arenaRating) arenaRating = avg_pers_rating; } @@ -952,3 +821,41 @@ void WorldSession::HandleBattleGroundReportAFK( WorldPacket & recv_data ) reportedPlayer->ReportedAfkBy(_player); } + +void WorldSession::SendBattleGroundOrArenaJoinError(uint8 err) +{ + WorldPacket data; + int32 msg; + switch (err) + { + case BG_JOIN_ERR_OFFLINE_MEMBER: + msg = LANG_BG_GROUP_OFFLINE_MEMBER; + break; + case BG_JOIN_ERR_GROUP_TOO_MANY: + msg = LANG_BG_GROUP_TOO_LARGE; + break; + case BG_JOIN_ERR_MIXED_FACTION: + msg = LANG_BG_GROUP_MIXED_FACTION; + break; + case BG_JOIN_ERR_MIXED_LEVELS: + msg = LANG_BG_GROUP_MIXED_LEVELS; + break; + case BG_JOIN_ERR_GROUP_MEMBER_ALREADY_IN_QUEUE: + msg = LANG_BG_GROUP_MEMBER_ALREADY_IN_QUEUE; + break; + case BG_JOIN_ERR_GROUP_DESERTER: + msg = LANG_BG_GROUP_MEMBER_DESERTER; + break; + case BG_JOIN_ERR_ALL_QUEUES_USED: + msg = LANG_BG_GROUP_MEMBER_NO_FREE_QUEUE_SLOTS; + break; + case BG_JOIN_ERR_GROUP_NOT_ENOUGH: + case BG_JOIN_ERR_MIXED_ARENATEAM: + default: + return; + break; + } + ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, GetTrinityString(msg), NULL); + SendPacket(&data); + return; +} |