aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/World
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts/World')
-rw-r--r--src/server/scripts/World/CMakeLists.txt19
-rw-r--r--src/server/scripts/World/dungeon_finder.cpp154
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