aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSpp <spp@jorge.gr>2012-10-23 11:44:02 +0200
committerSpp <spp@jorge.gr>2012-10-23 11:44:02 +0200
commit1be638e7310bdd362566a6dc463bf94950d50616 (patch)
tree1c5b75c36ce4f0c0f86fd97f4aa2150896a42aa0 /src
parentc1fada456bab098e78d705cc339e062264f00070 (diff)
Core/Dungeon Finder: Add debugging commands
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/DungeonFinding/LFGMgr.cpp56
-rwxr-xr-xsrc/server/game/DungeonFinding/LFGMgr.h12
-rw-r--r--src/server/game/DungeonFinding/LFGQueue.cpp44
-rw-r--r--src/server/game/DungeonFinding/LFGScripts.cpp24
-rwxr-xr-xsrc/server/game/Handlers/LFGHandler.cpp2
-rwxr-xr-xsrc/server/game/Miscellaneous/Language.h7
-rwxr-xr-xsrc/server/game/World/World.cpp2
-rwxr-xr-xsrc/server/game/World/World.h2
-rw-r--r--src/server/scripts/Commands/CMakeLists.txt1
-rw-r--r--src/server/scripts/Commands/cs_lfg.cpp134
-rw-r--r--src/server/worldserver/worldserver.conf.dist11
11 files changed, 278 insertions, 17 deletions
diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp
index e523c7f1c38..0a2a4b861b8 100755
--- a/src/server/game/DungeonFinding/LFGMgr.cpp
+++ b/src/server/game/DungeonFinding/LFGMgr.cpp
@@ -31,14 +31,11 @@
#include "GroupMgr.h"
#include "GameEventMgr.h"
-LFGMgr::LFGMgr(): m_QueueTimer(0), m_lfgProposalId(1)
+LFGMgr::LFGMgr(): m_QueueTimer(0), m_lfgProposalId(1),
+ m_options(sWorld->getIntConfig(CONFIG_LFG_OPTIONSMASK))
{
- m_options = sWorld->getBoolConfig(CONFIG_DUNGEON_FINDER_ENABLE);
- if (m_options)
- {
- new LFGPlayerScript();
- new LFGGroupScript();
- }
+ new LFGPlayerScript();
+ new LFGGroupScript();
}
LFGMgr::~LFGMgr()
@@ -353,7 +350,7 @@ void LFGMgr::LoadLFGDungeons(bool reload /* = false */)
void LFGMgr::Update(uint32 diff)
{
- if (!m_options)
+ if (!isOptionEnabled(LFG_OPTION_ENABLE_DUNGEON_FINDER | LFG_OPTION_ENABLE_RAID_BROWSER))
return;
time_t currTime = time(NULL);
@@ -1892,6 +1889,27 @@ bool LFGMgr::AllQueued(const LfgGuidList& check)
return true;
}
+// Only for debugging purposes
+void LFGMgr::Clean()
+{
+ m_Queues.clear();
+}
+
+bool LFGMgr::isOptionEnabled(uint32 option)
+{
+ return m_options & option;
+}
+
+uint32 LFGMgr::GetOptions()
+{
+ return m_options;
+}
+
+void LFGMgr::SetOptions(uint32 options)
+{
+ m_options = options;
+}
+
bool LFGMgr::IsSeasonActive(uint32 dungeonId)
{
switch (dungeonId)
@@ -1907,3 +1925,25 @@ bool LFGMgr::IsSeasonActive(uint32 dungeonId)
}
return false;
}
+
+std::string LFGMgr::DumpQueueInfo(bool /*full*/)
+{
+ uint32 size = uint32(m_Queues.size());
+ std::ostringstream o;
+
+ o << "Number of Queues: " << size << "\n";
+ for (LfgQueueMap::const_iterator itr = m_Queues.begin(); itr != m_Queues.end(); ++itr)
+ {
+ std::string const& queued = itr->second.DumpQueueInfo();
+ std::string const& compatibles = itr->second.DumpCompatibleInfo();
+ o << queued << compatibles;
+ /*
+ if (full)
+ {
+ LfgCompatibleMap const& compatibles = itr->second.GetCompatibleMap();
+ }
+ */
+ }
+
+ return o.str();
+}
diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h
index 920949a4564..5df6f2445e7 100755
--- a/src/server/game/DungeonFinding/LFGMgr.h
+++ b/src/server/game/DungeonFinding/LFGMgr.h
@@ -28,6 +28,12 @@
class Group;
class Player;
+enum LfgOptions
+{
+ LFG_OPTION_ENABLE_DUNGEON_FINDER = 0x01,
+ LFG_OPTION_ENABLE_RAID_BROWSER = 0x02,
+};
+
enum LFGMgrEnum
{
LFG_TIME_ROLECHECK = 40 * IN_MILLISECONDS,
@@ -346,11 +352,17 @@ class LFGMgr
bool IsTeleported(uint64 guid);
bool AllQueued(LfgGuidList const& check);
+ void Clean();
+
static bool HasIgnore(uint64 guid1, uint64 guid2);
static void SendLfgQueueStatus(uint64 guid, LfgQueueStatusData const& data);
+ bool isOptionEnabled(uint32 option);
+ uint32 GetOptions();
+ void SetOptions(uint32 options);
bool IsSeasonActive(uint32 dungeonId);
+ std::string DumpQueueInfo(bool full = false);
static std::string ConcatenateDungeons(LfgDungeonSet const& dungeons);
static std::string GetRolesString(uint8 roles);
static char const * GetStateString(LfgState state);
diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp
index c1d89a16300..131a3e7a992 100644
--- a/src/server/game/DungeonFinding/LFGQueue.cpp
+++ b/src/server/game/DungeonFinding/LFGQueue.cpp
@@ -25,6 +25,7 @@
#include "Log.h"
#include "ObjectMgr.h"
#include "World.h"
+#include "GroupMgr.h"
/**
Given a list of guids returns the concatenation using | as delimiter
@@ -536,4 +537,45 @@ void LfgQueue::UpdateQueueTimers(time_t currTime)
time_t LfgQueue::GetJoinTime(uint64 guid)
{
return m_QueueDataMap[guid].joinTime;
-} \ No newline at end of file
+}
+
+LfgCompatibleMap const& LfgQueue::GetCompatibleMap()
+{
+ return m_CompatibleMap;
+}
+
+std::string LfgQueue::DumpQueueInfo() const
+{
+ uint32 players = 0;
+ uint32 groups = 0;
+ uint32 playersInGroup = 0;
+
+ for (uint8 i = 0; i < 2; ++i)
+ {
+ LfgGuidList const& queue = i ? m_newToQueue : m_currentQueue;
+ for (LfgGuidList::const_iterator it = queue.begin(); it != queue.end(); ++it)
+ {
+ uint64 guid = *it;
+ if (IS_GROUP(guid))
+ {
+ groups++;
+ if (Group const* group = sGroupMgr->GetGroupByGUID(GUID_LOPART(guid)))
+ playersInGroup += group->GetMembersCount();
+ else
+ playersInGroup += 2; // Shouldn't happen but just in case
+ }
+ else
+ players++;
+ }
+ }
+ std::ostringstream o;
+ o << "Queued Players: " << players << "(in group: " << playersInGroup << ") Groups: " << groups << "\n";
+ return o.str();
+}
+
+std::string LfgQueue::DumpCompatibleInfo() const
+{
+ std::ostringstream o;
+ o << "Compatible Map size: " << m_CompatibleMap.size() << "\n";
+ return o.str();
+}
diff --git a/src/server/game/DungeonFinding/LFGScripts.cpp b/src/server/game/DungeonFinding/LFGScripts.cpp
index 10ce42da610..522ded70550 100644
--- a/src/server/game/DungeonFinding/LFGScripts.cpp
+++ b/src/server/game/DungeonFinding/LFGScripts.cpp
@@ -34,11 +34,17 @@ LFGPlayerScript::LFGPlayerScript() : PlayerScript("LFGPlayerScript")
void LFGPlayerScript::OnLevelChanged(Player* player, uint8 /*oldLevel*/)
{
+ if (!sLFGMgr->isOptionEnabled(LFG_OPTION_ENABLE_DUNGEON_FINDER | LFG_OPTION_ENABLE_RAID_BROWSER))
+ return;
+
sLFGMgr->InitializeLockedDungeons(player);
}
void LFGPlayerScript::OnLogout(Player* player)
{
+ if (!sLFGMgr->isOptionEnabled(LFG_OPTION_ENABLE_DUNGEON_FINDER | LFG_OPTION_ENABLE_RAID_BROWSER))
+ return;
+
uint64 guid = player->GetGUID();
sLFGMgr->LeaveLfg(guid);
LfgUpdateData updateData = LfgUpdateData(LFG_UPDATETYPE_REMOVED_FROM_QUEUE);
@@ -51,6 +57,9 @@ void LFGPlayerScript::OnLogout(Player* player)
void LFGPlayerScript::OnLogin(Player* player)
{
+ if (!sLFGMgr->isOptionEnabled(LFG_OPTION_ENABLE_DUNGEON_FINDER | LFG_OPTION_ENABLE_RAID_BROWSER))
+ return;
+
sLFGMgr->InitializeLockedDungeons(player);
sLFGMgr->SetTeam(player->GetGUID(), player->GetTeam());
// TODO - Restore LfgPlayerData and send proper status to player if it was in a group
@@ -69,6 +78,9 @@ LFGGroupScript::LFGGroupScript() : GroupScript("LFGGroupScript")
void LFGGroupScript::OnAddMember(Group* group, uint64 guid)
{
+ if (!sLFGMgr->isOptionEnabled(LFG_OPTION_ENABLE_DUNGEON_FINDER | LFG_OPTION_ENABLE_RAID_BROWSER))
+ return;
+
uint64 gguid = group->GetGUID();
uint64 leader = group->GetLeaderGUID();
@@ -106,6 +118,9 @@ void LFGGroupScript::OnAddMember(Group* group, uint64 guid)
void LFGGroupScript::OnRemoveMember(Group* group, uint64 guid, RemoveMethod method, uint64 kicker, char const* reason)
{
+ if (!sLFGMgr->isOptionEnabled(LFG_OPTION_ENABLE_DUNGEON_FINDER | LFG_OPTION_ENABLE_RAID_BROWSER))
+ return;
+
uint64 gguid = group->GetGUID();
sLog->outDebug(LOG_FILTER_LFG, "LFGScripts::OnRemoveMember [" UI64FMTD "]: remove [" UI64FMTD "] Method: %d Kicker: [" UI64FMTD "] Reason: %s", gguid, guid, method, kicker, (reason ? reason : ""));
@@ -157,6 +172,9 @@ void LFGGroupScript::OnRemoveMember(Group* group, uint64 guid, RemoveMethod meth
void LFGGroupScript::OnDisband(Group* group)
{
+ if (!sLFGMgr->isOptionEnabled(LFG_OPTION_ENABLE_DUNGEON_FINDER | LFG_OPTION_ENABLE_RAID_BROWSER))
+ return;
+
uint64 gguid = group->GetGUID();
sLog->outDebug(LOG_FILTER_LFG, "LFGScripts::OnDisband [" UI64FMTD "]", gguid);
@@ -165,6 +183,9 @@ void LFGGroupScript::OnDisband(Group* group)
void LFGGroupScript::OnChangeLeader(Group* group, uint64 newLeaderGuid, uint64 oldLeaderGuid)
{
+ if (!sLFGMgr->isOptionEnabled(LFG_OPTION_ENABLE_DUNGEON_FINDER | LFG_OPTION_ENABLE_RAID_BROWSER))
+ return;
+
uint64 gguid = group->GetGUID();
sLog->outDebug(LOG_FILTER_LFG, "LFGScripts::OnChangeLeader [" UI64FMTD "]: old [" UI64FMTD "] new [" UI64FMTD "]", gguid, newLeaderGuid, oldLeaderGuid);
@@ -173,6 +194,9 @@ void LFGGroupScript::OnChangeLeader(Group* group, uint64 newLeaderGuid, uint64 o
void LFGGroupScript::OnInviteMember(Group* group, uint64 guid)
{
+ if (!sLFGMgr->isOptionEnabled(LFG_OPTION_ENABLE_DUNGEON_FINDER | LFG_OPTION_ENABLE_RAID_BROWSER))
+ return;
+
uint64 gguid = group->GetGUID();
uint64 leader = group->GetLeaderGUID();
sLog->outDebug(LOG_FILTER_LFG, "LFGScripts::OnInviteMember [" UI64FMTD "]: invite [" UI64FMTD "] leader [" UI64FMTD "]", gguid, guid, leader);
diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp
index 116afdf8c75..96d21097e71 100755
--- a/src/server/game/Handlers/LFGHandler.cpp
+++ b/src/server/game/Handlers/LFGHandler.cpp
@@ -46,7 +46,7 @@ void BuildPartyLockDungeonBlock(WorldPacket& data, const LfgLockPartyMap& lockMa
void WorldSession::HandleLfgJoinOpcode(WorldPacket& recv_data)
{
- if (!sWorld->getBoolConfig(CONFIG_DUNGEON_FINDER_ENABLE) ||
+ if (!sLFGMgr->isOptionEnabled(LFG_OPTION_ENABLE_DUNGEON_FINDER | LFG_OPTION_ENABLE_RAID_BROWSER) ||
(GetPlayer()->GetGroup() && GetPlayer()->GetGroup()->GetLeaderGUID() != GetPlayer()->GetGUID() &&
(GetPlayer()->GetGroup()->GetMembersCount() == MAXGROUPSIZE || !GetPlayer()->GetGroup()->isLFGGroup())))
{
diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h
index 6868db35975..07bfd284a7d 100755
--- a/src/server/game/Miscellaneous/Language.h
+++ b/src/server/game/Miscellaneous/Language.h
@@ -990,6 +990,12 @@ enum TrinityStrings
LANG_WORLD_CLOSED = 7523,
LANG_WORLD_OPENED = 7524,
+ LANG_LFG_PLAYER_INFO = 9980,
+ LANG_LFG_GROUP_INFO = 9981,
+ LANG_LFG_NOT_IN_GROUP = 9982,
+ LANG_LFG_CLEAN = 9983,
+ LANG_LFG_OPTIONS = 9984,
+ LANG_LFG_OPTIONS_CHANGED = 9985,
LANG_LFG_STATE_NONE = 9986,
LANG_LFG_STATE_ROLECHECK = 9987,
LANG_LFG_STATE_QUEUED = 9988,
@@ -1098,4 +1104,3 @@ enum TrinityStrings
// For other tables maybe 2000010000-2147483647 (max index)
};
#endif
-
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index aa31dcc8aa1..4949f904a57 100755
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1182,7 +1182,7 @@ void World::LoadConfigSettings(bool reload)
m_int_configs[CONFIG_WARDEN_CLIENT_RESPONSE_DELAY] = ConfigMgr::GetIntDefault("Warden.ClientResponseDelay", 600);
// Dungeon finder
- m_bool_configs[CONFIG_DUNGEON_FINDER_ENABLE] = ConfigMgr::GetBoolDefault("DungeonFinder.Enable", false);
+ m_int_configs[CONFIG_LFG_OPTIONSMASK] = ConfigMgr::GetIntDefault("DungeonFinder.OptionsMask", 1);
// DBC_ItemAttributes
m_bool_configs[CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES] = ConfigMgr::GetBoolDefault("DBC.EnforceItemAttributes", true);
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index 66b52549e93..470059eb86b 100755
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -155,7 +155,6 @@ enum WorldBoolConfigs
CONFIG_CHATLOG_PUBLIC,
CONFIG_CHATLOG_ADDON,
CONFIG_CHATLOG_BGROUND,
- CONFIG_DUNGEON_FINDER_ENABLE,
CONFIG_AUTOBROADCAST,
CONFIG_ALLOW_TICKETS,
CONFIG_DBC_ENFORCE_ITEM_ATTRIBUTES,
@@ -313,6 +312,7 @@ enum WorldIntConfigs
CONFIG_DB_PING_INTERVAL,
CONFIG_PRESERVE_CUSTOM_CHANNEL_DURATION,
CONFIG_PERSISTENT_CHARACTER_CLEAN_FLAGS,
+ CONFIG_LFG_OPTIONSMASK,
CONFIG_MAX_INSTANCES_PER_HOUR,
CONFIG_WARDEN_CLIENT_RESPONSE_DELAY,
CONFIG_WARDEN_CLIENT_CHECK_HOLDOFF,
diff --git a/src/server/scripts/Commands/CMakeLists.txt b/src/server/scripts/Commands/CMakeLists.txt
index 177b3a479f5..a65324a9f42 100644
--- a/src/server/scripts/Commands/CMakeLists.txt
+++ b/src/server/scripts/Commands/CMakeLists.txt
@@ -27,6 +27,7 @@ set(scripts_STAT_SRCS
Commands/cs_honor.cpp
Commands/cs_instance.cpp
Commands/cs_learn.cpp
+ Commands/cs_lfg.cpp
Commands/cs_list.cpp
Commands/cs_lookup.cpp
Commands/cs_message.cpp
diff --git a/src/server/scripts/Commands/cs_lfg.cpp b/src/server/scripts/Commands/cs_lfg.cpp
new file mode 100644
index 00000000000..45ecc4e4721
--- /dev/null
+++ b/src/server/scripts/Commands/cs_lfg.cpp
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * 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 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "Chat.h"
+#include "LFGMgr.h"
+#include "Group.h"
+
+void GetPlayerInfo(ChatHandler* handler, Player* player)
+{
+ if (!player)
+ return;
+
+ uint64 guid = player->GetGUID();
+ LfgDungeonSet dungeons = sLFGMgr->GetSelectedDungeons(guid);
+
+ char const * const state = sLFGMgr->GetStateString(sLFGMgr->GetState(guid));
+ handler->PSendSysMessage(LANG_LFG_PLAYER_INFO, player->GetName(),
+ state, uint8(dungeons.size()), sLFGMgr->ConcatenateDungeons(dungeons).c_str(),
+ sLFGMgr->GetRolesString(sLFGMgr->GetRoles(guid)).c_str(), sLFGMgr->GetComment(guid).c_str());
+}
+
+class lfg_commandscript : public CommandScript
+{
+public:
+ lfg_commandscript() : CommandScript("lfg_commandscript") { }
+
+ ChatCommand* GetCommands() const
+ {
+ static ChatCommand lfgCommandTable[] =
+ {
+ { "player", SEC_GAMEMASTER, false, &HandleLfgPlayerInfoCommand, "", NULL },
+ { "group", SEC_GAMEMASTER, false, &HandleLfgGroupInfoCommand, "", NULL },
+ { "queue", SEC_GAMEMASTER, false, &HandleLfgQueueInfoCommand, "", NULL },
+ { "clean", SEC_ADMINISTRATOR, false, &HandleLfgCleanCommand, "", NULL },
+ { "options", SEC_ADMINISTRATOR, false, &HandleLfgOptionsCommand, "", NULL },
+ { NULL, SEC_PLAYER, false, NULL, "", NULL }
+ };
+
+ static ChatCommand commandTable[] =
+ {
+ { "lfg", SEC_GAMEMASTER, false, NULL, "", lfgCommandTable },
+ { NULL, SEC_PLAYER, false, NULL, "", NULL }
+ };
+ return commandTable;
+ }
+
+ static bool HandleLfgPlayerInfoCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target = NULL;
+ std::string playerName;
+ if (!handler->extractPlayerTarget((char*)args, &target, NULL, &playerName))
+ return false;
+
+ GetPlayerInfo(handler, target);
+ return true;
+ }
+
+ static bool HandleLfgGroupInfoCommand(ChatHandler* handler, char const* args)
+ {
+ Player* target = NULL;
+ std::string playerName;
+ if (!handler->extractPlayerTarget((char*)args, &target, NULL, &playerName))
+ return false;
+
+ Group* grp = target->GetGroup();
+ if (!grp)
+ {
+ handler->PSendSysMessage(LANG_LFG_NOT_IN_GROUP, playerName.c_str());
+ return true;
+ }
+
+ uint64 guid = grp->GetGUID();
+ char const * const state = sLFGMgr->GetStateString(sLFGMgr->GetState(guid));
+ handler->PSendSysMessage(LANG_LFG_GROUP_INFO, grp->isLFGGroup(),
+ state, sLFGMgr->GetDungeon(guid));
+
+ for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
+ GetPlayerInfo(handler, itr->getSource());
+
+ return true;
+ }
+
+ static bool HandleLfgOptionsCommand(ChatHandler* handler, char const* args)
+ {
+ int32 options = -1;
+ if (char* str = strtok((char*)args, " "))
+ {
+ int32 tmp = atoi(str);
+ if (tmp > -1)
+ options = tmp;
+ }
+
+ if (options != -1)
+ {
+ sLFGMgr->SetOptions(options);
+ handler->PSendSysMessage(LANG_LFG_OPTIONS_CHANGED);
+ }
+ handler->PSendSysMessage(LANG_LFG_OPTIONS, sLFGMgr->GetOptions());
+ return true;
+ }
+
+ static bool HandleLfgQueueInfoCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ handler->SendSysMessage(sLFGMgr->DumpQueueInfo().c_str());
+ return true;
+ }
+
+ static bool HandleLfgCleanCommand(ChatHandler* handler, char const* /*args*/)
+ {
+ handler->PSendSysMessage(LANG_LFG_CLEAN);
+ sLFGMgr->Clean();
+ return true;
+ }
+};
+
+void AddSC_lfg_commandscript()
+{
+ new lfg_commandscript();
+}
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index 55443f4253b..8f79cff8f46 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -1106,12 +1106,15 @@ Command.LookupMaxResults = 0
AllowTickets = 1
#
-# DungeonFinder.Enable
+# DungeonFinder.OptionsMask
# Description: Dungeon and raid finder system.
-# Default: 1 - (Enabled)
-# 0 - (Disabled)
+# Value is a bitmask consisting of:
+# LFG_OPTION_ENABLE_DUNGEON_FINDER = 1, Enable the dungeon finder browser
+# LFG_OPTION_ENABLE_RAID_BROWSER = 2, Enable the raid browser
+# Default: 1
+
+DungeonFinder.OptionsMask = 1
-DungeonFinder.Enable = 1
#
# DBC.EnforceItemAttributes