diff options
Diffstat (limited to 'src/server/scripts/World')
| -rw-r--r-- | src/server/scripts/World/CMakeLists.txt | 19 | ||||
| -rw-r--r-- | src/server/scripts/World/dungeon_finder.cpp | 154 |
2 files changed, 164 insertions, 9 deletions
diff --git a/src/server/scripts/World/CMakeLists.txt b/src/server/scripts/World/CMakeLists.txt index 3fad9c7ea87..3cc27cd8b5e 100644 --- a/src/server/scripts/World/CMakeLists.txt +++ b/src/server/scripts/World/CMakeLists.txt @@ -1,20 +1,21 @@ set(scripts_STAT_SRCS ${scripts_STAT_SRCS} - World/npc_professions.cpp - World/mob_generic_creature.cpp - World/npc_taxi.cpp - World/boss_lethon.cpp + World/achievement_scripts.cpp World/areatrigger_scripts.cpp World/boss_emeriss.cpp - World/guards.cpp - World/item_scripts.cpp + World/boss_lethon.cpp + World/boss_taerar.cpp World/boss_ysondre.cpp - World/npcs_special.cpp World/chat_log.cpp - World/boss_taerar.cpp + World/dungeon_finder.cpp World/go_scripts.cpp + World/guards.cpp + World/item_scripts.cpp + World/mob_generic_creature.cpp World/npc_innkeeper.cpp - World/achievement_scripts.cpp + World/npc_professions.cpp + World/npc_taxi.cpp + World/npcs_special.cpp ) message(" -> Prepared: World") diff --git a/src/server/scripts/World/dungeon_finder.cpp b/src/server/scripts/World/dungeon_finder.cpp new file mode 100644 index 00000000000..24e2fd65573 --- /dev/null +++ b/src/server/scripts/World/dungeon_finder.cpp @@ -0,0 +1,154 @@ +/* + * 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" + +class DungeonFinderScript: public GroupScript, PlayerScript +{ +public: + DungeonFinderScript(): GroupScript("DungeonFinderScript"), PlayerScript("DungeonFinderScript") { } + + void OnAddMember(Group* group, uint64 guid) + { + uint64 gguid = group->GetGUID(); + sLog.outError("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 gguid = group->GetGUID(); + sLog.outError("OnRemoveMember [" UI64FMTD "]: remove [" UI64FMTD "] Method: %d", gguid, guid, method); + 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 (!group->isLfgDungeonComplete()) // Need more players to finish the dungeon + sLFGMgr.OfferContinue(group); + + if (method == GROUP_REMOVEMETHOD_KICK) // Player have been kicked + { + // TODO - Update internal kick cooldown + } + else + { + // Deserter flag + } + + if (Player *plr = sObjectMgr.GetPlayer(guid)) + { + plr->GetSession()->SendLfgUpdateParty(LFG_UPDATETYPE_LEADER); + if (plr->GetMap()->IsDungeon()) // Teleport player out the dungeon + sLFGMgr.TeleportPlayer(plr, true); + } + } + + void OnDisband(Group* group) + { + uint64 gguid = group->GetGUID(); + sLog.outError("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.outError("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.outError("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(); +}
\ No newline at end of file |
