aboutsummaryrefslogtreecommitdiff
path: root/src/game/LFGHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/LFGHandler.cpp')
-rw-r--r--src/game/LFGHandler.cpp468
1 files changed, 89 insertions, 379 deletions
diff --git a/src/game/LFGHandler.cpp b/src/game/LFGHandler.cpp
index a98ec48e864..da9e32338cd 100644
--- a/src/game/LFGHandler.cpp
+++ b/src/game/LFGHandler.cpp
@@ -1,5 +1,4 @@
/*
- * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
*
@@ -18,417 +17,128 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include "LFGMgr.h"
#include "WorldSession.h"
-#include "Log.h"
-#include "Database/DatabaseEnv.h"
-#include "Player.h"
#include "WorldPacket.h"
-#include "ObjectMgr.h"
-#include "World.h"
-
-static void AttemptJoin(Player* _player)
-{
- // skip not can autojoin cases and player group case
- if (!_player->m_lookingForGroup.canAutoJoin() || _player->GetGroup())
- return;
-
- ObjectAccessor::Guard guard(*HashMapHolder<Player>::GetLock());
- HashMapHolder<Player>::MapType const& players = ObjectAccessor::Instance().GetPlayers();
- for (HashMapHolder<Player>::MapType::const_iterator iter = players.begin(); iter != players.end(); ++iter)
- {
- Player *plr = iter->second;
-
- // skip enemies and self
- if (!plr || plr == _player || plr->GetTeam() != _player->GetTeam())
- continue;
-
- //skip players not in world
- if (!plr->IsInWorld())
- continue;
-
- // skip not auto add, not group leader cases
- if (!plr->GetSession()->LookingForGroup_auto_add || plr->GetGroup() && plr->GetGroup()->GetLeaderGUID() != plr->GetGUID())
- continue;
-
- // skip non auto-join or empty slots, or non compatible slots
- if (!plr->m_lookingForGroup.more.canAutoJoin() || !_player->m_lookingForGroup.HaveInSlot(plr->m_lookingForGroup.more))
- continue;
-
- // attempt create group, or skip
- if (!plr->GetGroup())
- {
- Group* group = new Group;
- if (!group->Create(plr->GetGUID(), plr->GetName()))
- {
- delete group;
- continue;
- }
-
- objmgr.AddGroup(group);
- }
-
- // stop at success join
- if (plr->GetGroup()->AddMember(_player->GetGUID(), _player->GetName()))
- {
- if (sWorld.getConfig(CONFIG_RESTRICTED_LFG_CHANNEL) && _player->GetSession()->GetSecurity() == SEC_PLAYER)
- _player->LeaveLFGChannel();
- break;
- }
- // full
- else
- {
- if (sWorld.getConfig(CONFIG_RESTRICTED_LFG_CHANNEL) && plr->GetSession()->GetSecurity() == SEC_PLAYER)
- plr->LeaveLFGChannel();
- }
- }
-}
-
-static void AttemptAddMore(Player* _player)
-{
- // skip not group leader case
- if (_player->GetGroup() && _player->GetGroup()->GetLeaderGUID() != _player->GetGUID())
- return;
-
- if (!_player->m_lookingForGroup.more.canAutoJoin())
- return;
-
- ObjectAccessor::Guard guard(*HashMapHolder<Player>::GetLock());
- HashMapHolder<Player>::MapType const& players = ObjectAccessor::Instance().GetPlayers();
- for (HashMapHolder<Player>::MapType::const_iterator iter = players.begin(); iter != players.end(); ++iter)
- {
- Player *plr = iter->second;
-
- // skip enemies and self
- if (!plr || plr == _player || plr->GetTeam() != _player->GetTeam())
- continue;
-
- if (!plr->IsInWorld())
- continue;
-
- // skip not auto join or in group
- if (!plr->GetSession()->LookingForGroup_auto_join || plr->GetGroup())
- continue;
-
- if (!plr->m_lookingForGroup.HaveInSlot(_player->m_lookingForGroup.more))
- continue;
-
- // attempt create group if need, or stop attempts
- if (!_player->GetGroup())
- {
- Group* group = new Group;
- if (!group->Create(_player->GetGUID(), _player->GetName()))
- {
- delete group;
- return; // can't create group (??)
- }
-
- objmgr.AddGroup(group);
- }
-
- // stop at join fail (full)
- if (!_player->GetGroup()->AddMember(plr->GetGUID(), plr->GetName()))
- {
- if (sWorld.getConfig(CONFIG_RESTRICTED_LFG_CHANNEL) && _player->GetSession()->GetSecurity() == SEC_PLAYER)
- _player->LeaveLFGChannel();
-
- break;
- }
-
- // joined
- if (sWorld.getConfig(CONFIG_RESTRICTED_LFG_CHANNEL) && plr->GetSession()->GetSecurity() == SEC_PLAYER)
- plr->LeaveLFGChannel();
-
- // and group full
- if (_player->GetGroup()->IsFull())
- {
- if (sWorld.getConfig(CONFIG_RESTRICTED_LFG_CHANNEL) && _player->GetSession()->GetSecurity() == SEC_PLAYER)
- _player->LeaveLFGChannel();
-
- break;
- }
- }
-}
-
-void WorldSession::HandleLfgSetAutoJoinOpcode(WorldPacket & /*recv_data*/)
-{
- sLog.outDebug("CMSG_LFG_SET_AUTOJOIN");
- LookingForGroup_auto_join = true;
-
- if (!_player) // needed because STATUS_AUTHED
- return;
-
- AttemptJoin(_player);
-}
-
-void WorldSession::HandleLfgClearAutoJoinOpcode(WorldPacket & /*recv_data*/)
-{
- sLog.outDebug("CMSG_LFG_CLEAR_AUTOJOIN");
- LookingForGroup_auto_join = false;
-}
-
-void WorldSession::HandleLfmSetAutoFillOpcode(WorldPacket & /*recv_data*/)
-{
- sLog.outDebug("CMSG_LFM_SET_AUTOFILL");
- LookingForGroup_auto_add = true;
-
- if (!_player) // needed because STATUS_AUTHED
- return;
-
- AttemptAddMore(_player);
-}
-
-void WorldSession::HandleLfmClearAutoFillOpcode(WorldPacket & /*recv_data*/)
-{
- sLog.outDebug("CMSG_LFM_CLEAR_AUTOFILL");
- LookingForGroup_auto_add = false;
-}
-
-void WorldSession::HandleLfgClearOpcode(WorldPacket & /*recv_data */)
-{
- // empty packet
- sLog.outDebug("CMSG_CLEAR_LOOKING_FOR_GROUP");
-
- for (int i = 0; i < MAX_LOOKING_FOR_GROUP_SLOT; ++i)
- _player->m_lookingForGroup.slots[i].Clear();
-
- if (sWorld.getConfig(CONFIG_RESTRICTED_LFG_CHANNEL) && _player->GetSession()->GetSecurity() == SEC_PLAYER)
- _player->LeaveLFGChannel();
-
- SendLfgUpdate(0, 0, 0);
-}
-
-void WorldSession::HandleLfmClearOpcode(WorldPacket & /*recv_data */)
-{
- // empty packet
- sLog.outDebug("CMSG_CLEAR_LOOKING_FOR_MORE");
-
- _player->m_lookingForGroup.more.Clear();
-}
-
-void WorldSession::HandleSetLfmOpcode(WorldPacket & recv_data)
-{
- sLog.outDebug("CMSG_SET_LOOKING_FOR_MORE");
- //recv_data.hexlike();
- uint32 temp, entry, type;
- uint8 unk1;
- uint8 unk2[3];
-
- recv_data >> temp >> unk1 >> unk2[0] >> unk2[1] >> unk2[2];
-
- entry = (temp & 0x00FFFFFF);
- type = ((temp >> 24) & 0x000000FF);
-
- _player->m_lookingForGroup.more.Set(entry,type);
- sLog.outDebug("LFM set: temp %u, zone %u, type %u", temp, entry, type);
-
- if (LookingForGroup_auto_add)
- AttemptAddMore(_player);
-
- SendLfgResult(type, entry, 1);
-}
void WorldSession::HandleSetLfgCommentOpcode(WorldPacket & recv_data)
{
sLog.outDebug("CMSG_SET_LFG_COMMENT");
- //recv_data.hexlike();
std::string comment;
recv_data >> comment;
- sLog.outDebug("LFG comment %s", comment.c_str());
- _player->m_lookingForGroup.comment = comment;
+ GetPlayer()->m_lookingForGroup.comment = comment;
}
-void WorldSession::HandleLookingForGroup(WorldPacket& recv_data)
+void WorldSession::HandleLfgPlayerLockInfoRequestOpcode(WorldPacket &/*recv_data*/)
{
- sLog.outDebug("MSG_LOOKING_FOR_GROUP");
- //recv_data.hexlike();
- uint32 type, entry, unk;
-
- recv_data >> type >> entry >> unk;
- sLog.outDebug("MSG_LOOKING_FOR_GROUP: type %u, entry %u, unk %u", type, entry, unk);
-
- if (LookingForGroup_auto_add)
- AttemptAddMore(_player);
-
- if (LookingForGroup_auto_join)
- AttemptJoin(_player);
-
- SendLfgResult(type, entry, 0);
- SendLfgUpdate(0, 1, 0);
+ sLog.outDebug("CMSG_LFD_PLAYER_LOCK_INFO_REQUEST");
+ sLFGMgr.SendLfgPlayerInfo(GetPlayer());
}
-void WorldSession::SendLfgResult(uint32 /*type*/, uint32 /*entry*/, uint8 /*lfg_type*/)
-{/*
- uint32 number = 0;
+void WorldSession::HandleLfgPartyLockInfoRequestOpcode(WorldPacket &/*recv_data*/)
+{
+ sLog.outDebug("CMSG_LFD_PARTY_LOCK_INFO_REQUEST");
+ sLFGMgr.SendLfgPartyInfo(GetPlayer());
+}
- WorldPacket data(MSG_LOOKING_FOR_GROUP);
- data << uint32(type); // type
- data << uint32(entry); // entry from LFGDungeons.dbc
+void WorldSession::SendLfgUpdatePlayer(uint8 updateType, uint32 dungeonEntry /* = 0*/)
+{
+ bool queued = false;
+ bool extrainfo = false;
- data << uint8(0);
- if (uint8)
+ switch(updateType)
{
- uint32 count1;
- for (count1)
- {
- uint64; // player guid
- }
+ case LFG_UPDATETYPE_JOIN_PROPOSAL:
+ case LFG_UPDATETYPE_ADDED_TO_QUEUE:
+ queued = true;
+ extrainfo = true;
+ break;
+ //case LFG_UPDATETYPE_CLEAR_LOCK_LIST: // TODO: Sometimes has extrainfo - Check ocurrences...
+ case LFG_UPDATETYPE_PROPOSAL_FOUND:
+ extrainfo = true;
+ break;
}
-
- data << uint32(0); // count2
- data << uint32(0);
- for (count2)
+ sLog.outDebug("SMSG_LFG_UPDATE_PLAYER");
+ WorldPacket data(SMSG_LFG_UPDATE_PLAYER, 1 + 1 + (extrainfo ? 1 : 0) * (1 + 1 + 1 + 1 + !dungeonEntry ? 4 : GetPlayer()->m_lookingForGroup.applyDungeons.size() * 4 + GetPlayer()->m_lookingForGroup.comment.length()));
+ data << uint8(updateType); // Lfg Update type
+ data << uint8(extrainfo); // Extra info
+ if (extrainfo)
{
- uint64 // not player guid
- uint32 flags;
- if (flags & 0x2)
- {
- string
- }
- if (flags & 0x10)
+ data << uint8(queued); // Join the queue
+ data << uint8(0); // unk - Always 0
+ data << uint8(0); // unk - Always 0
+
+ if (dungeonEntry)
{
- uint8
+ data << uint8(1);
+ data << uint32(dungeonEntry);
}
- if (flags & 0x20)
+ else
{
- for (3)
- {
- uint8
- }
+ uint8 size = GetPlayer()->m_lookingForGroup.applyDungeons.size();
+ data << uint8(size);
+
+ for (LfgDungeonSet::const_iterator it = GetPlayer()->m_lookingForGroup.applyDungeons.begin(); it != GetPlayer()->m_lookingForGroup.applyDungeons.end(); ++it)
+ data << uint32(*it);
}
+ data << GetPlayer()->m_lookingForGroup.comment;
}
+ SendPacket(&data);
+}
- size_t count3_pos = data.wpos();
- data << uint32(0); // count3
- data << uint32(0); // unk
+void WorldSession::SendLfgUpdateParty(uint8 updateType, uint32 dungeonEntry /* = 0*/)
+{
+ bool join = false;
+ bool extrainfo = false;
+ bool queued = false;
- //TODO: Guard Player map
- HashMapHolder<Player>::MapType const& players = ObjectAccessor::Instance().GetPlayers();
- for (HashMapHolder<Player>::MapType::const_iterator iter = players.begin(); iter != players.end(); ++iter)
+ switch(updateType)
{
- Player *plr = iter->second;
-
- if (!plr || plr->GetTeam() != _player->GetTeam())
- continue;
-
- if (!plr->IsInWorld())
- continue;
-
- if (!plr->m_lookingForGroup.HaveInSlot(entry, type))
- continue;
-
- ++number;
-
- data << uint64(plr->GetGUID()); // guid
+ case LFG_UPDATETYPE_JOIN_PROPOSAL:
+ extrainfo = true;
+ break;
+ case LFG_UPDATETYPE_ADDED_TO_QUEUE:
+ extrainfo = true;
+ join = true;
+ queued = true;
+ break;
+ case LFG_UPDATETYPE_CLEAR_LOCK_LIST:
+ // join = true; // TODO: Sometimes queued and extrainfo - Check ocurrences...
+ queued = true;
+ break;
+ case LFG_UPDATETYPE_PROPOSAL_FOUND:
+ extrainfo = true;
+ join = true;
+ break;
+ }
- uint32 flags = 0x1FF;
- data << uint32(flags); // flags
+ sLog.outDebug("SMSG_LFG_UPDATE_PARTY");
+ WorldPacket data(SMSG_LFG_UPDATE_PARTY, 1 + 1 + (extrainfo ? 1 : 0) * (1 + 1 + 1 + 1 + 1 + !dungeonEntry ? 4 : GetPlayer()->m_lookingForGroup.applyDungeons.size() * 4 + GetPlayer()->m_lookingForGroup.comment.length()));
+ data << uint8(updateType); // Lfg Update type
+ data << uint8(extrainfo); // Extra info
+ if (extrainfo)
+ {
+ data << uint8(join); // LFG Join
+ data << uint8(queued); // Join the queue
+ data << uint8(0); // unk - Always 0
+ data << uint8(0); // unk - Always 0
- if (flags & 0x1)
+ if (dungeonEntry)
{
- data << uint8(plr->getLevel());
- data << uint8(plr->getClass());
- data << uint8(plr->getRace());
-
- for (int i = 0; i < 3; ++i)
- data << uint8(0); // spent talents count in specific tab
-
- data << uint32(0); // resistances1
- data << uint32(0); // spd/heal
- data << uint32(0); // spd/heal
- data << uint32(0); // combat_rating9
- data << uint32(0); // combat_rating10
- data << uint32(0); // combat_rating11
- data << float(0); // mp5
- data << float(0); // unk
- data << uint32(0); // attack power
- data << uint32(0); // stat1
- data << uint32(0); // maxhealth
- data << uint32(0); // maxpower1
- data << uint32(0); // unk
- data << float(0); // unk
- data << uint32(0); // unk
- data << uint32(0); // unk
- data << uint32(0); // unk
- data << uint32(0); // unk
- data << uint32(0); // combat_rating20
- data << uint32(0); // unk
+ data << uint8(1);
+ data << uint32(dungeonEntry);
}
-
- if (flags & 0x2)
- data << plr->m_lookingForGroup.comment; // comment
-
- if (flags & 0x4)
- data << uint8(0); // unk
-
- if (flags & 0x8)
- data << uint64(0); // guid from count2 block, not player guid
-
- if (flags & 0x10)
- data << uint8(0); // unk
-
- if (flags & 0x20)
- data << uint8(plr->m_lookingForGroup.roles); // roles
-
- if (flags & 0x40)
- data << uint32(plr->GetZoneId()); // areaid
-
- if (flags & 0x100)
- data << uint8(0); // LFG/LFM flag?
-
- if (flags & 0x80)
+ else
{
- for (uint8 j = 0; j < MAX_LOOKING_FOR_GROUP_SLOT; ++j)
- {
- data << uint32(plr->m_lookingForGroup.slots[j].entry | (plr->m_lookingForGroup.slots[j].type << 24));
- }
+ uint8 size = GetPlayer()->m_lookingForGroup.applyDungeons.size();
+ data << uint8(size);
+
+ for (LfgDungeonSet::const_iterator it = GetPlayer()->m_lookingForGroup.applyDungeons.begin(); it != GetPlayer()->m_lookingForGroup.applyDungeons.end(); ++it)
+ data << uint32(*it);
}
+ data << GetPlayer()->m_lookingForGroup.comment;
}
-
- data.put<uint32>(count3_pos, number); // fill count placeholder
-
SendPacket(&data);
-*/
-}
-
-void WorldSession::HandleSetLfgOpcode(WorldPacket & recv_data)
-{
- sLog.outDebug("CMSG_SET_LOOKING_FOR_GROUP");
- recv_data.hexlike();
- uint32 slot, temp, entry, type;
- uint8 roles, unk1;
-
- recv_data >> slot >> temp >> roles >> unk1;
-
- entry = (temp & 0x00FFFFFF);
- type = ((temp >> 24) & 0x000000FF);
-
- if (slot >= MAX_LOOKING_FOR_GROUP_SLOT)
- return;
-
- _player->m_lookingForGroup.slots[slot].Set(entry, type);
- _player->m_lookingForGroup.roles = roles;
- sLog.outDebug("LFG set: looknumber %u, temp %X, type %u, entry %u", slot, temp, type, entry);
-
- if (LookingForGroup_auto_join)
- AttemptJoin(_player);
-
- //SendLfgResult(type, entry, 0);
- SendLfgUpdate(0, 1, 0);
-}
-
-void WorldSession::HandleLfgSetRoles(WorldPacket &recv_data)
-{
- sLog.outDebug("CMSG_LFG_SET_ROLES");
-
- uint8 roles;
- recv_data >> roles;
-
- _player->m_lookingForGroup.roles = roles;
-}
-
-void WorldSession::SendLfgUpdate(uint8 /*unk1*/, uint8 /*unk2*/, uint8 /*unk3*/)
-{
-
-}
+} \ No newline at end of file