Core/Dungeon Finder: Code cleanup and minor optimizations

- Extend LfgState to keep control of the state of group and players using LFG
- Move scripts to its own class and initialize only if Dungeon finder is enabled
- Updated comments to doxygen format
- Use constructor initialization list
- All variables are declared in the inner most scope
- Fix some mem leaks
- Remove no longer needed code (Cleaner)
- Normalize handler function names

--HG--
branch : trunk
This commit is contained in:
Spp
2010-12-05 17:50:26 +01:00
parent 71c2698faf
commit e621f5fe98
16 changed files with 1015 additions and 1024 deletions

View File

@@ -7,7 +7,6 @@ set(scripts_STAT_SRCS
World/boss_taerar.cpp
World/boss_ysondre.cpp
World/chat_log.cpp
World/dungeon_finder.cpp
World/go_scripts.cpp
World/guards.cpp
World/item_scripts.cpp

View File

@@ -1,163 +0,0 @@
/*
* Copyright (C) 2008-2010 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/>.
*/
/*
* Interaction between core and LFGMgr
*/
#include "ScriptPCH.h"
#include "LFGMgr.h"
#include "Group.h"
class DungeonFinderScript: public GroupScript, PlayerScript
{
public:
DungeonFinderScript(): GroupScript("DungeonFinderScript"), PlayerScript("DungeonFinderScript") { }
void OnAddMember(Group* group, uint64 guid)
{
uint64 gguid = group->GetGUID();
sLog.outDebug("OnAddMember [" UI64FMTD "]: added [" UI64FMTD "]", gguid, guid);
if (!gguid)
return;
for (GroupReference *itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
{
if (Player *plrg = itr->getSource())
{
plrg->GetSession()->SendLfgUpdatePlayer(LFG_UPDATETYPE_CLEAR_LOCK_LIST);
plrg->GetSession()->SendLfgUpdateParty(LFG_UPDATETYPE_CLEAR_LOCK_LIST);
}
}
if (group->isLfgQueued())
sLFGMgr.Leave(NULL, group);
Player *plr = sObjectMgr.GetPlayer(guid);
if (plr && plr->isUsingLfg())
sLFGMgr.Leave(plr);
}
void OnRemoveMember(Group* group, uint64 guid, RemoveMethod& method, uint64 kicker, const char* reason)
{
uint64 gguid = group->GetGUID();
sLog.outDebug("OnRemoveMember [" UI64FMTD "]: remove [" UI64FMTD "] Method: %d Kicker: [" UI64FMTD "] Reason: %s", gguid, guid, method, kicker, (reason ? reason : ""));
if (!gguid)
return;
if (group->isLfgQueued())
{
// TODO - Do not remove, just remove the one leaving and rejoin queue with all other data
sLFGMgr.Leave(NULL, group);
}
if (!group->isLFGGroup())
return;
if (method == GROUP_REMOVEMETHOD_KICK) // Player have been kicked
{
// TODO - Update internal kick cooldown of kicker
std::string str_reason = "";
if (reason)
str_reason = std::string(reason);
sLFGMgr.InitBoot(group, GUID_LOPART(kicker), GUID_LOPART(guid), str_reason);
return;
}
if (Player *plr = sObjectMgr.GetPlayer(guid))
{
/*
if (method == GROUP_REMOVEMETHOD_LEAVE)
// Add deserter flag
else if (group->isLfgKickActive())
// Update internal kick cooldown of kicked
*/
plr->GetSession()->SendLfgUpdateParty(LFG_UPDATETYPE_LEADER);
if (plr->GetMap()->IsDungeon()) // Teleport player out the dungeon
sLFGMgr.TeleportPlayer(plr, true);
}
if (!group->isLfgDungeonComplete()) // Need more players to finish the dungeon
sLFGMgr.OfferContinue(group);
}
void OnDisband(Group* group)
{
uint64 gguid = group->GetGUID();
sLog.outDebug("OnDisband [" UI64FMTD "]", gguid);
if (!gguid)
return;
if (group->isLfgQueued())
sLFGMgr.Leave(NULL, group);
for (GroupReference *itr = group->GetFirstMember(); itr != NULL; itr = itr->next())
{
if (Player *plrg = itr->getSource())
{
plrg->GetSession()->SendLfgUpdateParty(LFG_UPDATETYPE_GROUP_DISBAND);
plrg->GetSession()->SendLfgUpdateParty(LFG_UPDATETYPE_LEADER);
if (plrg->GetMap()->IsDungeon()) // Teleport player out the dungeon
sLFGMgr.TeleportPlayer(plrg, true);
}
}
}
void OnChangeLeader(Group* group, uint64 newLeaderGuid, uint64 oldLeaderGuid)
{
uint64 gguid = group->GetGUID();
sLog.outDebug("OnChangeLeader [" UI64FMTD "]: old [" UI64FMTD "] new [" UI64FMTD "]", gguid, newLeaderGuid, oldLeaderGuid);
if (!gguid)
return;
Player *plr = sObjectMgr.GetPlayer(newLeaderGuid);
if (plr)
plr->GetSession()->SendLfgUpdateParty(LFG_UPDATETYPE_LEADER);
plr = sObjectMgr.GetPlayer(oldLeaderGuid);
if (plr)
plr->GetSession()->SendLfgUpdateParty(LFG_UPDATETYPE_GROUP_DISBAND);
}
void OnInviteMember(Group* group, uint64 guid)
{
uint64 gguid = group->GetGUID();
sLog.outDebug("OnInviteMember [" UI64FMTD "]: invite [" UI64FMTD "] leader [" UI64FMTD "]", gguid, guid, group->GetLeaderGUID());
if (!gguid)
return;
sLFGMgr.Leave(NULL, group);
}
void OnLevelChanged(Player* /*player*/, uint8 /*newLevel*/)
{
}
void OnLogout(Player* player)
{
sLFGMgr.Leave(player);
player->GetSession()->SendLfgUpdateParty(LFG_UPDATETYPE_REMOVED_FROM_QUEUE);
player->GetSession()->SendLfgUpdatePlayer(LFG_UPDATETYPE_REMOVED_FROM_QUEUE);
player->GetSession()->SendLfgUpdateSearch(false);
}
};
void AddSC_dungeon_finder()
{
new DungeonFinderScript();
}