Updated and enabled LFG packets

This commit is contained in:
hondacrx
2017-07-12 12:40:11 -04:00
parent 65802889c4
commit 195fea7a0b
11 changed files with 904 additions and 853 deletions
+57 -33
View File
@@ -41,14 +41,18 @@ namespace Framework.Constants
ProposalDeclined = 10, ProposalDeclined = 10,
GroupFound = 11, GroupFound = 11,
AddedToQueue = 13, AddedToQueue = 13,
ProposalBegin = 14, SuspendedQueue = 14,
UpdateStatus = 15, ProposalBegin = 15,
GroupMemberOffline = 16, UpdateStatus = 16,
GroupDisbandUnk16 = 17, // Fixme: Sometimes At Group Disband GroupMemberOffline = 17,
JoinQueueInitial = 24, GroupDisbandUnk16 = 18, // FIXME: Sometimes at group disband
DungeonFinished = 25, JoinQueueInitial = 25,
PartyRoleNotAvailable = 43, DungeonFinished = 26,
JoinLfgObjectFailed = 45, PartyRoleNotAvailable = 46,
JoinLfgObjectFailed = 48,
RemovedLevelup = 49,
RemovedXpToggle = 50,
RemovedFactionChange = 51
} }
public enum LfgState public enum LfgState
@@ -63,6 +67,15 @@ namespace Framework.Constants
Raidbrowser Raidbrowser
} }
public enum LfgQueueType
{
Dungeon = 1,
LRF = 2,
Scenario = 3,
Flex = 4,
WorldPvP = 5
}
public enum LfgLockStatusType public enum LfgLockStatusType
{ {
InsufficientExpansion = 1, InsufficientExpansion = 1,
@@ -113,36 +126,47 @@ namespace Framework.Constants
public enum LfgTeleportResult public enum LfgTeleportResult
{ {
// 7 = "You Can'T Do That Right Now" | 5 = No Client Reaction // 7 = "You Can'T Do That Right Now" | 5 = No Client Reaction
Ok = 0, // Internal Use None = 0, // Internal Use
PlayerDead = 1, Dead = 1,
Falling = 2, Falling = 2,
InVehicle = 3, OnTransport = 3,
Fatigue = 4, Exhaustion = 4,
InvalidLocation = 6, NoReturnLocation = 6,
Charming = 8 // Fixme - It Can Be 7 Or 8 (Need Proper Data) ImmuneToSummons = 8 // Fixme - It Can Be 7 Or 8 (Need Proper Data)
// unknown values
//LFG_TELEPORT_RESULT_NOT_IN_DUNGEON,
//LFG_TELEPORT_RESULT_NOT_ALLOWED,
//LFG_TELEPORT_RESULT_ALREADY_IN_DUNGEON
} }
public enum LfgJoinResult public enum LfgJoinResult
{ {
// 3 = No Client Reaction | 18 = "Rolecheck Failed" // 3 = No client reaction | 18 = "Rolecheck failed"
Ok = 0x00, // Joined (No Client Msg) Ok = 0x00, // Joined (No Client Msg)
Failed = 0x1b, // Rolecheck Failed GroupFull = 0x1f, // Your Group Is Already Full.
Groupfull = 0x1c, // Your Group Is Full NoLfgObject = 0x21, // Internal Lfg Error.
InternalError = 0x1e, // Internal Lfg Error NoSlotsPlayer = 0x22, // You Do Not Meet The Requirements For The Chosen Dungeons.
NotMeetReqs = 0x1f, // You Do Not Meet The Requirements For The Chosen Dungeons MismatchedSlots = 0x23, // You Cannot Mix Dungeons, Raids, And Random When Picking Dungeons.
PartyNotMeetReqs = 6, // One Or More Party Members Do Not Meet The Requirements For The Chosen Dungeons PartyPlayersFromDifferentRealms = 0x24, // The Dungeon You Chose Does Not Support Players From Multiple Realms.
MixedRaidDungeon = 0x20, // You Cannot Mix Dungeons, Raids, And Random When Picking Dungeons MembersNotPresent = 0x25, // One Or More Group Members Are Pending Invites Or Disconnected.
MultiRealm = 0x21, // The Dungeon You Chose Does Not Support Players From Multiple Realms GetInfoTimeout = 0x26, // Could Not Retrieve Information About Some Party Members.
Disconnected = 0x22, // One Or More Party Members Are Pending Invites Or Disconnected InvalidSlot = 0x27, // One Or More Dungeons Was Not Valid.
PartyInfoFailed = 0x23, // Could Not Retrieve Information About Some Party Members DeserterPlayer = 0x28, // You Can Not Queue For Dungeons Until Your Deserter Debuff Wears Off.
DungeonInvalid = 0x24, // One Or More Dungeons Was Not Valid DeserterParty = 0x29, // One Or More Party Members Has A Deserter Debuff.
Deserter = 0x25, // You Can Not Queue For Dungeons Until Your Deserter Debuff Wears Off RandomCooldownPlayer = 0x2a, // You Can Not Queue For Random Dungeons While On Random Dungeon Cooldown.
PartyDeserter = 0x26, // One Or More Party Members Has A Deserter Debuff RandomCooldownParty = 0x2b, // One Or More Party Members Are On Random Dungeon Cooldown.
RandomCooldown = 0x27, // You Can Not Queue For Random Dungeons While On Random Dungeon Cooldown TooManyMembers = 0x2c, // You Have Too Many Group Members To Queue For That.
PartyRandomCooldown = 0x28, // One Or More Party Members Are On Random Dungeon Cooldown CantUseDungeons = 0x2d, // You Cannot Queue For A Dungeon Or Raid While Using Battlegrounds Or Arenas.
TooMuchMembers = 0x29, // You Can Not Enter Dungeons With More That 5 Party Members RoleCheckFailed = 0x2e, // The Role Check Has Failed.
UsingBgSystem = 0x2a, // You Can Not Use The Dungeon System While In Bg Or Arenas TooFewMembers = 0x34, // You Do Not Have Enough Group Members To Queue For That.
RoleCheckFailed = 0x2b // Role Check Failed, Client Shows Special Error ReasonTooManyLfg = 0x35, // You Are Queued For Too Many Instances.
MismatchedSlotsLocalXrealm = 0x37, // You Cannot Mix Realm-Only And X-Realm Entries When Listing Your Name In Other Raids.
AlreadyUsingLfgList = 0x3f, // You Can'T Do That While Using Premade Groups.
NotLeader = 0x45, // You Are Not The Party Leader.
Dead = 0x49,
PartyNotMeetReqs = 6, // One Or More Party Members Do Not Meet The Requirements For The Chosen Dungeons (Fixme)
} }
public enum LfgRoleCheckState public enum LfgRoleCheckState
+1 -1
View File
@@ -857,7 +857,7 @@ namespace Game.BattleGrounds
if (SendPacket) if (SendPacket)
{ {
BattlefieldStatusNone battlefieldStatus; BattlefieldStatusNone battlefieldStatus;
Global.BattlegroundMgr.BuildBattlegroundStatusNone(out battlefieldStatus, player, player.GetBattlegroundQueueIndex(bgQueueTypeId), player.GetBattlegroundQueueJoinTime(bgQueueTypeId), m_ArenaType); Global.BattlegroundMgr.BuildBattlegroundStatusNone(out battlefieldStatus, player, player.GetBattlegroundQueueIndex(bgQueueTypeId), player.GetBattlegroundQueueJoinTime(bgQueueTypeId));
player.SendPacket(battlefieldStatus); player.SendPacket(battlefieldStatus);
} }
+7 -7
View File
@@ -127,8 +127,8 @@ namespace Game.BattleGrounds
{ {
header.Ticket.RequesterGuid = player.GetGUID(); header.Ticket.RequesterGuid = player.GetGUID();
header.Ticket.Id = ticketId; header.Ticket.Id = ticketId;
header.Ticket.Type = bg.isArena() ? (int)arenaType : 1; header.Ticket.Type = RideType.Battlegrounds;
header.Ticket.Time = joinTime; header.Ticket.Time = (int)joinTime;
header.QueueID = bg.GetQueueId(); header.QueueID = bg.GetQueueId();
header.RangeMin = (byte)bg.GetMinLevel(); header.RangeMin = (byte)bg.GetMinLevel();
header.RangeMax = (byte)bg.GetMaxLevel(); header.RangeMax = (byte)bg.GetMaxLevel();
@@ -138,13 +138,13 @@ namespace Game.BattleGrounds
header.TournamentRules = false; header.TournamentRules = false;
} }
public void BuildBattlegroundStatusNone(out BattlefieldStatusNone battlefieldStatus, Player player, uint ticketId, uint joinTime, ArenaTypes arenaType) public void BuildBattlegroundStatusNone(out BattlefieldStatusNone battlefieldStatus, Player player, uint ticketId, uint joinTime)
{ {
battlefieldStatus = new BattlefieldStatusNone(); battlefieldStatus = new BattlefieldStatusNone();
battlefieldStatus.Ticket.RequesterGuid = player.GetGUID(); battlefieldStatus.Ticket.RequesterGuid = player.GetGUID();
battlefieldStatus.Ticket.Id = ticketId; battlefieldStatus.Ticket.Id = ticketId;
battlefieldStatus.Ticket.Type = (int)arenaType; battlefieldStatus.Ticket.Type = RideType.Battlegrounds;
battlefieldStatus.Ticket.Time = joinTime; battlefieldStatus.Ticket.Time = (int)joinTime;
} }
public void BuildBattlegroundStatusNeedConfirmation(out BattlefieldStatusNeedConfirmation battlefieldStatus, Battleground bg, Player player, uint ticketId, uint joinTime, uint timeout, ArenaTypes arenaType) public void BuildBattlegroundStatusNeedConfirmation(out BattlefieldStatusNeedConfirmation battlefieldStatus, Battleground bg, Player player, uint ticketId, uint joinTime, uint timeout, ArenaTypes arenaType)
@@ -183,8 +183,8 @@ namespace Game.BattleGrounds
battlefieldStatus = new BattlefieldStatusFailed(); battlefieldStatus = new BattlefieldStatusFailed();
battlefieldStatus.Ticket.RequesterGuid = pPlayer.GetGUID(); battlefieldStatus.Ticket.RequesterGuid = pPlayer.GetGUID();
battlefieldStatus.Ticket.Id = ticketId; battlefieldStatus.Ticket.Id = ticketId;
battlefieldStatus.Ticket.Type = (int)arenaType; battlefieldStatus.Ticket.Type = RideType.Battlegrounds;
battlefieldStatus.Ticket.Time = pPlayer.GetBattlegroundQueueJoinTime(BGQueueTypeId(bg.GetTypeID(), arenaType)); battlefieldStatus.Ticket.Time = (int)pPlayer.GetBattlegroundQueueJoinTime(BGQueueTypeId(bg.GetTypeID(), arenaType));
battlefieldStatus.QueueID = bg.GetQueueId(); battlefieldStatus.QueueID = bg.GetQueueId();
battlefieldStatus.Reason = (int)result; battlefieldStatus.Reason = (int)result;
if (!errorGuid.IsEmpty() && (result == GroupJoinBattlegroundResult.NotInBattleground || result == GroupJoinBattlegroundResult.JoinTimedOut)) if (!errorGuid.IsEmpty() && (result == GroupJoinBattlegroundResult.NotInBattleground || result == GroupJoinBattlegroundResult.JoinTimedOut))
+4 -6
View File
@@ -336,7 +336,7 @@ namespace Game.BattleGrounds
// queue.removeplayer, it causes bugs // queue.removeplayer, it causes bugs
BattlefieldStatusNone battlefieldStatus; BattlefieldStatusNone battlefieldStatus;
Global.BattlegroundMgr.BuildBattlegroundStatusNone(out battlefieldStatus, plr2, queueSlot, plr2.GetBattlegroundQueueJoinTime(bgQueueTypeId), group.ArenaType); Global.BattlegroundMgr.BuildBattlegroundStatusNone(out battlefieldStatus, plr2, queueSlot, plr2.GetBattlegroundQueueJoinTime(bgQueueTypeId));
plr2.SendPacket(battlefieldStatus); plr2.SendPacket(battlefieldStatus);
} }
// then actually delete, this may delete the group as well! // then actually delete, this may delete the group as well!
@@ -411,7 +411,7 @@ namespace Game.BattleGrounds
BGQueueInviteEvent inviteEvent = new BGQueueInviteEvent(player.GetGUID(), ginfo.IsInvitedToBGInstanceGUID, bgTypeId, ginfo.ArenaType, ginfo.RemoveInviteTime); BGQueueInviteEvent inviteEvent = new BGQueueInviteEvent(player.GetGUID(), ginfo.IsInvitedToBGInstanceGUID, bgTypeId, ginfo.ArenaType, ginfo.RemoveInviteTime);
m_events.AddEvent(inviteEvent, m_events.CalculateTime(BattlegroundConst.InvitationRemindTime)); m_events.AddEvent(inviteEvent, m_events.CalculateTime(BattlegroundConst.InvitationRemindTime));
// create automatic remove events // create automatic remove events
BGQueueRemoveEvent removeEvent = new BGQueueRemoveEvent(player.GetGUID(), ginfo.IsInvitedToBGInstanceGUID, bgTypeId, ginfo.ArenaType, bgQueueTypeId, ginfo.RemoveInviteTime); BGQueueRemoveEvent removeEvent = new BGQueueRemoveEvent(player.GetGUID(), ginfo.IsInvitedToBGInstanceGUID, bgTypeId, bgQueueTypeId, ginfo.RemoveInviteTime);
m_events.AddEvent(removeEvent, m_events.CalculateTime(BattlegroundConst.InviteAcceptWaitTime)); m_events.AddEvent(removeEvent, m_events.CalculateTime(BattlegroundConst.InviteAcceptWaitTime));
uint queueSlot = player.GetBattlegroundQueueIndex(bgQueueTypeId); uint queueSlot = player.GetBattlegroundQueueIndex(bgQueueTypeId);
@@ -1134,12 +1134,11 @@ namespace Game.BattleGrounds
/// </summary> /// </summary>
class BGQueueRemoveEvent : BasicEvent class BGQueueRemoveEvent : BasicEvent
{ {
public BGQueueRemoveEvent(ObjectGuid pl_guid, uint bgInstanceGUID, BattlegroundTypeId BgTypeId, ArenaTypes arenaType, BattlegroundQueueTypeId bgQueueTypeId, uint removeTime) public BGQueueRemoveEvent(ObjectGuid pl_guid, uint bgInstanceGUID, BattlegroundTypeId BgTypeId, BattlegroundQueueTypeId bgQueueTypeId, uint removeTime)
{ {
m_PlayerGuid = pl_guid; m_PlayerGuid = pl_guid;
m_BgInstanceGUID = bgInstanceGUID; m_BgInstanceGUID = bgInstanceGUID;
m_RemoveTime = removeTime; m_RemoveTime = removeTime;
m_ArenaType = arenaType;
m_BgTypeId = BgTypeId; m_BgTypeId = BgTypeId;
m_BgQueueTypeId = bgQueueTypeId; m_BgQueueTypeId = bgQueueTypeId;
} }
@@ -1171,7 +1170,7 @@ namespace Game.BattleGrounds
Global.BattlegroundMgr.ScheduleQueueUpdate(0, 0, m_BgQueueTypeId, m_BgTypeId, bg.GetBracketId()); Global.BattlegroundMgr.ScheduleQueueUpdate(0, 0, m_BgQueueTypeId, m_BgTypeId, bg.GetBracketId());
BattlefieldStatusNone battlefieldStatus; BattlefieldStatusNone battlefieldStatus;
Global.BattlegroundMgr.BuildBattlegroundStatusNone(out battlefieldStatus, player, queueSlot, player.GetBattlegroundQueueJoinTime(m_BgQueueTypeId), m_ArenaType); Global.BattlegroundMgr.BuildBattlegroundStatusNone(out battlefieldStatus, player, queueSlot, player.GetBattlegroundQueueJoinTime(m_BgQueueTypeId));
player.SendPacket(battlefieldStatus); player.SendPacket(battlefieldStatus);
} }
} }
@@ -1186,7 +1185,6 @@ namespace Game.BattleGrounds
uint m_BgInstanceGUID; uint m_BgInstanceGUID;
uint m_RemoveTime; uint m_RemoveTime;
BattlegroundTypeId m_BgTypeId; BattlegroundTypeId m_BgTypeId;
ArenaTypes m_ArenaType;
BattlegroundQueueTypeId m_BgQueueTypeId; BattlegroundQueueTypeId m_BgQueueTypeId;
} }
} }
+50 -39
View File
@@ -27,6 +27,7 @@ using System.Collections.Generic;
using System.Diagnostics.Contracts; using System.Diagnostics.Contracts;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Game.Network.Packets;
namespace Game.DungeonFinding namespace Game.DungeonFinding
{ {
@@ -382,21 +383,21 @@ namespace Game.DungeonFinding
// Check player or group member restrictions // Check player or group member restrictions
if (!player.GetSession().HasPermission(RBACPermissions.JoinDungeonFinder)) if (!player.GetSession().HasPermission(RBACPermissions.JoinDungeonFinder))
joinData.result = LfgJoinResult.NotMeetReqs; joinData.result = LfgJoinResult.NoSlotsPlayer;
else if (player.InBattleground() || player.InArena() || player.InBattlegroundQueue()) else if (player.InBattleground() || player.InArena() || player.InBattlegroundQueue())
joinData.result = LfgJoinResult.UsingBgSystem; joinData.result = LfgJoinResult.CantUseDungeons;
else if (player.HasAura(SharedConst.LFGSpellDungeonDeserter)) else if (player.HasAura(SharedConst.LFGSpellDungeonDeserter))
joinData.result = LfgJoinResult.Deserter; joinData.result = LfgJoinResult.DeserterPlayer;
else if (player.HasAura(SharedConst.LFGSpellDungeonCooldown)) else if (player.HasAura(SharedConst.LFGSpellDungeonCooldown))
joinData.result = LfgJoinResult.RandomCooldown; joinData.result = LfgJoinResult.RandomCooldownPlayer;
else if (dungeons.Empty()) else if (dungeons.Empty())
joinData.result = LfgJoinResult.NotMeetReqs; joinData.result = LfgJoinResult.NoSlotsPlayer;
else if (player.HasAura(9454)) // check Freeze debuff else if (player.HasAura(9454)) // check Freeze debuff
joinData.result = LfgJoinResult.NotMeetReqs; joinData.result = LfgJoinResult.NoSlotsPlayer;
else if (grp) else if (grp)
{ {
if (grp.GetMembersCount() > MapConst.MaxGroupSize) if (grp.GetMembersCount() > MapConst.MaxGroupSize)
joinData.result = LfgJoinResult.TooMuchMembers; joinData.result = LfgJoinResult.TooManyMembers;
else else
{ {
byte memberCount = 0; byte memberCount = 0;
@@ -406,13 +407,13 @@ namespace Game.DungeonFinding
if (plrg) if (plrg)
{ {
if (!plrg.GetSession().HasPermission(RBACPermissions.JoinDungeonFinder)) if (!plrg.GetSession().HasPermission(RBACPermissions.JoinDungeonFinder))
joinData.result = LfgJoinResult.InternalError; joinData.result = LfgJoinResult.NoLfgObject;
if (plrg.HasAura(SharedConst.LFGSpellDungeonDeserter)) if (plrg.HasAura(SharedConst.LFGSpellDungeonDeserter))
joinData.result = LfgJoinResult.PartyDeserter; joinData.result = LfgJoinResult.DeserterParty;
else if (plrg.HasAura(SharedConst.LFGSpellDungeonCooldown)) else if (plrg.HasAura(SharedConst.LFGSpellDungeonCooldown))
joinData.result = LfgJoinResult.PartyRandomCooldown; joinData.result = LfgJoinResult.RandomCooldownParty;
else if (plrg.InBattleground() || plrg.InArena() || plrg.InBattlegroundQueue()) else if (plrg.InBattleground() || plrg.InArena() || plrg.InBattlegroundQueue())
joinData.result = LfgJoinResult.UsingBgSystem; joinData.result = LfgJoinResult.CantUseDungeons;
else if (plrg.HasAura(9454)) // check Freeze debuff else if (plrg.HasAura(9454)) // check Freeze debuff
joinData.result = LfgJoinResult.PartyNotMeetReqs; joinData.result = LfgJoinResult.PartyNotMeetReqs;
++memberCount; ++memberCount;
@@ -421,7 +422,7 @@ namespace Game.DungeonFinding
} }
if (joinData.result == LfgJoinResult.Ok && memberCount != grp.GetMembersCount()) if (joinData.result == LfgJoinResult.Ok && memberCount != grp.GetMembersCount())
joinData.result = LfgJoinResult.Disconnected; joinData.result = LfgJoinResult.MembersNotPresent;
} }
} }
else else
@@ -442,23 +443,23 @@ namespace Game.DungeonFinding
{ {
case LfgType.RandomDungeon: case LfgType.RandomDungeon:
if (dungeons.Count > 1) // Only allow 1 random dungeon if (dungeons.Count > 1) // Only allow 1 random dungeon
joinData.result = LfgJoinResult.DungeonInvalid; joinData.result = LfgJoinResult.InvalidSlot;
else else
rDungeonId = dungeons.First(); rDungeonId = dungeons.First();
goto case LfgType.Dungeon; goto case LfgType.Dungeon;
case LfgType.Dungeon: case LfgType.Dungeon:
if (isRaid) if (isRaid)
joinData.result = LfgJoinResult.MixedRaidDungeon; joinData.result = LfgJoinResult.MismatchedSlots;
isDungeon = true; isDungeon = true;
break; break;
case LfgType.Raid: case LfgType.Raid:
if (isDungeon) if (isDungeon)
joinData.result = LfgJoinResult.MixedRaidDungeon; joinData.result = LfgJoinResult.MismatchedSlots;
isRaid = true; isRaid = true;
break; break;
default: default:
Log.outError(LogFilter.Lfg, "Wrong dungeon type {0} for dungeon {1}", type, it); Log.outError(LogFilter.Lfg, "Wrong dungeon type {0} for dungeon {1}", type, it);
joinData.result = LfgJoinResult.DungeonInvalid; joinData.result = LfgJoinResult.InvalidSlot;
break; break;
} }
} }
@@ -473,7 +474,7 @@ namespace Game.DungeonFinding
// if we have lockmap then there are no compatible dungeons // if we have lockmap then there are no compatible dungeons
GetCompatibleDungeons(dungeons, players, joinData.lockmap, isContinue); GetCompatibleDungeons(dungeons, players, joinData.lockmap, isContinue);
if (dungeons.Empty()) if (dungeons.Empty())
joinData.result = grp ? LfgJoinResult.InternalError : LfgJoinResult.NotMeetReqs; joinData.result = grp ? LfgJoinResult.NoLfgObject : LfgJoinResult.NoSlotsPlayer;
} }
} }
@@ -493,6 +494,7 @@ namespace Game.DungeonFinding
return; return;
} }
RideTicket ticket = new RideTicket(guid, GetQueueId(gguid), RideType.Lfg, (int)Time.UnixTime);
string debugNames = ""; string debugNames = "";
if (grp) // Begin rolecheck if (grp) // Begin rolecheck
{ {
@@ -523,6 +525,7 @@ namespace Game.DungeonFinding
ObjectGuid pguid = plrg.GetGUID(); ObjectGuid pguid = plrg.GetGUID();
plrg.GetSession().SendLfgUpdateStatus(updateData, true); plrg.GetSession().SendLfgUpdateStatus(updateData, true);
SetState(pguid, LfgState.Rolecheck); SetState(pguid, LfgState.Rolecheck);
SetTicket(pguid, ticket);
if (!isContinue) if (!isContinue)
SetSelectedDungeons(pguid, dungeons); SetSelectedDungeons(pguid, dungeons);
roleCheck.roles[pguid] = 0; roleCheck.roles[pguid] = 0;
@@ -551,10 +554,12 @@ namespace Game.DungeonFinding
SetSelectedDungeons(guid, dungeons); SetSelectedDungeons(guid, dungeons);
} }
// Send update to player // Send update to player
SetTicket(guid, ticket);
SetRoles(guid, roles); SetRoles(guid, roles);
player.GetSession().SendLfgUpdateStatus(new LfgUpdateData(LfgUpdateType.JoinQueue, dungeons), false); player.GetSession().SendLfgUpdateStatus(new LfgUpdateData(LfgUpdateType.JoinQueueInitial, dungeons), false);
player.GetSession().SendLfgJoinResult(joinData);
SetState(gguid, LfgState.Queued); SetState(gguid, LfgState.Queued);
player.GetSession().SendLfgUpdateStatus(new LfgUpdateData(LfgUpdateType.AddedToQueue, dungeons), false);
player.GetSession().SendLfgJoinResult(joinData);
debugNames += player.GetName(); debugNames += player.GetName();
} }
StringBuilder o = new StringBuilder(); StringBuilder o = new StringBuilder();
@@ -628,6 +633,15 @@ namespace Game.DungeonFinding
} }
} }
public RideTicket GetTicket(ObjectGuid guid)
{
var palyerData = PlayersStore.LookupByKey(guid);
if (palyerData != null)
return palyerData.GetTicket();
return null;
}
public void UpdateRoleCheck(ObjectGuid gguid, ObjectGuid guid = default(ObjectGuid), LfgRoles roles = LfgRoles.None) public void UpdateRoleCheck(ObjectGuid gguid, ObjectGuid guid = default(ObjectGuid), LfgRoles roles = LfgRoles.None)
{ {
if (gguid.IsEmpty()) if (gguid.IsEmpty())
@@ -671,11 +685,7 @@ namespace Game.DungeonFinding
else else
dungeons = roleCheck.dungeons; dungeons = roleCheck.dungeons;
LfgJoinResult joinResult = LfgJoinResult.Failed; LfgJoinResultData joinData = new LfgJoinResultData(LfgJoinResult.RoleCheckFailed, roleCheck.state);
if (roleCheck.state == LfgRoleCheckState.MissingRole || roleCheck.state == LfgRoleCheckState.WrongRoles)
joinResult = LfgJoinResult.RoleCheckFailed;
LfgJoinResultData joinData = new LfgJoinResultData(joinResult, roleCheck.state);
foreach (var it in roleCheck.roles) foreach (var it in roleCheck.roles)
{ {
ObjectGuid pguid = it.Key; ObjectGuid pguid = it.Key;
@@ -1184,7 +1194,7 @@ namespace Game.DungeonFinding
if (dungeon == null) if (dungeon == null)
{ {
Log.outDebug(LogFilter.Lfg, "TeleportPlayer: Player {0} not in group/lfggroup or dungeon not found!", player.GetName()); Log.outDebug(LogFilter.Lfg, "TeleportPlayer: Player {0} not in group/lfggroup or dungeon not found!", player.GetName());
player.GetSession().SendLfgTeleportError(LfgTeleportResult.InvalidLocation); player.GetSession().SendLfgTeleportError(LfgTeleportResult.NoReturnLocation);
return; return;
} }
@@ -1197,19 +1207,19 @@ namespace Game.DungeonFinding
return; return;
} }
LfgTeleportResult error = LfgTeleportResult.Ok; LfgTeleportResult error = LfgTeleportResult.None;
if (!player.IsAlive()) if (!player.IsAlive())
error = LfgTeleportResult.PlayerDead; error = LfgTeleportResult.Dead;
else if (player.IsFalling() || player.HasUnitState(UnitState.Jumping)) else if (player.IsFalling() || player.HasUnitState(UnitState.Jumping))
error = LfgTeleportResult.Falling; error = LfgTeleportResult.Falling;
else if (player.IsMirrorTimerActive(MirrorTimerType.Fatigue)) else if (player.IsMirrorTimerActive(MirrorTimerType.Fatigue))
error = LfgTeleportResult.Fatigue; error = LfgTeleportResult.Exhaustion;
else if (player.GetVehicle()) else if (player.GetVehicle())
error = LfgTeleportResult.InVehicle; error = LfgTeleportResult.OnTransport;
else if (!player.GetCharmGUID().IsEmpty()) else if (!player.GetCharmGUID().IsEmpty())
error = LfgTeleportResult.Charming; error = LfgTeleportResult.ImmuneToSummons;
else if (player.HasAura(9454)) // check Freeze debuff else if (player.HasAura(9454)) // check Freeze debuff
error = LfgTeleportResult.InvalidLocation; error = LfgTeleportResult.NoReturnLocation;
else if (player.GetMapId() != dungeon.map) // Do not teleport players in dungeon to the entrance else if (player.GetMapId() != dungeon.map) // Do not teleport players in dungeon to the entrance
{ {
uint mapid = dungeon.map; uint mapid = dungeon.map;
@@ -1246,12 +1256,12 @@ namespace Game.DungeonFinding
} }
if (!player.TeleportTo(mapid, x, y, z, orientation)) if (!player.TeleportTo(mapid, x, y, z, orientation))
error = LfgTeleportResult.InvalidLocation; error = LfgTeleportResult.NoReturnLocation;
} }
else else
error = LfgTeleportResult.InvalidLocation; error = LfgTeleportResult.NoReturnLocation;
if (error != LfgTeleportResult.Ok) if (error != LfgTeleportResult.None)
player.GetSession().SendLfgTeleportError(error); player.GetSession().SendLfgTeleportError(error);
Log.outDebug(LogFilter.Lfg, "TeleportPlayer: Player {0} is being teleported in to map {1} (x: {2}, y: {3}, z: {4}) Result: {5}", player.GetName(), dungeon.map, dungeon.x, dungeon.y, dungeon.z, error); Log.outDebug(LogFilter.Lfg, "TeleportPlayer: Player {0} is being teleported in to map {1} (x: {2}, y: {3}, z: {4}) Result: {5}", player.GetName(), dungeon.map, dungeon.x, dungeon.y, dungeon.z, error);
@@ -1323,7 +1333,6 @@ namespace Game.DungeonFinding
if (reward == null) if (reward == null)
continue; continue;
bool done = false;
Quest quest = Global.ObjectMgr.GetQuestTemplate(reward.firstQuest); Quest quest = Global.ObjectMgr.GetQuestTemplate(reward.firstQuest);
if (quest == null) if (quest == null)
continue; continue;
@@ -1333,7 +1342,6 @@ namespace Game.DungeonFinding
player.RewardQuest(quest, 0, null, false); player.RewardQuest(quest, 0, null, false);
else else
{ {
done = true;
quest = Global.ObjectMgr.GetQuestTemplate(reward.otherQuest); quest = Global.ObjectMgr.GetQuestTemplate(reward.otherQuest);
if (quest == null) if (quest == null)
continue; continue;
@@ -1617,6 +1625,11 @@ namespace Game.DungeonFinding
PlayersStore[guid] = new LFGPlayerData(); PlayersStore[guid] = new LFGPlayerData();
} }
void SetTicket(ObjectGuid guid, RideTicket ticket)
{
PlayersStore[guid].SetTicket(ticket);
}
void RemovePlayerData(ObjectGuid guid) void RemovePlayerData(ObjectGuid guid)
{ {
Log.outDebug(LogFilter.Lfg, "RemovePlayerData: [{0}]", guid); Log.outDebug(LogFilter.Lfg, "RemovePlayerData: [{0}]", guid);
@@ -2003,12 +2016,11 @@ namespace Game.DungeonFinding
public class LfgQueueStatusData public class LfgQueueStatusData
{ {
public LfgQueueStatusData(byte _queueId = 0, uint _dungeonId = 0, long _joinTime = 0, int _waitTime = -1, int _waitTimeAvg = -1, int _waitTimeTank = -1, int _waitTimeHealer = -1, public LfgQueueStatusData(byte _queueId = 0, uint _dungeonId = 0, int _waitTime = -1, int _waitTimeAvg = -1, int _waitTimeTank = -1, int _waitTimeHealer = -1,
int _waitTimeDps = -1, uint _queuedTime = 0, byte _tanks = 0, byte _healers = 0, byte _dps = 0) int _waitTimeDps = -1, uint _queuedTime = 0, byte _tanks = 0, byte _healers = 0, byte _dps = 0)
{ {
queueId = _queueId; queueId = _queueId;
dungeonId = _dungeonId; dungeonId = _dungeonId;
joinTime = _joinTime;
waitTime = _waitTime; waitTime = _waitTime;
waitTimeAvg = _waitTimeAvg; waitTimeAvg = _waitTimeAvg;
waitTimeTank = _waitTimeTank; waitTimeTank = _waitTimeTank;
@@ -2022,7 +2034,6 @@ namespace Game.DungeonFinding
public byte queueId; public byte queueId;
public uint dungeonId; public uint dungeonId;
public long joinTime;
public int waitTime; public int waitTime;
public int waitTimeAvg; public int waitTimeAvg;
public int waitTimeTank; public int waitTimeTank;
+12
View File
@@ -18,6 +18,7 @@
using Framework.Constants; using Framework.Constants;
using Game.Entities; using Game.Entities;
using System.Collections.Generic; using System.Collections.Generic;
using Game.Network.Packets;
namespace Game.DungeonFinding namespace Game.DungeonFinding
{ {
@@ -29,6 +30,11 @@ namespace Game.DungeonFinding
m_OldState = LfgState.None; m_OldState = LfgState.None;
} }
public void SetTicket(RideTicket ticket)
{
m_Ticket = ticket;
}
public void SetState(LfgState state) public void SetState(LfgState state)
{ {
switch (state) switch (state)
@@ -75,6 +81,11 @@ namespace Game.DungeonFinding
m_SelectedDungeons = dungeons; m_SelectedDungeons = dungeons;
} }
public RideTicket GetTicket()
{
return m_Ticket;
}
public LfgState GetState() public LfgState GetState()
{ {
return m_State; return m_State;
@@ -106,6 +117,7 @@ namespace Game.DungeonFinding
} }
// General // General
RideTicket m_Ticket;
LfgState m_State; LfgState m_State;
LfgState m_OldState; LfgState m_OldState;
// Player // Player
+1 -1
View File
@@ -616,7 +616,7 @@ namespace Game.DungeonFinding
if (string.IsNullOrEmpty(queueinfo.bestCompatible)) if (string.IsNullOrEmpty(queueinfo.bestCompatible))
FindBestCompatibleInQueue(itQueue.Key, itQueue.Value); FindBestCompatibleInQueue(itQueue.Key, itQueue.Value);
LfgQueueStatusData queueData = new LfgQueueStatusData(queueId, dungeonId, queueinfo.joinTime, waitTime, wtAvg, wtTank, wtHealer, wtDps, queuedTime, queueinfo.tanks, queueinfo.healers, queueinfo.dps); LfgQueueStatusData queueData = new LfgQueueStatusData(queueId, dungeonId, waitTime, wtAvg, wtTank, wtHealer, wtDps, queuedTime, queueinfo.tanks, queueinfo.healers, queueinfo.dps);
foreach (var itPlayer in queueinfo.roles) foreach (var itPlayer in queueinfo.roles)
{ {
ObjectGuid pguid = itPlayer.Key; ObjectGuid pguid = itPlayer.Key;
-3
View File
@@ -34,10 +34,7 @@ namespace Game.DungeonFinding
return; return;
if (!player.GetGroup()) if (!player.GetGroup())
{
player.GetSession().SendLfgLfrList(false);
Global.LFGMgr.LeaveLfg(player.GetGUID()); Global.LFGMgr.LeaveLfg(player.GetGUID());
}
else if (player.GetSession().PlayerDisconnected()) else if (player.GetSession().PlayerDisconnected())
Global.LFGMgr.LeaveLfg(player.GetGUID(), true); Global.LFGMgr.LeaveLfg(player.GetGUID(), true);
} }
+1 -1
View File
@@ -1391,7 +1391,7 @@ namespace Game.Groups
{ {
partyUpdate.LfgInfos.HasValue = true; partyUpdate.LfgInfos.HasValue = true;
partyUpdate.LfgInfos.Value.Slot = Global.LFGMgr.GetDungeon(m_guid); partyUpdate.LfgInfos.Value.Slot = Global.LFGMgr.GetLFGDungeonEntry(Global.LFGMgr.GetDungeon(m_guid));
partyUpdate.LfgInfos.Value.BootCount = 0; partyUpdate.LfgInfos.Value.BootCount = 0;
partyUpdate.LfgInfos.Value.Aborted = false; partyUpdate.LfgInfos.Value.Aborted = false;
+192 -247
View File
@@ -23,48 +23,14 @@ using Game.Network;
using Game.Network.Packets; using Game.Network.Packets;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Game.DataStorage;
namespace Game namespace Game
{ {
public partial class WorldSession public partial class WorldSession
{ {
void BuildQuestReward(LfgPlayerQuestReward questReward, Quest quest, Player player)
{
byte rewCount = (byte)(quest.GetRewItemsCount() + quest.GetRewCurrencyCount());
questReward.RewardMoney = player.GetQuestMoneyReward(quest);
questReward.RewardXP = player.GetQuestXPReward(quest);
if (rewCount != 0)
{
for (byte i = 0; i < SharedConst.QuestRewardCurrencyCount; ++i)
{
var rewardCurrency = new LfgPlayerQuestReward.LfgPlayerQuestRewardCurrency();
uint currencyId = quest.RewardCurrencyId[i];
if (currencyId != 0)
{
rewardCurrency.CurrencyID = currencyId;
rewardCurrency.Quantity = quest.RewardCurrencyCount[i];
questReward.Currency.Add(rewardCurrency);
}
}
for (byte i = 0; i < SharedConst.QuestRewardItemCount; ++i)
{
var rewardItem = new LfgPlayerQuestReward.LfgPlayerQuestRewardItem();
uint itemId = quest.RewardItemId[i];
if (itemId != 0)
{
ItemTemplate item = Global.ObjectMgr.GetItemTemplate(itemId);
rewardItem.ItemID = itemId;
rewardItem.Quantity = quest.RewardItemCount[i];
questReward.Items.Add(rewardItem);
}
}
}
}
[WorldPacketHandler(ClientOpcodes.DfJoin)] [WorldPacketHandler(ClientOpcodes.DfJoin)]
void HandleDfJoin(DFJoin dfJoin) void HandleLfgJoin(DFJoin dfJoin)
{ {
if (!Global.LFGMgr.isOptionEnabled(LfgOptions.EnableDungeonFinder | LfgOptions.EnableRaidBrowser) || if (!Global.LFGMgr.isOptionEnabled(LfgOptions.EnableDungeonFinder | LfgOptions.EnableRaidBrowser) ||
(GetPlayer().GetGroup() && GetPlayer().GetGroup().GetLeaderGUID() != GetPlayer().GetGUID() && (GetPlayer().GetGroup() && GetPlayer().GetGroup().GetLeaderGUID() != GetPlayer().GetGUID() &&
@@ -73,73 +39,74 @@ namespace Game
if (dfJoin.Slots.Empty()) if (dfJoin.Slots.Empty())
{ {
Log.outDebug(LogFilter.Lfg, "ClientOpcodes.DfJoin {0} no dungeons selected", GetPlayerInfo()); Log.outDebug(LogFilter.Lfg, "CMSG_DF_JOIN {0} no dungeons selected", GetPlayerInfo());
return; return;
} }
List<uint> newDungeons = new List<uint>(); List<uint> newDungeons = new List<uint>();
for (int i = 0; i < dfJoin.Slots.Count; ++i) foreach (uint slot in dfJoin.Slots)
{ {
uint dungeon = dfJoin.Slots[i]; uint dungeon = slot & 0x00FFFFFF;
if (dungeon != 0) if (CliDB.LfgDungeonsStorage.ContainsKey(dungeon))
newDungeons.Add(dungeon); newDungeons.Add(dungeon);
} }
Log.outDebug(LogFilter.Lfg, "CMSG_DF_JOIN {0} roles: {1}, Dungeons: {2}", GetPlayerInfo(), dfJoin.Roles, newDungeons.Count);
Global.LFGMgr.JoinLfg(GetPlayer(), dfJoin.Roles, newDungeons); Global.LFGMgr.JoinLfg(GetPlayer(), dfJoin.Roles, newDungeons);
} }
[WorldPacketHandler(ClientOpcodes.DfLeave)] [WorldPacketHandler(ClientOpcodes.DfLeave)]
void HandleDfLeave(DFLeave dfLeave) void HandleLfgLeave(DFLeave dfLeave)
{ {
ObjectGuid leaveGuid = dfLeave.Ticket.RequesterGuid;
Group group = GetPlayer().GetGroup(); Group group = GetPlayer().GetGroup();
ObjectGuid guid = GetPlayer().GetGUID();
ObjectGuid gguid = group ? group.GetGUID() : guid; Log.outDebug(LogFilter.Lfg, "CMSG_DF_LEAVE {0} in group: {1} sent guid {2}.", GetPlayerInfo(), group ? 1 : 0, dfLeave.Ticket.RequesterGuid.ToString());
// Check cheating - only leader can leave the queue // Check cheating - only leader can leave the queue
if (!group || group.GetLeaderGUID() == leaveGuid) if (!group || group.GetLeaderGUID() == dfLeave.Ticket.RequesterGuid)
Global.LFGMgr.LeaveLfg(gguid); Global.LFGMgr.LeaveLfg(dfLeave.Ticket.RequesterGuid);
} }
[WorldPacketHandler(ClientOpcodes.DfProposalResponse)] [WorldPacketHandler(ClientOpcodes.DfProposalResponse)]
void HandleDfProposalResponse(DFProposalResponse dfProposalResponse) void HandleLfgProposalResult(DFProposalResponse dfProposalResponse)
{ {
Global.LFGMgr.UpdateProposal(dfProposalResponse.ProposalID, dfProposalResponse.Ticket.RequesterGuid, dfProposalResponse.Accepted); Log.outDebug(LogFilter.Lfg, "CMSG_LFG_PROPOSAL_RESULT {0} proposal: {1} accept: {2}", GetPlayerInfo(), dfProposalResponse.ProposalID, dfProposalResponse.Accepted ? 1 : 0);
Global.LFGMgr.UpdateProposal(dfProposalResponse.ProposalID, GetPlayer().GetGUID(), dfProposalResponse.Accepted);
} }
[WorldPacketHandler(ClientOpcodes.DfSetRoles)] [WorldPacketHandler(ClientOpcodes.DfSetRoles)]
void HandleDfSetRoles(DFSetRoles setRoles) void HandleLfgSetRoles(DFSetRoles dfSetRoles)
{ {
ObjectGuid guid = GetPlayer().GetGUID(); ObjectGuid guid = GetPlayer().GetGUID();
Group group = GetPlayer().GetGroup(); Group group = GetPlayer().GetGroup();
if (!group) if (!group)
{ {
Log.outDebug(LogFilter.Lfg, "CMSG_LFG_SET_ROLES {0} Not in group", Log.outDebug(LogFilter.Lfg, "CMSG_DF_SET_ROLES {0} Not in group",
GetPlayerInfo()); GetPlayerInfo());
return; return;
} }
ObjectGuid gguid = group.GetGUID(); ObjectGuid gguid = group.GetGUID();
Log.outDebug(LogFilter.Lfg, "CMSG_LFG_SET_ROLES: Group {0}, Player {1}, Roles: {2}", gguid.ToString(), GetPlayerInfo(), setRoles.RolesDesired); Log.outDebug(LogFilter.Lfg, "CMSG_DF_SET_ROLES: Group {0}, Player {1}, Roles: {2}", gguid.ToString(), GetPlayerInfo(), dfSetRoles.RolesDesired);
Global.LFGMgr.UpdateRoleCheck(gguid, guid, setRoles.RolesDesired); Global.LFGMgr.UpdateRoleCheck(gguid, guid, dfSetRoles.RolesDesired);
} }
[WorldPacketHandler(ClientOpcodes.DfBootPlayerVote)] [WorldPacketHandler(ClientOpcodes.DfBootPlayerVote)]
void HandleDfBootPlayerVote(DFBootPlayerVote bootPlayerVote) void HandleLfgSetBootVote(DFBootPlayerVote dfBootPlayerVote)
{ {
ObjectGuid guid = GetPlayer().GetGUID(); ObjectGuid guid = GetPlayer().GetGUID();
Log.outDebug(LogFilter.Lfg, "ClientOpcodes.DfBootPlayerVote: {0} agree: {1}", GetPlayerInfo(), bootPlayerVote.Vote); Log.outDebug(LogFilter.Lfg, "CMSG_LFG_SET_BOOT_VOTE {0} agree: {1}", GetPlayerInfo(), dfBootPlayerVote.Vote ? 1 : 0);
Global.LFGMgr.UpdateBoot(guid, bootPlayerVote.Vote); Global.LFGMgr.UpdateBoot(guid, dfBootPlayerVote.Vote);
} }
[WorldPacketHandler(ClientOpcodes.DfTeleport)] [WorldPacketHandler(ClientOpcodes.DfTeleport)]
void HandleDfTeleport(DFTeleport teleport) void HandleLfgTeleport(DFTeleport dfTeleport)
{ {
Log.outDebug(LogFilter.Lfg, "CMSG_LFG_TELEPORT {0} out: {1}", GetPlayerInfo(), teleport.TeleportOut); Log.outDebug(LogFilter.Lfg, "CMSG_DF_TELEPORT {0} out: {1}", GetPlayerInfo(), dfTeleport.TeleportOut ? 1 : 0);
Global.LFGMgr.TeleportPlayer(GetPlayer(), teleport.TeleportOut, true); Global.LFGMgr.TeleportPlayer(GetPlayer(), dfTeleport.TeleportOut, true);
} }
//[WorldPacketHandler(ClientOpcodes.DfGetSystemInfo, Processing = PacketProcessing.ThreadSafe)] [WorldPacketHandler(ClientOpcodes.DfGetSystemInfo, Processing = PacketProcessing.ThreadSafe)]
void HandleDfGetSystemInfo(DFGetSystemInfo dfGetSystemInfo) void HandleDfGetSystemInfo(DFGetSystemInfo dfGetSystemInfo)
{ {
Log.outDebug(LogFilter.Lfg, "CMSG_LFG_Lock_INFO_REQUEST {0} for {1}", GetPlayerInfo(), (dfGetSystemInfo.Player ? "player" : "party")); Log.outDebug(LogFilter.Lfg, "CMSG_LFG_Lock_INFO_REQUEST {0} for {1}", GetPlayerInfo(), (dfGetSystemInfo.Player ? "player" : "party"));
@@ -175,56 +142,67 @@ namespace Game
public void SendLfgPlayerLockInfo() public void SendLfgPlayerLockInfo()
{ {
ObjectGuid guid = GetPlayer().GetGUID();
// Get Random dungeons that can be done at a certain level and expansion // Get Random dungeons that can be done at a certain level and expansion
uint level = GetPlayer().getLevel(); uint level = GetPlayer().getLevel();
List<uint> randomDungeons = Global.LFGMgr.GetRandomAndSeasonalDungeons(level, (uint)GetExpansion()); List<uint> randomDungeons = Global.LFGMgr.GetRandomAndSeasonalDungeons(level, (uint)GetExpansion());
// Get player Locked Dungeons
Dictionary<uint, LfgLockInfoData> Lock = Global.LFGMgr.GetLockedDungeons(guid);
uint rsize = (uint)randomDungeons.Count;
uint lsize = (uint)Lock.Count;
LfgPlayerInfo lfgPlayerInfo = new LfgPlayerInfo(); LfgPlayerInfo lfgPlayerInfo = new LfgPlayerInfo();
lfgPlayerInfo.BlackList = new LFGBlackList(Lock);
// Get player locked Dungeons
foreach (var locked in Global.LFGMgr.GetLockedDungeons(_player.GetGUID()))
lfgPlayerInfo.BlackList.Slot.Add(new LFGBlackListSlot(locked.Key, (uint)locked.Value.lockStatus, locked.Value.requiredItemLevel, (int)locked.Value.currentItemLevel));
foreach (var slot in randomDungeons) foreach (var slot in randomDungeons)
{ {
var dungeonInfo = new LfgPlayerDungeonInfo(); var playerDungeonInfo = new LfgPlayerDungeonInfo();
dungeonInfo.Slot = slot; playerDungeonInfo.Slot = slot;
dungeonInfo.FirstReward = true; playerDungeonInfo.CompletionQuantity = 1;
playerDungeonInfo.CompletionLimit = 1;
playerDungeonInfo.CompletionCurrencyID = 0;
playerDungeonInfo.SpecificQuantity = 0;
playerDungeonInfo.SpecificLimit = 1;
playerDungeonInfo.OverallQuantity = 0;
playerDungeonInfo.OverallLimit = 1;
playerDungeonInfo.PurseWeeklyQuantity = 0;
playerDungeonInfo.PurseWeeklyLimit = 0;
playerDungeonInfo.PurseQuantity = 0;
playerDungeonInfo.PurseLimit = 0;
playerDungeonInfo.Quantity = 1;
playerDungeonInfo.CompletedMask = 0;
playerDungeonInfo.EncounterMask = 0;
LfgReward reward = Global.LFGMgr.GetRandomDungeonReward(slot, level); LfgReward reward = Global.LFGMgr.GetRandomDungeonReward(slot, level);
Quest quest = null;
bool done = false;
if (reward != null) if (reward != null)
{ {
quest = Global.ObjectMgr.GetQuestTemplate(reward.firstQuest); Quest quest = Global.ObjectMgr.GetQuestTemplate(reward.firstQuest);
if (quest != null) if (quest != null)
{ {
done = !GetPlayer().CanRewardQuest(quest, false); playerDungeonInfo.FirstReward = !GetPlayer().CanRewardQuest(quest, false);
if (done) if (!playerDungeonInfo.FirstReward)
{
quest = Global.ObjectMgr.GetQuestTemplate(reward.otherQuest); quest = Global.ObjectMgr.GetQuestTemplate(reward.otherQuest);
dungeonInfo.FirstReward = false;
if (quest != null)
{
playerDungeonInfo.Rewards.RewardMoney = _player.GetQuestMoneyReward(quest);
playerDungeonInfo.Rewards.RewardXP = _player.GetQuestXPReward(quest);
for (byte i = 0; i < SharedConst.QuestRewardItemCount; ++i)
{
uint itemId = quest.RewardItemId[i];
if (itemId != 0)
playerDungeonInfo.Rewards.Item.Add(new LfgPlayerQuestRewardItem(itemId, quest.RewardItemCount[i]));
}
for (byte i = 0; i < SharedConst.QuestRewardCurrencyCount; ++i)
{
uint curencyId = quest.RewardCurrencyId[i];
if (curencyId != 0)
playerDungeonInfo.Rewards.Currency.Add(new LfgPlayerQuestRewardCurrency(curencyId, quest.RewardCurrencyCount[i]));
}
} }
} }
} }
if (quest != null) lfgPlayerInfo.Dungeons.Add(playerDungeonInfo);
{
dungeonInfo.ShortageEligible = true;
dungeonInfo.CompletionQuantity = 1;
dungeonInfo.CompletionLimit = 1;
dungeonInfo.SpecificLimit = 1;
dungeonInfo.OverallLimit = 1;
dungeonInfo.Quantity = 1;
BuildQuestReward(dungeonInfo.Rewards, quest, GetPlayer());
}
lfgPlayerInfo.Dungeons.Add(dungeonInfo);
} }
SendPacket(lfgPlayerInfo); SendPacket(lfgPlayerInfo);
@@ -237,8 +215,9 @@ namespace Game
if (!group) if (!group)
return; return;
LfgPartyInfo lfgPartyInfo = new LfgPartyInfo();
// Get the Locked dungeons of the other party members // Get the Locked dungeons of the other party members
Dictionary<ObjectGuid, Dictionary<uint, LfgLockInfoData>> LockMap = new Dictionary<ObjectGuid, Dictionary<uint, LfgLockInfoData>>();
for (GroupReference refe = group.GetFirstMember(); refe != null; refe = refe.next()) for (GroupReference refe = group.GetFirstMember(); refe != null; refe = refe.next())
{ {
Player plrg = refe.GetSource(); Player plrg = refe.GetSource();
@@ -249,62 +228,65 @@ namespace Game
if (pguid == guid) if (pguid == guid)
continue; continue;
LockMap[pguid] = Global.LFGMgr.GetLockedDungeons(pguid); LFGBlackList lfgBlackList = new LFGBlackList();
lfgBlackList.PlayerGuid.Set(pguid);
foreach (var locked in Global.LFGMgr.GetLockedDungeons(pguid))
lfgBlackList.Slot.Add(new LFGBlackListSlot(locked.Key, (uint)locked.Value.lockStatus, locked.Value.requiredItemLevel, (int)locked.Value.currentItemLevel));
lfgPartyInfo.Player.Add(lfgBlackList);
} }
Log.outDebug(LogFilter.Lfg, "SMSG_LFG_PARTY_INFO {0}", GetPlayerInfo()); Log.outDebug(LogFilter.Lfg, "SMSG_LFG_PARTY_INFO {0}", GetPlayerInfo());
SendPacket(lfgPartyInfo);
LfgPartyInfo partyInfo = new LfgPartyInfo();
foreach (var it in LockMap)
{
var blackList = new LFGBlackList(it.Value);
blackList.PlayerGuid.Set(it.Key);
partyInfo.Players.Add(blackList);
}
SendPacket(partyInfo);
} }
public void SendLfgUpdateStatus(LfgUpdateData updateData, bool party) public void SendLfgUpdateStatus(LfgUpdateData updateData, bool party)
{ {
ObjectGuid guid = GetPlayer().GetGUID(); bool join = false;
bool queued = false;
LFGUpdateStatus updateStatus = new LFGUpdateStatus();
updateStatus.Ticket.RequesterGuid = guid;
updateStatus.Ticket.Id = Global.LFGMgr.GetQueueId(guid);
updateStatus.Ticket.Type = (byte)updateData.state;
updateStatus.Ticket.Time = (uint)Global.LFGMgr.GetQueueJoinTime(guid);
updateStatus.SubType = (byte)(updateData.dungeons.Count > 0 ? Global.LFGMgr.GetDungeonType(updateData.dungeons[0]) : 0);
updateStatus.Reason = (byte)updateData.updateType;
updateStatus.Slots = updateData.dungeons;
updateStatus.RequestedRoles = (uint)Global.LFGMgr.GetRoles(guid);
updateStatus.IsParty = party;
switch (updateData.updateType) switch (updateData.updateType)
{ {
case LfgUpdateType.JoinQueueInitial: // Joined queue outside the dungeon case LfgUpdateType.JoinQueueInitial: // Joined queue outside the dungeon
updateStatus.Joined = updateStatus.LfgJoined = true; join = true;
break; break;
case LfgUpdateType.JoinQueue: case LfgUpdateType.JoinQueue:
case LfgUpdateType.AddedToQueue: // Rolecheck Success case LfgUpdateType.AddedToQueue: // Rolecheck Success
updateStatus.Joined = updateStatus.LfgJoined = true; join = true;
updateStatus.Queued = true; queued = true;
break; break;
case LfgUpdateType.ProposalBegin: case LfgUpdateType.ProposalBegin:
updateStatus.Joined = updateStatus.LfgJoined = true; join = true;
break; break;
case LfgUpdateType.UpdateStatus: case LfgUpdateType.UpdateStatus:
updateStatus.Joined = updateStatus.LfgJoined = updateData.state != LfgState.Rolecheck && updateData.state != LfgState.None; join = updateData.state != LfgState.Rolecheck && updateData.state != LfgState.None;
updateStatus.Queued = updateData.state == LfgState.Queued; queued = updateData.state == LfgState.Queued;
break; break;
default: default:
break; break;
} }
SendPacket(updateStatus); LFGUpdateStatus lfgUpdateStatus = new LFGUpdateStatus();
RideTicket ticket = Global.LFGMgr.GetTicket(_player.GetGUID());
if (ticket != null)
lfgUpdateStatus.Ticket = ticket;
lfgUpdateStatus.SubType = (byte)LfgQueueType.Dungeon; // other types not implemented
lfgUpdateStatus.Reason = (byte)updateData.updateType;
foreach (var dungeonId in updateData.dungeons)
lfgUpdateStatus.Slots.Add(Global.LFGMgr.GetLFGDungeonEntry(dungeonId));
lfgUpdateStatus.RequestedRoles = (uint)Global.LFGMgr.GetRoles(_player.GetGUID());
//lfgUpdateStatus.SuspendedPlayers;
lfgUpdateStatus.IsParty = party;
lfgUpdateStatus.NotifyUI = true;
lfgUpdateStatus.Joined = join;
lfgUpdateStatus.LfgJoined = updateData.updateType != LfgUpdateType.RemovedFromQueue;
lfgUpdateStatus.Queued = queued;
SendPacket(lfgUpdateStatus);
} }
public void SendLfgRoleChosen(ObjectGuid guid, LfgRoles roles) public void SendLfgRoleChosen(ObjectGuid guid, LfgRoles roles)
@@ -326,71 +308,62 @@ namespace Game
Log.outDebug(LogFilter.Lfg, "SMSG_LFG_ROLE_CHECK_UPDATE {0}", GetPlayerInfo()); Log.outDebug(LogFilter.Lfg, "SMSG_LFG_ROLE_CHECK_UPDATE {0}", GetPlayerInfo());
LFGRoleCheckUpdate roleCheckUpdate = new LFGRoleCheckUpdate(); LFGRoleCheckUpdate lfgRoleCheckUpdate = new LFGRoleCheckUpdate();
roleCheckUpdate.PartyIndex = (byte)roleCheck.rDungeonId; //Wrong lfgRoleCheckUpdate.PartyIndex = 127;
roleCheckUpdate.RoleCheckStatus = (byte)roleCheck.state; lfgRoleCheckUpdate.RoleCheckStatus = (byte)roleCheck.state;
roleCheckUpdate.IsBeginning = roleCheck.state == LfgRoleCheckState.Initialiting; lfgRoleCheckUpdate.IsBeginning = roleCheck.state == LfgRoleCheckState.Initialiting;
if (!dungeons.Empty()) foreach (var dungeonId in dungeons)
foreach (var it in dungeons) lfgRoleCheckUpdate.JoinSlots.Add(Global.LFGMgr.GetLFGDungeonEntry(dungeonId));
roleCheckUpdate.JoinSlots.Add(Global.LFGMgr.GetLFGDungeonEntry(it)); // Dungeon
lfgRoleCheckUpdate.BgQueueID = 0;
lfgRoleCheckUpdate.GroupFinderActivityID = 0;
if (!roleCheck.roles.Empty()) if (!roleCheck.roles.Empty())
{ {
// Leader info MUST be sent 1st :S // Leader info MUST be sent 1st :S
ObjectGuid guid = roleCheck.leader; byte roles = (byte)roleCheck.roles.Find(roleCheck.leader).Value;
LfgRoles roles = roleCheck.roles.LookupByKey(guid); lfgRoleCheckUpdate.Members.Add(new LFGRoleCheckUpdateMember(roleCheck.leader, roles, Global.WorldMgr.GetCharacterInfo(roleCheck.leader).Level, roles > 0));
Player player = Global.ObjAccessor.FindPlayer(guid);
var roleCheckUpdateMember = new LFGRoleCheckUpdate.LFGRoleCheckUpdateMember();
roleCheckUpdateMember.Guid = guid;
roleCheckUpdateMember.RolesDesired = (uint)roles;
roleCheckUpdateMember.Level = (byte)(player ? player.getLevel() : 0);
roleCheckUpdateMember.RoleCheckComplete = roles > 0;
roleCheckUpdate.Members.Add(roleCheckUpdateMember);
foreach (var it in roleCheck.roles) foreach (var it in roleCheck.roles)
{ {
if (it.Key == roleCheck.leader) if (it.Key == roleCheck.leader)
continue; continue;
roleCheckUpdateMember = new LFGRoleCheckUpdate.LFGRoleCheckUpdateMember(); roles = (byte)it.Value;
lfgRoleCheckUpdate.Members.Add(new LFGRoleCheckUpdateMember(it.Key, roles, Global.WorldMgr.GetCharacterInfo(it.Key).Level, roles > 0));
guid = it.Key;
roles = it.Value;
player = Global.ObjAccessor.FindPlayer(guid);
roleCheckUpdateMember.Guid = guid;
roleCheckUpdateMember.RolesDesired = (uint)roles;
roleCheckUpdateMember.Level = (byte)(player ? player.getLevel() : 0);
roleCheckUpdateMember.RoleCheckComplete = roles > 0;
roleCheckUpdate.Members.Add(roleCheckUpdateMember);
} }
} }
SendPacket(roleCheckUpdate); SendPacket(lfgRoleCheckUpdate);
} }
public void SendLfgJoinResult(LfgJoinResultData joinData) public void SendLfgJoinResult(LfgJoinResultData joinData)
{ {
ObjectGuid guid = GetPlayer().GetGUID(); LFGJoinResult lfgJoinResult = new LFGJoinResult();
LFGJoinResult joinResult = new LFGJoinResult(); RideTicket ticket = Global.LFGMgr.GetTicket(GetPlayer().GetGUID());
joinResult.Ticket = new RideTicket(guid, Global.LFGMgr.GetQueueId(guid), (int)Global.LFGMgr.GetState(guid), (uint)Time.UnixTime); if (ticket != null)
lfgJoinResult.Ticket = ticket;
lfgJoinResult.Result = (byte)joinData.result;
if (joinData.result == LfgJoinResult.RoleCheckFailed)
lfgJoinResult.ResultDetail = (byte)joinData.state;
joinResult.Result = (byte)joinData.result;
joinResult.ResultDetail= (byte)joinData.state;
foreach (var it in joinData.lockmap) foreach (var it in joinData.lockmap)
{ {
var blackList = new LFGBlackList(it.Value); var blackList = new LFGJoinBlackList();
blackList.PlayerGuid.Set(it.Key); blackList.PlayerGuid = it.Key;
joinResult.BlackList.Add(blackList);
foreach (var lockInfo in it.Value)
{
Log.outTrace(LogFilter.Lfg, "SendLfgJoinResult:: {0} DungeonID: {1} Lock status: {2} Required itemLevel: {3} Current itemLevel: {4}",
it.Key.ToString(), (lockInfo.Key & 0x00FFFFFF), lockInfo.Value.lockStatus, lockInfo.Value.requiredItemLevel, lockInfo.Value.currentItemLevel);
blackList.Slots.Add(new LFGJoinBlackListSlot((int)lockInfo.Key, (int)lockInfo.Value.lockStatus, lockInfo.Value.requiredItemLevel, (int)lockInfo.Value.currentItemLevel));
}
} }
SendPacket(joinResult); SendPacket(lfgJoinResult);
} }
public void SendLfgQueueStatus(LfgQueueStatusData queueData) public void SendLfgQueueStatus(LfgQueueStatusData queueData)
@@ -400,22 +373,23 @@ namespace Game
GetPlayerInfo(), Global.LFGMgr.GetState(GetPlayer().GetGUID()), queueData.dungeonId, queueData.waitTime, queueData.waitTimeAvg, GetPlayerInfo(), Global.LFGMgr.GetState(GetPlayer().GetGUID()), queueData.dungeonId, queueData.waitTime, queueData.waitTimeAvg,
queueData.waitTimeTank, queueData.waitTimeHealer, queueData.waitTimeDps, queueData.queuedTime, queueData.tanks, queueData.healers, queueData.dps); queueData.waitTimeTank, queueData.waitTimeHealer, queueData.waitTimeDps, queueData.queuedTime, queueData.tanks, queueData.healers, queueData.dps);
LFGQueueStatus queueStatus = new LFGQueueStatus(); LFGQueueStatus lfgQueueStatus = new LFGQueueStatus();
queueStatus.Ticket = new RideTicket(GetPlayer().GetGUID(), queueData.dungeonId, 3, (uint)queueData.joinTime);
queueStatus.Slot = queueData.queueId;
queueStatus.AvgWaitTime = (uint)queueData.waitTimeAvg;
queueStatus.QueuedTime = queueData.queuedTime;
RideTicket ticket = Global.LFGMgr.GetTicket(GetPlayer().GetGUID());
if (ticket != null)
lfgQueueStatus.Ticket = ticket;
lfgQueueStatus.Slot = queueData.queueId;
lfgQueueStatus.AvgWaitTimeMe = (uint)queueData.waitTime;
lfgQueueStatus.AvgWaitTime = (uint)queueData.waitTimeAvg;
lfgQueueStatus.AvgWaitTimeByRole[0] = (uint)queueData.waitTimeTank;
lfgQueueStatus.AvgWaitTimeByRole[1] = (uint)queueData.waitTimeHealer;
lfgQueueStatus.AvgWaitTimeByRole[2] = (uint)queueData.waitTimeDps;
lfgQueueStatus.LastNeeded[0] = queueData.tanks;
lfgQueueStatus.LastNeeded[1] = queueData.healers;
lfgQueueStatus.LastNeeded[2] = queueData.dps;
lfgQueueStatus.QueuedTime = queueData.queuedTime;
queueStatus.LastNeeded[0] = queueData.tanks; SendPacket(lfgQueueStatus);
queueStatus.AvgWaitTimeByRole[0] = (uint)queueData.waitTimeTank;
queueStatus.LastNeeded[1] = queueData.healers;
queueStatus.AvgWaitTimeByRole[1] = (uint)queueData.waitTimeHealer;
queueStatus.LastNeeded[2] = queueData.dps;
queueStatus.AvgWaitTimeByRole[2] = (uint)queueData.waitTimeDps;
queueStatus.AvgWaitTimeMe = (uint)queueData.waitTime;
SendPacket(queueStatus);
} }
public void SendLfgPlayerReward(LfgPlayerRewardData rewardData) public void SendLfgPlayerReward(LfgPlayerRewardData rewardData)
@@ -426,49 +400,32 @@ namespace Game
Log.outDebug(LogFilter.Lfg, "SMSG_LFG_PLAYER_REWARD {0} rdungeonEntry: {1}, sdungeonEntry: {2}, done: {3}", Log.outDebug(LogFilter.Lfg, "SMSG_LFG_PLAYER_REWARD {0} rdungeonEntry: {1}, sdungeonEntry: {2}, done: {3}",
GetPlayerInfo(), rewardData.rdungeonEntry, rewardData.sdungeonEntry, rewardData.done); GetPlayerInfo(), rewardData.rdungeonEntry, rewardData.sdungeonEntry, rewardData.done);
byte itemNum = (byte)(rewardData.quest.GetRewItemsCount() + rewardData.quest.GetRewCurrencyCount()); LFGPlayerReward lfgPlayerReward = new LFGPlayerReward();
lfgPlayerReward.QueuedSlot = rewardData.rdungeonEntry;
LFGPlayerReward playerReward = new LFGPlayerReward(); lfgPlayerReward.ActualSlot = rewardData.sdungeonEntry;
playerReward.ActualSlot = rewardData.rdungeonEntry; // Random Dungeon Finished lfgPlayerReward.RewardMoney = GetPlayer().GetQuestMoneyReward(rewardData.quest);
playerReward.QueuedSlot = rewardData.sdungeonEntry; // Dungeon Finished lfgPlayerReward.AddedXP = GetPlayer().GetQuestXPReward(rewardData.quest);
playerReward.RewardMoney = GetPlayer().GetQuestMoneyReward(rewardData.quest);
playerReward.AddedXP = GetPlayer().GetQuestXPReward(rewardData.quest);
for (byte i = 0; i < SharedConst.QuestRewardCurrencyCount; ++i)
{
var playerRewards = new LFGPlayerReward.LFGPlayerRewards();
uint currencyId = rewardData.quest.RewardCurrencyId[i];
if (currencyId != 0)
{
playerRewards.RewardItem = currencyId;
playerRewards.RewardItemQuantity = rewardData.quest.RewardCurrencyCount[i];
playerRewards.IsCurrency = true;
playerReward.Rewards.Add(playerRewards);
}
}
for (byte i = 0; i < SharedConst.QuestRewardItemCount; ++i) for (byte i = 0; i < SharedConst.QuestRewardItemCount; ++i)
{ {
var playerRewards = new LFGPlayerReward.LFGPlayerRewards();
uint itemId = rewardData.quest.RewardItemId[i]; uint itemId = rewardData.quest.RewardItemId[i];
if (itemId != 0) if (itemId != 0)
{ lfgPlayerReward.Rewards.Add(new LFGPlayerRewards(itemId, rewardData.quest.RewardItemCount[i], 0, false));
ItemTemplate item = Global.ObjectMgr.GetItemTemplate(itemId);
playerRewards.RewardItem = itemId;
playerRewards.RewardItemQuantity = rewardData.quest.RewardItemCount[i];
playerRewards.IsCurrency = false;
playerReward.Rewards.Add(playerRewards);
}
} }
SendPacket(playerReward); for (byte i = 0; i < SharedConst.QuestRewardCurrencyCount; ++i)
{
uint currencyId = rewardData.quest.RewardCurrencyId[i];
if (currencyId != 0)
lfgPlayerReward.Rewards.Add(new LFGPlayerRewards(currencyId, rewardData.quest.RewardCurrencyCount[i], 0, true));
}
SendPacket(lfgPlayerReward);
} }
public void SendLfgBootProposalUpdate(LfgPlayerBoot boot) public void SendLfgBootProposalUpdate(LfgPlayerBoot boot)
{ {
ObjectGuid guid = GetPlayer().GetGUID(); LfgAnswer playerVote = boot.votes.LookupByKey(GetPlayer().GetGUID());
LfgAnswer playerVote = boot.votes.LookupByKey(guid);
byte votesNum = 0; byte votesNum = 0;
byte agreeNum = 0; byte agreeNum = 0;
uint secsleft = (uint)((boot.cancelTime - Time.UnixTime) / 1000); uint secsleft = (uint)((boot.cancelTime - Time.UnixTime) / 1000);
@@ -515,42 +472,34 @@ namespace Game
dungeonEntry = playerDungeons.First(); dungeonEntry = playerDungeons.First();
} }
dungeonEntry = Global.LFGMgr.GetLFGDungeonEntry(dungeonEntry); LFGProposalUpdate lfgProposalUpdate = new LFGProposalUpdate();
LFGProposalUpdate proposalUpdate = new LFGProposalUpdate(); RideTicket ticket = Global.LFGMgr.GetTicket(GetPlayer().GetGUID());
proposalUpdate.Ticket = new RideTicket(playerGuid, Global.LFGMgr.GetQueueId(playerGuid), 3, (uint)Global.LFGMgr.GetQueueJoinTime(playerGuid)); if (ticket != null)
lfgProposalUpdate.Ticket = ticket;
proposalUpdate.InstanceID = dungeonEntry; lfgProposalUpdate.InstanceID = 0;
proposalUpdate.ProposalID = proposal.id; lfgProposalUpdate.ProposalID = proposal.id;
proposalUpdate.Slot = proposal.dungeonId; lfgProposalUpdate.Slot = Global.LFGMgr.GetLFGDungeonEntry(dungeonEntry);
proposalUpdate.State = (byte)proposal.state; lfgProposalUpdate.State = (byte)proposal.state;
proposalUpdate.CompletedMask = proposal.encounters; lfgProposalUpdate.CompletedMask = proposal.encounters;
lfgProposalUpdate.ValidCompletedMask = true;
proposalUpdate.ValidCompletedMask = false; lfgProposalUpdate.ProposalSilent = silent;
proposalUpdate.ProposalSilent = silent; lfgProposalUpdate.IsRequeue = !proposal.isNew;
foreach (var pair in proposal.players) foreach (var pair in proposal.players)
{ {
var updatePlayer = new LFGProposalUpdate.LFGProposalUpdatePlayer(); var proposalPlayer = new LFGProposalUpdatePlayer();
updatePlayer.Roles = (uint)pair.Value.role; proposalPlayer.Roles = (uint)pair.Value.role;
updatePlayer.Me = (pair.Key == playerGuid); proposalPlayer.Me = (pair.Key == playerGuid);
updatePlayer.SameParty = (pair.Value.group == guildGuid); proposalPlayer.MyParty = !pair.Value.group.IsEmpty() && pair.Value.group == proposal.group;
updatePlayer.MyParty = (pair.Value.group == proposal.group); proposalPlayer.SameParty = !pair.Value.group.IsEmpty() && pair.Value.group == guildGuid;
updatePlayer.Responded = (pair.Value.accept != LfgAnswer.Pending); proposalPlayer.Responded = (pair.Value.accept != LfgAnswer.Pending);
updatePlayer.Accepted = (pair.Value.accept == LfgAnswer.Agree); proposalPlayer.Accepted = (pair.Value.accept == LfgAnswer.Agree);
proposalUpdate.Players.Add(updatePlayer); lfgProposalUpdate.Players.Add(proposalPlayer);
} }
SendPacket(proposalUpdate); SendPacket(lfgProposalUpdate);
}
public void SendLfgLfrList(bool update)
{
/* WorldPacket data = new WorldPacket(ServerOpcodes.LfgUpdateSearch);
data.WriteUInt8(update); // In Lfg Queue?
SendPacket(data);
*/
} }
public void SendLfgDisabled() public void SendLfgDisabled()
@@ -561,17 +510,13 @@ namespace Game
public void SendLfgOfferContinue(uint dungeonEntry) public void SendLfgOfferContinue(uint dungeonEntry)
{ {
Log.outDebug(LogFilter.Lfg, "SMSG_LFG_OFFER_CONTINUE {0} dungeon entry: {1}", GetPlayerInfo(), dungeonEntry); Log.outDebug(LogFilter.Lfg, "SMSG_LFG_OFFER_CONTINUE {0} dungeon entry: {1}", GetPlayerInfo(), dungeonEntry);
LfgOfferContinue lfgOfferContinue = new LfgOfferContinue(); SendPacket(new LfgOfferContinue(Global.LFGMgr.GetLFGDungeonEntry(dungeonEntry)));
lfgOfferContinue.Slot = dungeonEntry;
SendPacket(lfgOfferContinue);
} }
public void SendLfgTeleportError(LfgTeleportResult err) public void SendLfgTeleportError(LfgTeleportResult err)
{ {
Log.outDebug(LogFilter.Lfg, "SMSG_LFG_TELEPORT_DENIED {0} reason: {1}", GetPlayerInfo(), err); Log.outDebug(LogFilter.Lfg, "SMSG_LFG_TELEPORT_DENIED {0} reason: {1}", GetPlayerInfo(), err);
LfgTeleportDenied lfgTeleportDenied = new LfgTeleportDenied(); SendPacket(new LfgTeleportDenied(err));
lfgTeleportDenied.Reason = err;
SendPacket(lfgTeleportDenied);
} }
} }
} }
File diff suppressed because it is too large Load Diff