diff options
author | ShinDarth <borzifrancesco@gmail.com> | 2015-10-19 13:44:36 +0200 |
---|---|---|
committer | ShinDarth <borzifrancesco@gmail.com> | 2015-10-28 20:39:04 +0100 |
commit | d380c12c562800b4b073cc0ec49808c256789519 (patch) | |
tree | 74bff8786861952f3dd56cb5700e0dd5fedc2a63 /src | |
parent | 5c449b50aadcb35a4bd7fdc25d3a249f023cf507 (diff) |
Core/Battleground: implement deserters tracker feature
Diffstat (limited to 'src')
-rw-r--r-- | src/server/database/Database/Implementation/CharacterDatabase.cpp | 3 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/CharacterDatabase.h | 2 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Battleground.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/Battleground.h | 9 | ||||
-rw-r--r-- | src/server/game/Battlegrounds/BattlegroundQueue.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Handlers/BattleGroundHandler.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.cpp | 9 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 1 | ||||
-rw-r--r-- | src/server/game/World/World.h | 1 | ||||
-rw-r--r-- | src/server/worldserver/worldserver.conf.dist | 8 |
11 files changed, 72 insertions, 0 deletions
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index b41ba41bcff..4557dcab996 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -611,4 +611,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UPD_QUEST_TRACK_GM_COMPLETE, "UPDATE quest_tracker SET completed_by_gm = 1 WHERE id = ? AND character_guid = ? ORDER BY quest_accept_time DESC LIMIT 1", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_QUEST_TRACK_COMPLETE_TIME, "UPDATE quest_tracker SET quest_complete_time = NOW() WHERE id = ? AND character_guid = ? ORDER BY quest_accept_time DESC LIMIT 1", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_QUEST_TRACK_ABANDON_TIME, "UPDATE quest_tracker SET quest_abandon_time = NOW() WHERE id = ? AND character_guid = ? ORDER BY quest_accept_time DESC LIMIT 1", CONNECTION_ASYNC); + + // DeserterTracker + PrepareStatement(CHAR_INS_DESERTER_TRACK, "INSERT INTO battleground_deserters (guid, type, datetime) VALUES (?, ?, NOW())", CONNECTION_ASYNC); } diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index c76c584a0a8..f920a8c3d10 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -531,6 +531,8 @@ enum CharacterDatabaseStatements CHAR_UPD_QUEST_TRACK_COMPLETE_TIME, CHAR_UPD_QUEST_TRACK_ABANDON_TIME, + CHAR_INS_DESERTER_TRACK, + MAX_CHARACTERDATABASE_STATEMENTS }; diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 0e44925cd57..d368b347a0f 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -306,6 +306,15 @@ inline void Battleground::_ProcessOfflineQueue() { if (itr->second.OfflineRemoveTime <= sWorld->GetGameTime()) { + if (isBattleground() && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS) && + (GetStatus() == STATUS_IN_PROGRESS || GetStatus() == STATUS_WAIT_JOIN)) + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_DESERTER_TRACK); + stmt->setUInt32(0, itr->first.GetCounter()); + stmt->setUInt8(1, BG_DESERTION_TYPE_OFFLINE); + CharacterDatabase.Execute(stmt); + } + RemovePlayerAtLeave(itr->first, true, true);// remove player from BG m_OfflineQueue.pop_front(); // remove from offline queue //do not use itr for anything, because it is erased in RemovePlayerAtLeave() diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index 08134298569..471da9846b2 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -40,6 +40,15 @@ class BattlegroundMap; struct PvPDifficultyEntry; struct WorldSafeLocsEntry; +enum BattlegroundDesertionType +{ + BG_DESERTION_TYPE_LEAVE_BG = 0, // player leaves the BG + BG_DESERTION_TYPE_OFFLINE = 1, // player is kicked from BG because offline + BG_DESERTION_TYPE_LEAVE_QUEUE = 2, // player is invited to join and refuses to do it + BG_DESERTION_TYPE_NO_ENTER_BUTTON = 3, // player is invited to join and do nothing (time expires) + BG_DESERTION_TYPE_INVITE_LOGOUT = 4, // player is invited to join and logs out +}; + enum BattlegroundCriteriaId { BG_CRITERIA_CHECK_RESILIENT_VICTORY, diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index 162122ab4db..87e07e15191 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -1068,6 +1068,16 @@ bool BGQueueRemoveEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) BattlegroundQueue &bgQueue = sBattlegroundMgr->GetBattlegroundQueue(m_BgQueueTypeId); if (bgQueue.IsPlayerInvited(m_PlayerGuid, m_BgInstanceGUID, m_RemoveTime)) { + // track if player leaves the BG by not clicking enter button + if (bg->isBattleground() && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS) && + (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN)) + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_DESERTER_TRACK); + stmt->setUInt32(0, player->GetGUID().GetCounter()); + stmt->setUInt8(1, BG_DESERTION_TYPE_NO_ENTER_BUTTON); + CharacterDatabase.Execute(stmt); + } + TC_LOG_DEBUG("bg.battleground", "Battleground: removing player %u from bg queue for instance %u because of not pressing enter battle in time.", player->GetGUID().GetCounter(), m_BgInstanceGUID); player->RemoveBattlegroundQueueId(m_BgQueueTypeId); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index bfcdb7a8f57..fcd7b8707c8 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -22031,6 +22031,16 @@ void Player::LeaveBattleground(bool teleportToEntryPoint) CastSpell(this, 26013, true); // Deserter } } + + // track if player leaves the BG while inside it + if (bg->isBattleground() && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS) && + (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN)) + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_DESERTER_TRACK); + stmt->setUInt32(0, GetGUID().GetCounter()); + stmt->setUInt8(1, BG_DESERTION_TYPE_LEAVE_BG); + CharacterDatabase.Execute(stmt); + } } } diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index fec0b8e0d40..d4291e34df6 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -506,6 +506,16 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) sBattlegroundMgr->ScheduleQueueUpdate(ginfo.ArenaMatchmakerRating, ginfo.ArenaType, bgQueueTypeId, bgTypeId, bracketEntry->GetBracketId()); SendPacket(&data); TC_LOG_DEBUG("bg.battleground", "Battleground: player %s (%u) left queue for bgtype %u, queue type %u.", _player->GetName().c_str(), _player->GetGUID().GetCounter(), bg->GetTypeID(), bgQueueTypeId); + + // track if player refuses to join the BG after being invited + if (bg->isBattleground() && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS) && + (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN)) + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_DESERTER_TRACK); + stmt->setUInt32(0, _player->GetGUID().GetCounter()); + stmt->setUInt8(1, BG_DESERTION_TYPE_LEAVE_QUEUE); + CharacterDatabase.Execute(stmt); + } } } diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index b4bb7541be8..c99346cdb74 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -483,6 +483,15 @@ void WorldSession::LogoutPlayer(bool save) { if (BattlegroundQueueTypeId bgQueueTypeId = _player->GetBattlegroundQueueTypeId(i)) { + // track if player logs out after invited to join BG + if (_player->IsInvitedForBattlegroundQueueType(bgQueueTypeId) && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS)) + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_DESERTER_TRACK); + stmt->setUInt32(0, _player->GetGUID().GetCounter()); + stmt->setUInt8(1, BG_DESERTION_TYPE_INVITE_LOGOUT); + CharacterDatabase.Execute(stmt); + } + _player->RemoveBattlegroundQueueId(bgQueueTypeId); BattlegroundQueue& queue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId); queue.RemovePlayer(_player->GetGUID(), true); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 1c401be97c6..6a3dafd0e10 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1038,6 +1038,7 @@ void World::LoadConfigSettings(bool reload) m_bool_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE] = sConfigMgr->GetBoolDefault("Battleground.QueueAnnouncer.Enable", false); m_bool_configs[CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY] = sConfigMgr->GetBoolDefault("Battleground.QueueAnnouncer.PlayerOnly", false); m_bool_configs[CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE] = sConfigMgr->GetBoolDefault("Battleground.StoreStatistics.Enable", false); + m_bool_configs[CONFIG_BATTLEGROUND_TRACK_DESERTERS] = sConfigMgr->GetBoolDefault("Battleground.TrackDeserters.Enable", false); m_int_configs[CONFIG_BATTLEGROUND_INVITATION_TYPE] = sConfigMgr->GetIntDefault ("Battleground.InvitationType", 0); m_int_configs[CONFIG_BATTLEGROUND_PREMATURE_FINISH_TIMER] = sConfigMgr->GetIntDefault ("Battleground.PrematureFinishTimer", 5 * MINUTE * IN_MILLISECONDS); m_int_configs[CONFIG_BATTLEGROUND_PREMADE_GROUP_WAIT_FOR_MATCH] = sConfigMgr->GetIntDefault ("Battleground.PremadeGroupWaitForMatch", 30 * MINUTE * IN_MILLISECONDS); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 7c7af77d19d..e655a64776a 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -124,6 +124,7 @@ enum WorldBoolConfigs CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE, CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY, CONFIG_BATTLEGROUND_STORE_STATISTICS_ENABLE, + CONFIG_BATTLEGROUND_TRACK_DESERTERS, CONFIG_BG_XP_FOR_KILL, CONFIG_ARENA_AUTO_DISTRIBUTE_POINTS, CONFIG_ARENA_QUEUE_ANNOUNCER_ENABLE, diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 221fea12399..13b6b22bed4 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -2199,6 +2199,14 @@ Battleground.QueueAnnouncer.PlayerOnly = 0 Battleground.StoreStatistics.Enable = 0 # +# Battleground.TrackDeserters.Enable +# Description: Track deserters of Battlegrounds. +# Default: 0 - (Disabled) +# 1 - (Enabled) + +Battleground.TrackDeserters.Enable = 0 + +# # Battleground.InvitationType # Description: Set Battleground invitation type. # Default: 0 - (Normal, Invite as much players to battlegrounds as queued, |