diff options
Diffstat (limited to 'src')
71 files changed, 3055 insertions, 1500 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 5a60291ab4c..ec37d8c29e2 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1164,6 +1164,14 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u me->GetMotionMaster()->MovePoint(SMART_RANDOM_POINT, x, y, z); break; } + case SMART_ACTION_RISE_UP: + { + if (!me) + break; + + me->GetMotionMaster()->MovePoint(SMART_RANDOM_POINT, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + (float)e.action.moveRandom.distance); + break; + } case SMART_ACTION_SET_VISIBILITY: { if (me) @@ -3298,10 +3306,6 @@ void SmartScript::InitTimer(SmartScriptHolder& e) case SMART_EVENT_UPDATE_OOC: RecalcTimer(e, e.event.minMaxRepeat.min, e.event.minMaxRepeat.max); break; - case SMART_EVENT_IC_LOS: - case SMART_EVENT_OOC_LOS: - RecalcTimer(e, e.event.los.cooldownMin, e.event.los.cooldownMax); - break; case SMART_EVENT_DISTANCE_CREATURE: case SMART_EVENT_DISTANCE_GAMEOBJECT: RecalcTimer(e, e.event.distance.repeat, e.event.distance.repeat); diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index c86255f6d4a..831b231ff5f 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -1235,6 +1235,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_ACTION_ADD_GO_FLAG: case SMART_ACTION_REMOVE_GO_FLAG: case SMART_ACTION_SUMMON_CREATURE_GROUP: + case SMART_ACTION_RISE_UP: break; default: TC_LOG_ERROR("sql.sql", "SmartAIMgr: Not handled action_type(%u), event_type(%u), Entry " SI64FMTD " SourceType %u Event %u, skipped.", e.GetActionType(), e.GetEventType(), e.entryOrGuid, e.GetScriptType(), e.event_id); diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index 66829db812f..b33077be9dd 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -540,8 +540,9 @@ enum SMART_ACTION SMART_ACTION_GAME_EVENT_STOP = 111, // GameEventId SMART_ACTION_GAME_EVENT_START = 112, // GameEventId SMART_ACTION_START_CLOSEST_WAYPOINT = 113, // wp1, wp2, wp3, wp4, wp5, wp6, wp7 + SMART_ACTION_RISE_UP = 114, // distance - SMART_ACTION_END = 114 + SMART_ACTION_END = 115 }; struct SmartAction diff --git a/src/server/game/Calendar/CalendarMgr.cpp b/src/server/game/Calendar/CalendarMgr.cpp index 82c8ced3801..e31b9739654 100644 --- a/src/server/game/Calendar/CalendarMgr.cpp +++ b/src/server/game/Calendar/CalendarMgr.cpp @@ -22,6 +22,7 @@ #include "GuildMgr.h" #include "ObjectAccessor.h" #include "Opcodes.h" +#include "CalendarPackets.h" CalendarInvite::~CalendarInvite() { @@ -51,30 +52,30 @@ void CalendarMgr::LoadFromDB() _maxEventId = 0; _maxInviteId = 0; - // 0 1 2 3 4 5 6 7 8 - if (QueryResult result = CharacterDatabase.Query("SELECT id, creator, title, description, type, dungeon, eventtime, flags, time2 FROM calendar_events")) + // 0 1 2 3 4 5 6 7 8 + if (QueryResult result = CharacterDatabase.Query("SELECT EventID, Owner, Title, Description, EventType, TextureID, Date, Flags, LockDate FROM calendar_events")) do { Field* fields = result->Fetch(); - uint64 eventId = fields[0].GetUInt64(); - ObjectGuid creatorGUID = ObjectGuid::Create<HighGuid::Player>(fields[1].GetUInt64()); + uint64 eventID = fields[0].GetUInt64(); + ObjectGuid ownerGUID = ObjectGuid::Create<HighGuid::Player>(fields[1].GetUInt64()); std::string title = fields[2].GetString(); std::string description = fields[3].GetString(); CalendarEventType type = CalendarEventType(fields[4].GetUInt8()); - int32 dungeonId = fields[5].GetInt32(); - uint32 eventTime = fields[6].GetUInt32(); + int32 textureID = fields[5].GetInt32(); + uint32 date = fields[6].GetUInt32(); uint32 flags = fields[7].GetUInt32(); - uint32 timezoneTime = fields[8].GetUInt32(); - ObjectGuid::LowType guildId = UI64LIT(0); + uint32 lockDate = fields[8].GetUInt32(); + ObjectGuid::LowType guildID = UI64LIT(0); if (flags & CALENDAR_FLAG_GUILD_EVENT || flags & CALENDAR_FLAG_WITHOUT_INVITES) - guildId = Player::GetGuildIdFromDB(creatorGUID); + guildID = Player::GetGuildIdFromDB(ownerGUID); - CalendarEvent* calendarEvent = new CalendarEvent(eventId, creatorGUID, guildId, type, dungeonId, time_t(eventTime), flags, time_t(timezoneTime), title, description); + CalendarEvent* calendarEvent = new CalendarEvent(eventID, ownerGUID, guildID, type, textureID, time_t(date), flags, title, description, time_t(lockDate)); _events.insert(calendarEvent); - _maxEventId = std::max(_maxEventId, eventId); + _maxEventId = std::max(_maxEventId, eventID); ++count; } @@ -83,8 +84,8 @@ void CalendarMgr::LoadFromDB() TC_LOG_INFO("server.loading", ">> Loaded %u calendar events", count); count = 0; - // 0 1 2 3 4 5 6 7 - if (QueryResult result = CharacterDatabase.Query("SELECT id, event, invitee, sender, status, statustime, rank, text FROM calendar_invites")) + // 0 1 2 3 4 5 6 7 + if (QueryResult result = CharacterDatabase.Query("SELECT InviteID, EventID, Invitee, Sender, Status, ResponseTime, ModerationRank, Note FROM calendar_invites")) do { Field* fields = result->Fetch(); @@ -94,11 +95,11 @@ void CalendarMgr::LoadFromDB() ObjectGuid invitee = ObjectGuid::Create<HighGuid::Player>(fields[2].GetUInt64()); ObjectGuid senderGUID = ObjectGuid::Create<HighGuid::Player>(fields[3].GetUInt64()); CalendarInviteStatus status = CalendarInviteStatus(fields[4].GetUInt8()); - uint32 statusTime = fields[5].GetUInt32(); + uint32 responseTime = fields[5].GetUInt32(); CalendarModerationRank rank = CalendarModerationRank(fields[6].GetUInt8()); - std::string text = fields[7].GetString(); + std::string note = fields[7].GetString(); - CalendarInvite* invite = new CalendarInvite(inviteId, eventId, invitee, senderGUID, time_t(statusTime), status, rank, text); + CalendarInvite* invite = new CalendarInvite(inviteId, eventId, invitee, senderGUID, time_t(responseTime), status, rank, note); _invites[eventId].push_back(invite); _maxInviteId = std::max(_maxInviteId, inviteId); @@ -122,7 +123,7 @@ void CalendarMgr::AddEvent(CalendarEvent* calendarEvent, CalendarSendEventType s { _events.insert(calendarEvent); UpdateEvent(calendarEvent); - SendCalendarEvent(calendarEvent->GetCreatorGUID(), *calendarEvent, sendType); + SendCalendarEvent(calendarEvent->GetOwnerGUID(), *calendarEvent, sendType); } void CalendarMgr::AddInvite(CalendarEvent* calendarEvent, CalendarInvite* invite) @@ -133,10 +134,10 @@ void CalendarMgr::AddInvite(CalendarEvent* calendarEvent, CalendarInvite* invite void CalendarMgr::AddInvite(CalendarEvent* calendarEvent, CalendarInvite* invite, SQLTransaction& trans) { - if (!calendarEvent->IsGuildAnnouncement()) + if (!calendarEvent->IsGuildAnnouncement() && calendarEvent->GetOwnerGUID() != invite->GetInviteeGUID()) SendCalendarEventInvite(*invite); - if (!calendarEvent->IsGuildEvent() || invite->GetInviteeGUID() == calendarEvent->GetCreatorGUID()) + if (!calendarEvent->IsGuildEvent() || invite->GetInviteeGUID() == calendarEvent->GetOwnerGUID()) SendCalendarEventInviteAlert(*calendarEvent, *invite); if (!calendarEvent->IsGuildAnnouncement()) @@ -228,14 +229,14 @@ void CalendarMgr::UpdateEvent(CalendarEvent* calendarEvent) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CALENDAR_EVENT); stmt->setUInt64(0, calendarEvent->GetEventId()); - stmt->setUInt64(1, calendarEvent->GetCreatorGUID().GetCounter()); + stmt->setUInt64(1, calendarEvent->GetOwnerGUID().GetCounter()); stmt->setString(2, calendarEvent->GetTitle()); stmt->setString(3, calendarEvent->GetDescription()); stmt->setUInt8(4, calendarEvent->GetType()); - stmt->setInt32(5, calendarEvent->GetDungeonId()); - stmt->setUInt32(6, uint32(calendarEvent->GetEventTime())); + stmt->setInt32(5, calendarEvent->GetTextureId()); + stmt->setUInt32(6, uint32(calendarEvent->GetDate())); stmt->setUInt32(7, calendarEvent->GetFlags()); - stmt->setUInt32(8, calendarEvent->GetTimeZoneTime()); // correct? + stmt->setUInt32(8, uint32(calendarEvent->GetLockDate())); CharacterDatabase.Execute(stmt); } @@ -253,16 +254,16 @@ void CalendarMgr::UpdateInvite(CalendarInvite* invite, SQLTransaction& trans) stmt->setUInt64(2, invite->GetInviteeGUID().GetCounter()); stmt->setUInt64(3, invite->GetSenderGUID().GetCounter()); stmt->setUInt8(4, invite->GetStatus()); - stmt->setUInt32(5, uint32(invite->GetStatusTime())); + stmt->setUInt32(5, uint32(invite->GetResponseTime())); stmt->setUInt8(6, invite->GetRank()); - stmt->setString(7, invite->GetText()); + stmt->setString(7, invite->GetNote()); CharacterDatabase.ExecuteOrAppend(trans, stmt); } void CalendarMgr::RemoveAllPlayerEventsAndInvites(ObjectGuid guid) { for (CalendarEventStore::const_iterator itr = _events.begin(); itr != _events.end(); ++itr) - if ((*itr)->GetCreatorGUID() == guid) + if ((*itr)->GetOwnerGUID() == guid) RemoveEvent((*itr)->GetEventId(), ObjectGuid::Empty); // don't send mail if removing a character CalendarInviteStore playerInvites = GetPlayerInvites(guid); @@ -273,7 +274,7 @@ void CalendarMgr::RemoveAllPlayerEventsAndInvites(ObjectGuid guid) void CalendarMgr::RemovePlayerGuildEventsAndSignups(ObjectGuid guid, ObjectGuid::LowType guildId) { for (CalendarEventStore::const_iterator itr = _events.begin(); itr != _events.end(); ++itr) - if ((*itr)->GetCreatorGUID() == guid && ((*itr)->IsGuildEvent() || (*itr)->IsGuildAnnouncement())) + if ((*itr)->GetOwnerGUID() == guid && ((*itr)->IsGuildEvent() || (*itr)->IsGuildAnnouncement())) RemoveEvent((*itr)->GetEventId(), guid); CalendarInviteStore playerInvites = GetPlayerInvites(guid); @@ -411,7 +412,7 @@ std::string CalendarEvent::BuildCalendarMailBody() const std::ostringstream strm; // we are supposed to send PackedTime so i used WorldPacket to pack it - data.AppendPackedTime(_eventTime); + data.AppendPackedTime(_date); data >> time; strm << time; return strm.str(); @@ -420,130 +421,123 @@ std::string CalendarEvent::BuildCalendarMailBody() const void CalendarMgr::SendCalendarEventInvite(CalendarInvite const& invite) { CalendarEvent* calendarEvent = GetEvent(invite.GetEventId()); - time_t statusTime = invite.GetStatusTime(); - bool hasStatusTime = statusTime != 946684800; // 01/01/2000 00:00:00 ObjectGuid invitee = invite.GetInviteeGUID(); Player* player = ObjectAccessor::FindConnectedPlayer(invitee); uint8 level = player ? player->getLevel() : Player::GetLevelFromDB(invitee); - WorldPacket data(SMSG_CALENDAR_EVENT_INVITE, 8 + 8 + 8 + 1 + 1 + 1 + (statusTime ? 4 : 0) + 1); - data << invitee; - data << uint64(invite.GetEventId()); - data << uint64(invite.GetInviteId()); - data << uint8(level); - data << uint8(invite.GetStatus()); - data << uint8(hasStatusTime); - if (hasStatusTime) - data.AppendPackedTime(statusTime); - data << uint8(invite.GetSenderGUID() != invite.GetInviteeGUID()); // false only if the invite is sign-up + WorldPackets::Calendar::SCalendarEventInvite packet; + packet.EventID = calendarEvent ? calendarEvent->GetEventId() : 0; + packet.InviteGuid = invitee; + packet.InviteID = calendarEvent ? invite.GetInviteId() : 0; + packet.Level = level; + packet.ResponseTime = invite.GetResponseTime(); + packet.Status = invite.GetStatus(); + packet.Type = calendarEvent ? calendarEvent->IsGuildEvent() : 0; // Correct ? + packet.ClearPending = calendarEvent ? !calendarEvent->IsGuildEvent() : true; // Correct ? if (!calendarEvent) // Pre-invite { if (Player* playerSender = ObjectAccessor::FindConnectedPlayer(invite.GetSenderGUID())) - playerSender->SendDirectMessage(&data); + playerSender->SendDirectMessage(packet.Write()); } else { - if (calendarEvent->GetCreatorGUID() != invite.GetInviteeGUID()) // correct? - SendPacketToAllEventRelatives(data, *calendarEvent); + if (calendarEvent->GetOwnerGUID() != invite.GetInviteeGUID()) // correct? + SendPacketToAllEventRelatives(packet.Write(), *calendarEvent); } } -void CalendarMgr::SendCalendarEventUpdateAlert(CalendarEvent const& calendarEvent, time_t oldEventTime) +void CalendarMgr::SendCalendarEventUpdateAlert(CalendarEvent const& calendarEvent, time_t originalDate) { - WorldPacket data(SMSG_CALENDAR_EVENT_UPDATED_ALERT, 1 + 8 + 4 + 4 + 4 + 1 + 4 + - calendarEvent.GetTitle().size() + calendarEvent.GetDescription().size() + 1 + 4 + 4); - data << uint8(1); // unk - data << uint64(calendarEvent.GetEventId()); - data.AppendPackedTime(oldEventTime); - data << uint32(calendarEvent.GetFlags()); - data.AppendPackedTime(calendarEvent.GetEventTime()); - data << uint8(calendarEvent.GetType()); - data << int32(calendarEvent.GetDungeonId()); - data << calendarEvent.GetTitle(); - data << calendarEvent.GetDescription(); - data << uint8(CALENDAR_REPEAT_NEVER); // repeatable - data << uint32(CALENDAR_MAX_INVITES); - data << uint32(0); // unk + WorldPackets::Calendar::CalendarEventUpdatedAlert packet; + packet.ClearPending = true; // FIXME + packet.Date = calendarEvent.GetDate(); + packet.Description = calendarEvent.GetDescription(); + packet.EventID = calendarEvent.GetEventId(); + packet.EventName = calendarEvent.GetTitle(); + packet.EventType = calendarEvent.GetType(); + packet.Flags = calendarEvent.GetFlags(); + packet.LockDate = calendarEvent.GetLockDate(); // Always 0 ? + packet.OriginalDate = originalDate; + packet.TextureID = calendarEvent.GetTextureId(); - SendPacketToAllEventRelatives(data, calendarEvent); + SendPacketToAllEventRelatives(packet.Write(), calendarEvent); } void CalendarMgr::SendCalendarEventStatus(CalendarEvent const& calendarEvent, CalendarInvite const& invite) { - WorldPacket data(SMSG_CALENDAR_EVENT_INVITE_STATUS, 8 + 8 + 4 + 4 + 1 + 1 + 4); - data << invite.GetInviteeGUID(); - data << uint64(calendarEvent.GetEventId()); - data.AppendPackedTime(calendarEvent.GetEventTime()); - data << uint32(calendarEvent.GetFlags()); - data << uint8(invite.GetStatus()); - data << uint8(invite.GetRank()); - data.AppendPackedTime(invite.GetStatusTime()); + WorldPackets::Calendar::CalendarEventInviteStatus packet; + packet.ClearPending = true; // FIXME + packet.Date = calendarEvent.GetDate(); + packet.EventID = calendarEvent.GetEventId(); + packet.Flags = calendarEvent.GetFlags(); + packet.InviteGuid = invite.GetInviteeGUID(); + packet.ResponseTime = invite.GetResponseTime(); + packet.Status = invite.GetStatus(); - SendPacketToAllEventRelatives(data, calendarEvent); + SendPacketToAllEventRelatives(packet.Write(), calendarEvent); } void CalendarMgr::SendCalendarEventRemovedAlert(CalendarEvent const& calendarEvent) { - WorldPacket data(SMSG_CALENDAR_EVENT_REMOVED_ALERT, 1 + 8 + 1); - data << uint8(1); // FIXME: If true does not SignalEvent(EVENT_CALENDAR_ACTION_PENDING) - data << uint64(calendarEvent.GetEventId()); - data.AppendPackedTime(calendarEvent.GetEventTime()); + WorldPackets::Calendar::CalendarEventRemovedAlert packet; + packet.ClearPending = true; // FIXME + packet.Date = calendarEvent.GetDate(); + packet.EventID = calendarEvent.GetEventId(); - SendPacketToAllEventRelatives(data, calendarEvent); + SendPacketToAllEventRelatives(packet.Write(), calendarEvent); } void CalendarMgr::SendCalendarEventInviteRemove(CalendarEvent const& calendarEvent, CalendarInvite const& invite, uint32 flags) { - WorldPacket data(SMSG_CALENDAR_EVENT_INVITE_REMOVED, 8 + 4 + 4 + 1); - data << invite.GetInviteeGUID(); - data << uint64(invite.GetEventId()); - data << uint32(flags); - data << uint8(1); // FIXME + WorldPackets::Calendar::CalendarEventInviteRemoved packet; + packet.ClearPending = true; // FIXME + packet.EventID = calendarEvent.GetEventId(); + packet.Flags = flags; + packet.InviteGuid = invite.GetInviteeGUID(); - SendPacketToAllEventRelatives(data, calendarEvent); + SendPacketToAllEventRelatives(packet.Write(), calendarEvent); } void CalendarMgr::SendCalendarEventModeratorStatusAlert(CalendarEvent const& calendarEvent, CalendarInvite const& invite) { - WorldPacket data(SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS, 8 + 8 + 1 + 1); - data << invite.GetInviteeGUID(); - data << uint64(invite.GetEventId()); - data << uint8(invite.GetRank()); - data << uint8(1); // Unk boolean - Display to client? + WorldPackets::Calendar::CalendarEventInviteModeratorStatus packet; + packet.ClearPending = true; // FIXME + packet.EventID = calendarEvent.GetEventId(); + packet.InviteGuid = invite.GetInviteeGUID(); + packet.Status = invite.GetStatus(); - SendPacketToAllEventRelatives(data, calendarEvent); + SendPacketToAllEventRelatives(packet.Write(), calendarEvent); } void CalendarMgr::SendCalendarEventInviteAlert(CalendarEvent const& calendarEvent, CalendarInvite const& invite) { - WorldPacket data(SMSG_CALENDAR_EVENT_INVITE_ALERT); - data << uint64(calendarEvent.GetEventId()); - data << calendarEvent.GetTitle(); - data.AppendPackedTime(calendarEvent.GetEventTime()); - data << uint32(calendarEvent.GetFlags()); - data << uint32(calendarEvent.GetType()); - data << int32(calendarEvent.GetDungeonId()); - data << uint64(invite.GetInviteId()); + WorldPackets::Calendar::CalendarEventInviteAlert packet; + packet.Date = calendarEvent.GetDate(); + packet.EventID = calendarEvent.GetEventId(); + packet.EventName = calendarEvent.GetTitle(); + packet.EventType = calendarEvent.GetType(); + packet.Flags = calendarEvent.GetFlags(); + packet.InviteID = invite.GetInviteId(); + packet.InvitedByGuid = invite.GetSenderGUID(); + packet.ModeratorStatus = invite.GetRank(); + packet.OwnerGuid = calendarEvent.GetOwnerGUID(); + packet.Status = invite.GetStatus(); + packet.TextureID = calendarEvent.GetTextureId(); Guild* guild = sGuildMgr->GetGuildById(calendarEvent.GetGuildId()); - data << (guild ? guild->GetGUID() : ObjectGuid::Empty); - - data << uint8(invite.GetStatus()); - data << uint8(invite.GetRank()); - data << calendarEvent.GetCreatorGUID(); - data << invite.GetSenderGUID(); + packet.EventGuildID = guild ? guild->GetGUID() : ObjectGuid::Empty; if (calendarEvent.IsGuildEvent() || calendarEvent.IsGuildAnnouncement()) { if (guild) - guild->BroadcastPacket(&data); + guild->BroadcastPacket(packet.Write()); } else if (Player* player = ObjectAccessor::FindConnectedPlayer(invite.GetInviteeGUID())) - player->SendDirectMessage(&data); + player->SendDirectMessage(packet.Write()); } void CalendarMgr::SendCalendarEvent(ObjectGuid guid, CalendarEvent const& calendarEvent, CalendarSendEventType sendType) @@ -554,105 +548,99 @@ void CalendarMgr::SendCalendarEvent(ObjectGuid guid, CalendarEvent const& calend CalendarInviteStore const& eventInviteeList = _invites[calendarEvent.GetEventId()]; - WorldPacket data(SMSG_CALENDAR_SEND_EVENT, 60 + eventInviteeList.size() * 32); - data << uint8(sendType); - data << calendarEvent.GetCreatorGUID(); - data << uint64(calendarEvent.GetEventId()); - data << calendarEvent.GetTitle(); - data << calendarEvent.GetDescription(); - data << uint8(calendarEvent.GetType()); - data << uint8(CALENDAR_REPEAT_NEVER); // repeatable - data << uint32(CALENDAR_MAX_INVITES); - data << int32(calendarEvent.GetDungeonId()); - data << uint32(calendarEvent.GetFlags()); - data.AppendPackedTime(calendarEvent.GetEventTime()); - data.AppendPackedTime(calendarEvent.GetTimeZoneTime()); + WorldPackets::Calendar::CalendarSendEvent packet; + packet.Date = calendarEvent.GetDate(); + packet.Description = calendarEvent.GetDescription(); + packet.EventID = calendarEvent.GetEventId(); + packet.EventName = calendarEvent.GetTitle(); + packet.EventType = sendType; + packet.Flags = calendarEvent.GetFlags(); + packet.GetEventType = calendarEvent.GetType(); + packet.LockDate = calendarEvent.GetLockDate(); // Always 0 ? + packet.OwnerGuid = calendarEvent.GetOwnerGUID(); + packet.TextureID = calendarEvent.GetTextureId(); Guild* guild = sGuildMgr->GetGuildById(calendarEvent.GetGuildId()); - data << (guild ? guild->GetGUID() : ObjectGuid::Empty); + packet.EventGuildID = (guild ? guild->GetGUID() : ObjectGuid::Empty); - data << uint32(eventInviteeList.size()); - for (CalendarInviteStore::const_iterator itr = eventInviteeList.begin(); itr != eventInviteeList.end(); ++itr) + for (auto const& calendarInvite : eventInviteeList) { - CalendarInvite const* calendarInvite = (*itr); ObjectGuid inviteeGuid = calendarInvite->GetInviteeGUID(); Player* invitee = ObjectAccessor::FindPlayer(inviteeGuid); uint8 inviteeLevel = invitee ? invitee->getLevel() : Player::GetLevelFromDB(inviteeGuid); ObjectGuid::LowType inviteeGuildId = invitee ? invitee->GetGuildId() : Player::GetGuildIdFromDB(inviteeGuid); - data << inviteeGuid; - data << uint8(inviteeLevel); - data << uint8(calendarInvite->GetStatus()); - data << uint8(calendarInvite->GetRank()); - data << uint8(calendarEvent.IsGuildEvent() && calendarEvent.GetGuildId() == inviteeGuildId); - data << uint64(calendarInvite->GetInviteId()); - data.AppendPackedTime(calendarInvite->GetStatusTime()); - data << calendarInvite->GetText(); + WorldPackets::Calendar::CalendarEventInviteInfo inviteInfo; + inviteInfo.Guid = inviteeGuid; + inviteInfo.Level = inviteeLevel; + inviteInfo.Status = calendarInvite->GetStatus(); + inviteInfo.Moderator = calendarInvite->GetRank(); + inviteInfo.InviteType = calendarEvent.IsGuildEvent() && calendarEvent.GetGuildId() == inviteeGuildId; + inviteInfo.InviteID = calendarInvite->GetInviteId(); + inviteInfo.ResponseTime = calendarInvite->GetResponseTime(); + inviteInfo.Notes = calendarInvite->GetNote(); + + packet.Invites.push_back(inviteInfo); } - player->SendDirectMessage(&data); + player->SendDirectMessage(packet.Write()); } void CalendarMgr::SendCalendarEventInviteRemoveAlert(ObjectGuid guid, CalendarEvent const& calendarEvent, CalendarInviteStatus status) { if (Player* player = ObjectAccessor::FindConnectedPlayer(guid)) { - WorldPacket data(SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT, 8 + 4 + 4 + 1); - data << uint64(calendarEvent.GetEventId()); - data.AppendPackedTime(calendarEvent.GetEventTime()); - data << uint32(calendarEvent.GetFlags()); - data << uint8(status); + WorldPackets::Calendar::CalendarEventInviteRemovedAlert packet; + packet.Date = calendarEvent.GetDate(); + packet.EventID = calendarEvent.GetEventId(); + packet.Flags = calendarEvent.GetFlags(); + packet.Status = status; - player->SendDirectMessage(&data); + player->SendDirectMessage(packet.Write()); } } void CalendarMgr::SendCalendarClearPendingAction(ObjectGuid guid) { if (Player* player = ObjectAccessor::FindConnectedPlayer(guid)) - { - WorldPacket data(SMSG_CALENDAR_CLEAR_PENDING_ACTION, 0); - player->SendDirectMessage(&data); - } + player->SendDirectMessage(WorldPackets::Calendar::CalendarClearPendingAction().Write()); } void CalendarMgr::SendCalendarCommandResult(ObjectGuid guid, CalendarError err, char const* param /*= NULL*/) { if (Player* player = ObjectAccessor::FindConnectedPlayer(guid)) { - WorldPacket data(SMSG_CALENDAR_COMMAND_RESULT, 0); - data << uint32(0); - data << uint8(0); + WorldPackets::Calendar::CalendarCommandResult packet; + packet.Command = 1; // FIXME + packet.Result = err; + switch (err) { case CALENDAR_ERROR_OTHER_INVITES_EXCEEDED: case CALENDAR_ERROR_ALREADY_INVITED_TO_EVENT_S: case CALENDAR_ERROR_IGNORING_YOU_S: - data << param; + packet.Name = param; break; default: - data << uint8(0); break; } - data << uint32(err); - - player->SendDirectMessage(&data); + player->SendDirectMessage(packet.Write()); } } -void CalendarMgr::SendPacketToAllEventRelatives(WorldPacket& packet, CalendarEvent const& calendarEvent) +void CalendarMgr::SendPacketToAllEventRelatives(WorldPacket const* packet, CalendarEvent const& calendarEvent) { // Send packet to all guild members if (calendarEvent.IsGuildEvent() || calendarEvent.IsGuildAnnouncement()) if (Guild* guild = sGuildMgr->GetGuildById(calendarEvent.GetGuildId())) - guild->BroadcastPacket(&packet); + guild->BroadcastPacket(packet); // Send packet to all invitees if event is non-guild, in other case only to non-guild invitees (packet was broadcasted for them) CalendarInviteStore invites = _invites[calendarEvent.GetEventId()]; for (CalendarInviteStore::iterator itr = invites.begin(); itr != invites.end(); ++itr) if (Player* player = ObjectAccessor::FindConnectedPlayer((*itr)->GetInviteeGUID())) if (!calendarEvent.IsGuildEvent() || (calendarEvent.IsGuildEvent() && player->GetGuildId() != calendarEvent.GetGuildId())) - player->SendDirectMessage(&packet); + player->SendDirectMessage(packet); } diff --git a/src/server/game/Calendar/CalendarMgr.h b/src/server/game/Calendar/CalendarMgr.h index 8122f41c0f5..5449c9c739f 100644 --- a/src/server/game/Calendar/CalendarMgr.h +++ b/src/server/game/Calendar/CalendarMgr.h @@ -123,9 +123,10 @@ enum CalendarError CALENDAR_ERROR_NO_MODERATOR = 40 }; -#define CALENDAR_MAX_EVENTS 30 -#define CALENDAR_MAX_GUILD_EVENTS 100 -#define CALENDAR_MAX_INVITES 100 +#define CALENDAR_MAX_EVENTS 30 +#define CALENDAR_MAX_GUILD_EVENTS 100 +#define CALENDAR_MAX_INVITES 100 +#define CALENDAR_DEFAULT_RESPONSE_TIME 946684800 // 01/01/2000 00:00:00 struct CalendarInvite { @@ -136,19 +137,19 @@ struct CalendarInvite _eventId = eventId; _invitee = calendarInvite.GetInviteeGUID(); _senderGUID = calendarInvite.GetSenderGUID(); - _statusTime = calendarInvite.GetStatusTime(); + _responseTime = calendarInvite.GetResponseTime(); _status = calendarInvite.GetStatus(); _rank = calendarInvite.GetRank(); - _text = calendarInvite.GetText(); + _note = calendarInvite.GetNote(); } - CalendarInvite() : _inviteId(1), _eventId(0), _invitee(), _senderGUID(), _statusTime(time(NULL)), - _status(CALENDAR_STATUS_INVITED), _rank(CALENDAR_RANK_PLAYER), _text("") { } + CalendarInvite() : _inviteId(1), _eventId(0), _invitee(), _senderGUID(), _responseTime(0), + _status(CALENDAR_STATUS_INVITED), _rank(CALENDAR_RANK_PLAYER), _note("") { } - CalendarInvite(uint64 inviteId, uint64 eventId, ObjectGuid invitee, ObjectGuid senderGUID, time_t statusTime, - CalendarInviteStatus status, CalendarModerationRank rank, std::string text) : - _inviteId(inviteId), _eventId(eventId), _invitee(invitee), _senderGUID(senderGUID), _statusTime(statusTime), - _status(status), _rank(rank), _text(text) { } + CalendarInvite(uint64 inviteId, uint64 eventId, ObjectGuid invitee, ObjectGuid senderGUID, time_t responseTime, + CalendarInviteStatus status, CalendarModerationRank rank, std::string note) : + _inviteId(inviteId), _eventId(eventId), _invitee(invitee), _senderGUID(senderGUID), _responseTime(responseTime), + _status(status), _rank(rank), _note(note) { } ~CalendarInvite(); @@ -164,11 +165,11 @@ struct CalendarInvite void SetInvitee(ObjectGuid guid) { _invitee = guid; } ObjectGuid GetInviteeGUID() const { return _invitee; } - void SetStatusTime(time_t statusTime) { _statusTime = statusTime; } - time_t GetStatusTime() const { return _statusTime; } + void SetResponseTime(time_t responseTime) { _responseTime = responseTime; } + time_t GetResponseTime() const { return _responseTime; } - void SetText(std::string const& text) { _text = text; } - std::string GetText() const { return _text; } + void SetNote(std::string const& note) { _note = note; } + std::string GetNote() const { return _note; } void SetStatus(CalendarInviteStatus status) { _status = status; } CalendarInviteStatus GetStatus() const { return _status; } @@ -181,10 +182,10 @@ struct CalendarInvite uint64 _eventId; ObjectGuid _invitee; ObjectGuid _senderGUID; - time_t _statusTime; + time_t _responseTime; CalendarInviteStatus _status; CalendarModerationRank _rank; - std::string _text; + std::string _note; }; struct CalendarEvent @@ -193,36 +194,35 @@ struct CalendarEvent CalendarEvent(CalendarEvent const& calendarEvent, uint64 eventId) { _eventId = eventId; - _creatorGUID = calendarEvent.GetCreatorGUID(); - _guildId = calendarEvent.GetGuildId(); - _type = calendarEvent.GetType(); - _dungeonId = calendarEvent.GetDungeonId(); - _eventTime = calendarEvent.GetEventTime(); + _ownerGUID = calendarEvent.GetOwnerGUID(); + _eventGuildId = calendarEvent.GetGuildId(); + _eventType = calendarEvent.GetType(); + _textureId = calendarEvent.GetTextureId(); + _date = calendarEvent.GetDate(); _flags = calendarEvent.GetFlags(); - _timezoneTime = calendarEvent.GetTimeZoneTime(); _title = calendarEvent.GetTitle(); _description = calendarEvent.GetDescription(); + _lockDate = calendarEvent.GetLockDate(); } - CalendarEvent(uint64 eventId, ObjectGuid creatorGUID, ObjectGuid::LowType guildId, CalendarEventType type, int32 dungeonId, - time_t eventTime, uint32 flags, time_t timezoneTime, std::string title, std::string description) : - _eventId(eventId), _creatorGUID(creatorGUID), _guildId(guildId), _type(type), _dungeonId(dungeonId), - _eventTime(eventTime), _flags(flags), _timezoneTime(timezoneTime), _title(title), - _description(description) { } + CalendarEvent(uint64 eventId, ObjectGuid ownerGUID, ObjectGuid::LowType guildId, CalendarEventType type, int32 textureId, + time_t date, uint32 flags, std::string title, std::string description, time_t lockDate) : + _eventId(eventId), _ownerGUID(ownerGUID), _eventGuildId(guildId), _eventType(type), _textureId(textureId), + _date(date), _flags(flags), _title(title), _description(description), _lockDate(lockDate) { } - CalendarEvent() : _eventId(1), _creatorGUID(), _guildId(UI64LIT(0)), _type(CALENDAR_TYPE_OTHER), _dungeonId(-1), _eventTime(0), - _flags(0), _timezoneTime(0), _title(""), _description("") { } + CalendarEvent() : _eventId(1), _ownerGUID(), _eventGuildId(UI64LIT(0)), _eventType(CALENDAR_TYPE_OTHER), _textureId(-1), _date(0), + _flags(0), _title(""), _description(""), _lockDate(0) { } ~CalendarEvent(); void SetEventId(uint64 eventId) { _eventId = eventId; } uint64 GetEventId() const { return _eventId; } - void SetCreatorGUID(ObjectGuid guid) { _creatorGUID = guid; } - ObjectGuid GetCreatorGUID() const { return _creatorGUID; } + void SetOwnerGUID(ObjectGuid guid) { _ownerGUID = guid; } + ObjectGuid GetOwnerGUID() const { return _ownerGUID; } - void SetGuildId(ObjectGuid::LowType guildId) { _guildId = guildId; } - ObjectGuid::LowType GetGuildId() const { return _guildId; } + void SetGuildId(ObjectGuid::LowType guildId) { _eventGuildId = guildId; } + ObjectGuid::LowType GetGuildId() const { return _eventGuildId; } void SetTitle(std::string const& title) { _title = title; } std::string GetTitle() const { return _title; } @@ -230,42 +230,43 @@ struct CalendarEvent void SetDescription(std::string const& description) { _description = description; } std::string GetDescription() const { return _description; } - void SetType(CalendarEventType type) { _type = type; } - CalendarEventType GetType() const { return _type; } + void SetType(CalendarEventType eventType) { _eventType = eventType; } + CalendarEventType GetType() const { return _eventType; } - void SetDungeonId(int32 dungeonId) { _dungeonId = dungeonId; } - int32 GetDungeonId() const { return _dungeonId; } + void SetTextureId(int32 textureId) { _textureId = textureId; } + int32 GetTextureId() const { return _textureId; } - void SetEventTime(time_t eventTime) { _eventTime = eventTime; } - time_t GetEventTime() const { return _eventTime; } + void SetDate(time_t date) { _date = date; } + time_t GetDate() const { return _date; } void SetFlags(uint32 flags) { _flags = flags; } uint32 GetFlags() const { return _flags; } - void SetTimeZoneTime(time_t timezoneTime) { _timezoneTime = timezoneTime; } - time_t GetTimeZoneTime() const { return _timezoneTime; } - bool IsGuildEvent() const { return (_flags & CALENDAR_FLAG_GUILD_EVENT) != 0; } bool IsGuildAnnouncement() const { return (_flags & CALENDAR_FLAG_WITHOUT_INVITES) != 0; } + bool IsLocked() const { return (_flags & CALENDAR_FLAG_INVITES_LOCKED) != 0; } + + void SetLockDate(time_t lockDate) { _lockDate = lockDate; } + time_t GetLockDate() const { return _lockDate; } std::string BuildCalendarMailSubject(ObjectGuid remover) const; std::string BuildCalendarMailBody() const; private: uint64 _eventId; - ObjectGuid _creatorGUID; - ObjectGuid::LowType _guildId; - CalendarEventType _type; - int32 _dungeonId; - time_t _eventTime; + ObjectGuid _ownerGUID; + ObjectGuid::LowType _eventGuildId; + CalendarEventType _eventType; + int32 _textureId; + time_t _date; uint32 _flags; - time_t _timezoneTime; std::string _title; std::string _description; + time_t _lockDate; }; typedef std::vector<CalendarInvite*> CalendarInviteStore; typedef std::set<CalendarEvent*> CalendarEventStore; -typedef std::map<uint64 /* eventId */, CalendarInviteStore > CalendarEventInviteStore; +typedef std::map<uint64 /* eventID */, CalendarInviteStore > CalendarEventInviteStore; class CalendarMgr { @@ -324,14 +325,14 @@ class CalendarMgr void SendCalendarEventInviteAlert(CalendarEvent const& calendarEvent, CalendarInvite const& invite); void SendCalendarEventInviteRemove(CalendarEvent const& calendarEvent, CalendarInvite const& invite, uint32 flags); void SendCalendarEventInviteRemoveAlert(ObjectGuid guid, CalendarEvent const& calendarEvent, CalendarInviteStatus status); - void SendCalendarEventUpdateAlert(CalendarEvent const& calendarEvent, time_t oldEventTime); + void SendCalendarEventUpdateAlert(CalendarEvent const& calendarEvent, time_t originalDate); void SendCalendarEventStatus(CalendarEvent const& calendarEvent, CalendarInvite const& invite); void SendCalendarEventRemovedAlert(CalendarEvent const& calendarEvent); void SendCalendarEventModeratorStatusAlert(CalendarEvent const& calendarEvent, CalendarInvite const& invite); void SendCalendarClearPendingAction(ObjectGuid guid); void SendCalendarCommandResult(ObjectGuid guid, CalendarError err, char const* param = NULL); - void SendPacketToAllEventRelatives(WorldPacket& packet, CalendarEvent const& calendarEvent); + void SendPacketToAllEventRelatives(WorldPacket const* packet, CalendarEvent const& calendarEvent); }; #define sCalendarMgr CalendarMgr::instance() diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 0683725cab8..39c32e602da 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -254,8 +254,9 @@ typedef std::unordered_map<uint16, CreatureBaseStats> CreatureBaseStatsContainer struct CreatureLocale { StringVector Name; - StringVector FemaleName; - StringVector SubName; + StringVector NameAlt; + StringVector Title; + StringVector TitleAlt; }; struct GossipMenuItemsLocale diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3e89952c2e4..5b6003bf166 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -99,6 +99,7 @@ #include "WorldPacket.h" #include "WorldSession.h" #include "WorldStatePackets.h" +#include "DBCStructure.h" #define ZONE_UPDATE_INTERVAL (1*IN_MILLISECONDS) @@ -651,7 +652,7 @@ void KillRewarder::Reward() } -Player::Player(WorldSession* session): Unit(true) +Player::Player(WorldSession* session) : Unit(true) { m_speakTime = 0; m_speakCount = 0; @@ -891,6 +892,8 @@ Player::Player(WorldSession* session): Unit(true) for (uint8 i = 0; i < MAX_CUF_PROFILES; ++i) _CUFProfiles[i] = nullptr; + + _advancedCombatLoggingEnabled = false; } Player::~Player() @@ -1305,10 +1308,12 @@ uint32 Player::EnvironmentalDamage(EnviromentalDamage type, uint32 damage) packet.Amount = damage; packet.Absorbed = absorb; packet.Resisted = resist; - SendMessageToSet(packet.Write(), true); uint32 final_damage = DealDamage(this, damage, NULL, SELF_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + packet.LogData.Initialize(this); + SendCombatLogMessage(&packet); + if (!IsAlive()) { if (type == DAMAGE_FALL) // DealDamage not apply item durability loss at self damage @@ -3657,7 +3662,8 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent if (!pSkill) continue; - if ((_spell_idx->second->AquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(pSkill->ID))) + // Runeforging special case + if ((_spell_idx->second->AquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(pSkill->ID)) || ((pSkill->ID == SKILL_RUNEFORGING_2) && _spell_idx->second->TrivialSkillLineRankHigh == 0)) if (SkillRaceClassInfoEntry const* rcInfo = GetSkillRaceClassInfo(pSkill->ID, getRace(), getClass())) LearnDefaultSkill(rcInfo); } @@ -8844,10 +8850,9 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type) packet.Owner = loot->GetGUID(); packet.LootMethod = _lootMethod; packet.AcquireReason = loot_type; - if (!GetGroup()) + if (GetGroup() && (_lootMethod == GROUP_LOOT || _lootMethod == PERSONAL_LOOT)) /// @TODO: Need more research packet.PersonalLooting = true; - else - packet.PersonalLooting = false; + packet.Acquired = true; // false == No Loot (this too^^) loot->BuildLootResponse(packet, this, permission); SendDirectMessage(packet.Write()); @@ -14959,8 +14964,8 @@ bool Player::SatisfyQuestSkill(Quest const* qInfo, bool msg) const { if (msg) { - SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestSkill: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required skill value.", qInfo->GetQuestId()); + SendCanTakeQuestResponse(QUEST_ERR_NONE); + TC_LOG_DEBUG("misc", "SatisfyQuestSkill: Sent QUEST_ERR_NONE (questId: %u) because player does not have required skill value.", qInfo->GetQuestId()); } return false; @@ -14975,8 +14980,8 @@ bool Player::SatisfyQuestLevel(Quest const* qInfo, bool msg) { if (msg) { - SendCanTakeQuestResponse(INVALIDREASON_QUEST_FAILED_LOW_LEVEL); - TC_LOG_DEBUG("misc", "SatisfyQuestLevel: Sent INVALIDREASON_QUEST_FAILED_LOW_LEVEL (questId: %u) because player does not have required (min) level.", qInfo->GetQuestId()); + SendCanTakeQuestResponse(QUEST_ERR_FAILED_LOW_LEVEL); + TC_LOG_DEBUG("misc", "SatisfyQuestLevel: Sent QUEST_ERR_FAILED_LOW_LEVEL (questId: %u) because player does not have required (min) level.", qInfo->GetQuestId()); } return false; } @@ -14984,8 +14989,8 @@ bool Player::SatisfyQuestLevel(Quest const* qInfo, bool msg) { if (msg) { - SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); // There doesn't seem to be a specific response for too high player level - TC_LOG_DEBUG("misc", "SatisfyQuestLevel: Sent INVALIDREASON_QUEST_FAILED_LOW_LEVEL (questId: %u) because player does not have required (max) level.", qInfo->GetQuestId()); + SendCanTakeQuestResponse(QUEST_ERR_NONE); // There doesn't seem to be a specific response for too high player level + TC_LOG_DEBUG("misc", "SatisfyQuestLevel: Sent QUEST_ERR_FAILED_LOW_LEVEL (questId: %u) because player does not have required (max) level.", qInfo->GetQuestId()); } return false; } @@ -15045,8 +15050,8 @@ bool Player::SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg) { if (msg) { - SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestPreviousQuest: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required quest (1).", qInfo->GetQuestId()); + SendCanTakeQuestResponse(QUEST_ERR_NONE); + TC_LOG_DEBUG("misc", "SatisfyQuestPreviousQuest: Sent QUEST_ERR_NONE (questId: %u) because player does not have required quest (1).", qInfo->GetQuestId()); } return false; } @@ -15078,8 +15083,8 @@ bool Player::SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg) { if (msg) { - SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestPreviousQuest: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required quest (2).", qInfo->GetQuestId()); + SendCanTakeQuestResponse(QUEST_ERR_NONE); + TC_LOG_DEBUG("misc", "SatisfyQuestPreviousQuest: Sent QUEST_ERR_NONE (questId: %u) because player does not have required quest (2).", qInfo->GetQuestId()); } return false; @@ -15094,8 +15099,8 @@ bool Player::SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg) // and negative prev. quests in non-active state if (msg) { - SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestPreviousQuest: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required quest (3).", qInfo->GetQuestId()); + SendCanTakeQuestResponse(QUEST_ERR_NONE); + TC_LOG_DEBUG("misc", "SatisfyQuestPreviousQuest: Sent QUEST_ERR_NONE (questId: %u) because player does not have required quest (3).", qInfo->GetQuestId()); } return false; @@ -15112,8 +15117,8 @@ bool Player::SatisfyQuestClass(Quest const* qInfo, bool msg) const { if (msg) { - SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestClass: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required class.", qInfo->GetQuestId()); + SendCanTakeQuestResponse(QUEST_ERR_NONE); + TC_LOG_DEBUG("misc", "SatisfyQuestClass: Sent QUEST_ERR_NONE (questId: %u) because player does not have required class.", qInfo->GetQuestId()); } return false; @@ -15131,8 +15136,8 @@ bool Player::SatisfyQuestRace(Quest const* qInfo, bool msg) { if (msg) { - SendCanTakeQuestResponse(INVALIDREASON_QUEST_FAILED_WRONG_RACE); - TC_LOG_DEBUG("misc", "SatisfyQuestRace: Sent INVALIDREASON_QUEST_FAILED_WRONG_RACE (questId: %u) because player does not have required race.", qInfo->GetQuestId()); + SendCanTakeQuestResponse(QUEST_ERR_FAILED_WRONG_RACE); + TC_LOG_DEBUG("misc", "SatisfyQuestRace: Sent QUEST_ERR_FAILED_WRONG_RACE (questId: %u) because player does not have required race.", qInfo->GetQuestId()); } return false; @@ -15147,8 +15152,8 @@ bool Player::SatisfyQuestReputation(Quest const* qInfo, bool msg) { if (msg) { - SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestReputation: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required reputation (min).", qInfo->GetQuestId()); + SendCanTakeQuestResponse(QUEST_ERR_NONE); + TC_LOG_DEBUG("misc", "SatisfyQuestReputation: Sent QUEST_ERR_NONE (questId: %u) because player does not have required reputation (min).", qInfo->GetQuestId()); } return false; } @@ -15158,8 +15163,8 @@ bool Player::SatisfyQuestReputation(Quest const* qInfo, bool msg) { if (msg) { - SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestReputation: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required reputation (max).", qInfo->GetQuestId()); + SendCanTakeQuestResponse(QUEST_ERR_NONE); + TC_LOG_DEBUG("misc", "SatisfyQuestReputation: Sent QUEST_ERR_NONE (questId: %u) because player does not have required reputation (max).", qInfo->GetQuestId()); } return false; } @@ -15172,8 +15177,8 @@ bool Player::SatisfyQuestReputation(Quest const* qInfo, bool msg) { if (msg) { - SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestReputation: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required reputation (ReputationObjective2).", qInfo->GetQuestId()); + SendCanTakeQuestResponse(QUEST_ERR_NONE); + TC_LOG_DEBUG("misc", "SatisfyQuestReputation: Sent QUEST_ERR_NONE (questId: %u) because player does not have required reputation (ReputationObjective2).", qInfo->GetQuestId()); } return false; }**/ @@ -15187,8 +15192,8 @@ bool Player::SatisfyQuestStatus(Quest const* qInfo, bool msg) { if (msg) { - SendCanTakeQuestResponse(INVALIDREASON_QUEST_ALREADY_ON); - TC_LOG_DEBUG("misc", "SatisfyQuestStatus: Sent INVALIDREASON_QUEST_ALREADY_ON (questId: %u) because player quest status is not NONE.", qInfo->GetQuestId()); + SendCanTakeQuestResponse(QUEST_ERR_ALREADY_ON1); + TC_LOG_DEBUG("misc", "SatisfyQuestStatus: Sent QUEST_ERR_ALREADY_ON1 (questId: %u) because player quest status is not NONE.", qInfo->GetQuestId()); } return false; } @@ -15202,8 +15207,8 @@ bool Player::SatisfyQuestConditions(Quest const* qInfo, bool msg) { if (msg) { - SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestConditions: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not meet conditions.", qInfo->GetQuestId()); + SendCanTakeQuestResponse(QUEST_ERR_NONE); + TC_LOG_DEBUG("misc", "SatisfyQuestConditions: Sent QUEST_ERR_NONE (questId: %u) because player does not meet conditions.", qInfo->GetQuestId()); } TC_LOG_DEBUG("condition", "Player::SatisfyQuestConditions: conditions not met for quest %u", qInfo->GetQuestId()); return false; @@ -15217,8 +15222,8 @@ bool Player::SatisfyQuestTimed(Quest const* qInfo, bool msg) { if (msg) { - SendCanTakeQuestResponse(INVALIDREASON_QUEST_ONLY_ONE_TIMED); - TC_LOG_DEBUG("misc", "SatisfyQuestTimed: Sent INVALIDREASON_QUEST_ONLY_ONE_TIMED (questId: %u) because player is already on a timed quest.", qInfo->GetQuestId()); + SendCanTakeQuestResponse(QUEST_ERR_ONLY_ONE_TIMED); + TC_LOG_DEBUG("misc", "SatisfyQuestTimed: Sent QUEST_ERR_ONLY_ONE_TIMED (questId: %u) because player is already on a timed quest.", qInfo->GetQuestId()); } return false; } @@ -15248,8 +15253,8 @@ bool Player::SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg) { if (msg) { - SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestExclusiveGroup: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player already did daily quests in exclusive group.", qInfo->GetQuestId()); + SendCanTakeQuestResponse(QUEST_ERR_NONE); + TC_LOG_DEBUG("misc", "SatisfyQuestExclusiveGroup: Sent QUEST_ERR_NONE (questId: %u) because player already did daily quests in exclusive group.", qInfo->GetQuestId()); } return false; @@ -15260,8 +15265,8 @@ bool Player::SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg) { if (msg) { - SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestExclusiveGroup: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player already did quest in exclusive group.", qInfo->GetQuestId()); + SendCanTakeQuestResponse(QUEST_ERR_NONE); + TC_LOG_DEBUG("misc", "SatisfyQuestExclusiveGroup: Sent QUEST_ERR_NONE (questId: %u) because player already did quest in exclusive group.", qInfo->GetQuestId()); } return false; } @@ -15280,8 +15285,8 @@ bool Player::SatisfyQuestNextChain(Quest const* qInfo, bool msg) { if (msg) { - SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestNextChain: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player already did or started next quest in chain.", qInfo->GetQuestId()); + SendCanTakeQuestResponse(QUEST_ERR_NONE); + TC_LOG_DEBUG("misc", "SatisfyQuestNextChain: Sent QUEST_ERR_NONE (questId: %u) because player already did or started next quest in chain.", qInfo->GetQuestId()); } return false; } @@ -15307,8 +15312,8 @@ bool Player::SatisfyQuestPrevChain(Quest const* qInfo, bool msg) { if (msg) { - SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestNextChain: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player already did or started next quest in chain.", qInfo->GetQuestId()); + SendCanTakeQuestResponse(QUEST_ERR_NONE); + TC_LOG_DEBUG("misc", "SatisfyQuestNextChain: Sent QUEST_ERR_NONE (questId: %u) because player already did or started next quest in chain.", qInfo->GetQuestId()); } return false; } @@ -16376,35 +16381,36 @@ void Player::SendQuestReward(Quest const* quest, uint32 XP) GetSession()->SendPacket(packet.Write()); } -void Player::SendQuestFailed(uint32 questId, InventoryResult reason) +void Player::SendQuestFailed(uint32 questID, InventoryResult reason) { - if (questId) + if (questID) { - WorldPacket data(SMSG_QUEST_GIVER_QUEST_FAILED, 4 + 4); - data << uint32(questId); - data << uint32(reason); // failed reason (valid reasons: 4, 16, 50, 17, 74, other values show default message) - GetSession()->SendPacket(&data); - TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_FAILED"); + WorldPackets::Quest::QuestGiverQuestFailed questGiverQuestFailed; + questGiverQuestFailed.QuestID = questID; + questGiverQuestFailed.Reason = reason; // failed reason (valid reasons: 4, 16, 50, 17, other values show default message) + GetSession()->SendPacket(questGiverQuestFailed.Write()); } } -void Player::SendQuestTimerFailed(uint32 quest_id) +void Player::SendQuestTimerFailed(uint32 questID) { - if (quest_id) + if (questID) { - WorldPacket data(SMSG_QUEST_UPDATE_FAILED_TIMER, 4); - data << uint32(quest_id); - GetSession()->SendPacket(&data); - TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_FAILEDTIMER"); + WorldPackets::Quest::QuestUpdateFailedTimer questUpdateFailedTimer; + questUpdateFailedTimer.QuestID = questID; + GetSession()->SendPacket(questUpdateFailedTimer.Write()); } } -void Player::SendCanTakeQuestResponse(QuestFailedReason msg) const +void Player::SendCanTakeQuestResponse(QuestFailedReason reason, bool sendErrorMessage /*= true*/, std::string reasonText /*= ""*/) const { - WorldPacket data(SMSG_QUEST_GIVER_INVALID_QUEST, 4); - data << uint32(msg); - GetSession()->SendPacket(&data); - TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_INVALID"); + WorldPackets::Quest::QuestGiverInvalidQuest questGiverInvalidQuest; + + questGiverInvalidQuest.Reason = reason; + questGiverInvalidQuest.SendErrorMessage = sendErrorMessage; + questGiverInvalidQuest.ReasonText = reasonText; + + GetSession()->SendPacket(questGiverInvalidQuest.Write()); } void Player::SendQuestConfirmAccept(Quest const* quest, Player* receiver) @@ -16426,19 +16432,16 @@ void Player::SendQuestConfirmAccept(Quest const* quest, Player* receiver) packet.QuestTitle = questTitle; receiver->GetSession()->SendPacket(packet.Write()); - - TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_CONFIRM_ACCEPT"); } -void Player::SendPushToPartyResponse(Player* player, uint8 msg) +void Player::SendPushToPartyResponse(Player* player, QuestPushReason reason) { if (player) { - WorldPackets::Quest::QuestPushResult data; + WorldPackets::Quest::QuestPushResultResponse data; data.SenderGUID = player->GetGUID(); - data.Result = msg; // valid values: 0-8 + data.Result = reason; // valid values: 0-13 SendDirectMessage(data.Write()); - TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_PUSH_RESULT"); } } @@ -16673,9 +16676,9 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) //"resettalents_time, talentTree, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " // 40 41 42 43 44 45 //"totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " - // 46 47 48 49 50 51 52 53 54 55 56 57 - //"health, power1, power2, power3, power4, power5, power6, instance_id, speccount, activespec, exploredZones, equipmentCache, " - // 58 59 60 61 62 + // 46 47 48 49 50 51 52 53 54 55 56 57 58 + //"health, power1, power2, power3, power4, power5, power6, instance_id, speccount, activespec, lootSpecId, exploredZones, equipmentCache, " + // 59 60 61 62 63 //"knownTitles, actionBars, grantableLevels, raidDifficulty, legacyRaidDifficulty FROM characters WHERE guid = '%u'", guid); PreparedQueryResult result = holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_FROM); if (!result) @@ -16745,8 +16748,8 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) SetUInt32Value(UNIT_FIELD_LEVEL, fields[6].GetUInt8()); SetUInt32Value(PLAYER_XP, fields[7].GetUInt32()); - _LoadIntoDataField(fields[56].GetCString(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE); - _LoadIntoDataField(fields[58].GetCString(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE*2); + _LoadIntoDataField(fields[57].GetCString(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE); + _LoadIntoDataField(fields[59].GetCString(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE*2); SetObjectScale(1.0f); SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f); @@ -16780,7 +16783,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) } // set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise) - SetByteValue(PLAYER_FIELD_BYTES, PLAYER_FIELD_BYTES_OFFSET_ACTION_BAR_TOGGLES, fields[59].GetUInt8()); + SetByteValue(PLAYER_FIELD_BYTES, PLAYER_FIELD_BYTES_OFFSET_ACTION_BAR_TOGGLES, fields[60].GetUInt8()); InitDisplayIds(); @@ -16816,8 +16819,8 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) uint32 instanceId = fields[53].GetUInt32(); SetDungeonDifficultyID(CheckLoadedDungeonDifficultyID(Difficulty(fields[39].GetUInt8()))); - SetRaidDifficultyID(CheckLoadedRaidDifficultyID(Difficulty(fields[61].GetUInt8()))); - SetLegacyRaidDifficultyID(CheckLoadedLegacyRaidDifficultyID(Difficulty(fields[62].GetUInt8()))); + SetRaidDifficultyID(CheckLoadedRaidDifficultyID(Difficulty(fields[62].GetUInt8()))); + SetLegacyRaidDifficultyID(CheckLoadedLegacyRaidDifficultyID(Difficulty(fields[63].GetUInt8()))); std::string taxi_nodes = fields[38].GetString(); @@ -17188,8 +17191,15 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) //mails are loaded only when needed ;-) - when player in game click on mailbox. //_LoadMail(); - SetTalentGroupsCount(fields[53].GetUInt8()); - SetActiveTalentGroup(fields[54].GetUInt8()); + SetTalentGroupsCount(fields[54].GetUInt8()); + SetActiveTalentGroup(fields[55].GetUInt8()); + + uint32 lootSpecId = fields[56].GetUInt32(); + if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(lootSpecId)) + { + if (chrSpec->ClassID == getClass()) + SetLootSpecId(lootSpecId); + } // sanity check if (GetTalentGroupsCount() > MAX_TALENT_GROUPS || GetActiveTalentGroup() > MAX_TALENT_GROUP || GetTalentGroupsCount() < MIN_TALENT_GROUPS) @@ -17442,6 +17452,8 @@ bool Player::isAllowedToLoot(const Creature* creature) switch (thisGroup->GetLootMethod()) { + case PERSONAL_LOOT: /// @todo implement personal loot (http://wow.gamepedia.com/Loot#Personal_Loot) + return false; case MASTER_LOOT: case FREE_FOR_ALL: return true; @@ -18569,9 +18581,11 @@ void Player::BindToInstance() WorldPackets::Instance::InstanceSaveCreated data; data.Gm = IsGameMaster(); GetSession()->SendPacket(data.Write()); - BindToInstance(mapSave, true); - - GetSession()->SendCalendarRaidLockout(mapSave, true); + if (!IsGameMaster()) + { + BindToInstance(mapSave, true); + GetSession()->SendCalendarRaidLockout(mapSave, true); + } } void Player::SetPendingBind(uint32 instanceId, uint32 bindTimer) @@ -18930,6 +18944,8 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt8(index++, GetTalentGroupsCount()); stmt->setUInt8(index++, GetActiveTalentGroup()); + stmt->setUInt32(index++, GetLootSpecId()); + ss.str(""); for (uint32 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i) ss << GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + i) << ' '; @@ -19067,6 +19083,8 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt8(index++, GetTalentGroupsCount()); stmt->setUInt8(index++, GetActiveTalentGroup()); + stmt->setUInt32(index++, GetLootSpecId()); + ss.str(""); for (uint32 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i) ss << GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + i) << ' '; @@ -20071,7 +20089,7 @@ void Player::SendResetInstanceSuccess(uint32 MapId) GetSession()->SendPacket(data.Write()); } -void Player::SendResetInstanceFailed(uint32 reason, uint32 MapId) +void Player::SendResetInstanceFailed(ResetFailedReason reason, uint32 mapID) { /*reasons for instance reset failure: // 0: There are players inside the instance. @@ -20080,7 +20098,7 @@ void Player::SendResetInstanceFailed(uint32 reason, uint32 MapId) */ WorldPackets::Instance::InstanceResetFailed data; - data.MapID = MapId; + data.MapID = mapID; data.ResetFailedReason = reason; GetSession()->SendPacket(data.Write()); } @@ -21671,14 +21689,9 @@ void Player::UpdateHomebindTime(uint32 time) // GMs never get homebind timer online if (m_InstanceValid || IsGameMaster()) { - if (m_HomebindTimer) // instance valid, but timer not reset - { - // hide reminder - WorldPacket data(SMSG_RAID_GROUP_ONLY, 4+4); - data << uint32(0); - data << uint32(0); - GetSession()->SendPacket(&data); - } + if (m_HomebindTimer) // instance valid, but timer not reset + SendRaidGroupOnlyMessage(RAID_GROUP_ERR_NONE, 0); + // instance is valid, reset homebind timer m_HomebindTimer = 0; } @@ -21697,10 +21710,7 @@ void Player::UpdateHomebindTime(uint32 time) // instance is invalid, start homebind timer m_HomebindTimer = 60000; // send message to player - WorldPacket data(SMSG_RAID_GROUP_ONLY, 4+4); - data << uint32(m_HomebindTimer); - data << uint32(1); - GetSession()->SendPacket(&data); + SendRaidGroupOnlyMessage(RAID_GROUP_ERR_REQUIREMENTS_UNMATCH, m_HomebindTimer); TC_LOG_DEBUG("maps", "PLAYER: Player '%s' (%s) will be teleported to homebind in 60 seconds", GetName().c_str(), GetGUID().ToString().c_str()); } } @@ -22733,6 +22743,7 @@ void Player::ApplyEquipCooldown(Item* pItem) WorldPackets::Item::ItemCooldown data; data.ItemGuid = pItem->GetGUID(); data.SpellID = effectData->SpellID; + data.Cooldown = 30 * IN_MILLISECONDS; // Always 30secs? GetSession()->SendPacket(data.Write()); } } @@ -23621,7 +23632,7 @@ void Player::RemoveItemDependentAurasAndCasts(Item* pItem) InterruptSpell(CurrentSpellTypes(i)); } -uint32 Player::GetResurrectionSpellId() +uint32 Player::GetResurrectionSpellId() const { // search priceless resurrection possibilities uint32 prio = 0; @@ -26747,3 +26758,12 @@ void Player::SendSpellCategoryCooldowns() SendDirectMessage(cooldowns.Write()); } + +void Player::SendRaidGroupOnlyMessage(RaidGroupReason reason, int32 delay) +{ + WorldPackets::Instance::RaidGroupOnly raidGroupOnly; + raidGroupOnly.Delay = delay; + raidGroupOnly.Reason = reason; + + GetSession()->SendPacket(raidGroupOnly.Write()); +} diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 6147090a0ff..4218a058798 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1721,11 +1721,11 @@ class Player : public Unit, public GridObject<Player> void SetQuestObjectiveData(Quest const* quest, int8 storageIndex, int32 data); void SendQuestComplete(Quest const* quest); void SendQuestReward(Quest const* quest, uint32 XP); - void SendQuestFailed(uint32 questId, InventoryResult reason = EQUIP_ERR_OK); - void SendQuestTimerFailed(uint32 questId); - void SendCanTakeQuestResponse(QuestFailedReason msg) const; + void SendQuestFailed(uint32 questID, InventoryResult reason = EQUIP_ERR_OK); + void SendQuestTimerFailed(uint32 questID); + void SendCanTakeQuestResponse(QuestFailedReason reason, bool sendErrorMessage = true, std::string reasonText = "") const; void SendQuestConfirmAccept(Quest const* quest, Player* receiver); - void SendPushToPartyResponse(Player* player, uint8 msg); + void SendPushToPartyResponse(Player* player, QuestPushReason reason); void SendQuestUpdateAddCredit(Quest const* quest, ObjectGuid guid, QuestObjective const& obj, uint16 count); void SendQuestUpdateAddPlayer(Quest const* quest, uint16 newCount, uint32 required); @@ -1894,6 +1894,10 @@ class Player : public Unit, public GridObject<Player> uint32 GetReputation(uint32 factionentry) const; std::string GetGuildName(); + // Loot Spec + void SetLootSpecId(uint32 id) { SetUInt32Value(PLAYER_FIELD_LOOT_SPEC_ID, id); } + uint32 GetLootSpecId() const { return GetUInt32Value(PLAYER_FIELD_LOOT_SPEC_ID); } + // Talents uint32 GetTalentResetCost() const { return _talentMgr->ResetTalentsCost; } void SetTalentResetCost(uint32 cost) { _talentMgr->ResetTalentsCost = cost; } @@ -2047,6 +2051,7 @@ class Player : public Unit, public GridObject<Player> static Difficulty CheckLoadedDungeonDifficultyID(Difficulty difficulty); static Difficulty CheckLoadedRaidDifficultyID(Difficulty difficulty); static Difficulty CheckLoadedLegacyRaidDifficultyID(Difficulty difficulty); + void SendRaidGroupOnlyMessage(RaidGroupReason reason, int32 delay); bool UpdateSkill(uint32 skill_id, uint32 step); bool UpdateSkillPro(uint16 skillId, int32 chance, uint32 step); @@ -2137,7 +2142,7 @@ class Player : public Unit, public GridObject<Player> void SendRaidDifficulty(bool legacy, int32 forcedDifficulty = -1); void ResetInstances(uint8 method, bool isRaid, bool isLegacy); void SendResetInstanceSuccess(uint32 MapId); - void SendResetInstanceFailed(uint32 reason, uint32 MapId); + void SendResetInstanceFailed(ResetFailedReason reason, uint32 mapID); void SendResetFailedNotify(uint32 mapid); virtual bool UpdatePosition(float x, float y, float z, float orientation, bool teleport = false) override; @@ -2153,7 +2158,7 @@ class Player : public Unit, public GridObject<Player> void SpawnCorpseBones(); void CreateCorpse(); void KillPlayer(); - uint32 GetResurrectionSpellId(); + uint32 GetResurrectionSpellId() const; void ResurrectPlayer(float restore_percent, bool applySickness = false); void BuildPlayerRepop(); void RepopAtGraveyard(); @@ -2390,7 +2395,6 @@ class Player : public Unit, public GridObject<Player> void UpdateSpeakTime(); bool CanSpeak() const; - void ChangeSpeakTime(int utime); /*********************************************************/ /*** VARIOUS SYSTEMS ***/ @@ -2572,7 +2576,6 @@ class Player : public Unit, public GridObject<Player> uint32 GetAchievementPoints() const; bool HasAchieved(uint32 achievementId) const; void ResetAchievements(); - void CheckAllAchievementCriteria(); void ResetAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, bool evenIfCriteriaComplete = false); void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, uint64 miscValue3 = 0, Unit* unit = NULL); void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0); @@ -2633,6 +2636,9 @@ class Player : public Unit, public GridObject<Player> void DeleteGarrison(); Garrison* GetGarrison() { return _garrison.get(); } + bool IsAdvancedCombatLoggingEnabled() const { return _advancedCombatLoggingEnabled; } + void SetAdvancedCombatLogging(bool enabled) { _advancedCombatLoggingEnabled = enabled; } + protected: // Gamemaster whisper whitelist GuidList WhisperList; @@ -2938,7 +2944,6 @@ class Player : public Unit, public GridObject<Player> MapReference m_mapRef; void UpdateCharmedAI(); - uint32 m_lastFallTime; float m_lastFallZ; @@ -2983,6 +2988,8 @@ class Player : public Unit, public GridObject<Player> uint32 _maxPersonalArenaRate; std::unique_ptr<Garrison> _garrison; + + bool _advancedCombatLoggingEnabled; }; void AddItemsSetItem(Player* player, Item* item); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 9a69f3b35ff..254d01ad308 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -67,6 +67,8 @@ #include "CombatPackets.h" #include "CombatLogPackets.h" #include "VehiclePackets.h" +#include "LootPackets.h" +#include "PartyPackets.h" #include <cmath> @@ -162,6 +164,12 @@ ProcEventInfo::ProcEventInfo(Unit* actor, Unit* actionTarget, Unit* procTarget, _damageInfo(damageInfo), _healInfo(healInfo) { } +SpellNonMeleeDamage::SpellNonMeleeDamage(Unit* _attacker, Unit* _target, uint32 _SpellID, uint32 _schoolMask) + : target(_target), attacker(_attacker), SpellID(_SpellID), damage(0), schoolMask(_schoolMask), + absorb(0), resist(0), periodicLog(false), blocked(0), HitInfo(0), cleanDamage(0), preHitHealth(_target->GetHealth()) +{ +} + SpellInfo const* ProcEventInfo::GetSpellInfo() const { /// WORKAROUND: unfinished new proc system @@ -1073,29 +1081,29 @@ void Unit::CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 dama damageInfo->damage = damage; } -void Unit::DealSpellDamage(SpellNonMeleeDamage* damageInfo, bool durabilityLoss) +uint32 Unit::DealSpellDamage(SpellNonMeleeDamage const* damageInfo, bool durabilityLoss) { - if (damageInfo == 0) - return; + if (!damageInfo) + return 0; Unit* victim = damageInfo->target; if (!victim) - return; + return 0; if (!victim->IsAlive() || victim->HasUnitState(UNIT_STATE_IN_FLIGHT) || (victim->GetTypeId() == TYPEID_UNIT && victim->ToCreature()->IsInEvadeMode())) - return; + return 0; SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(damageInfo->SpellID); - if (spellProto == NULL) + if (!spellProto) { TC_LOG_DEBUG("entities.unit", "Unit::DealSpellDamage has wrong damageInfo->SpellID: %u", damageInfo->SpellID); - return; + return 0; } // Call default DealDamage CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->absorb, BASE_ATTACK, MELEE_HIT_NORMAL); - DealDamage(victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss); + return DealDamage(victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss); } /// @todo for melee need create structure as in @@ -1389,7 +1397,7 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) // ...or immuned if (IsImmunedToDamage(i_spellProto)) { - victim->SendSpellDamageImmune(this, i_spellProto->Id); + victim->SendSpellDamageImmune(this, i_spellProto->Id, false); continue; } @@ -1401,22 +1409,24 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss) damage = this->SpellDamageBonusTaken(caster, i_spellProto, damage, SPELL_DIRECT_DAMAGE, (*dmgShieldItr)->GetSpellEffectInfo()); } + uint32 absorb = 0, resist = 0; + victim->CalcAbsorbResist(this, SpellSchoolMask(i_spellProto->SchoolMask), SPELL_DIRECT_DAMAGE, damage, &absorb, &resist, i_spellProto); // No Unit::CalcAbsorbResist here - opcode doesn't send that data - this damage is probably not affected by that victim->DealDamageMods(this, damage, NULL); - /// @todo Move this to a packet handler - WorldPacket data(SMSG_SPELL_DAMAGE_SHIELD, 8 + 8 + 4 + 4 + 4 + 4 + 4); - data << victim->GetGUID(); - data << GetGUID(); - data << uint32(i_spellProto->Id); - data << uint32(damage); // Damage - int32 overkill = int32(damage) - int32(GetHealth()); - data << uint32(overkill > 0 ? overkill : 0); // Overkill - data << uint32(i_spellProto->SchoolMask); - data << uint32(0); // FIX ME: Send resisted damage, both fully resisted and partly resisted - victim->SendMessageToSet(&data, true); + WorldPackets::CombatLog::SpellDamageShield damageShield; + damageShield.Attacker = victim->GetGUID(); + damageShield.Defender = GetGUID(); + damageShield.SpellID = i_spellProto->Id; + damageShield.TotalDamage = damage; + damageShield.OverKill = std::max(int32(damage) - int32(GetHealth()), 0); + damageShield.SchoolMask = i_spellProto->SchoolMask; + damageShield.LogAbsorbed = absorb; victim->DealDamage(this, damage, 0, SPELL_DIRECT_DAMAGE, i_spellProto->GetSchoolMask(), i_spellProto, true); + + damageShield.LogData.Initialize(this); + victim->SendCombatLogMessage(&damageShield); } } } @@ -1773,10 +1783,12 @@ void Unit::CalcAbsorbResist(Unit* victim, SpellSchoolMask schoolMask, DamageEffe uint32 split_absorb = 0; DealDamageMods(caster, splitDamage, &split_absorb); - SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo()->Id, splitDamage, schoolMask, split_absorb, 0, false, 0, false); - + SpellNonMeleeDamage log(this, caster, (*itr)->GetSpellInfo()->Id, schoolMask); CleanDamage cleanDamage = CleanDamage(splitDamage, 0, BASE_ATTACK, MELEE_HIT_NORMAL); - DealDamage(caster, splitDamage, &cleanDamage, DIRECT_DAMAGE, schoolMask, (*itr)->GetSpellInfo(), false); + log.damage = DealDamage(caster, splitDamage, &cleanDamage, DIRECT_DAMAGE, schoolMask, (*itr)->GetSpellInfo(), false); + log.absorb = split_absorb; + SendSpellNonMeleeDamageLog(&log); + // break 'Fear' and similar auras caster->ProcDamageAndSpellFor(true, this, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_NORMAL_HIT, BASE_ATTACK, (*itr)->GetSpellInfo(), splitDamage); } @@ -4805,36 +4817,25 @@ void Unit::RemoveAllGameObjects() } } -void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage* log) +void Unit::SendSpellNonMeleeDamageLog(SpellNonMeleeDamage const* log) { WorldPackets::CombatLog::SpellNonMeleeDamageLog packet; packet.Me = log->target->GetGUID(); packet.CasterGUID = log->attacker->GetGUID(); packet.SpellID = log->SpellID; packet.Damage = log->damage; - int32 overkill = log->damage - log->target->GetHealth(); - packet.Overkill = (overkill > 0 ? overkill : 0); + if (log->damage > log->preHitHealth) + packet.Overkill = log->damage - log->preHitHealth; + else + packet.Overkill = 0; + packet.SchoolMask = log->schoolMask; packet.ShieldBlock = log->blocked; packet.Resisted = log->resist; packet.Absorbed = log->absorb; - packet.Periodic = false; + packet.Periodic = log->periodicLog; packet.Flags = log->HitInfo; - SendMessageToSet(packet.Write(), true); -} - -void Unit::SendSpellNonMeleeDamageLog(Unit* target, uint32 SpellID, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit) -{ - SpellNonMeleeDamage log(this, target, SpellID, damageSchoolMask); - log.damage = Damage - AbsorbedDamage - Resist - Blocked; - log.absorb = AbsorbedDamage; - log.resist = Resist; - log.physicalLog = PhysicalDamage; - log.blocked = Blocked; - log.HitInfo = SPELL_HIT_TYPE_UNK1 | SPELL_HIT_TYPE_UNK3 | SPELL_HIT_TYPE_UNK6; - if (CriticalHit) - log.HitInfo |= SPELL_HIT_TYPE_CRIT; - SendSpellNonMeleeDamageLog(&log); + SendCombatLogMessage(&packet); } void Unit::ProcDamageAndSpell(Unit* victim, uint32 procAttacker, uint32 procVictim, uint32 procExtra, uint32 amount, WeaponAttackType attType, SpellInfo const* procSpell, SpellInfo const* procAura) @@ -4855,6 +4856,7 @@ void Unit::SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* info) data.TargetGUID = GetGUID(); data.CasterGUID = aura->GetCasterGUID(); data.SpellID = aura->GetId(); + data.LogData.Initialize(this); /// @todo: should send more logs in one packet when multistrike WorldPackets::CombatLog::SpellPeriodicAuraLog::SpellLogEffect spellLogEffect; @@ -4870,48 +4872,40 @@ void Unit::SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* info) data.Effects.push_back(spellLogEffect); - SendMessageToSet(data.Write(), true); + SendCombatLogMessage(&data); } void Unit::SendSpellMiss(Unit* target, uint32 spellID, SpellMissInfo missInfo) { - WorldPacket data(SMSG_SPELL_MISS_LOG, (4+8+1+4+8+1)); - data << uint32(spellID); - data << GetGUID(); - data << uint8(0); // can be 0 or 1 - data << uint32(1); // target count - // for (i = 0; i < target count; ++i) - data << target->GetGUID(); // target GUID - data << uint8(missInfo); - // end loop - SendMessageToSet(&data, true); + WorldPackets::CombatLog::SpellMissLog spellMissLog; + spellMissLog.SpellID = spellID; + spellMissLog.Caster = GetGUID(); + spellMissLog.Entries.emplace_back(target->GetGUID(), missInfo); + SendMessageToSet(spellMissLog.Write(), true); } void Unit::SendSpellDamageResist(Unit* target, uint32 spellId) { - WorldPacket data(SMSG_PROC_RESIST, 8+8+4+1); - data << GetGUID(); - data << target->GetGUID(); - data << uint32(spellId); - data << uint8(0); // bool - log format: 0-default, 1-debug - SendMessageToSet(&data, true); + WorldPackets::CombatLog::ProcResist procResist; + procResist.Caster = GetGUID(); + procResist.SpellID = spellId; + procResist.Target = target->GetGUID(); + SendMessageToSet(procResist.Write(), true); } -void Unit::SendSpellDamageImmune(Unit* target, uint32 spellId) +void Unit::SendSpellDamageImmune(Unit* target, uint32 spellId, bool isPeriodic) { - WorldPacket data(SMSG_SPELL_OR_DAMAGE_IMMUNE, 8+8+4+1); - data << GetGUID(); - data << target->GetGUID(); - data << uint32(spellId); - data << uint8(0); // bool - log format: 0-default, 1-debug - SendMessageToSet(&data, true); + WorldPackets::CombatLog::SpellOrDamageImmune spellOrDamageImmune; + spellOrDamageImmune.CasterGUID = GetGUID(); + spellOrDamageImmune.VictimGUID = target->GetGUID(); + spellOrDamageImmune.SpellID = spellId; + spellOrDamageImmune.IsPeriodic = isPeriodic; + SendMessageToSet(spellOrDamageImmune.Write(), true); } void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo) { - TC_LOG_DEBUG("entities.unit", "WORLD: Sending SMSG_ATTACKERSTATEUPDATE"); - - WorldPackets::Combat::AttackerStateUpdate packet; + WorldPackets::CombatLog::AttackerStateUpdate packet; packet.HitInfo = damageInfo->HitInfo; packet.AttackerGUID = damageInfo->attacker->GetGUID(); packet.VictimGUID = damageInfo->target->GetGUID(); @@ -4919,7 +4913,7 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo) int32 overkill = damageInfo->damage - damageInfo->target->GetHealth(); packet.OverDamage = (overkill < 0 ? -1 : overkill); - packet.SubDmg = WorldPackets::Combat::SubDamage(); + packet.SubDmg = boost::in_place(); packet.SubDmg->SchoolMask = damageInfo->damageSchoolMask; // School of sub damage packet.SubDmg->FDamage = damageInfo->damage; // sub damage packet.SubDmg->Damage = damageInfo->damage; // Sub Damage @@ -4929,7 +4923,9 @@ void Unit::SendAttackStateUpdate(CalcDamageInfo* damageInfo) packet.VictimState = damageInfo->TargetState; packet.BlockAmount = damageInfo->blocked_amount; - SendMessageToSet(packet.Write(), true); + packet.LogData.Initialize(damageInfo->attacker); + + SendCombatLogMessage(&packet); } void Unit::SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 /*SwingType*/, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount) @@ -6118,8 +6114,10 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere if (pPet && pPet->GetVictim() && damage && procSpell) { uint32 procDmg = damage / 2; - pPet->SendSpellNonMeleeDamageLog(pPet->GetVictim(), procSpell->Id, procDmg, procSpell->GetSchoolMask(), 0, 0, false, 0, false); - pPet->DealDamage(pPet->GetVictim(), procDmg, NULL, SPELL_DIRECT_DAMAGE, procSpell->GetSchoolMask(), procSpell, true); + + SpellNonMeleeDamage log(pPet, pPet->GetVictim(), procSpell->Id, procSpell->GetSchoolMask()); + log.damage = pPet->DealDamage(pPet->GetVictim(), procDmg, NULL, SPELL_DIRECT_DAMAGE, procSpell->GetSchoolMask(), procSpell, true); + pPet->SendSpellNonMeleeDamageLog(&log); break; } else @@ -8142,7 +8140,9 @@ void Unit::SendHealSpellLog(Unit* victim, uint32 spellID, uint32 health, uint32 if (hasLogData) SpellParsers.ReadSpellCastLogData(packet); */ - SendMessageToSet(spellHealLog.Write(), true); + + spellHealLog.LogData.Initialize(victim); + SendCombatLogMessage(&spellHealLog); } int32 Unit::HealBySpell(Unit* victim, SpellInfo const* spellInfo, uint32 addHealth, bool critical) @@ -8164,18 +8164,18 @@ void Unit::SendEnergizeSpellLog(Unit* victim, uint32 spellId, int32 damage, Powe data.SpellID = spellId; data.Type = powerType; data.Amount = damage; - - SendMessageToSet(data.Write(), true); + data.LogData.Initialize(victim); + SendCombatLogMessage(&data); } void Unit::EnergizeBySpell(Unit* victim, uint32 spellId, int32 damage, Powers powerType) { - SendEnergizeSpellLog(victim, spellId, damage, powerType); - // needs to be called after sending spell log victim->ModifyPower(powerType, damage); SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); victim->getHostileRefManager().threatAssist(this, float(damage) * 0.5f, spellInfo); + + SendEnergizeSpellLog(victim, spellId, damage, powerType); } uint32 Unit::SpellDamageBonusDone(Unit* victim, SpellInfo const* spellProto, uint32 pdamage, DamageEffectType damagetype, SpellEffectInfo const* effect, uint32 stack) const @@ -13453,9 +13453,9 @@ void Unit::Kill(Unit* victim, bool durabilityLoss) // call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop) if (isRewardAllowed && player && player != victim) { - WorldPacket data(SMSG_PARTY_KILL_LOG, (8+8)); // send event PARTY_KILL - data << player->GetGUID(); // player with killing blow - data << victim->GetGUID(); // victim + WorldPackets::Party::PartyKillLog partyKillLog; + partyKillLog.Player = player->GetGUID(); + partyKillLog.Victim = victim->GetGUID(); Player* looter = player; Group* group = player->GetGroup(); @@ -13463,7 +13463,7 @@ void Unit::Kill(Unit* victim, bool durabilityLoss) if (group) { - group->BroadcastPacket(&data, group->GetMemberGroup(player->GetGUID()) != 0); + group->BroadcastPacket(partyKillLog.Write(), group->GetMemberGroup(player->GetGUID()) != 0); if (creature) { @@ -13481,15 +13481,14 @@ void Unit::Kill(Unit* victim, bool durabilityLoss) } else { - player->SendDirectMessage(&data); + player->SendDirectMessage(partyKillLog.Write()); if (creature) { - WorldPacket data2(SMSG_LOOT_LIST, 8 + 1 + 1); - data2 << creature->GetGUID(); - data2 << uint8(0); // unk1 - data2 << uint8(0); // no group looter - player->SendMessageToSet(&data2, true); + WorldPackets::Loot::LootList lootList; + lootList.Owner = creature->GetGUID(); + + player->SendMessageToSet(lootList.Write(), true); } } @@ -15474,7 +15473,6 @@ void Unit::SendThreatListUpdate() { if (!getThreatManager().isThreatListEmpty()) { - TC_LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_UPDATE Message"); WorldPackets::Combat::ThreatUpdate packet; packet.UnitGUID = GetGUID(); ThreatContainer::StorageType const &tlist = getThreatManager().getThreatList(); @@ -15494,7 +15492,6 @@ void Unit::SendChangeCurrentVictimOpcode(HostileReference* pHostileReference) { if (!getThreatManager().isThreatListEmpty()) { - TC_LOG_DEBUG("entities.unit", "WORLD: Send SMSG_HIGHEST_THREAT_UPDATE Message"); WorldPackets::Combat::HighestThreatUpdate packet; packet.UnitGUID = GetGUID(); packet.HighestThreatGUID = pHostileReference->getUnitGuid(); @@ -15513,7 +15510,6 @@ void Unit::SendChangeCurrentVictimOpcode(HostileReference* pHostileReference) void Unit::SendClearThreatListOpcode() { - TC_LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_CLEAR Message"); WorldPackets::Combat::ThreatClear packet; packet.UnitGUID = GetGUID(); SendMessageToSet(packet.Write(), false); @@ -15521,7 +15517,6 @@ void Unit::SendClearThreatListOpcode() void Unit::SendRemoveFromThreatListOpcode(HostileReference* pHostileReference) { - TC_LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_REMOVE Message"); WorldPackets::Combat::ThreatRemove packet; packet.UnitGUID = GetGUID(); packet.AboutGUID = pHostileReference->getUnitGuid(); @@ -15647,9 +15642,9 @@ uint32 Unit::GetRemainingPeriodicAmount(ObjectGuid caster, uint32 spellId, AuraT void Unit::SendClearTarget() { - WorldPacket data(SMSG_BREAK_TARGET, GetPackGUID().size()); - data << GetPackGUID(); - SendMessageToSet(&data, false); + WorldPackets::Combat::BreakTarget breakTarget; + breakTarget.UnitGUID = GetGUID(); + SendMessageToSet(breakTarget.Write(), false); } uint32 Unit::GetResistance(SpellSchoolMask mask) const @@ -16249,9 +16244,9 @@ void Unit::DestroyForPlayer(Player* target) const { if (bg->isArena()) { - WorldPacket data(SMSG_DESTROY_ARENA_UNIT, 18); - data << GetGUID(); - target->GetSession()->SendPacket(&data); + WorldPackets::Battleground::DestroyArenaUnit destroyArenaUnit; + destroyArenaUnit.Guid = GetGUID(); + target->GetSession()->SendPacket(destroyArenaUnit.Write()); } } @@ -16442,3 +16437,105 @@ SpellInfo const* Unit::GetCastSpellInfo(SpellInfo const* spellInfo) const return spellInfo; } + +struct CombatLogSender +{ + WorldObject const* i_source; + WorldPackets::CombatLog::CombatLogServerPacket const* i_message; + float const i_distSq; + CombatLogSender(WorldObject const* src, WorldPackets::CombatLog::CombatLogServerPacket* msg, float dist) + : i_source(src), i_message(msg), i_distSq(dist * dist) + { + msg->Write(); + } + + bool IsInRangeHelper(WorldObject const* object) const; + void Visit(PlayerMapType &m); + void Visit(CreatureMapType &m); + void Visit(DynamicObjectMapType &m); + template<class SKIP> void Visit(GridRefManager<SKIP>&) { } + + void SendPacket(Player* player) + { + if (!player->HaveAtClient(i_source)) + return; + + if (player->IsAdvancedCombatLoggingEnabled()) + player->SendDirectMessage(i_message->GetFullLogPacket()); + else + player->SendDirectMessage(i_message->GetBasicLogPacket()); + } +}; + +bool CombatLogSender::IsInRangeHelper(WorldObject const* object) const +{ + if (!object->IsInPhase(i_source)) + return false; + + return object->GetExactDist2dSq(i_source) <= i_distSq; +} + +void CombatLogSender::Visit(PlayerMapType& m) +{ + for (PlayerMapType::iterator iter = m.begin(); iter != m.end(); ++iter) + { + Player* target = iter->GetSource(); + if (!IsInRangeHelper(target)) + continue; + + // Send packet to all who are sharing the player's vision + if (target->HasSharedVision()) + { + SharedVisionList::const_iterator i = target->GetSharedVisionList().begin(); + for (; i != target->GetSharedVisionList().end(); ++i) + if ((*i)->m_seer == target) + SendPacket(*i); + } + + if (target->m_seer == target || target->GetVehicle()) + SendPacket(target); + } +} + +void CombatLogSender::Visit(CreatureMapType& m) +{ + for (CreatureMapType::iterator iter = m.begin(); iter != m.end(); ++iter) + { + Creature* target = iter->GetSource(); + if (!IsInRangeHelper(target)) + continue; + + // Send packet to all who are sharing the creature's vision + if (target->HasSharedVision()) + { + SharedVisionList::const_iterator i = target->GetSharedVisionList().begin(); + for (; i != target->GetSharedVisionList().end(); ++i) + if ((*i)->m_seer == target) + SendPacket(*i); + } + } +} + +void CombatLogSender::Visit(DynamicObjectMapType& m) +{ + for (DynamicObjectMapType::iterator iter = m.begin(); iter != m.end(); ++iter) + { + DynamicObject* target = iter->GetSource(); + if (!IsInRangeHelper(target)) + continue; + + if (Unit* caster = target->GetCaster()) + { + // Send packet back to the caster if the caster has vision of dynamic object + Player* player = caster->ToPlayer(); + if (player && player->m_seer == target) + SendPacket(player); + } + } +} + +void Unit::SendCombatLogMessage(WorldPackets::CombatLog::CombatLogServerPacket* combatLog) const +{ + CombatLogSender notifier(this, combatLog, GetVisibilityRange()); + VisitNearbyWorldObject(GetVisibilityRange(), notifier); +} diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index fe7fd3c306a..af2cad003b9 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -410,6 +410,13 @@ namespace Movement { class MoveSpline; } +namespace WorldPackets +{ + namespace CombatLog + { + class CombatLogServerPacket; + } +} typedef std::list<Unit*> UnitList; typedef std::list<std::pair<Aura*, uint8>> DispelChargesList; @@ -1026,25 +1033,21 @@ struct CalcDamageInfo // Spell damage info structure based on structure sending in SMSG_SPELLNONMELEEDAMAGELOG opcode struct SpellNonMeleeDamage { - SpellNonMeleeDamage(Unit* _attacker, Unit* _target, uint32 _SpellID, uint32 _schoolMask) - : target(_target), attacker(_attacker), SpellID(_SpellID), damage(0), overkill(0), schoolMask(_schoolMask), - absorb(0), resist(0), physicalLog(false), unused(false), blocked(0), HitInfo(0), cleanDamage(0) - { } + SpellNonMeleeDamage(Unit* _attacker, Unit* _target, uint32 _SpellID, uint32 _schoolMask); Unit *target; Unit *attacker; uint32 SpellID; uint32 damage; - uint32 overkill; uint32 schoolMask; uint32 absorb; uint32 resist; - bool physicalLog; - bool unused; + bool periodicLog; uint32 blocked; uint32 HitInfo; // Used for help uint32 cleanDamage; + uint32 preHitHealth; }; struct SpellPeriodicAuraLogInfo @@ -1325,6 +1328,8 @@ class Unit : public WorldObject void CleanupBeforeRemoveFromMap(bool finalCleanup); void CleanupsBeforeDelete(bool finalCleanup = true) override; // used in ~Creature/~Player (or before mass creature delete to remove cross-references to already deleted units) + void SendCombatLogMessage(WorldPackets::CombatLog::CombatLogServerPacket* combatLog) const; + DiminishingLevels GetDiminishing(DiminishingGroup group); void IncrDiminishing(DiminishingGroup group); float ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration, Unit* caster, DiminishingLevels Level, int32 limitduration); @@ -1511,7 +1516,7 @@ class Unit : public WorldObject void HandleProcExtraAttackFor(Unit* victim); void CalculateSpellDamageTaken(SpellNonMeleeDamage* damageInfo, int32 damage, SpellInfo const* spellInfo, WeaponAttackType attackType = BASE_ATTACK, bool crit = false); - void DealSpellDamage(SpellNonMeleeDamage* damageInfo, bool durabilityLoss); + uint32 DealSpellDamage(SpellNonMeleeDamage const* damageInfo, bool durabilityLoss); // player or player's pet resilience (-1%) uint32 GetDamageReduction(uint32 damage) const { return GetCombatRatingDamageReduction(CR_RESILIENCE_PLAYER_DAMAGE_TAKEN, 1.0f, 100.0f, damage); } @@ -1620,12 +1625,11 @@ class Unit : public WorldObject void SendAttackStateUpdate(CalcDamageInfo* damageInfo); void SendAttackStateUpdate(uint32 HitInfo, Unit* target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount); - void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage* log); - void SendSpellNonMeleeDamageLog(Unit* target, uint32 SpellID, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit = false); + void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage const* log); void SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* pInfo); void SendSpellMiss(Unit* target, uint32 spellID, SpellMissInfo missInfo); void SendSpellDamageResist(Unit* target, uint32 spellId); - void SendSpellDamageImmune(Unit* target, uint32 spellId); + void SendSpellDamageImmune(Unit* target, uint32 spellId, bool isPeriodic); void NearTeleportTo(float x, float y, float z, float orientation, bool casting = false); void SendTeleportPacket(Position& pos); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 89b874697e5..3f595a2cd69 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -302,17 +302,8 @@ void ObjectMgr::LoadCreatureLocales() _creatureLocaleStore.clear(); // need for reload case - QueryResult result = WorldDatabase.Query("SELECT entry, " - "name_loc1, femaleName_loc1, subname_loc1, " - "name_loc2, femaleName_loc2, subname_loc2, " - "name_loc3, femaleName_loc3, subname_loc3, " - "name_loc4, femaleName_loc4, subname_loc4, " - "name_loc5, femaleName_loc5, subname_loc5, " - "name_loc6, femaleName_loc6, subname_loc6, " - "name_loc7, femaleName_loc7, subname_loc7, " - "name_loc8, femaleName_loc8, subname_loc8 " - "FROM locales_creature"); - + // 0 1 2 3 4 5 + QueryResult result = WorldDatabase.Query("SELECT entry, locale, Name, NameAlt, Title, TitleAlt FROM creature_template_locale"); if (!result) return; @@ -320,17 +311,24 @@ void ObjectMgr::LoadCreatureLocales() { Field* fields = result->Fetch(); - uint32 entry = fields[0].GetUInt32(); + uint32 id = fields[0].GetUInt32(); + std::string localeName = fields[1].GetString(); - CreatureLocale& data = _creatureLocaleStore[entry]; + std::string name = fields[2].GetString(); + std::string nameAlt = fields[3].GetString(); + std::string title = fields[4].GetString(); + std::string titleAlt = fields[5].GetString(); + + CreatureLocale& data = _creatureLocaleStore[id]; + LocaleConstant locale = GetLocaleByName(localeName); + if (locale == LOCALE_enUS) + continue; + + AddLocaleString(name, locale, data.Name); + AddLocaleString(nameAlt, locale, data.NameAlt); + AddLocaleString(title, locale, data.Title); + AddLocaleString(titleAlt, locale, data.TitleAlt); - for (uint8 i = OLD_TOTAL_LOCALES - 1; i > 0; --i) - { - LocaleConstant locale = (LocaleConstant) i; - AddLocaleString(fields[1 + 3 * (i - 1)].GetString(), locale, data.Name); - AddLocaleString(fields[1 + 3 * (i - 1) + 1].GetString(), locale, data.FemaleName); - AddLocaleString(fields[1 + 3 * (i - 1) + 2].GetString(), locale, data.SubName); - } } while (result->NextRow()); TC_LOG_INFO("server.loading", ">> Loaded %u creature locale strings in %u ms", uint32(_creatureLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime)); @@ -394,6 +392,8 @@ void ObjectMgr::LoadPointOfInterestLocales() PointOfInterestLocale& data = _pointOfInterestLocaleStore[id]; LocaleConstant locale = GetLocaleByName(localeName); + if (locale == LOCALE_enUS) + continue; AddLocaleString(name, locale, data.Name); } while (result->NextRow()); @@ -4467,6 +4467,8 @@ void ObjectMgr::LoadQuestTemplateLocale() QuestTemplateLocale& data = _questTemplateLocaleStore[id]; LocaleConstant locale = GetLocaleByName(localeName); + if (locale == LOCALE_enUS) + continue; AddLocaleString(logTitle, locale, data.LogTitle); AddLocaleString(logDescription, locale, data.LogDescription); @@ -4503,6 +4505,8 @@ void ObjectMgr::LoadQuestObjectivesLocale() QuestObjectivesLocale& data = _questObjectivesLocaleStore[id]; LocaleConstant locale = GetLocaleByName(localeName); + if (locale == LOCALE_enUS) + continue; AddLocaleString(Description, locale, data.Description); } @@ -5116,6 +5120,8 @@ void ObjectMgr::LoadPageTextLocales() PageTextLocale& data = _pageTextLocaleStore[id]; LocaleConstant locale = GetLocaleByName(localeName); + if (locale == LOCALE_enUS) + continue; AddLocaleString(text, locale, data.Text); } while (result->NextRow()); @@ -6403,6 +6409,8 @@ void ObjectMgr::LoadGameObjectLocales() GameObjectLocale& data = _gameObjectLocaleStore[id]; LocaleConstant locale = GetLocaleByName(localeName); + if (locale == LOCALE_enUS) + continue; AddLocaleString(name, locale, data.Name); AddLocaleString(castBarCaption, locale, data.CastBarCaption); @@ -7802,7 +7810,7 @@ SkillRangeType GetSkillRangeType(SkillRaceClassInfoEntry const* rcEntry) if (sObjectMgr->GetSkillTier(rcEntry->SkillTierID)) return SKILL_RANGE_RANK; - if (rcEntry->SkillID == SKILL_RUNEFORGING) + if (rcEntry->SkillID == SKILL_RUNEFORGING || rcEntry->SkillID == SKILL_RUNEFORGING_2) return SKILL_RANGE_MONO; switch (skill->CategoryID) diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 2391f152ab3..7689f518b10 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -36,6 +36,7 @@ #include "LFGMgr.h" #include "UpdateFieldFlags.h" #include "PartyPackets.h" +#include "LootPackets.h" Roll::Roll(ObjectGuid _guid, LootItem const& li) : itemGUID(_guid), itemid(li.itemid), itemRandomPropId(li.randomPropertyId), itemRandomSuffix(li.randomSuffix), itemCount(li.count), @@ -930,20 +931,17 @@ void Group::SendLooter(Creature* creature, Player* groupLooter) { ASSERT(creature); - WorldPacket data(SMSG_LOOT_LIST, (8+8)); - data << creature->GetGUID(); + WorldPackets::Loot::LootList lootList; + + lootList.Owner = creature->GetGUID(); if (GetLootMethod() == MASTER_LOOT && creature->loot.hasOverThresholdItem()) - data << GetMasterLooterGuid(); - else - data << uint8(0); + lootList.Master = GetMasterLooterGuid(); if (groupLooter) - data << groupLooter->GetPackGUID(); - else - data << uint8(0); + lootList.RoundRobinWinner = groupLooter->GetGUID(); - BroadcastPacket(&data, false); + BroadcastPacket(lootList.Write(), false); } void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject) @@ -2112,7 +2110,7 @@ void Group::ResetInstances(uint8 method, bool isRaid, bool isLegacy, Player* Sen if (SendMsgTo) { if (!isEmpty) - SendMsgTo->SendResetInstanceFailed(0, instanceSave->GetMapId()); + SendMsgTo->SendResetInstanceFailed(INSTANCE_RESET_FAILED, instanceSave->GetMapId()); else if (sWorld->getBoolConfig(CONFIG_INSTANCES_RESET_ANNOUNCE)) { if (Group* group = SendMsgTo->GetGroup()) diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 97a965da681..e93a1da83b3 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -31,6 +31,7 @@ #include "SocialMgr.h" #include "Opcodes.h" #include "ChatPackets.h" +#include "CalendarPackets.h" #define MAX_GUILD_BANK_TAB_TEXT_LEN 500 #define EMBLEM_PRICE 10 * GOLD @@ -2533,15 +2534,12 @@ void Guild::BroadcastPacketIfTrackingAchievement(WorldPacket const* packet, uint void Guild::MassInviteToEvent(WorldSession* session, uint32 minLevel, uint32 maxLevel, uint32 minRank) { - uint32 count = 0; - - WorldPacket data(SMSG_CALENDAR_EVENT_INITIAL_INVITES); - data << uint32(count); // count placeholder + WorldPackets::Calendar::CalendarEventInitialInvites packet; for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr) { // not sure if needed, maybe client checks it as well - if (count >= CALENDAR_MAX_INVITES) + if (packet.Invites.size() >= CALENDAR_MAX_INVITES) { if (Player* player = session->GetPlayer()) sCalendarMgr->SendCalendarCommandResult(player->GetGUID(), CALENDAR_ERROR_INVITES_EXCEEDED); @@ -2552,16 +2550,10 @@ void Guild::MassInviteToEvent(WorldSession* session, uint32 minLevel, uint32 max uint32 level = Player::GetLevelFromDB(member->GetGUID()); if (member->GetGUID() != session->GetPlayer()->GetGUID() && level >= minLevel && level <= maxLevel && member->IsRankNotLower(minRank)) - { - data << member->GetGUID(); - data << uint8(level); - ++count; - } + packet.Invites.emplace_back(member->GetGUID(), level); } - data.put<uint32>(0, count); - - session->SendPacket(&data); + session->SendPacket(packet.Write()); } // Members handling diff --git a/src/server/game/Handlers/CalendarHandler.cpp b/src/server/game/Handlers/CalendarHandler.cpp index a6f39fcd09b..e4426094748 100644 --- a/src/server/game/Handlers/CalendarHandler.cpp +++ b/src/server/game/Handlers/CalendarHandler.cpp @@ -19,10 +19,10 @@ /* ----- Opcodes Not Used yet ----- -SMSG_CALENDAR_EVENT_INVITE_NOTES [ packguid(Invitee), uint64(inviteId), string(Text), Boolean(Unk) ] -?CMSG_CALENDAR_EVENT_INVITE_NOTES [ uint32(unk1), uint32(unk2), uint32(unk3), uint32(unk4), uint32(unk5) ] -SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT [ uint64(inviteId), string(Text) ] -SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT [ uint64(eventId), uint32(eventTime), uint32(unkFlag), uint8(deletePending) ] +SMSG_CALENDAR_EVENT_INVITE_NOTES [ ObjectGuid(InviteGuid), bool(ClearPending), std::string(Notes), uint64(EventID) ] +?CMSG_CALENDAR_EVENT_INVITE_NOTES [ ObjectGuid(Guid), uint64(EventID), uint64(InviteID), uint64(ModeratorID), std::string(Notes) ] +SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT [ uint64(EventID), std::string(Notes) ] +SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT [ uint64(EventID), uint32(Date), uint32(Flags), uint8(Status) ] SMSG_CALENDAR_RAID_LOCKOUT_UPDATED SendCalendarRaidLockoutUpdated(InstanceSave const* save) @todo @@ -46,196 +46,119 @@ Copied events should probably have a new owner #include "DatabaseEnv.h" #include "GuildMgr.h" #include "WorldSession.h" +#include "CalendarPackets.h" -void WorldSession::HandleCalendarGetCalendar(WorldPacket& /*recvData*/) +void WorldSession::HandleCalendarGetCalendar(WorldPackets::Calendar::CalendarGetCalendar& /*calendarGetCalendar*/) { ObjectGuid guid = _player->GetGUID(); - TC_LOG_DEBUG("network", "CMSG_CALENDAR_GET [%s]", guid.ToString().c_str()); - time_t currTime = time(NULL); - WorldPacket data(SMSG_CALENDAR_SEND_CALENDAR, 1000); // Average size if no instance + WorldPackets::Calendar::CalendarSendCalendar packet; + packet.ServerNow = currTime; + packet.RaidOrigin = 1135753200; // Constant date, unk (28.12.2005 07:00) + packet.ServerTime = currTime; - CalendarInviteStore invites = sCalendarMgr->GetPlayerInvites(guid); - data << uint32(invites.size()); - for (CalendarInviteStore::const_iterator itr = invites.begin(); itr != invites.end(); ++itr) + CalendarInviteStore playerInvites = sCalendarMgr->GetPlayerInvites(guid); + for (auto const& invite : playerInvites) { - data << uint64((*itr)->GetEventId()); - data << uint64((*itr)->GetInviteId()); - data << uint8((*itr)->GetStatus()); - data << uint8((*itr)->GetRank()); - - if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent((*itr)->GetEventId())) - { - data << uint8(calendarEvent->IsGuildEvent()); - data << calendarEvent->GetCreatorGUID(); - } - else - { - data << uint8(0); - data << (*itr)->GetSenderGUID(); - } + WorldPackets::Calendar::CalendarSendCalendarInviteInfo inviteInfo; + inviteInfo.EventID = invite->GetEventId(); + inviteInfo.InviteID = invite->GetInviteId(); + inviteInfo.InviterGuid = invite->GetSenderGUID(); + inviteInfo.Status = invite->GetStatus(); + inviteInfo.Moderator = invite->GetRank(); + if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(invite->GetEventId())) + inviteInfo.InviteType = calendarEvent->IsGuildEvent() && calendarEvent->GetGuildId() == _player->GetGuildId(); + + packet.Invites.push_back(inviteInfo); } CalendarEventStore playerEvents = sCalendarMgr->GetPlayerEvents(guid); - data << uint32(playerEvents.size()); - for (CalendarEventStore::const_iterator itr = playerEvents.begin(); itr != playerEvents.end(); ++itr) + for (auto const& event : playerEvents) { - CalendarEvent* calendarEvent = *itr; - - data << uint64(calendarEvent->GetEventId()); - data << calendarEvent->GetTitle(); - data << uint32(calendarEvent->GetType()); - data.AppendPackedTime(calendarEvent->GetEventTime()); - data << uint32(calendarEvent->GetFlags()); - data << int32(calendarEvent->GetDungeonId()); - - Guild* guild = sGuildMgr->GetGuildById(calendarEvent->GetGuildId()); - data << (guild ? guild->GetGUID() : ObjectGuid::Empty); - - data << calendarEvent->GetCreatorGUID(); + WorldPackets::Calendar::CalendarSendCalendarEventInfo eventInfo; + eventInfo.EventID = event->GetEventId(); + eventInfo.Date = event->GetDate(); + Guild* guild = sGuildMgr->GetGuildById(event->GetGuildId()); + eventInfo.EventGuildID = guild ? guild->GetGUID() : ObjectGuid::Empty; + eventInfo.EventName = event->GetTitle(); + eventInfo.EventType = event->GetType(); + eventInfo.Flags = event->GetFlags(); + eventInfo.OwnerGuid = event->GetOwnerGUID(); + eventInfo.TextureID = event->GetTextureId(); + + packet.Events.push_back(eventInfo); } - data << uint32(currTime); // server time - data.AppendPackedTime(currTime); // zone time - - ByteBuffer dataBuffer; - uint32 boundCounter = 0; for (uint8 i = 0; i < MAX_DIFFICULTY; ++i) { Player::BoundInstancesMap boundInstances = _player->GetBoundInstances(Difficulty(i)); - for (Player::BoundInstancesMap::const_iterator itr = boundInstances.begin(); itr != boundInstances.end(); ++itr) + for (auto const& boundInstance : boundInstances) { - if (itr->second.perm) + if (boundInstance.second.perm) { - InstanceSave const* save = itr->second.save; - dataBuffer << uint32(save->GetMapId()); - dataBuffer << uint32(save->GetDifficultyID()); - dataBuffer << uint32(save->GetResetTime() - currTime); - dataBuffer << uint64(save->GetInstanceId()); // instance save id as unique instance copy id - ++boundCounter; + WorldPackets::Calendar::CalendarSendCalendarRaidLockoutInfo lockoutInfo; + + InstanceSave const* save = boundInstance.second.save; + lockoutInfo.MapID = save->GetMapId(); + lockoutInfo.DifficultyID = save->GetDifficultyID(); + lockoutInfo.ExpireTime = save->GetResetTime() - currTime; + lockoutInfo.InstanceID = save->GetInstanceId(); // instance save id as unique instance copy id + + packet.RaidLockouts.push_back(lockoutInfo); } } } - data << uint32(boundCounter); - data.append(dataBuffer); - - data << uint32(1135753200); // Constant date, unk (28.12.2005 07:00) - - // Reuse variables - boundCounter = 0; std::set<uint32> sentMaps; - dataBuffer.clear(); - ResetTimeByMapDifficultyMap const& resets = sInstanceSaveMgr->GetResetTimeMap(); - for (ResetTimeByMapDifficultyMap::const_iterator itr = resets.begin(); itr != resets.end(); ++itr) + for (auto const& reset : resets) { - uint32 mapId = PAIR32_LOPART(itr->first); - if (sentMaps.find(mapId) != sentMaps.end()) + uint32 mapID = PAIR64_LOPART(reset.first); + if (sentMaps.find(mapID) != sentMaps.end()) continue; - MapEntry const* mapEntry = sMapStore.LookupEntry(mapId); + MapEntry const* mapEntry = sMapStore.LookupEntry(mapID); if (!mapEntry || !mapEntry->IsRaid()) continue; - sentMaps.insert(mapId); - - dataBuffer << int32(mapId); - dataBuffer << int32(itr->second - currTime); - dataBuffer << int32(0); // Never seen anything else in sniffs - still unknown - ++boundCounter; - } - - data << uint32(boundCounter); - data.append(dataBuffer); - - /// @todo Fix this, how we do know how many and what holidays to send? - uint32 holidayCount = 0; - data << uint32(holidayCount); - for (uint32 i = 0; i < holidayCount; ++i) - { - HolidaysEntry const* holiday = sHolidaysStore.LookupEntry(666); - - data << uint32(holiday->ID); // m_ID - data << uint32(holiday->Region); // m_region, might be looping - data << uint32(holiday->Looping); // m_looping, might be region - data << uint32(holiday->Priority); // m_priority - data << uint32(holiday->CalendarFilterType); // m_calendarFilterType - - for (uint8 j = 0; j < MAX_HOLIDAY_DATES; ++j) - data << uint32(holiday->Date[j]); // 26 * m_date -- WritePackedTime ? - - for (uint8 j = 0; j < MAX_HOLIDAY_DURATIONS; ++j) - data << uint32(holiday->Duration[j]); // 10 * m_duration + sentMaps.insert(mapID); + WorldPackets::Calendar::CalendarSendCalendarRaidResetInfo resetInfo; + resetInfo.MapID = mapID; + resetInfo.Duration = reset.second - currTime; + resetInfo.Offset = 0; // Never seen anything else in sniffs - still unknown - for (uint8 j = 0; j < MAX_HOLIDAY_FLAGS; ++j) - data << uint32(holiday->CalendarFlags[j]); // 10 * m_calendarFlags - - data << holiday->TextureFilename->Str[sWorld->GetDefaultDbcLocale()]; // m_textureFilename (holiday name) + packet.RaidResets.push_back(resetInfo); } - SendPacket(&data); + SendPacket(packet.Write()); } -void WorldSession::HandleCalendarGetEvent(WorldPacket& recvData) +void WorldSession::HandleCalendarGetEvent(WorldPackets::Calendar::CalendarGetEvent& calendarGetEvent) { - uint64 eventId; - recvData >> eventId; - - TC_LOG_DEBUG("network", "CMSG_CALENDAR_GET_EVENT. Player [%s] Event [" UI64FMTD "]", _player->GetGUID().ToString().c_str(), eventId); - - if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(eventId)) + if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarGetEvent.EventID)) sCalendarMgr->SendCalendarEvent(_player->GetGUID(), *calendarEvent, CALENDAR_SENDTYPE_GET); else sCalendarMgr->SendCalendarCommandResult(_player->GetGUID(), CALENDAR_ERROR_EVENT_INVALID); } -void WorldSession::HandleCalendarGuildFilter(WorldPacket& recvData) +void WorldSession::HandleCalendarGuildFilter(WorldPackets::Calendar::CalendarGuildFilter& calendarGuildFilter) { - TC_LOG_DEBUG("network", "CMSG_CALENDAR_GUILD_FILTER [%s]", _player->GetGUID().ToString().c_str()); - - uint32 minLevel; - uint32 maxLevel; - uint32 minRank; - - recvData >> minLevel >> maxLevel >> minRank; - if (Guild* guild = sGuildMgr->GetGuildById(_player->GetGuildId())) - guild->MassInviteToEvent(this, minLevel, maxLevel, minRank); - - TC_LOG_DEBUG("network", "CMSG_CALENDAR_GUILD_FILTER: Min level [%d], Max level [%d], Min rank [%d]", minLevel, maxLevel, minRank); + guild->MassInviteToEvent(this, calendarGuildFilter.MinLevel, calendarGuildFilter.MaxLevel, calendarGuildFilter.MaxRankOrder); } -void WorldSession::HandleCalendarAddEvent(WorldPacket& recvData) +void WorldSession::HandleCalendarAddEvent(WorldPackets::Calendar::CalendarAddEvent& calendarAddEvent) { ObjectGuid guid = _player->GetGUID(); - std::string title; - std::string description; - uint8 type; - uint8 repeatable; - uint32 maxInvites; - int32 dungeonId; - uint32 eventPackedTime; - uint32 unkPackedTime; - uint32 flags; - - recvData >> title >> description >> type >> repeatable >> maxInvites >> dungeonId; - recvData.ReadPackedTime(eventPackedTime); - recvData.ReadPackedTime(unkPackedTime); - recvData >> flags; - // prevent events in the past // To Do: properly handle timezones and remove the "- time_t(86400L)" hack - if (time_t(eventPackedTime) < (time(NULL) - time_t(86400L))) - { - recvData.rfinish(); + if (calendarAddEvent.EventInfo.Time < (time(NULL) - time_t(86400L))) return; - } - CalendarEvent* calendarEvent = new CalendarEvent(sCalendarMgr->GetFreeEventId(), guid, UI64LIT(0), CalendarEventType(type), dungeonId, - time_t(eventPackedTime), flags, time_t(unkPackedTime), title, description); + CalendarEvent* calendarEvent = new CalendarEvent(sCalendarMgr->GetFreeEventId(), guid, UI64LIT(0), CalendarEventType(calendarAddEvent.EventInfo.EventType), calendarAddEvent.EventInfo.TextureID, + calendarAddEvent.EventInfo.Time, calendarAddEvent.EventInfo.Flags, calendarAddEvent.EventInfo.Title, calendarAddEvent.EventInfo.Description, time_t(0)); if (calendarEvent->IsGuildEvent() || calendarEvent->IsGuildAnnouncement()) if (Player* creator = ObjectAccessor::FindPlayer(guid)) @@ -243,108 +166,52 @@ void WorldSession::HandleCalendarAddEvent(WorldPacket& recvData) if (calendarEvent->IsGuildAnnouncement()) { - // 946684800 is 01/01/2000 00:00:00 - default response time - CalendarInvite invite(0, calendarEvent->GetEventId(), ObjectGuid::Empty, guid, 946684800, CALENDAR_STATUS_NOT_SIGNED_UP, CALENDAR_RANK_PLAYER, ""); + CalendarInvite invite(0, calendarEvent->GetEventId(), ObjectGuid::Empty, guid, CALENDAR_DEFAULT_RESPONSE_TIME, CALENDAR_STATUS_NOT_SIGNED_UP, CALENDAR_RANK_PLAYER, ""); // WARNING: By passing pointer to a local variable, the underlying method(s) must NOT perform any kind // of storage of the pointer as it will lead to memory corruption sCalendarMgr->AddInvite(calendarEvent, &invite); } else { - // client limits the amount of players to be invited to 100 - const uint32 MaxPlayerInvites = 100; - - uint32 inviteCount; - ObjectGuid invitee[MaxPlayerInvites]; - uint8 status[MaxPlayerInvites]; - uint8 rank[MaxPlayerInvites]; - - memset(status, 0, sizeof(status)); - memset(rank, 0, sizeof(rank)); - - try - { - recvData >> inviteCount; - - for (uint32 i = 0; i < inviteCount && i < MaxPlayerInvites; ++i) - { - recvData >> invitee[i]; - recvData >> status[i] >> rank[i]; - } - } - catch (ByteBufferException const&) - { - delete calendarEvent; - calendarEvent = NULL; - throw; - } - SQLTransaction trans; - if (inviteCount > 1) + if (calendarAddEvent.EventInfo.Invites.size() > 1) trans = CharacterDatabase.BeginTransaction(); - for (uint32 i = 0; i < inviteCount && i < MaxPlayerInvites; ++i) + for (uint32 i = 0; i < calendarAddEvent.EventInfo.Invites.size(); ++i) { - // 946684800 is 01/01/2000 00:00:00 - default response time - CalendarInvite* invite = new CalendarInvite(sCalendarMgr->GetFreeInviteId(), calendarEvent->GetEventId(), invitee[i], guid, 946684800, CalendarInviteStatus(status[i]), CalendarModerationRank(rank[i]), ""); + CalendarInvite* invite = new CalendarInvite(sCalendarMgr->GetFreeInviteId(), calendarEvent->GetEventId(), calendarAddEvent.EventInfo.Invites[i].Guid, + guid, CALENDAR_DEFAULT_RESPONSE_TIME, CalendarInviteStatus(calendarAddEvent.EventInfo.Invites[i].Status), + CalendarModerationRank(calendarAddEvent.EventInfo.Invites[i].Moderator), ""); sCalendarMgr->AddInvite(calendarEvent, invite, trans); } - if (inviteCount > 1) + if (calendarAddEvent.EventInfo.Invites.size() > 1) CharacterDatabase.CommitTransaction(trans); } sCalendarMgr->AddEvent(calendarEvent, CALENDAR_SENDTYPE_ADD); } -void WorldSession::HandleCalendarUpdateEvent(WorldPacket& recvData) +void WorldSession::HandleCalendarUpdateEvent(WorldPackets::Calendar::CalendarUpdateEvent& calendarUpdateEvent) { ObjectGuid guid = _player->GetGUID(); - time_t oldEventTime; - - uint64 eventId; - uint64 inviteId; - std::string title; - std::string description; - uint8 type; - uint8 repetitionType; - uint32 maxInvites; - int32 dungeonId; - uint32 eventPackedTime; - uint32 timeZoneTime; - uint32 flags; - - recvData >> eventId >> inviteId >> title >> description >> type >> repetitionType >> maxInvites >> dungeonId; - recvData.ReadPackedTime(eventPackedTime); - recvData.ReadPackedTime(timeZoneTime); - recvData >> flags; + time_t oldEventTime = time_t(0); // prevent events in the past // To Do: properly handle timezones and remove the "- time_t(86400L)" hack - if (time_t(eventPackedTime) < (time(NULL) - time_t(86400L))) - { - recvData.rfinish(); + if (calendarUpdateEvent.EventInfo.Time < (time(NULL) - time_t(86400L))) return; - } - - TC_LOG_DEBUG("network", "CMSG_CALENDAR_UPDATE_EVENT [%s] EventId [" UI64FMTD - "], InviteId [" UI64FMTD "] Title %s, Description %s, type %u " - "Repeatable %u, MaxInvites %u, Dungeon ID %d, Time %u " - "Time2 %u, Flags %u", guid.ToString().c_str(), eventId, inviteId, title.c_str(), - description.c_str(), type, repetitionType, maxInvites, dungeonId, - eventPackedTime, timeZoneTime, flags); - if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(eventId)) + if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarUpdateEvent.EventInfo.EventID)) { - oldEventTime = calendarEvent->GetEventTime(); + oldEventTime = calendarEvent->GetDate(); - calendarEvent->SetType(CalendarEventType(type)); - calendarEvent->SetFlags(flags); - calendarEvent->SetEventTime(time_t(eventPackedTime)); - calendarEvent->SetTimeZoneTime(time_t(timeZoneTime)); // Not sure, seems constant from the little sniffs we have - calendarEvent->SetDungeonId(dungeonId); - calendarEvent->SetTitle(title); - calendarEvent->SetDescription(description); + calendarEvent->SetType(CalendarEventType(calendarUpdateEvent.EventInfo.EventType)); + calendarEvent->SetFlags(calendarUpdateEvent.EventInfo.Flags); + calendarEvent->SetDate(calendarUpdateEvent.EventInfo.Time); + calendarEvent->SetTextureId(calendarUpdateEvent.EventInfo.TextureID); + calendarEvent->SetTitle(calendarUpdateEvent.EventInfo.Title); + calendarEvent->SetDescription(calendarUpdateEvent.EventInfo.Description); sCalendarMgr->UpdateEvent(calendarEvent); sCalendarMgr->SendCalendarEventUpdateAlert(*calendarEvent, oldEventTime); @@ -353,44 +220,28 @@ void WorldSession::HandleCalendarUpdateEvent(WorldPacket& recvData) sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID); } -void WorldSession::HandleCalendarRemoveEvent(WorldPacket& recvData) +void WorldSession::HandleCalendarRemoveEvent(WorldPackets::Calendar::CalendarRemoveEvent& calendarRemoveEvent) { ObjectGuid guid = _player->GetGUID(); - uint64 eventId; - - recvData >> eventId; - recvData.rfinish(); // Skip flags & invite ID, we don't use them - - sCalendarMgr->RemoveEvent(eventId, guid); + sCalendarMgr->RemoveEvent(calendarRemoveEvent.EventID, guid); } -void WorldSession::HandleCalendarCopyEvent(WorldPacket& recvData) +void WorldSession::HandleCalendarCopyEvent(WorldPackets::Calendar::CalendarCopyEvent& calendarCopyEvent) { ObjectGuid guid = _player->GetGUID(); - uint64 eventId; - uint64 inviteId; - uint32 eventTime; - - recvData >> eventId >> inviteId; - recvData.ReadPackedTime(eventTime); - TC_LOG_DEBUG("network", "CMSG_CALENDAR_COPY_EVENT [%s], EventId [" UI64FMTD - "] inviteId [" UI64FMTD "] Time: %u", guid.ToString().c_str(), eventId, inviteId, eventTime); // prevent events in the past // To Do: properly handle timezones and remove the "- time_t(86400L)" hack - if (time_t(eventTime) < (time(NULL) - time_t(86400L))) - { - recvData.rfinish(); + if (calendarCopyEvent.Date < (time(NULL) - time_t(86400L))) return; - } - if (CalendarEvent* oldEvent = sCalendarMgr->GetEvent(eventId)) + if (CalendarEvent* oldEvent = sCalendarMgr->GetEvent(calendarCopyEvent.EventID)) { CalendarEvent* newEvent = new CalendarEvent(*oldEvent, sCalendarMgr->GetFreeEventId()); - newEvent->SetEventTime(time_t(eventTime)); + newEvent->SetDate(calendarCopyEvent.Date); sCalendarMgr->AddEvent(newEvent, CALENDAR_SENDTYPE_COPY); - CalendarInviteStore invites = sCalendarMgr->GetEventInvites(eventId); + CalendarInviteStore invites = sCalendarMgr->GetEventInvites(calendarCopyEvent.EventID); SQLTransaction trans; if (invites.size() > 1) trans = CharacterDatabase.BeginTransaction(); @@ -400,31 +251,21 @@ void WorldSession::HandleCalendarCopyEvent(WorldPacket& recvData) if (invites.size() > 1) CharacterDatabase.CommitTransaction(trans); - // should we change owner when somebody makes a copy of event owned by another person? + // Should we change owner when somebody makes a copy of event owned by another person? } else sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID); } -void WorldSession::HandleCalendarEventInvite(WorldPacket& recvData) +void WorldSession::HandleCalendarEventInvite(WorldPackets::Calendar::CalendarEventInvite& calendarEventInvite) { - TC_LOG_DEBUG("network", "CMSG_CALENDAR_EVENT_INVITE"); - ObjectGuid playerGuid = _player->GetGUID(); - uint64 eventId; - uint64 inviteId; - std::string name; - bool isPreInvite; - bool isGuildEvent; - ObjectGuid inviteeGuid; uint32 inviteeTeam = 0; ObjectGuid::LowType inviteeGuildId = UI64LIT(0); - recvData >> eventId >> inviteId >> name >> isPreInvite >> isGuildEvent; - - if (Player* player = ObjectAccessor::FindConnectedPlayerByName(name)) + if (Player* player = ObjectAccessor::FindConnectedPlayerByName(calendarEventInvite.Name)) { // Invitee is online inviteeGuid = player->GetGUID(); @@ -435,7 +276,7 @@ void WorldSession::HandleCalendarEventInvite(WorldPacket& recvData) { // Invitee offline, get data from database PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GUID_RACE_ACC_BY_NAME); - stmt->setString(0, name); + stmt->setString(0, calendarEventInvite.Name); if (PreparedQueryResult result = CharacterDatabase.Query(stmt)) { Field* fields = result->Fetch(); @@ -462,14 +303,14 @@ void WorldSession::HandleCalendarEventInvite(WorldPacket& recvData) Field* fields = result->Fetch(); if (fields[0].GetUInt8() & SOCIAL_FLAG_IGNORED) { - sCalendarMgr->SendCalendarCommandResult(playerGuid, CALENDAR_ERROR_IGNORING_YOU_S, name.c_str()); + sCalendarMgr->SendCalendarCommandResult(playerGuid, CALENDAR_ERROR_IGNORING_YOU_S, calendarEventInvite.Name.c_str()); return; } } - if (!isPreInvite) + if (!calendarEventInvite.Creating) { - if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(eventId)) + if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarEventInvite.EventID)) { if (calendarEvent->IsGuildEvent() && calendarEvent->GetGuildId() == inviteeGuildId) { @@ -478,8 +319,7 @@ void WorldSession::HandleCalendarEventInvite(WorldPacket& recvData) return; } - // 946684800 is 01/01/2000 00:00:00 - default response time - CalendarInvite* invite = new CalendarInvite(sCalendarMgr->GetFreeInviteId(), eventId, inviteeGuid, playerGuid, 946684800, CALENDAR_STATUS_INVITED, CALENDAR_RANK_PLAYER, ""); + CalendarInvite* invite = new CalendarInvite(sCalendarMgr->GetFreeInviteId(), calendarEventInvite.EventID, inviteeGuid, playerGuid, CALENDAR_DEFAULT_RESPONSE_TIME, CALENDAR_STATUS_INVITED, CALENDAR_RANK_PLAYER, ""); sCalendarMgr->AddInvite(calendarEvent, invite); } else @@ -487,28 +327,24 @@ void WorldSession::HandleCalendarEventInvite(WorldPacket& recvData) } else { - if (isGuildEvent && inviteeGuildId == _player->GetGuildId()) + if (calendarEventInvite.IsSignUp && inviteeGuildId == _player->GetGuildId()) { sCalendarMgr->SendCalendarCommandResult(playerGuid, CALENDAR_ERROR_NO_GUILD_INVITES); return; } - // 946684800 is 01/01/2000 00:00:00 - default response time - CalendarInvite invite(inviteId, 0, inviteeGuid, playerGuid, 946684800, CALENDAR_STATUS_INVITED, CALENDAR_RANK_PLAYER, ""); + CalendarInvite invite(sCalendarMgr->GetFreeInviteId(), 0L, inviteeGuid, playerGuid, CALENDAR_DEFAULT_RESPONSE_TIME, CALENDAR_STATUS_INVITED, CALENDAR_RANK_PLAYER, ""); sCalendarMgr->SendCalendarEventInvite(invite); } } -void WorldSession::HandleCalendarEventSignup(WorldPacket& recvData) +void WorldSession::HandleCalendarEventSignup(WorldPackets::Calendar::CalendarEventSignUp& calendarEventSignUp) { ObjectGuid guid = _player->GetGUID(); - uint64 eventId; - bool tentative; - recvData >> eventId >> tentative; - TC_LOG_DEBUG("network", "CMSG_CALENDAR_EVENT_SIGNUP [%s] EventId [" UI64FMTD "] Tentative %u", guid.ToString().c_str(), eventId, tentative); + TC_LOG_DEBUG("network", "CMSG_CALENDAR_EVENT_SIGNUP [%s] EventId [" UI64FMTD "] Tentative %u", guid.ToString().c_str(), calendarEventSignUp.EventID, calendarEventSignUp.Tentative); - if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(eventId)) + if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarEventSignUp.EventID)) { if (calendarEvent->IsGuildEvent() && calendarEvent->GetGuildId() != _player->GetGuildId()) { @@ -516,8 +352,8 @@ void WorldSession::HandleCalendarEventSignup(WorldPacket& recvData) return; } - CalendarInviteStatus status = tentative ? CALENDAR_STATUS_TENTATIVE : CALENDAR_STATUS_SIGNED_UP; - CalendarInvite* invite = new CalendarInvite(sCalendarMgr->GetFreeInviteId(), eventId, guid, guid, time(NULL), status, CALENDAR_RANK_PLAYER, ""); + CalendarInviteStatus status = calendarEventSignUp.Tentative ? CALENDAR_STATUS_TENTATIVE : CALENDAR_STATUS_SIGNED_UP; + CalendarInvite* invite = new CalendarInvite(sCalendarMgr->GetFreeInviteId(), calendarEventSignUp.EventID, guid, guid, time(NULL), status, CALENDAR_RANK_PLAYER, ""); sCalendarMgr->AddInvite(calendarEvent, invite); sCalendarMgr->SendCalendarClearPendingAction(guid); } @@ -525,31 +361,23 @@ void WorldSession::HandleCalendarEventSignup(WorldPacket& recvData) sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID); } -void WorldSession::HandleCalendarEventRsvp(WorldPacket& recvData) +void WorldSession::HandleCalendarEventRsvp(WorldPackets::Calendar::CalendarEventRSVP& calendarEventRSVP) { ObjectGuid guid = _player->GetGUID(); - uint64 eventId; - uint64 inviteId; - uint32 status; - recvData >> eventId >> inviteId >> status; - TC_LOG_DEBUG("network", "CMSG_CALENDAR_EVENT_RSVP [%s] EventId [" - UI64FMTD "], InviteId [" UI64FMTD "], status %u", guid.ToString().c_str(), eventId, - inviteId, status); - - if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(eventId)) + if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarEventRSVP.EventID)) { - // i think we still should be able to remove self from locked events - if (status != CALENDAR_STATUS_REMOVED && calendarEvent->GetFlags() & CALENDAR_FLAG_INVITES_LOCKED) + // I think we still should be able to remove self from locked events + if (calendarEventRSVP.Status != CALENDAR_STATUS_REMOVED && calendarEvent->IsLocked()) { sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_LOCKED); return; } - if (CalendarInvite* invite = sCalendarMgr->GetInvite(inviteId)) + if (CalendarInvite* invite = sCalendarMgr->GetInvite(calendarEventRSVP.InviteID)) { - invite->SetStatus(CalendarInviteStatus(status)); - invite->SetStatusTime(time(NULL)); + invite->SetStatus(CalendarInviteStatus(calendarEventRSVP.Status)); + invite->SetResponseTime(time(NULL)); sCalendarMgr->UpdateInvite(invite); sCalendarMgr->SendCalendarEventStatus(*calendarEvent, *invite); @@ -562,61 +390,45 @@ void WorldSession::HandleCalendarEventRsvp(WorldPacket& recvData) sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID); } -void WorldSession::HandleCalendarEventRemoveInvite(WorldPacket& recvData) +void WorldSession::HandleCalendarEventRemoveInvite(WorldPackets::Calendar::CalendarRemoveInvite& calendarRemoveInvite) { ObjectGuid guid = _player->GetGUID(); - ObjectGuid invitee; - uint64 eventId; - uint64 ownerInviteId; // isn't it sender's inviteId? - uint64 inviteId; - - recvData >> invitee; - recvData >> inviteId >> ownerInviteId >> eventId; TC_LOG_DEBUG("network", "CMSG_CALENDAR_REMOVE_INVITE [%s] EventId [" UI64FMTD "], ownerInviteId [" UI64FMTD "], Invitee ([%s] id: [" UI64FMTD "])", - guid.ToString().c_str(), eventId, ownerInviteId, invitee.ToString().c_str(), inviteId); + guid.ToString().c_str(), calendarRemoveInvite.EventID, calendarRemoveInvite.ModeratorID, calendarRemoveInvite.Guid.ToString().c_str(), calendarRemoveInvite.InviteID); - if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(eventId)) + if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarRemoveInvite.EventID)) { - if (calendarEvent->GetCreatorGUID() == invitee) + if (calendarEvent->GetOwnerGUID() == calendarRemoveInvite.Guid) { sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_DELETE_CREATOR_FAILED); return; } - sCalendarMgr->RemoveInvite(inviteId, eventId, guid); + sCalendarMgr->RemoveInvite(calendarRemoveInvite.InviteID, calendarRemoveInvite.EventID, guid); } else sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_NO_INVITE); } -void WorldSession::HandleCalendarEventStatus(WorldPacket& recvData) +void WorldSession::HandleCalendarEventStatus(WorldPackets::Calendar::CalendarEventStatus& calendarEventStatus) { ObjectGuid guid = _player->GetGUID(); - ObjectGuid invitee; - uint64 eventId; - uint64 inviteId; - uint64 ownerInviteId; // isn't it sender's inviteId? - uint8 status; - recvData >> invitee; - recvData >> eventId >> inviteId >> ownerInviteId >> status; TC_LOG_DEBUG("network", "CMSG_CALENDAR_EVENT_STATUS [%s] EventId [" UI64FMTD "] ownerInviteId [" UI64FMTD "], Invitee ([%s] id: [" - UI64FMTD "], status %u", guid.ToString().c_str(), eventId, ownerInviteId, invitee.ToString().c_str(), inviteId, status); + UI64FMTD "], status %u", guid.ToString().c_str(), calendarEventStatus.EventID, calendarEventStatus.ModeratorID, calendarEventStatus.Guid.ToString().c_str(), calendarEventStatus.InviteID, calendarEventStatus.Status); - if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(eventId)) + if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarEventStatus.EventID)) { - if (CalendarInvite* invite = sCalendarMgr->GetInvite(inviteId)) + if (CalendarInvite* invite = sCalendarMgr->GetInvite(calendarEventStatus.InviteID)) { - invite->SetStatus((CalendarInviteStatus)status); - // not sure if we should set response time when moderator changes invite status - //invite->SetStatusTime(time(NULL)); + invite->SetStatus((CalendarInviteStatus)calendarEventStatus.Status); sCalendarMgr->UpdateInvite(invite); sCalendarMgr->SendCalendarEventStatus(*calendarEvent, *invite); - sCalendarMgr->SendCalendarClearPendingAction(invitee); + sCalendarMgr->SendCalendarClearPendingAction(calendarEventStatus.Guid); } else sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_NO_INVITE); // correct? @@ -625,26 +437,19 @@ void WorldSession::HandleCalendarEventStatus(WorldPacket& recvData) sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID); } -void WorldSession::HandleCalendarEventModeratorStatus(WorldPacket& recvData) +void WorldSession::HandleCalendarEventModeratorStatus(WorldPackets::Calendar::CalendarEventModeratorStatus& calendarEventModeratorStatus) { ObjectGuid guid = _player->GetGUID(); - ObjectGuid invitee; - uint64 eventId; - uint64 inviteId; - uint64 ownerInviteId; // isn't it sender's inviteId? - uint8 rank; - recvData >> invitee; - recvData >> eventId >> inviteId >> ownerInviteId >> rank; - TC_LOG_DEBUG("network", "CMSG_CALENDAR_EVENT_MODERATOR_STATUS [%s] EventId [" - UI64FMTD "] ownerInviteId [" UI64FMTD "], Invitee ([%s] id: [" - UI64FMTD "], rank %u", guid.ToString().c_str(), eventId, ownerInviteId, invitee.ToString().c_str(), inviteId, rank); + TC_LOG_DEBUG("network", "CMSG_CALENDAR_EVENT_MODERATOR_STATUS [%s] EventID [" + UI64FMTD "] ModeratorID [" UI64FMTD "], Invitee ([%s] InviteID: [" + UI64FMTD "], Status %u", guid.ToString().c_str(), calendarEventModeratorStatus.EventID, calendarEventModeratorStatus.ModeratorID, calendarEventModeratorStatus.Guid.ToString().c_str(), calendarEventModeratorStatus.InviteID, calendarEventModeratorStatus.Status); - if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(eventId)) + if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarEventModeratorStatus.EventID)) { - if (CalendarInvite* invite = sCalendarMgr->GetInvite(inviteId)) + if (CalendarInvite* invite = sCalendarMgr->GetInvite(calendarEventModeratorStatus.InviteID)) { - invite->SetRank(CalendarModerationRank(rank)); + invite->SetRank(CalendarModerationRank(calendarEventModeratorStatus.Status)); sCalendarMgr->UpdateInvite(invite); sCalendarMgr->SendCalendarEventModeratorStatusAlert(*calendarEvent, *invite); } @@ -669,27 +474,22 @@ void WorldSession::HandleCalendarComplain(WorldPacket& recvData) // what to do with complains? } -void WorldSession::HandleCalendarGetNumPending(WorldPacket& /*recvData*/) +void WorldSession::HandleCalendarGetNumPending(WorldPackets::Calendar::CalendarGetNumPending& /*calendarGetNumPending*/) { ObjectGuid guid = _player->GetGUID(); uint32 pending = sCalendarMgr->GetPlayerNumPending(guid); TC_LOG_DEBUG("network", "CMSG_CALENDAR_GET_NUM_PENDING: [%s] Pending: %u", guid.ToString().c_str(), pending); - WorldPacket data(SMSG_CALENDAR_SEND_NUM_PENDING, 4); - data << uint32(pending); - SendPacket(&data); + SendPacket(WorldPackets::Calendar::CalendarSendNumPending(pending).Write()); } -void WorldSession::HandleSetSavedInstanceExtend(WorldPacket& recvData) +void WorldSession::HandleSetSavedInstanceExtend(WorldPackets::Calendar::SetSavedInstanceExtend& setSavedInstanceExtend) { - uint32 mapId, difficulty; - uint8 toggleExtend; - recvData >> mapId >> difficulty>> toggleExtend; - TC_LOG_DEBUG("network", "CMSG_SET_SAVED_INSTANCE_EXTEND - MapId: %u, Difficulty: %u, ToggleExtend: %s", mapId, difficulty, toggleExtend ? "On" : "Off"); + TC_LOG_DEBUG("network", "CMSG_SET_SAVED_INSTANCE_EXTEND - MapId: %u, Difficulty: %u, ToggleExtend: %s", setSavedInstanceExtend.MapID, setSavedInstanceExtend.DifficultyID, setSavedInstanceExtend.Extend ? "On" : "Off"); /* - InstancePlayerBind* instanceBind = _player->GetBoundInstance(mapId, Difficulty(difficulty)); + InstancePlayerBind* instanceBind = _player->GetBoundInstance(setSavedInstanceExtend.MapID, Difficulty(setSavedInstanceExtend.DifficultyID)); if (!instanceBind || !instanceBind->save) return; @@ -726,16 +526,15 @@ void WorldSession::SendCalendarRaidLockoutUpdated(InstanceSave const* save) return; ObjectGuid guid = _player->GetGUID(); - TC_LOG_DEBUG("network", "SMSG_CALENDAR_RAID_LOCKOUT_UPDATED [%s] Map: %u, Difficulty %u", - guid.ToString().c_str(), save->GetMapId(), save->GetDifficultyID()); + TC_LOG_DEBUG("network", "SMSG_CALENDAR_RAID_LOCKOUT_UPDATED [%s] Map: %u, Difficulty %u", guid.ToString().c_str(), save->GetMapId(), save->GetDifficultyID()); time_t currTime = time(NULL); - WorldPacket data(SMSG_CALENDAR_RAID_LOCKOUT_UPDATED, 4 + 4 + 4 + 4 + 8); - data.AppendPackedTime(currTime); - data << uint32(save->GetMapId()); - data << uint32(save->GetDifficultyID()); - data << uint32(0); // Amount of seconds that has changed to the reset time - data << uint32(save->GetResetTime() - currTime); - SendPacket(&data); + WorldPackets::Calendar::CalendarRaidLockoutUpdated packet; + packet.DifficultyID = save->GetDifficultyID(); + packet.MapID = save->GetMapId(); + packet.NewTimeRemaining = 0; // FIXME + packet.OldTimeRemaining = save->GetResetTime() - currTime; + + SendPacket(packet.Write()); } diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index c3bc704314f..6faeae4004d 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -2355,7 +2355,7 @@ void WorldSession::HandleReorderCharacters(WorldPackets::Character::ReorderChara CharacterDatabase.CommitTransaction(trans); } -void WorldSession::HandleOpeningCinematic(WorldPacket& /*recvData*/) +void WorldSession::HandleOpeningCinematic(WorldPackets::Misc::OpeningCinematic& /*packet*/) { // Only players that has not yet gained any experience can use this if (_player->GetUInt32Value(PLAYER_XP)) diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index 8db7afbfa35..00c684feef4 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -348,7 +348,7 @@ void WorldSession::HandleSetLootMethodOpcode(WorldPackets::Party::SetLootMethod& if (!group->IsLeader(GetPlayer()->GetGUID())) return; - if (packet.LootMethod > NEED_BEFORE_GREED) + if (packet.LootMethod > PERSONAL_LOOT) return; if (packet.LootThreshold < ITEM_QUALITY_UNCOMMON || packet.LootThreshold > ITEM_QUALITY_ARTIFACT) @@ -359,9 +359,9 @@ void WorldSession::HandleSetLootMethodOpcode(WorldPackets::Party::SetLootMethod& /********************/ // everything's fine, do it - group->SetLootMethod((LootMethod)packet.LootMethod); + group->SetLootMethod(static_cast<LootMethod>(packet.LootMethod)); group->SetMasterLooterGuid(packet.LootMasterGUID); - group->SetLootThreshold((ItemQualities)packet.LootThreshold); + group->SetLootThreshold(static_cast<ItemQualities>(packet.LootThreshold)); group->SendUpdate(); } diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index fe6cb4674bc..34649e80e1c 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -482,3 +482,17 @@ void WorldSession::HandleLootMasterGiveOpcode(WorldPacket& recvData) loot->NotifyItemRemoved(slotid); --loot->unlootedCount; } + +void WorldSession::HandleSetLootSpecialization(WorldPackets::Loot::SetLootSpecialization& packet) +{ + if (packet.SpecID) + { + if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(packet.SpecID)) + { + if (chrSpec->ClassID == GetPlayer()->getClass()) + GetPlayer()->SetLootSpecId(packet.SpecID); + } + } + else + GetPlayer()->SetLootSpecId(packet.SpecID); +} diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 7fd5ad542ff..48ce07f3668 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -46,6 +46,7 @@ #include "MiscPackets.h" #include "AchievementPackets.h" #include "WhoPackets.h" +#include "InstancePackets.h" void WorldSession::HandleRepopRequest(WorldPackets::Misc::RepopRequest& /*packet*/) { @@ -319,21 +320,29 @@ void WorldSession::HandleLogoutCancelOpcode(WorldPackets::Character::LogoutCance TC_LOG_DEBUG("network", "WORLD: Sent SMSG_LOGOUT_CANCEL_ACK Message"); } -void WorldSession::HandleTogglePvP(WorldPacket& recvData) +void WorldSession::HandleTogglePvP(WorldPackets::Misc::TogglePvP& /*packet*/) { - // this opcode can be used in two ways: Either set explicit new status or toggle old status - if (recvData.size() == 1) + bool inPvP = GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP); + + GetPlayer()->ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP, !inPvP); + GetPlayer()->ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_PVP_TIMER, inPvP); + + if (GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP)) { - bool newPvPStatus; - recvData >> newPvPStatus; - GetPlayer()->ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP, newPvPStatus); - GetPlayer()->ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_PVP_TIMER, !newPvPStatus); + if (!GetPlayer()->IsPvP() || GetPlayer()->pvpInfo.EndTimer) + GetPlayer()->UpdatePvP(true, true); } else { - GetPlayer()->ToggleFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP); - GetPlayer()->ToggleFlag(PLAYER_FLAGS, PLAYER_FLAGS_PVP_TIMER); + if (!GetPlayer()->pvpInfo.IsHostile && GetPlayer()->IsPvP()) + GetPlayer()->pvpInfo.EndTimer = time(nullptr); // start toggle-off } +} + +void WorldSession::HandleSetPvP(WorldPackets::Misc::SetPvP& packet) +{ + GetPlayer()->ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP, packet.EnablePVP); + GetPlayer()->ApplyModFlag(PLAYER_FLAGS, PLAYER_FLAGS_PVP_TIMER, !packet.EnablePVP); if (GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP)) { @@ -343,11 +352,8 @@ void WorldSession::HandleTogglePvP(WorldPacket& recvData) else { if (!GetPlayer()->pvpInfo.IsHostile && GetPlayer()->IsPvP()) - GetPlayer()->pvpInfo.EndTimer = time(NULL); // start toggle-off + GetPlayer()->pvpInfo.EndTimer = time(nullptr); // start set-off } - - //if (OutdoorPvP* pvp = _player->GetOutdoorPvP()) - // pvp->HandlePlayerActivityChanged(_player); } void WorldSession::HandlePortGraveyard(WorldPackets::Misc::PortGraveyard& /*packet*/) @@ -1110,11 +1116,8 @@ void WorldSession::SendSetPhaseShift(std::set<uint32> const& phaseIds, std::set< SendPacket(phaseShift.Write()); } -void WorldSession::HandleInstanceLockResponse(WorldPacket& recvPacket) +void WorldSession::HandleInstanceLockResponse(WorldPackets::Instance::InstanceLockResponse& packet) { - uint8 accept; - recvPacket >> accept; - if (!_player->HasPendingBind()) { TC_LOG_INFO("network", "InstanceLockResponse: Player %s (%s) tried to bind himself/teleport to graveyard without a pending bind!", @@ -1122,7 +1125,7 @@ void WorldSession::HandleInstanceLockResponse(WorldPacket& recvPacket) return; } - if (accept) + if (packet.AcceptLock) _player->BindToInstance(); else _player->RepopAtGraveyard(); @@ -1227,3 +1230,8 @@ void WorldSession::SendLoadCUFProfiles() loadCUFProfiles.CUFProfiles.push_back(cufProfile); SendPacket(loadCUFProfiles.Write()); } + +void WorldSession::HandleSetAdvancedCombatLogging(WorldPackets::ClientConfig::SetAdvancedCombatLogging& setAdvancedCombatLogging) +{ + _player->SetAdvancedCombatLogging(setAdvancedCombatLogging.Enable); +} diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index c1818638a56..a9ab4ca841d 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -77,35 +77,50 @@ void WorldSession::HandleCreatureQuery(WorldPackets::Query::QueryCreature& packe WorldPackets::Query::CreatureStats& stats = response.Stats; - stats.Title = creatureInfo->SubName; - stats.CursorName = creatureInfo->IconName; - stats.CreatureType = creatureInfo->type; - stats.CreatureFamily = creatureInfo->family; - stats.Classification = creatureInfo->rank; - stats.HpMulti = creatureInfo->ModHealth; - stats.EnergyMulti = creatureInfo->ModMana; stats.Leader = creatureInfo->RacialLeader; - CreatureQuestItemList const* items = sObjectMgr->GetCreatureQuestItemList(packet.CreatureID); - if (items) - for (uint32 item : *items) - stats.QuestItems.push_back(item); + stats.Name[0] = creatureInfo->Name; + stats.NameAlt[0] = creatureInfo->FemaleName; - stats.CreatureMovementInfoID = creatureInfo->movementId; - stats.RequiredExpansion = creatureInfo->expansionUnknown; stats.Flags[0] = creatureInfo->type_flags; stats.Flags[1] = creatureInfo->type_flags2; + + stats.CreatureType = creatureInfo->type; + stats.CreatureFamily = creatureInfo->family; + stats.Classification = creatureInfo->rank; + for (uint32 i = 0; i < MAX_KILL_CREDIT; ++i) stats.ProxyCreatureID[i] = creatureInfo->KillCredit[i]; + stats.CreatureDisplayID[0] = creatureInfo->Modelid1; stats.CreatureDisplayID[1] = creatureInfo->Modelid2; stats.CreatureDisplayID[2] = creatureInfo->Modelid3; stats.CreatureDisplayID[3] = creatureInfo->Modelid4; - stats.Name[0] = creatureInfo->Name; - stats.NameAlt[0] = creatureInfo->FemaleName; + + stats.HpMulti = creatureInfo->ModHealth; + stats.EnergyMulti = creatureInfo->ModMana; + + stats.CreatureMovementInfoID = creatureInfo->movementId; + stats.RequiredExpansion = creatureInfo->expansionUnknown; + + stats.Title = creatureInfo->SubName; + //stats.TitleAlt = ; + stats.CursorName = creatureInfo->IconName; + + if (CreatureQuestItemList const* items = sObjectMgr->GetCreatureQuestItemList(packet.CreatureID)) + for (uint32 item : *items) + stats.QuestItems.push_back(item); + + LocaleConstant localeConstant = GetSessionDbLocaleIndex(); + if (localeConstant >= LOCALE_enUS) + if (CreatureLocale const* creatureLocale = sObjectMgr->GetCreatureLocale(packet.CreatureID)) + { + ObjectMgr::GetLocaleString(creatureLocale->Name, localeConstant, stats.Name[0]); + ObjectMgr::GetLocaleString(creatureLocale->NameAlt, localeConstant, stats.NameAlt[0]); + ObjectMgr::GetLocaleString(creatureLocale->Title, localeConstant, stats.Title); + ObjectMgr::GetLocaleString(creatureLocale->TitleAlt, localeConstant, stats.TitleAlt); + } } - else - response.Allow = false; SendPacket(response.Write()); } diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 9665a41034e..76303c063e5 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -149,7 +149,7 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode(WorldPackets::Quest::QuestG Player* player = ObjectAccessor::FindPlayer(_player->GetDivider()); if (player) { - player->SendPushToPartyResponse(_player, QUEST_PARTY_MSG_ACCEPT_QUEST); + player->SendPushToPartyResponse(_player, QUEST_PUSH_ACCEPTED); _player->SetDivider(ObjectGuid::Empty); } } @@ -586,35 +586,35 @@ void WorldSession::HandlePushQuestToParty(WorldPacket& recvPacket) if (!receiver->SatisfyQuestStatus(quest, false)) { - sender->SendPushToPartyResponse(receiver, QUEST_PARTY_MSG_HAVE_QUEST); + sender->SendPushToPartyResponse(receiver, QUEST_PUSH_ONQUEST); continue; } if (receiver->GetQuestStatus(questId) == QUEST_STATUS_COMPLETE) { - sender->SendPushToPartyResponse(receiver, QUEST_PARTY_MSG_FINISH_QUEST); + sender->SendPushToPartyResponse(receiver, QUEST_PUSH_ALREADY_DONE); continue; } if (!receiver->CanTakeQuest(quest, false)) { - sender->SendPushToPartyResponse(receiver, QUEST_PARTY_MSG_CANT_TAKE_QUEST); + sender->SendPushToPartyResponse(receiver, QUEST_PUSH_INVALID); continue; } if (!receiver->SatisfyQuestLog(false)) { - sender->SendPushToPartyResponse(receiver, QUEST_PARTY_MSG_LOG_FULL); + sender->SendPushToPartyResponse(receiver, QUEST_PUSH_LOG_FULL); continue; } if (!receiver->GetDivider().IsEmpty()) { - sender->SendPushToPartyResponse(receiver, QUEST_PARTY_MSG_BUSY); + sender->SendPushToPartyResponse(receiver, QUEST_PUSH_BUSY); continue; } - sender->SendPushToPartyResponse(receiver, QUEST_PARTY_MSG_SHARING_QUEST); + sender->SendPushToPartyResponse(receiver, QUEST_PUSH_SUCCESS); if (quest->IsAutoAccept() && receiver->CanAddQuest(quest, true) && receiver->CanTakeQuest(quest, true)) receiver->AddQuestAndCheckCompletion(quest, sender); @@ -629,19 +629,13 @@ void WorldSession::HandlePushQuestToParty(WorldPacket& recvPacket) } } -void WorldSession::HandleQuestPushResult(WorldPacket& recvPacket) +void WorldSession::HandleQuestPushResult(WorldPackets::Quest::QuestPushResult& packet) { - ObjectGuid guid; - uint32 questId; - uint8 msg; - recvPacket >> guid >> questId >> msg; - - if (!_player->GetDivider().IsEmpty() && _player->GetDivider() == guid) + if (!_player->GetDivider().IsEmpty() && _player->GetDivider() == packet.SenderGUID) { - Player* player = ObjectAccessor::FindPlayer(_player->GetDivider()); - if (player) + if (Player* player = ObjectAccessor::FindPlayer(_player->GetDivider())) { - player->SendPushToPartyResponse(_player, msg); + player->SendPushToPartyResponse(_player, static_cast<QuestPushReason>(packet.Result)); _player->SetDivider(ObjectGuid::Empty); } } diff --git a/src/server/game/Handlers/VoidStorageHandler.cpp b/src/server/game/Handlers/VoidStorageHandler.cpp index 46e2f1270c1..4ad507895a4 100644 --- a/src/server/game/Handlers/VoidStorageHandler.cpp +++ b/src/server/game/Handlers/VoidStorageHandler.cpp @@ -95,18 +95,6 @@ void WorldSession::HandleVoidStorageQuery(WorldPackets::VoidStorage::QueryVoidSt void WorldSession::HandleVoidStorageTransfer(WorldPackets::VoidStorage::VoidStorageTransfer& voidStorageTransfer) { - if (voidStorageTransfer.DepositsCount > VOID_STORAGE_MAX_DEPOSIT) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageTransfer - Player (%s, name: %s) wants to deposit more than 9 items (%u).", _player->GetGUID().ToString().c_str(), _player->GetName().c_str(), voidStorageTransfer.DepositsCount); - return; - } - - if (voidStorageTransfer.WithdrawalsCount > VOID_STORAGE_MAX_WITHDRAW) - { - TC_LOG_DEBUG("network", "WORLD: HandleVoidStorageTransfer - Player (%s, name: %s) wants to withdraw more than 9 items (%u).", _player->GetGUID().ToString().c_str(), _player->GetName().c_str(), voidStorageTransfer.WithdrawalsCount); - return; - } - Creature* unit = _player->GetNPCIfCanInteractWith(voidStorageTransfer.Npc, UNIT_NPC_FLAG_VAULTKEEPER); if (!unit) { @@ -120,14 +108,14 @@ void WorldSession::HandleVoidStorageTransfer(WorldPackets::VoidStorage::VoidStor return; } - if (voidStorageTransfer.DepositsCount > _player->GetNumOfVoidStorageFreeSlots()) + if (voidStorageTransfer.Deposits.size() > _player->GetNumOfVoidStorageFreeSlots()) { SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_FULL); return; } uint32 freeBagSlots = 0; - if (voidStorageTransfer.WithdrawalsCount) + if (!voidStorageTransfer.Withdrawals.empty()) { // make this a Player function for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++) @@ -139,13 +127,13 @@ void WorldSession::HandleVoidStorageTransfer(WorldPackets::VoidStorage::VoidStor ++freeBagSlots; } - if (voidStorageTransfer.WithdrawalsCount > freeBagSlots) + if (voidStorageTransfer.Withdrawals.size() > freeBagSlots) { SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_INVENTORY_FULL); return; } - if (!_player->HasEnoughMoney(uint64(voidStorageTransfer.DepositsCount * VOID_STORAGE_STORE_ITEM_COST))) + if (!_player->HasEnoughMoney(uint64(voidStorageTransfer.Deposits.size() * VOID_STORAGE_STORE_ITEM_COST))) { SendVoidStorageTransferResult(VOID_TRANSFER_ERROR_NOT_ENOUGH_MONEY); return; @@ -153,7 +141,7 @@ void WorldSession::HandleVoidStorageTransfer(WorldPackets::VoidStorage::VoidStor std::pair<VoidStorageItem, uint8> depositItems[VOID_STORAGE_MAX_DEPOSIT]; uint8 depositCount = 0; - for (uint32 i = 0; i < voidStorageTransfer.DepositsCount; ++i) + for (uint32 i = 0; i < voidStorageTransfer.Deposits.size(); ++i) { Item* item = _player->GetItemByGuid(voidStorageTransfer.Deposits[i]); if (!item) @@ -181,7 +169,7 @@ void WorldSession::HandleVoidStorageTransfer(WorldPackets::VoidStorage::VoidStor VoidStorageItem withdrawItems[VOID_STORAGE_MAX_WITHDRAW]; uint8 withdrawCount = 0; - for (uint32 i = 0; i < voidStorageTransfer.WithdrawalsCount; ++i) + for (uint32 i = 0; i < voidStorageTransfer.Withdrawals.size(); ++i) { uint8 slot = 0; VoidStorageItem* itemVS = _player->GetVoidStorageItem(voidStorageTransfer.Withdrawals[i].GetCounter(), slot); diff --git a/src/server/game/Loot/LootMgr.h b/src/server/game/Loot/LootMgr.h index 534ed1a173c..0c5bdc496c8 100644 --- a/src/server/game/Loot/LootMgr.h +++ b/src/server/game/Loot/LootMgr.h @@ -68,7 +68,8 @@ enum LootMethod ROUND_ROBIN = 1, MASTER_LOOT = 2, GROUP_LOOT = 3, - NEED_BEFORE_GREED = 4 + NEED_BEFORE_GREED = 4, + PERSONAL_LOOT = 5 }; enum PermissionTypes diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 07c20ac599e..1fdd92de91c 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -3224,8 +3224,8 @@ void InstanceMap::PermBindAllPlayers(Player* source) WorldPackets::Instance::InstanceSaveCreated data; data.Gm = player->IsGameMaster(); player->GetSession()->SendPacket(data.Write()); - - player->GetSession()->SendCalendarRaidLockout(save, true); + if (!player->IsGameMaster()) + player->GetSession()->SendCalendarRaidLockout(save, true); } // if the leader is not in the instance the group will not get a perm bind diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index a708556fe64..5cb3a2c26c5 100644 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -155,9 +155,7 @@ bool MapManager::CanPlayerEnter(uint32 mapid, Player* player, bool loginCheck) if ((!group || !group->isRaidGroup()) && !sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_RAID)) { /// @todo this is not a good place to send the message - WorldPacket data(SMSG_RAID_GROUP_ONLY); - data << uint32(0) << uint32(2); - player->GetSession()->SendPacket(&data); + player->SendRaidGroupOnlyMessage(RAID_GROUP_ERR_ONLY, 0); TC_LOG_DEBUG("maps", "MAP: Player '%s' must be in a raid group to enter instance '%s'", player->GetName().c_str(), mapName); return false; } diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 7456e55f5f1..d6f1d240a16 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -510,7 +510,7 @@ enum SpellAttr4 SPELL_ATTR4_SPELL_VS_EXTEND_COST = 0x00000400, // 10 Rogue Shiv have this flag SPELL_ATTR4_UNK11 = 0x00000800, // 11 SPELL_ATTR4_UNK12 = 0x00001000, // 12 - SPELL_ATTR4_UNK13 = 0x00002000, // 13 + SPELL_ATTR4_COMBAT_LOG_NO_CASTER = 0x00002000, // 13 No caster object is sent to client combat log SPELL_ATTR4_DAMAGE_DOESNT_BREAK_AURAS = 0x00004000, // 14 doesn't break auras by damage from these spells SPELL_ATTR4_UNK15 = 0x00008000, // 15 SPELL_ATTR4_NOT_USABLE_IN_ARENA_OR_RATED_BG = 0x00010000, // 16 Cannot be used in both Arenas or Rated Battlegrounds @@ -2032,12 +2032,14 @@ enum SpellMissInfo enum SpellHitType { - SPELL_HIT_TYPE_UNK1 = 0x00001, - SPELL_HIT_TYPE_CRIT = 0x00002, - SPELL_HIT_TYPE_UNK3 = 0x00004, - SPELL_HIT_TYPE_UNK4 = 0x00008, - SPELL_HIT_TYPE_UNK5 = 0x00010, // replace caster? - SPELL_HIT_TYPE_UNK6 = 0x00020 + SPELL_HIT_TYPE_CRIT_DEBUG = 0x01, + SPELL_HIT_TYPE_CRIT = 0x02, + SPELL_HIT_TYPE_HIT_DEBUG = 0x04, + SPELL_HIT_TYPE_SPLIT = 0x08, + SPELL_HIT_TYPE_VICTIM_IS_ATTACKER = 0x10, + SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG = 0x20, + SPELL_HIT_TYPE_UNK = 0x40, + SPELL_HIT_TYPE_NO_ATTACKER = 0x80, // does the same as SPELL_ATTR4_COMBAT_LOG_NO_CASTER }; enum SpellDmgClass @@ -4667,32 +4669,32 @@ enum SpellFamilyNames enum TradeStatus { - TRADE_STATUS_STUNNED = 0, - TRADE_STATUS_TARGET_DEAD = 2, - TRADE_STATUS_PLAYER_IGNORED = 3, - TRADE_STATUS_STATE_CHANGED = 4, - TRADE_STATUS_PETITION = 5, - TRADE_STATUS_FAILED = 6, - TRADE_STATUS_NOT_ENOUGH_CURRENCY = 7, - TRADE_STATUS_TARGET_LOGGING_OUT = 8, - TRADE_STATUS_PROPOSED = 9, - TRADE_STATUS_RESTRICTED_ACCOUNT = 10, - TRADE_STATUS_WRONG_REALM = 12, - TRADE_STATUS_ALREADY_TRADING = 14, - TRADE_STATUS_COMPLETE = 15, - TRADE_STATUS_TARGET_STUNNED = 16, - TRADE_STATUS_ACCEPTED = 17, - TRADE_STATUS_NO_TARGET = 18, - TRADE_STATUS_CURRENCY_NOT_TRADABLE = 19, - TRADE_STATUS_WRONG_FACTION = 20, - TRADE_STATUS_NOT_ON_TAPLIST = 21, - TRADE_STATUS_UNACCEPTED = 23, - TRADE_STATUS_LOGGING_OUT = 24, + TRADE_STATUS_DEAD = 0, + TRADE_STATUS_WRONG_FACTION = 1, + TRADE_STATUS_STATE_CHANGED = 2, + TRADE_STATUS_NOT_ENOUGH_CURRENCY = 3, + TRADE_STATUS_CURRENCY_NOT_TRADABLE = 4, + TRADE_STATUS_TOO_FAR_AWAY = 5, + TRADE_STATUS_RESTRICTED_ACCOUNT = 6, + TRADE_STATUS_ACCEPTED = 8, + TRADE_STATUS_TARGET_DEAD = 9, + TRADE_STATUS_INITIATED = 10, + TRADE_STATUS_TARGET_STUNNED = 11, + TRADE_STATUS_LOGGING_OUT = 12, + TRADE_STATUS_UNACCEPTED = 13, + TRADE_STATUS_NOT_ON_TAPLIST = 14, + TRADE_STATUS_COMPLETE = 16, + TRADE_STATUS_PLAYER_IGNORED = 17, + TRADE_STATUS_ALREADY_TRADING = 19, + TRADE_STATUS_TARGET_LOGGING_OUT = 20, + TRADE_STATUS_FAILED = 21, + TRADE_STATUS_PLAYER_BUSY = 22, + TRADE_STATUS_PROPOSED = 23, + TRADE_STATUS_PETITION = 25, TRADE_STATUS_CANCELLED = 26, - TRADE_STATUS_TOO_FAR_AWAY = 27, - TRADE_STATUS_DEAD = 28, - TRADE_STATUS_INITIATED = 29, - TRADE_STATUS_PLAYER_BUSY = 30 + TRADE_STATUS_WRONG_REALM = 28, + TRADE_STATUS_STUNNED = 30, + TRADE_STATUS_NO_TARGET = 31 }; enum XPColorChar @@ -4937,4 +4939,20 @@ enum TokenResult TOKEN_RESULT_ERROR_TRIAL_RESTRICTED = 8 }; +enum RaidGroupReason +{ + RAID_GROUP_ERR_NONE = 0, + RAID_GROUP_ERR_LOWLEVEL = 1, // "You are too low level to enter this instance." + RAID_GROUP_ERR_ONLY = 2, // "You must be in a raid group to enter this instance." + RAID_GROUP_ERR_FULL = 3, // "The instance is full." + RAID_GROUP_ERR_REQUIREMENTS_UNMATCH = 4 // "You do not meet the requirements to enter this instance." +}; + +enum ResetFailedReason +{ + INSTANCE_RESET_FAILED = 0, // "Cannot reset %s. There are players still inside the instance." + INSTANCE_RESET_FAILED_ZONING = 1, // "Cannot reset %s. There are players in your party attempting to zone into an instance." + INSTANCE_RESET_FAILED_OFFLINE = 2 // "Cannot reset %s. There are players offline in your party." +}; + #endif diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h index a2a61cc5da0..3e7b895ffdf 100644 --- a/src/server/game/Quests/QuestDef.h +++ b/src/server/game/Quests/QuestDef.h @@ -52,34 +52,38 @@ namespace WorldPackets enum QuestFailedReason { - INVALIDREASON_DONT_HAVE_REQ = 0, - INVALIDREASON_QUEST_FAILED_LOW_LEVEL = 1, // You are not high enough level for that quest. - INVALIDREASON_QUEST_FAILED_WRONG_RACE = 6, // That quest is not available to your race. - INVALIDREASON_QUEST_ALREADY_DONE = 7, // You have completed that quest. - INVALIDREASON_QUEST_ONLY_ONE_TIMED = 12, // You can only be on one timed quest at a time. - INVALIDREASON_QUEST_ALREADY_ON = 13, // You are already on that quest. - INVALIDREASON_QUEST_FAILED_EXPANSION = 16, // This quest requires an expansion enabled account. - INVALIDREASON_QUEST_ALREADY_ON2 = 18, // You are already on that quest. - INVALIDREASON_QUEST_FAILED_MISSING_ITEMS = 21, // You don't have the required items with you. Check storage. - INVALIDREASON_QUEST_FAILED_NOT_ENOUGH_MONEY = 23, // You don't have enough money for that quest. - INVALIDREASON_DAILY_QUESTS_REMAINING = 26, // You have already completed 25 daily quests today. - INVALIDREASON_QUEST_FAILED_CAIS = 27, // You cannot complete quests once you have reached tired time. - INVALIDREASON_DAILY_QUEST_COMPLETED_TODAY = 29 // You have completed that daily quest today. + QUEST_ERR_NONE = 0, + QUEST_ERR_FAILED_LOW_LEVEL = 1, // "You are not high enough level for that quest."" + QUEST_ERR_FAILED_WRONG_RACE = 6, // "That quest is not available to your race." + QUEST_ERR_ALREADY_DONE = 7, // "You have completed that daily quest today." + QUEST_ERR_ONLY_ONE_TIMED = 12, // "You can only be on one timed quest at a time" + QUEST_ERR_ALREADY_ON1 = 13, // "You are already on that quest" + QUEST_ERR_FAILED_EXPANSION = 16, // "This quest requires an expansion enabled account." + QUEST_ERR_ALREADY_ON2 = 18, // "You are already on that quest" + QUEST_ERR_FAILED_MISSING_ITEMS = 21, // "You don't have the required items with you. Check storage." + QUEST_ERR_FAILED_NOT_ENOUGH_MONEY = 23, // "You don't have enough money for that quest" + QUEST_ERR_FAILED_CAIS = 24, // "You cannot complete quests once you have reached tired time" + QUEST_ERR_ALREADY_DONE_DAILY = 26, // "You have completed that daily quest today." + QUEST_ERR_FAILED_SPELL = 28, // "You haven't learned the required spell." + QUEST_ERR_HAS_IN_PROGRESS = 30 // "Progress Bar objective not completed" }; -enum QuestShareMessages +enum QuestPushReason { - QUEST_PARTY_MSG_SHARING_QUEST = 0, - QUEST_PARTY_MSG_CANT_TAKE_QUEST = 1, - QUEST_PARTY_MSG_ACCEPT_QUEST = 2, - QUEST_PARTY_MSG_DECLINE_QUEST = 3, - QUEST_PARTY_MSG_BUSY = 4, - QUEST_PARTY_MSG_LOG_FULL = 5, - QUEST_PARTY_MSG_HAVE_QUEST = 6, - QUEST_PARTY_MSG_FINISH_QUEST = 7, - QUEST_PARTY_MSG_CANT_BE_SHARED_TODAY = 8, - QUEST_PARTY_MSG_SHARING_TIMER_EXPIRED = 9, - QUEST_PARTY_MSG_NOT_IN_PARTY = 10 + QUEST_PUSH_SUCCESS = 0, // "Sharing quest with %s..." + QUEST_PUSH_INVALID = 1, // "%s is not eligible for that quest" + QUEST_PUSH_ACCEPTED = 2, // "%s has accepted your quest" + QUEST_PUSH_DECLINED = 3, // "%s has declined your quest" + QUEST_PUSH_BUSY = 4, // "%s is busy" + QUEST_PUSH_DEAD = 5, // "%s is dead." + QUEST_PUSH_LOG_FULL = 6, // "%s's quest log is full" + QUEST_PUSH_ONQUEST = 7, // "%s is already on that quest" + QUEST_PUSH_ALREADY_DONE = 8, // "%s has completed that quest" + QUEST_PUSH_NOT_DAILY = 9, // "That quest cannot be shared today" + QUEST_PUSH_TIMER_EXPIRED = 10, // "Quest sharing timer has expired" + QUEST_PUSH_NOT_IN_PARTY = 11, // "You are not in a party" + QUEST_PUSH_DIFFERENT_SERVER_DAILY = 12, // "%s is not eligible for that quest today" + QUEST_PUSH_NOT_ALLOWED = 13 // "That quest cannot be shared" }; enum QuestTradeSkill diff --git a/src/server/game/Server/Packets/BattlegroundPackets.cpp b/src/server/game/Server/Packets/BattlegroundPackets.cpp index 142d53c481a..7bd1bbe5d66 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.cpp +++ b/src/server/game/Server/Packets/BattlegroundPackets.cpp @@ -265,3 +265,9 @@ WorldPacket const* WorldPackets::Battleground::BattlegroundPlayerLeft::Write() _worldPacket << Guid; return &_worldPacket; } + +WorldPacket const* WorldPackets::Battleground::DestroyArenaUnit::Write() +{ + _worldPacket << Guid; + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/BattlegroundPackets.h b/src/server/game/Server/Packets/BattlegroundPackets.h index 2b534826436..971bbfd24cb 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.h +++ b/src/server/game/Server/Packets/BattlegroundPackets.h @@ -357,6 +357,16 @@ namespace WorldPackets ObjectGuid Guid; }; + + class DestroyArenaUnit final : public ServerPacket + { + public: + DestroyArenaUnit() : ServerPacket(SMSG_DESTROY_ARENA_UNIT, 16) { } + + WorldPacket const* Write() override; + + ObjectGuid Guid; + }; } } diff --git a/src/server/game/Server/Packets/CalendarPackets.cpp b/src/server/game/Server/Packets/CalendarPackets.cpp new file mode 100644 index 00000000000..ca80093ba00 --- /dev/null +++ b/src/server/game/Server/Packets/CalendarPackets.cpp @@ -0,0 +1,468 @@ +/* + * Copyright (C) 2008-2015 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/>. + */ + +#include "CalendarPackets.h" +#include "CalendarMgr.h" + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Calendar::CalendarSendCalendarEventInfo const& eventInfo) +{ + data << uint64(eventInfo.EventID); + data << uint8(eventInfo.EventType); + data.AppendPackedTime(eventInfo.Date); + data << uint32(eventInfo.Flags); + data << int32(eventInfo.TextureID); + data << eventInfo.EventGuildID; + data << eventInfo.OwnerGuid; + + data.WriteBits(eventInfo.EventName.size(), 8); + data.FlushBits(); + data.WriteString(eventInfo.EventName); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Calendar::CalendarSendCalendarRaidResetInfo const& resetInfo) +{ + data << int32(resetInfo.MapID); + data << uint32(resetInfo.Duration); + data << int32(resetInfo.Offset); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Calendar::CalendarSendCalendarRaidLockoutInfo const& lockoutInfo) +{ + data << uint64(lockoutInfo.InstanceID); + data << int32(lockoutInfo.MapID); + data << uint32(lockoutInfo.DifficultyID); + data << uint32(lockoutInfo.ExpireTime); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Calendar::CalendarSendCalendarInviteInfo const& inviteInfo) +{ + data << uint64(inviteInfo.EventID); + data << uint64(inviteInfo.InviteID); + data << uint8(inviteInfo.Status); + data << uint8(inviteInfo.Moderator); + data << uint8(inviteInfo.InviteType); + data << inviteInfo.InviterGuid; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Calendar::CalendarEventInviteInfo const& inviteInfo) +{ + data << inviteInfo.Guid; + data << uint64(inviteInfo.InviteID); + + data << uint8(inviteInfo.Level); + data << uint8(inviteInfo.Status); + data << uint8(inviteInfo.Moderator); + data << uint8(inviteInfo.InviteType); + + data.AppendPackedTime(inviteInfo.ResponseTime); + + data.WriteBits(inviteInfo.Notes.size(), 8); + data.FlushBits(); + data.WriteString(inviteInfo.Notes); + + return data; +} + +void WorldPackets::Calendar::CalendarGetEvent::Read() +{ + _worldPacket >> EventID; +} + +void WorldPackets::Calendar::CalendarGuildFilter::Read() +{ + _worldPacket >> MinLevel; + _worldPacket >> MaxLevel; + _worldPacket >> MaxRankOrder; +} + +ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Calendar::CalendarAddEventInviteInfo& invite) +{ + buffer >> invite.Guid; + buffer >> invite.Status; + buffer >> invite.Moderator; + return buffer; +} + +ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Calendar::CalendarAddEventInfo& addEventInfo) +{ + uint8 titleLength = buffer.ReadBits(8); + uint16 descriptionLength = buffer.ReadBits(11); + + buffer >> addEventInfo.EventType; + buffer >> addEventInfo.TextureID; + addEventInfo.Time = buffer.ReadPackedTime(); + buffer >> addEventInfo.Flags; + addEventInfo.Invites.resize(buffer.read<uint32>()); + + addEventInfo.Title = buffer.ReadString(titleLength); + addEventInfo.Description = buffer.ReadString(descriptionLength); + + for (WorldPackets::Calendar::CalendarAddEventInviteInfo& invite : addEventInfo.Invites) + buffer >> invite; + + return buffer; +} + +void WorldPackets::Calendar::CalendarAddEvent::Read() +{ + _worldPacket >> EventInfo; + _worldPacket >> MaxSize; +} + +void WorldPackets::Calendar::CalendarUpdateEvent::Read() +{ + _worldPacket >> EventInfo.EventID; + _worldPacket >> EventInfo.ModeratorID; + _worldPacket >> EventInfo.EventType; + _worldPacket >> EventInfo.TextureID; + EventInfo.Time = _worldPacket.ReadPackedTime(); + _worldPacket >> EventInfo.Flags; + + uint8 titleLen = _worldPacket.ReadBits(8); + uint16 descLen = _worldPacket.ReadBits(11); + + EventInfo.Title = _worldPacket.ReadString(titleLen); + EventInfo.Description = _worldPacket.ReadString(descLen); + _worldPacket >> MaxSize; +} + +void WorldPackets::Calendar::CalendarRemoveEvent::Read() +{ + _worldPacket >> EventID; + _worldPacket >> ModeratorID; + _worldPacket >> Flags; +} + +void WorldPackets::Calendar::CalendarCopyEvent::Read() +{ + _worldPacket >> EventID; + _worldPacket >> ModeratorID; + Date = _worldPacket.ReadPackedTime(); +} + +void WorldPackets::Calendar::CalendarEventRSVP::Read() +{ + _worldPacket >> EventID; + _worldPacket >> InviteID; + _worldPacket >> Status; +} + +void WorldPackets::Calendar::CalendarEventInvite::Read() +{ + _worldPacket >> EventID; + _worldPacket >> ModeratorID; + + uint16 nameLen = _worldPacket.ReadBits(9); + Creating = _worldPacket.ReadBit(); + IsSignUp = _worldPacket.ReadBit(); + + Name = _worldPacket.ReadString(nameLen); +} + +void WorldPackets::Calendar::CalendarEventSignUp::Read() +{ + _worldPacket >> EventID; + Tentative = _worldPacket.ReadBit(); +} + +void WorldPackets::Calendar::CalendarRemoveInvite::Read() +{ + _worldPacket >> Guid; + _worldPacket >> InviteID; + _worldPacket >> ModeratorID; + _worldPacket >> EventID; +} + +void WorldPackets::Calendar::CalendarEventStatus::Read() +{ + _worldPacket >> Guid; + _worldPacket >> EventID; + _worldPacket >> InviteID; + _worldPacket >> ModeratorID; + _worldPacket >> Status; +} + +void WorldPackets::Calendar::SetSavedInstanceExtend::Read() +{ + _worldPacket >> MapID; + _worldPacket >> DifficultyID; + Extend = _worldPacket.ReadBit(); +} + +void WorldPackets::Calendar::CalendarEventModeratorStatus::Read() +{ + _worldPacket >> Guid; + _worldPacket >> EventID; + _worldPacket >> InviteID; + _worldPacket >> ModeratorID; + _worldPacket >> Status; +} + +WorldPacket const* WorldPackets::Calendar::SCalendarEventInvite::Write() +{ + _worldPacket << InviteGuid; + _worldPacket << uint64(EventID); + _worldPacket << uint64(InviteID); + _worldPacket << uint8(Level); + _worldPacket << uint8(Status); + _worldPacket << uint8(Type); + _worldPacket.AppendPackedTime(ResponseTime); + + _worldPacket.WriteBit(ClearPending); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Calendar::CalendarSendCalendar::Write() +{ + _worldPacket << uint32(ServerNow); + _worldPacket.AppendPackedTime(ServerTime); + _worldPacket << uint32(RaidOrigin); + _worldPacket << uint32(Invites.size()); + _worldPacket << uint32(Events.size()); + _worldPacket << uint32(RaidLockouts.size()); + _worldPacket << uint32(RaidResets.size()); + + for (auto const& invite : Invites) + _worldPacket << invite; + + for (auto const& event : Events) + _worldPacket << event; + + for (auto const& lockout : RaidLockouts) + _worldPacket << lockout; + + for (auto const& reset : RaidResets) + _worldPacket << reset; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Calendar::CalendarSendEvent::Write() +{ + _worldPacket << uint8(EventType); + _worldPacket << OwnerGuid; + _worldPacket << uint64(EventID); + _worldPacket << uint8(GetEventType); + _worldPacket << int32(TextureID); + _worldPacket << uint32(Flags); + _worldPacket.AppendPackedTime(Date); + _worldPacket << uint32(LockDate); + _worldPacket << EventGuildID; + + _worldPacket << uint32(Invites.size()); + for (auto const& invite : Invites) + _worldPacket << invite; + + _worldPacket.WriteBits(EventName.size(), 8); + _worldPacket.WriteBits(Description.size(), 11); + _worldPacket.FlushBits(); + + _worldPacket.WriteString(EventName); + _worldPacket.WriteString(Description); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Calendar::CalendarEventInviteAlert::Write() +{ + _worldPacket << uint64(EventID); + _worldPacket.AppendPackedTime(Date); + _worldPacket << uint32(Flags); + _worldPacket << uint8(EventType); + _worldPacket << int32(TextureID); + _worldPacket << EventGuildID; + _worldPacket << uint64(InviteID); + _worldPacket << uint8(Status); + _worldPacket << uint8(ModeratorStatus); + + // Todo: check order + _worldPacket << InvitedByGuid; + _worldPacket << OwnerGuid; + + _worldPacket.WriteBits(EventName.size(), 8); + _worldPacket.FlushBits(); + _worldPacket.WriteString(EventName); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Calendar::CalendarEventInviteStatus::Write() +{ + _worldPacket << InviteGuid; + _worldPacket << uint64(EventID); + _worldPacket.AppendPackedTime(Date); + _worldPacket << uint32(Flags); + _worldPacket << uint8(Status); + _worldPacket.AppendPackedTime(ResponseTime); + + _worldPacket.WriteBit(ClearPending); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Calendar::CalendarEventInviteRemoved::Write() +{ + _worldPacket << InviteGuid; + _worldPacket << uint64(EventID); + _worldPacket << uint32(Flags); + + _worldPacket.WriteBit(ClearPending); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Calendar::CalendarEventInviteModeratorStatus::Write() +{ + _worldPacket << InviteGuid; + _worldPacket << uint64(EventID); + _worldPacket << uint8(Status); + + _worldPacket.WriteBit(ClearPending); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Calendar::CalendarEventInviteRemovedAlert::Write() +{ + _worldPacket << uint64(EventID); + _worldPacket.AppendPackedTime(Date); + _worldPacket << uint32(Flags); + _worldPacket << uint8(Status); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Calendar::CalendarEventUpdatedAlert::Write() +{ + _worldPacket << uint64(EventID); + + _worldPacket.AppendPackedTime(OriginalDate); + _worldPacket.AppendPackedTime(Date); + _worldPacket << uint32(LockDate); + _worldPacket << uint32(Flags); + _worldPacket << uint32(TextureID); + _worldPacket << uint8(EventType); + + _worldPacket.WriteBits(EventName.size(), 8); + _worldPacket.WriteBits(Description.size(), 11); + _worldPacket.WriteBit(ClearPending); + _worldPacket.FlushBits(); + + _worldPacket.WriteString(EventName); + _worldPacket.WriteString(Description); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Calendar::CalendarEventRemovedAlert::Write() +{ + _worldPacket << uint64(EventID); + _worldPacket.AppendPackedTime(Date); + + _worldPacket.WriteBit(ClearPending); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Calendar::CalendarSendNumPending::Write() +{ + _worldPacket << uint32(NumPending); + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Calendar::CalendarCommandResult::Write() +{ + _worldPacket << uint8(Command); + _worldPacket << uint8(Result); + + _worldPacket.WriteBits(Name.size(), 9); + _worldPacket.FlushBits(); + _worldPacket.WriteString(Name); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Calendar::CalendarRaidLockoutUpdated::Write() +{ + _worldPacket << uint32(ServerTime); + _worldPacket << int32(MapID); + _worldPacket << uint32(DifficultyID); + _worldPacket << int32(NewTimeRemaining); + _worldPacket << int32(OldTimeRemaining); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Calendar::CalendarEventInitialInvites::Write() +{ + _worldPacket << uint32(Invites.size()); + for (auto const& invite : Invites) + { + _worldPacket << invite.InviteGuid; + _worldPacket << uint8(invite.Level); + } + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Calendar::CalendarEventInviteStatusAlert::Write() +{ + _worldPacket << uint64(EventID); + _worldPacket.AppendPackedTime(Date); + _worldPacket << uint32(Flags); + _worldPacket << uint8(Status); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Calendar::CalendarEventInviteNotesAlert::Write() +{ + _worldPacket << uint64(EventID); + + _worldPacket.WriteBits(Notes.size(), 8); + _worldPacket.FlushBits(); + _worldPacket.WriteString(Notes); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Calendar::CalendarEventInviteNotes::Write() +{ + _worldPacket << InviteGuid; + _worldPacket << uint64(EventID); + + _worldPacket.WriteBits(Notes.size(), 8); + _worldPacket.WriteBit(ClearPending); + _worldPacket.FlushBits(); + _worldPacket.WriteString(Notes); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/CalendarPackets.h b/src/server/game/Server/Packets/CalendarPackets.h new file mode 100644 index 00000000000..d753113e816 --- /dev/null +++ b/src/server/game/Server/Packets/CalendarPackets.h @@ -0,0 +1,548 @@ +/* + * Copyright (C) 2008-2015 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/>. + */ + +#ifndef CalendarPackets_h__ +#define CalendarPackets_h__ + +#include "ObjectGuid.h" +#include "Packet.h" +#include "PacketUtilities.h" +#include "CalendarMgr.h" + +namespace WorldPackets +{ + namespace Calendar + { + class CalendarGetCalendar final : public ClientPacket + { + public: + CalendarGetCalendar(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_GET, std::move(packet)) { } + + void Read() override { } + }; + + class CalendarGetEvent final : public ClientPacket + { + public: + CalendarGetEvent(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_GET_EVENT, std::move(packet)) { } + + void Read() override; + + uint64 EventID = 0; + }; + + class CalendarGuildFilter final : public ClientPacket + { + public: + CalendarGuildFilter(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_GUILD_FILTER, std::move(packet)) { } + + void Read() override; + + uint8 MinLevel = 1; + uint8 MaxLevel = 100; + uint8 MaxRankOrder = 0; + }; + + struct CalendarAddEventInviteInfo + { + ObjectGuid Guid; + uint8 Status = 0; + uint8 Moderator = 0; + }; + + struct CalendarAddEventInfo + { + std::string Title; + std::string Description; + uint8 EventType = 0; + int32 TextureID = 0; + time_t Time = time_t(0); + uint32 Flags = 0; + Array<CalendarAddEventInviteInfo, CALENDAR_MAX_INVITES> Invites; + }; + + class CalendarAddEvent final : public ClientPacket + { + public: + CalendarAddEvent(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_ADD_EVENT, std::move(packet)) { } + + void Read() override; + + uint32 MaxSize = 100; + CalendarAddEventInfo EventInfo; + }; + + struct CalendarUpdateEventInfo + { + uint64 EventID = 0; + uint64 ModeratorID = 0; + std::string Title; + std::string Description; + uint8 EventType = 0; + uint32 TextureID = 0; + time_t Time = time_t(0); + uint32 Flags = 0; + }; + + class CalendarUpdateEvent final : public ClientPacket + { + public: + CalendarUpdateEvent(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_UPDATE_EVENT, std::move(packet)) { } + + void Read() override; + + uint32 MaxSize = 0; + CalendarUpdateEventInfo EventInfo; + }; + + class CalendarRemoveEvent final : public ClientPacket + { + public: + CalendarRemoveEvent(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_REMOVE_EVENT, std::move(packet)) { } + + void Read() override; + + uint64 ModeratorID = 0; + uint64 EventID = 0; + uint32 Flags = 0; + }; + + class CalendarCopyEvent final : public ClientPacket + { + public: + CalendarCopyEvent(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_COPY_EVENT, std::move(packet)) { } + + void Read() override; + + uint64 ModeratorID = 0; + uint64 EventID = 0; + time_t Date = time_t(0); + }; + + class SCalendarEventInvite final : public ServerPacket + { + public: + SCalendarEventInvite() : ServerPacket(SMSG_CALENDAR_EVENT_INVITE, 43) { } + + WorldPacket const* Write() override; + + uint64 InviteID = 0; + time_t ResponseTime = time_t(0); + uint8 Level = 100; + ObjectGuid InviteGuid; + uint64 EventID = 0; + uint8 Type = 0; + bool ClearPending = false; + uint8 Status = 0; + }; + + struct CalendarSendCalendarInviteInfo + { + uint64 EventID = 0; + uint64 InviteID = 0; + ObjectGuid InviterGuid; + uint8 Status = 0; + uint8 Moderator = 0; + uint8 InviteType = 0; + }; + + struct CalendarSendCalendarRaidLockoutInfo + { + uint64 InstanceID = 0; + int32 MapID = 0; + uint32 DifficultyID = 0; + time_t ExpireTime = time_t(0); + }; + + struct CalendarSendCalendarRaidResetInfo + { + int32 MapID = 0; + uint32 Duration = 0; + int32 Offset = 0; + }; + + struct CalendarSendCalendarEventInfo + { + uint64 EventID = 0; + std::string EventName; + uint8 EventType = 0; + time_t Date = time_t(0); + uint32 Flags = 0; + int32 TextureID = 0; + ObjectGuid EventGuildID; + ObjectGuid OwnerGuid; + }; + + class CalendarSendCalendar final : public ServerPacket + { + public: + CalendarSendCalendar() : ServerPacket(SMSG_CALENDAR_SEND_CALENDAR, 338) { } + + WorldPacket const* Write() override; + + time_t RaidOrigin = time_t(0); + time_t ServerTime = time_t(0); + time_t ServerNow = time_t(0); + std::vector<CalendarSendCalendarInviteInfo> Invites; + std::vector<CalendarSendCalendarRaidLockoutInfo> RaidLockouts; + std::vector<CalendarSendCalendarRaidResetInfo> RaidResets; + std::vector<CalendarSendCalendarEventInfo> Events; + }; + + struct CalendarEventInviteInfo + { + ObjectGuid Guid; + uint64 InviteID = 0; + time_t ResponseTime = time_t(0); + uint8 Level = 1; + uint8 Status = 0; + uint8 Moderator = 0; + uint8 InviteType = 0; + std::string Notes; + }; + + class CalendarSendEvent final : public ServerPacket + { + public: + CalendarSendEvent() : ServerPacket(SMSG_CALENDAR_SEND_EVENT, 93) { } + + WorldPacket const* Write() override; + + ObjectGuid OwnerGuid; + ObjectGuid EventGuildID; + uint64 EventID = 0; + time_t Date = time_t(0); + time_t LockDate = time_t(0); + uint32 Flags = 0; + int32 TextureID = 0; + uint8 GetEventType = 0; + uint8 EventType = 0; + std::string Description; + std::string EventName; + std::vector<CalendarEventInviteInfo> Invites; + }; + + class CalendarEventInviteAlert final : public ServerPacket + { + public: + CalendarEventInviteAlert() : ServerPacket(SMSG_CALENDAR_EVENT_INVITE_ALERT, 80) { } + + WorldPacket const* Write() override; + + ObjectGuid OwnerGuid; + ObjectGuid EventGuildID; + ObjectGuid InvitedByGuid; + uint64 InviteID = 0; + uint64 EventID = 0; + uint32 Flags = 0; + time_t Date = time_t(0); + int32 TextureID = 0; + uint8 Status = 0; + uint8 EventType = 0; + uint8 ModeratorStatus = 0; + std::string EventName; + }; + + class CalendarEventInvite final : public ClientPacket + { + public: + CalendarEventInvite(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_EVENT_INVITE, std::move(packet)) { } + + void Read() override; + + uint64 ModeratorID = 0; + bool IsSignUp = false; + bool Creating = true; + uint64 EventID = 0; + std::string Name; + }; + + class CalendarEventRSVP final : public ClientPacket + { + public: + CalendarEventRSVP(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_EVENT_RSVP, std::move(packet)) { } + + void Read() override; + + uint64 InviteID = 0; + uint64 EventID = 0; + uint8 Status = 0; + }; + + class CalendarEventInviteStatus final : public ServerPacket + { + public: + CalendarEventInviteStatus() : ServerPacket(SMSG_CALENDAR_EVENT_INVITE_STATUS, 41) { } + + WorldPacket const* Write() override; + + uint32 Flags = 0; + uint64 EventID = 0; + uint8 Status = 0; + bool ClearPending = false; + time_t ResponseTime = time_t(0); + time_t Date = time_t(0); + ObjectGuid InviteGuid; + }; + + class CalendarEventInviteRemoved final : public ServerPacket + { + public: + CalendarEventInviteRemoved() : ServerPacket(SMSG_CALENDAR_EVENT_INVITE_REMOVED, 29) { } + + WorldPacket const* Write() override; + + ObjectGuid InviteGuid; + uint64 EventID = 0; + uint32 Flags = 0; + bool ClearPending = false; + }; + + class CalendarEventInviteModeratorStatus final : public ServerPacket + { + public: + CalendarEventInviteModeratorStatus() : ServerPacket(SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS, 26) { } + + WorldPacket const* Write() override; + + ObjectGuid InviteGuid; + uint64 EventID = 0; + uint8 Status = 0; + bool ClearPending = false; + }; + + class CalendarEventInviteRemovedAlert final : public ServerPacket + { + public: + CalendarEventInviteRemovedAlert() : ServerPacket(SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT, 17) { } + + WorldPacket const* Write() override; + + uint64 EventID = 0; + time_t Date = time_t(0); + uint32 Flags = 0; + uint8 Status = 0; + }; + + class CalendarClearPendingAction final : public ServerPacket + { + public: + CalendarClearPendingAction() : ServerPacket(SMSG_CALENDAR_CLEAR_PENDING_ACTION, 0) { } + + WorldPacket const* Write() override { return &_worldPacket; } + }; + + class CalendarEventUpdatedAlert final : public ServerPacket + { + public: + CalendarEventUpdatedAlert() : ServerPacket(SMSG_CALENDAR_EVENT_UPDATED_ALERT, 32) { } + + WorldPacket const* Write() override; + + uint64 EventID = 0; + time_t Date = time_t(0); + uint32 Flags = 0; + time_t LockDate = time_t(0); + time_t OriginalDate = time_t(0); + int32 TextureID = 0; + uint8 EventType = 0; + bool ClearPending = false; + std::string Description; + std::string EventName; + }; + + class CalendarEventRemovedAlert final : public ServerPacket + { + public: + CalendarEventRemovedAlert() : ServerPacket(SMSG_CALENDAR_EVENT_REMOVED_ALERT, 13) { } + + WorldPacket const* Write() override; + + uint64 EventID = 0; + time_t Date = time_t(0); + bool ClearPending = false; + }; + + class CalendarSendNumPending final : public ServerPacket + { + public: + CalendarSendNumPending() : ServerPacket(SMSG_CALENDAR_SEND_NUM_PENDING, 4) { } + CalendarSendNumPending(uint32 numPending) : ServerPacket(SMSG_CALENDAR_SEND_NUM_PENDING, 4), NumPending(numPending) { } + + WorldPacket const* Write() override; + + uint32 NumPending = 0; + }; + + class CalendarGetNumPending final : public ClientPacket + { + public: + CalendarGetNumPending(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_GET_NUM_PENDING, std::move(packet)) { } + + void Read() override { } + }; + + class CalendarEventSignUp final : public ClientPacket + { + public: + CalendarEventSignUp(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_EVENT_SIGN_UP, std::move(packet)) { } + + void Read() override; + + bool Tentative = false; + uint64 EventID = 0; + }; + + class CalendarRemoveInvite final : public ClientPacket + { + public: + CalendarRemoveInvite(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_REMOVE_INVITE, std::move(packet)) { } + + void Read() override; + + ObjectGuid Guid; + uint64 EventID = 0; + uint64 ModeratorID = 0; + uint64 InviteID = 0; + }; + + class CalendarEventStatus final : public ClientPacket + { + public: + CalendarEventStatus(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_EVENT_STATUS, std::move(packet)) { } + + void Read() override; + + ObjectGuid Guid; + uint64 EventID = 0; + uint64 ModeratorID = 0; + uint64 InviteID = 0; + uint8 Status = 0; + }; + + class SetSavedInstanceExtend final : public ClientPacket + { + public: + SetSavedInstanceExtend(WorldPacket&& packet) : ClientPacket(CMSG_SET_SAVED_INSTANCE_EXTEND, std::move(packet)) { } + + void Read() override; + + int32 MapID = 0; + bool Extend = false; + uint32 DifficultyID = 0; + }; + + class CalendarEventModeratorStatus final : public ClientPacket + { + public: + CalendarEventModeratorStatus(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_EVENT_MODERATOR_STATUS, std::move(packet)) { } + + void Read() override; + + ObjectGuid Guid; + uint64 EventID = 0; + uint64 InviteID = 0; + uint64 ModeratorID = 0; + uint8 Status = 0; + }; + + class CalendarCommandResult final : public ServerPacket + { + public: + CalendarCommandResult() : ServerPacket(SMSG_CALENDAR_COMMAND_RESULT, 3) { } + CalendarCommandResult(uint8 command, uint8 result, std::string const& name) : ServerPacket(SMSG_CALENDAR_COMMAND_RESULT, 3), Command(command), Result(result), Name(name) { } + + WorldPacket const* Write() override; + + uint8 Command = 0; + uint8 Result = 0; + std::string Name; + }; + + class CalendarRaidLockoutUpdated final : public ServerPacket + { + public: + CalendarRaidLockoutUpdated() : ServerPacket(SMSG_CALENDAR_RAID_LOCKOUT_UPDATED, 20) { } + + WorldPacket const* Write() override; + + int32 MapID = 0; + int32 OldTimeRemaining = 0; + time_t ServerTime = 0; + uint32 DifficultyID = 0; + int32 NewTimeRemaining = 0; + }; + + struct CalendarEventInitialInviteInfo + { + CalendarEventInitialInviteInfo(ObjectGuid inviteGuid, uint8 level) : InviteGuid(inviteGuid), Level(level) { } + + ObjectGuid InviteGuid; + uint8 Level = 100; + }; + + class CalendarEventInitialInvites final : public ServerPacket + { + public: + CalendarEventInitialInvites() : ServerPacket(SMSG_CALENDAR_EVENT_INITIAL_INVITES, 17) { } + + WorldPacket const* Write() override; + + std::vector<CalendarEventInitialInviteInfo> Invites; + }; + + class CalendarEventInviteStatusAlert final : public ServerPacket + { + public: + CalendarEventInviteStatusAlert() : ServerPacket(SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT, 5) { } + + WorldPacket const* Write() override; + + uint64 EventID = 0; + uint32 Flags = 0; + time_t Date = time_t(0); + uint8 Status = 0; + }; + + class CalendarEventInviteNotesAlert final : public ServerPacket + { + public: + CalendarEventInviteNotesAlert() : ServerPacket(SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT, 9) { } + CalendarEventInviteNotesAlert(uint64 eventID, std::string const& notes) : ServerPacket(SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT, 8 + notes.size()), EventID(eventID), Notes(notes) { } + + WorldPacket const* Write() override; + + uint64 EventID = 0; + std::string Notes; + }; + + class CalendarEventInviteNotes final : public ServerPacket + { + public: + CalendarEventInviteNotes() : ServerPacket(SMSG_CALENDAR_EVENT_INVITE_NOTES, 26) { } + + WorldPacket const* Write() override; + + ObjectGuid InviteGuid; + uint64 EventID = 0; + std::string Notes; + bool ClearPending = false; + }; + } +} + +#endif // CalendarPackets_h__ diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index 9c6bb07f56e..afeb3e2a6b6 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -316,10 +316,15 @@ WorldPacket const* WorldPackets::Character::GenerateRandomCharacterNameResult::W return &_worldPacket; } +WorldPackets::Character::ReorderCharacters::ReorderCharacters(WorldPacket&& packet) : ClientPacket(CMSG_REORDER_CHARACTERS, std::move(packet)), + Entries(sWorld->getIntConfig(CONFIG_CHARACTERS_PER_REALM)) +{ + +} + void WorldPackets::Character::ReorderCharacters::Read() { - uint32 count = std::min<uint32>(_worldPacket.ReadBits(9), sWorld->getIntConfig(CONFIG_CHARACTERS_PER_REALM)); - Entries.resize(count); + Entries.resize(_worldPacket.ReadBits(9)); for (ReorderInfo& reorderInfo : Entries) { _worldPacket >> reorderInfo.PlayerGUID; diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index 10f1053f8ee..018564350b0 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -20,6 +20,7 @@ #include "Packet.h" #include "Player.h" +#include "PacketUtilities.h" namespace WorldPackets { @@ -351,11 +352,11 @@ namespace WorldPackets uint8 NewPosition = 0; }; - ReorderCharacters(WorldPacket&& packet) : ClientPacket(CMSG_REORDER_CHARACTERS, std::move(packet)) { } + ReorderCharacters(WorldPacket&& packet); void Read() override; - std::list<ReorderInfo> Entries; + Array<ReorderInfo> Entries; }; class UndeleteCharacter final : public ClientPacket diff --git a/src/server/game/Server/Packets/ClientConfigPackets.cpp b/src/server/game/Server/Packets/ClientConfigPackets.cpp index 2ff1bd236f8..74ff955f5d7 100644 --- a/src/server/game/Server/Packets/ClientConfigPackets.cpp +++ b/src/server/game/Server/Packets/ClientConfigPackets.cpp @@ -127,3 +127,8 @@ void WorldPackets::ClientConfig::UserClientUpdateAccountData::Read() _worldPacket.read(CompressedData.contents(), compressedSize); } } + +void WorldPackets::ClientConfig::SetAdvancedCombatLogging::Read() +{ + Enable = _worldPacket.ReadBit(); +} diff --git a/src/server/game/Server/Packets/ClientConfigPackets.h b/src/server/game/Server/Packets/ClientConfigPackets.h index a1ed1a355bb..12550a3096b 100644 --- a/src/server/game/Server/Packets/ClientConfigPackets.h +++ b/src/server/game/Server/Packets/ClientConfigPackets.h @@ -99,6 +99,16 @@ namespace WorldPackets uint8 DataType = 0; ///< @see enum AccountDataType ByteBuffer CompressedData; }; + + class SetAdvancedCombatLogging final : public ClientPacket + { + public: + SetAdvancedCombatLogging(WorldPacket&& packet) : ClientPacket(CMSG_SET_ADVANCED_COMBAT_LOGGING, std::move(packet)) { } + + void Read() override; + + bool Enable = false; + }; } } diff --git a/src/server/game/Server/Packets/CombatLogPackets.cpp b/src/server/game/Server/Packets/CombatLogPackets.cpp index 295f27375da..1b55bc8e26f 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.cpp +++ b/src/server/game/Server/Packets/CombatLogPackets.cpp @@ -20,167 +20,150 @@ WorldPacket const* WorldPackets::CombatLog::SpellNonMeleeDamageLog::Write() { - _worldPacket << Me; - _worldPacket << CasterGUID; - _worldPacket << SpellID; - _worldPacket << Damage; - _worldPacket << Overkill; - _worldPacket << SchoolMask; - _worldPacket << ShieldBlock; - _worldPacket << Resisted; - _worldPacket << Absorbed; - - _worldPacket.WriteBit(Periodic); - _worldPacket.WriteBits(Flags, 9); - _worldPacket.WriteBit(false); // Debug info - _worldPacket.WriteBit(LogData.is_initialized()); - _worldPacket.FlushBits(); - - if (LogData) - _worldPacket << *LogData; + *this << Me; + *this << CasterGUID; + *this << int32(SpellID); + *this << int32(Damage); + *this << int32(Overkill); + *this << uint8(SchoolMask); + *this << int32(ShieldBlock); + *this << int32(Resisted); + *this << int32(Absorbed); + WriteBit(Periodic); + WriteBits(Flags, 8); + WriteBit(false); // Debug info + WriteLogDataBit(); + FlushBits(); + WriteLogData(); return &_worldPacket; } WorldPacket const* WorldPackets::CombatLog::EnvironmentalDamageLog::Write() { - _worldPacket << Victim; - _worldPacket << Type; - _worldPacket << Amount; - _worldPacket << Resisted; - _worldPacket << Absorbed; - - _worldPacket.WriteBit(LogData.is_initialized()); - _worldPacket.FlushBits(); - - if (LogData) - _worldPacket << *LogData; + *this << Victim; + *this << uint8(Type); + *this << int32(Amount); + *this << int32(Resisted); + *this << int32(Absorbed); + WriteLogDataBit(); + FlushBits(); + WriteLogData(); return &_worldPacket; } WorldPacket const* WorldPackets::CombatLog::SpellExecuteLog::Write() { - _worldPacket << Caster; - _worldPacket << SpellID; - - _worldPacket << uint32(Effects.size()); + *this << Caster; + *this << SpellID; + *this << uint32(Effects.size()); for (SpellLogEffect const& effect : Effects) { - _worldPacket << effect.Effect; + *this << effect.Effect; - _worldPacket << uint32(effect.PowerDrainTargets.size()); - _worldPacket << uint32(effect.ExtraAttacksTargets.size()); - _worldPacket << uint32(effect.DurabilityDamageTargets.size()); - _worldPacket << uint32(effect.GenericVictimTargets.size()); - _worldPacket << uint32(effect.TradeSkillTargets.size()); - _worldPacket << uint32(effect.FeedPetTargets.size()); + *this << uint32(effect.PowerDrainTargets.size()); + *this << uint32(effect.ExtraAttacksTargets.size()); + *this << uint32(effect.DurabilityDamageTargets.size()); + *this << uint32(effect.GenericVictimTargets.size()); + *this << uint32(effect.TradeSkillTargets.size()); + *this << uint32(effect.FeedPetTargets.size()); for (SpellLogEffectPowerDrainParams const& powerDrainTarget : effect.PowerDrainTargets) { - _worldPacket << powerDrainTarget.Victim; - _worldPacket << powerDrainTarget.Points; - _worldPacket << powerDrainTarget.PowerType; - _worldPacket << powerDrainTarget.Amplitude; + *this << powerDrainTarget.Victim; + *this << powerDrainTarget.Points; + *this << powerDrainTarget.PowerType; + *this << powerDrainTarget.Amplitude; } for (SpellLogEffectExtraAttacksParams const& extraAttacksTarget : effect.ExtraAttacksTargets) { - _worldPacket << extraAttacksTarget.Victim; - _worldPacket << extraAttacksTarget.NumAttacks; + *this << extraAttacksTarget.Victim; + *this << extraAttacksTarget.NumAttacks; } for (SpellLogEffectDurabilityDamageParams const& durabilityDamageTarget : effect.DurabilityDamageTargets) { - _worldPacket << durabilityDamageTarget.Victim; - _worldPacket << durabilityDamageTarget.ItemID; - _worldPacket << durabilityDamageTarget.Amount; + *this << durabilityDamageTarget.Victim; + *this << durabilityDamageTarget.ItemID; + *this << durabilityDamageTarget.Amount; } for (SpellLogEffectGenericVictimParams const& genericVictimTarget : effect.GenericVictimTargets) - _worldPacket << genericVictimTarget.Victim; + *this << genericVictimTarget.Victim; for (SpellLogEffectTradeSkillItemParams const& tradeSkillTarget : effect.TradeSkillTargets) - _worldPacket << tradeSkillTarget.ItemID; - + *this << tradeSkillTarget.ItemID; for (SpellLogEffectFeedPetParams const& feedPetTarget : effect.FeedPetTargets) - _worldPacket << feedPetTarget.ItemID; + *this << feedPetTarget.ItemID; } - _worldPacket.WriteBit(LogData.is_initialized()); - _worldPacket.FlushBits(); - - if (LogData) - _worldPacket << *LogData; + WriteLogDataBit(); + FlushBits(); + WriteLogData(); return &_worldPacket; } WorldPacket const* WorldPackets::CombatLog::SpellHealLog::Write() { - _worldPacket << TargetGUID; - _worldPacket << CasterGUID; - - _worldPacket << SpellID; - _worldPacket << Health; - _worldPacket << OverHeal; - _worldPacket << Absorbed; - - _worldPacket.WriteBit(Crit); - _worldPacket.WriteBit(Multistrike); - - _worldPacket.WriteBit(CritRollMade.is_initialized()); - _worldPacket.WriteBit(CritRollNeeded.is_initialized()); - _worldPacket.WriteBit(LogData.is_initialized()); - _worldPacket.FlushBits(); + *this << TargetGUID; + *this << CasterGUID; + *this << int32(SpellID); + *this << int32(Health); + *this << int32(OverHeal); + *this << int32(Absorbed); + WriteBit(Crit); + WriteBit(Multistrike); + WriteBit(CritRollMade.is_initialized()); + WriteBit(CritRollNeeded.is_initialized()); + WriteLogDataBit(); + FlushBits(); if (CritRollMade) - _worldPacket << *CritRollMade; + *this << *CritRollMade; if (CritRollNeeded) - _worldPacket << *CritRollNeeded; + *this << *CritRollNeeded; - if (LogData) - _worldPacket << *LogData; + WriteLogData(); return &_worldPacket; } WorldPacket const* WorldPackets::CombatLog::SpellPeriodicAuraLog::Write() { - _worldPacket << TargetGUID; - _worldPacket << CasterGUID; - _worldPacket << SpellID; - - _worldPacket << uint32(Effects.size()); + *this << TargetGUID; + *this << CasterGUID; + *this << SpellID; + *this << uint32(Effects.size()); for (SpellLogEffect const& effect : Effects) { - _worldPacket << effect.Effect; - _worldPacket << int32(effect.Amount); - _worldPacket << int32(effect.OverHealOrKill); - _worldPacket << int32(effect.SchoolMaskOrPower); - _worldPacket << int32(effect.AbsorbedOrAmplitude); - _worldPacket << int32(effect.Resisted); - - _worldPacket.WriteBit(effect.Crit); - _worldPacket.WriteBit(effect.Multistrike); - - if (_worldPacket.WriteBit(effect.DebugInfo.is_initialized())) + *this << effect.Effect; + *this << int32(effect.Amount); + *this << int32(effect.OverHealOrKill); + *this << int32(effect.SchoolMaskOrPower); + *this << int32(effect.AbsorbedOrAmplitude); + *this << int32(effect.Resisted); + WriteBit(effect.Crit); + WriteBit(effect.Multistrike); + + if (WriteBit(effect.DebugInfo.is_initialized())) { - _worldPacket << float(effect.DebugInfo->CritRollMade); - _worldPacket << float(effect.DebugInfo->CritRollNeeded); + *this << float(effect.DebugInfo->CritRollMade); + *this << float(effect.DebugInfo->CritRollNeeded); } - _worldPacket.FlushBits(); + FlushBits(); } - _worldPacket.WriteBit(LogData.is_initialized()); - _worldPacket.FlushBits(); - if (LogData) - _worldPacket << *LogData; + WriteLogDataBit(); + FlushBits(); + WriteLogData(); return &_worldPacket; } @@ -197,17 +180,16 @@ WorldPacket const* WorldPackets::CombatLog::SpellInterruptLog::Write() WorldPacket const* WorldPackets::CombatLog::SpellEnergizeLog::Write() { - _worldPacket << CasterGUID; - _worldPacket << TargetGUID; + *this << CasterGUID; + *this << TargetGUID; - _worldPacket << int32(SpellID); - _worldPacket << int32(Type); - _worldPacket << int32(Amount); + *this << int32(SpellID); + *this << int32(Type); + *this << int32(Amount); - _worldPacket.WriteBit(LogData.is_initialized()); - _worldPacket.FlushBits(); - if (LogData) - _worldPacket << *LogData; + WriteLogDataBit(); + FlushBits(); + WriteLogData(); return &_worldPacket; } @@ -220,3 +202,135 @@ WorldPacket const* WorldPackets::CombatLog::SpellInstakillLog::Write() return &_worldPacket; } + +ByteBuffer& operator<<(ByteBuffer& buffer, WorldPackets::CombatLog::SpellLogMissDebug const& missDebug) +{ + buffer << float(missDebug.HitRoll); + buffer << float(missDebug.HitRollNeeded); + return buffer; +} + +ByteBuffer& operator<<(ByteBuffer& buffer, WorldPackets::CombatLog::SpellLogMissEntry const& missEntry) +{ + buffer << missEntry.Victim; + buffer << uint8(missEntry.MissReason); + if (buffer.WriteBit(missEntry.Debug.is_initialized())) + buffer << *missEntry.Debug; + + buffer.FlushBits(); + return buffer; +} + +WorldPacket const* WorldPackets::CombatLog::SpellMissLog::Write() +{ + _worldPacket << int32(SpellID); + _worldPacket << Caster; + _worldPacket << uint32(Entries.size()); + for (SpellLogMissEntry const& missEntry : Entries) + _worldPacket << missEntry; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::CombatLog::ProcResist::Write() +{ + _worldPacket << Caster; + _worldPacket << Target; + _worldPacket << int32(SpellID); + _worldPacket.WriteBit(Rolled.is_initialized()); + _worldPacket.WriteBit(Needed.is_initialized()); + _worldPacket.FlushBits(); + + if (Rolled) + _worldPacket << *Rolled; + + if (Needed) + _worldPacket << *Needed; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::CombatLog::SpellOrDamageImmune::Write() +{ + _worldPacket << CasterGUID; + _worldPacket << VictimGUID; + _worldPacket << uint32(SpellID); + _worldPacket.WriteBit(IsPeriodic); + _worldPacket.FlushBits(); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::CombatLog::SpellDamageShield::Write() +{ + *this << Attacker; + *this << Defender; + *this << int32(SpellID); + *this << int32(TotalDamage); + *this << int32(OverKill); + *this << int32(SchoolMask); + *this << int32(LogAbsorbed); + WriteLogDataBit(); + FlushBits(); + WriteLogData(); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::CombatLog::AttackerStateUpdate::Write() +{ + ByteBuffer attackRoundInfo; + attackRoundInfo << HitInfo; + attackRoundInfo << AttackerGUID; + attackRoundInfo << VictimGUID; + attackRoundInfo << Damage; + attackRoundInfo << OverDamage; + + if (attackRoundInfo.WriteBit(SubDmg.is_initialized())) + { + attackRoundInfo << SubDmg->SchoolMask; + attackRoundInfo << SubDmg->FDamage; + attackRoundInfo << SubDmg->Damage; + if (HitInfo & (HITINFO_FULL_ABSORB | HITINFO_PARTIAL_ABSORB)) + attackRoundInfo << SubDmg->Absorbed; + if (HitInfo & (HITINFO_FULL_RESIST | HITINFO_PARTIAL_RESIST)) + attackRoundInfo << SubDmg->Resisted; + } + + attackRoundInfo << VictimState; + attackRoundInfo << AttackerState; + attackRoundInfo << MeleeSpellID; + if (HitInfo & HITINFO_BLOCK) + attackRoundInfo << BlockAmount; + + if (HitInfo & HITINFO_RAGE_GAIN) + attackRoundInfo << RageGained; + + if (HitInfo & HITINFO_UNK1) + { + attackRoundInfo << UnkState.State1; + attackRoundInfo << UnkState.State2; + attackRoundInfo << UnkState.State3; + attackRoundInfo << UnkState.State4; + attackRoundInfo << UnkState.State5; + attackRoundInfo << UnkState.State6; + attackRoundInfo << UnkState.State7; + attackRoundInfo << UnkState.State8; + attackRoundInfo << UnkState.State9; + attackRoundInfo << UnkState.State10; + attackRoundInfo << UnkState.State11; + attackRoundInfo << UnkState.State12; + } + if (HitInfo & (HITINFO_BLOCK | HITINFO_UNK12)) + attackRoundInfo << Unk; + + WriteLogDataBit(); + FlushBits(); + WriteLogData(); + + *this << uint32(attackRoundInfo.size()); + _worldPacket.append(attackRoundInfo); + _fullLogPacket.append(attackRoundInfo); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/CombatLogPackets.h b/src/server/game/Server/Packets/CombatLogPackets.h index 5566ea62180..408210342e3 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.h +++ b/src/server/game/Server/Packets/CombatLogPackets.h @@ -26,10 +26,59 @@ namespace WorldPackets { namespace CombatLog { - class SpellNonMeleeDamageLog final : public ServerPacket + class CombatLogServerPacket : public ServerPacket { public: - SpellNonMeleeDamageLog() : ServerPacket(SMSG_SPELL_NON_MELEE_DAMAGE_LOG, 60) { } + CombatLogServerPacket(OpcodeServer opcode, size_t initialSize = 200, ConnectionType connection = CONNECTION_TYPE_DEFAULT) + : ServerPacket(opcode, initialSize, connection), _fullLogPacket(opcode, initialSize, connection) { } + + WorldPacket const* GetFullLogPacket() const { return &_fullLogPacket; } + WorldPacket const* GetBasicLogPacket() const { return &_worldPacket; } + + Spells::SpellCastLogData LogData; + + protected: + template<typename T> + void operator<<(T const& val) + { + _worldPacket << val; + _fullLogPacket << val; + } + + void WriteLogDataBit() + { + _worldPacket.WriteBit(false); + _fullLogPacket.WriteBit(true); + } + + void FlushBits() + { + _worldPacket.FlushBits(); + _fullLogPacket.FlushBits(); + } + + bool WriteBit(bool bit) + { + _worldPacket.WriteBit(bit); + _fullLogPacket.WriteBit(bit); + return bit; + } + + void WriteBits(uint32 value, uint32 bitCount) + { + _worldPacket.WriteBits(value, bitCount); + _fullLogPacket.WriteBits(value, bitCount); + } + + ByteBuffer& WriteLogData() { return _fullLogPacket << LogData; } + + WorldPacket _fullLogPacket; + }; + + class SpellNonMeleeDamageLog final : public CombatLogServerPacket + { + public: + SpellNonMeleeDamageLog() : CombatLogServerPacket(SMSG_SPELL_NON_MELEE_DAMAGE_LOG, 60) { } WorldPacket const* Write() override; @@ -41,17 +90,16 @@ namespace WorldPackets bool Periodic = 0.0f; uint8 SchoolMask = 0; ObjectGuid CasterGUID; - Optional<Spells::SpellCastLogData> LogData; int32 Damage = 0; // Optional<SpellNonMeleeDamageLogDebugInfo> Debug Info; int32 Flags = 0; int32 Overkill = 0; }; - class EnvironmentalDamageLog final : public ServerPacket + class EnvironmentalDamageLog final : public CombatLogServerPacket { public: - EnvironmentalDamageLog() : ServerPacket(SMSG_ENVIRONMENTAL_DAMAGE_LOG, 23) { } + EnvironmentalDamageLog() : CombatLogServerPacket(SMSG_ENVIRONMENTAL_DAMAGE_LOG, 23) { } WorldPacket const* Write() override; @@ -60,10 +108,9 @@ namespace WorldPackets int32 Amount = 0; int32 Resisted = 0; int32 Absorbed = 0; - Optional<Spells::SpellCastLogData> LogData; /// @todo: find the correct way where to use it, in sniff always false }; - class SpellExecuteLog final : public ServerPacket + class SpellExecuteLog final : public CombatLogServerPacket { public: struct SpellLogEffect @@ -78,20 +125,19 @@ namespace WorldPackets std::vector<SpellLogEffectFeedPetParams> FeedPetTargets; }; - SpellExecuteLog() : ServerPacket(SMSG_SPELL_EXECUTE_LOG, 16 + 4 + 4 + 1) { } + SpellExecuteLog() : CombatLogServerPacket(SMSG_SPELL_EXECUTE_LOG, 16 + 4 + 4 + 1) { } WorldPacket const* Write() override; ObjectGuid Caster; int32 SpellID = 0; std::vector<SpellLogEffect> Effects; - Optional<Spells::SpellCastLogData> LogData; /// @todo: find the correct way where to use it, in sniff always false }; - class SpellHealLog final : public ServerPacket + class SpellHealLog final : public CombatLogServerPacket { public: - SpellHealLog() : ServerPacket(SMSG_SPELL_HEAL_LOG, 16 + 16 + 4 * 4 + 1) { } + SpellHealLog() : CombatLogServerPacket(SMSG_SPELL_HEAL_LOG, 16 + 16 + 4 * 4 + 1) { } WorldPacket const* Write() override; @@ -105,10 +151,9 @@ namespace WorldPackets bool Multistrike = false; Optional<float> CritRollMade; Optional<float> CritRollNeeded; - Optional<Spells::SpellCastLogData> LogData; /// @todo: find the correct way where to use it, in sniff always false }; - class SpellPeriodicAuraLog final : public ServerPacket + class SpellPeriodicAuraLog final : public CombatLogServerPacket { public: struct PeriodicalAuraLogEffectDebugInfo @@ -130,7 +175,7 @@ namespace WorldPackets Optional<PeriodicalAuraLogEffectDebugInfo> DebugInfo; }; - SpellPeriodicAuraLog() : ServerPacket(SMSG_SPELL_PERIODIC_AURA_LOG, 16 + 16 + 4 + 4 + 1) { } + SpellPeriodicAuraLog() : CombatLogServerPacket(SMSG_SPELL_PERIODIC_AURA_LOG, 16 + 16 + 4 + 4 + 1) { } WorldPacket const* Write() override; @@ -138,7 +183,6 @@ namespace WorldPackets ObjectGuid CasterGUID; int32 SpellID = 0; std::vector<SpellLogEffect> Effects; - Optional<Spells::SpellCastLogData> LogData; /// @todo: find the correct way where to use it, in sniff always false }; class SpellInterruptLog final : public ServerPacket @@ -154,10 +198,10 @@ namespace WorldPackets int32 SpellID = 0; }; - class SpellEnergizeLog final : public ServerPacket + class SpellEnergizeLog final : public CombatLogServerPacket { public: - SpellEnergizeLog() : ServerPacket(SMSG_SPELL_ENERGIZE_LOG, 16 + 16 + 4 + 4 + 4 + 1) { } + SpellEnergizeLog() : CombatLogServerPacket(SMSG_SPELL_ENERGIZE_LOG, 16 + 16 + 4 + 4 + 4 + 1) { } WorldPacket const* Write() override; @@ -166,7 +210,6 @@ namespace WorldPackets int32 SpellID = 0; int32 Type = 0; int32 Amount = 0; - Optional<Spells::SpellCastLogData> LogData; /// @todo: find the correct way where to use it, in sniff always false }; class SpellInstakillLog final : public ServerPacket @@ -180,6 +223,123 @@ namespace WorldPackets ObjectGuid Caster; int32 SpellID = 0; }; + + struct SpellLogMissDebug + { + float HitRoll = 0.0f; + float HitRollNeeded = 0.0f; + }; + + struct SpellLogMissEntry + { + SpellLogMissEntry(ObjectGuid const& victim, uint8 missReason) : Victim(victim), MissReason(missReason) { } + + ObjectGuid Victim; + uint8 MissReason = 0; + Optional<SpellLogMissDebug> Debug; + }; + + class SpellMissLog final : public ServerPacket + { + public: + SpellMissLog() : ServerPacket(SMSG_SPELL_MISS_LOG) { } + + WorldPacket const* Write() override; + + int32 SpellID = 0; + ObjectGuid Caster; + std::vector<SpellLogMissEntry> Entries; + }; + + class ProcResist final : public ServerPacket + { + public: + ProcResist() : ServerPacket(SMSG_PROC_RESIST, 16 + 4 + 4 + 4 + 16) { } + + WorldPacket const* Write() override; + + ObjectGuid Caster; + ObjectGuid Target; + int32 SpellID = 0; + Optional<float> Rolled; + Optional<float> Needed; + }; + + class SpellOrDamageImmune final : public ServerPacket + { + public: + SpellOrDamageImmune() : ServerPacket(SMSG_SPELL_OR_DAMAGE_IMMUNE, 16 + 1 + 4 + 16) { } + + WorldPacket const* Write() override; + + ObjectGuid CasterGUID; + ObjectGuid VictimGUID; + uint32 SpellID = 0; + bool IsPeriodic = false; + }; + + class SpellDamageShield final : public CombatLogServerPacket + { + public: + SpellDamageShield() : CombatLogServerPacket(SMSG_SPELL_DAMAGE_SHIELD, 4 + 16 + 4 + 4 + 16 + 4 + 4 + 1) { } + + WorldPacket const* Write() override; + + ObjectGuid Attacker; + ObjectGuid Defender; + int32 SpellID = 0; + int32 TotalDamage = 0; + int32 OverKill = 0; + int32 SchoolMask = 0; + int32 LogAbsorbed = 0; + }; + + struct SubDamage + { + int32 SchoolMask = 0; + float FDamage = 0.0f; // Float damage (Most of the time equals to Damage) + int32 Damage = 0; + int32 Absorbed = 0; + int32 Resisted = 0; + }; + + struct UnkAttackerState + { + int32 State1 = 0; + float State2 = 0.0f; + float State3 = 0.0f; + float State4 = 0.0f; + float State5 = 0.0f; + float State6 = 0.0f; + float State7 = 0.0f; + float State8 = 0.0f; + float State9 = 0.0f; + float State10 = 0.0f; + float State11 = 0.0f; + int32 State12 = 0; + }; + + class AttackerStateUpdate final : public CombatLogServerPacket + { + public: + AttackerStateUpdate() : CombatLogServerPacket(SMSG_ATTACKER_STATE_UPDATE, 70) { } + + WorldPacket const* Write() override; + + uint32 HitInfo = 0; // Flags + ObjectGuid AttackerGUID; + ObjectGuid VictimGUID; + int32 Damage = 0; + int32 OverDamage = -1; // (damage - health) or -1 if unit is still alive + Optional<SubDamage> SubDmg; + uint8 VictimState = 0; + int32 AttackerState = -1; + int32 MeleeSpellID = 0; + int32 BlockAmount = 0; + int32 RageGained = 0; + UnkAttackerState UnkState; + float Unk = 0.0f; + }; } } diff --git a/src/server/game/Server/Packets/CombatPackets.cpp b/src/server/game/Server/Packets/CombatPackets.cpp index d47f2275ee6..0aed54cf3c0 100644 --- a/src/server/game/Server/Packets/CombatPackets.cpp +++ b/src/server/game/Server/Packets/CombatPackets.cpp @@ -94,64 +94,6 @@ WorldPacket const* WorldPackets::Combat::AIReaction::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Combat::AttackerStateUpdate::Write() -{ - if (_worldPacket.WriteBit(LogData.is_initialized())) - _worldPacket << *LogData; - - // Placeholder for size which will be calculated at the end based on packet size - // Client uses this size to copy remaining packet to another CDataStore - _worldPacket << int32(0); - size_t pos = _worldPacket.wpos(); - - _worldPacket << HitInfo; - _worldPacket << AttackerGUID; - _worldPacket << VictimGUID; - _worldPacket << Damage; - _worldPacket << OverDamage; - - if (_worldPacket.WriteBit(SubDmg.is_initialized())) - { - _worldPacket << SubDmg->SchoolMask; - _worldPacket << SubDmg->FDamage; - _worldPacket << SubDmg->Damage; - if (HitInfo & (HITINFO_FULL_ABSORB | HITINFO_PARTIAL_ABSORB)) - _worldPacket << SubDmg->Absorbed; - if (HitInfo & (HITINFO_FULL_RESIST | HITINFO_PARTIAL_RESIST)) - _worldPacket << SubDmg->Resisted; - } - - _worldPacket << VictimState; - _worldPacket << AttackerState; - _worldPacket << MeleeSpellID; - if (HitInfo & HITINFO_BLOCK) - _worldPacket << BlockAmount; - if (HitInfo & HITINFO_RAGE_GAIN) - _worldPacket << RageGained; - if (HitInfo & HITINFO_UNK1) - { - _worldPacket << UnkState.State1; - _worldPacket << UnkState.State2; - _worldPacket << UnkState.State3; - _worldPacket << UnkState.State4; - _worldPacket << UnkState.State5; - _worldPacket << UnkState.State6; - _worldPacket << UnkState.State7; - _worldPacket << UnkState.State8; - _worldPacket << UnkState.State9; - _worldPacket << UnkState.State10; - _worldPacket << UnkState.State11; - _worldPacket << UnkState.State12; - } - if (HitInfo & (HITINFO_BLOCK|HITINFO_UNK12)) - _worldPacket << Unk; - - // Update size placeholder - _worldPacket.put<int32>(pos - sizeof(int32), _worldPacket.wpos() - pos); - - return &_worldPacket; -} - WorldPacket const* WorldPackets::Combat::AttackSwingError::Write() { _worldPacket.WriteBits(Reason, 2); @@ -207,3 +149,10 @@ WorldPacket const* WorldPackets::Combat::PvPCredit::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Combat::BreakTarget::Write() +{ + _worldPacket << UnitGUID; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/CombatPackets.h b/src/server/game/Server/Packets/CombatPackets.h index deeb98fe335..b2e4df978c3 100644 --- a/src/server/game/Server/Packets/CombatPackets.h +++ b/src/server/game/Server/Packets/CombatPackets.h @@ -130,54 +130,6 @@ namespace WorldPackets uint32 Reaction = 0; }; - struct SubDamage - { - int32 SchoolMask = 0; - float FDamage = 0.0f; // Float damage (Most of the time equals to Damage) - int32 Damage = 0; - int32 Absorbed = 0; - int32 Resisted = 0; - }; - - struct UnkAttackerState - { - int32 State1 = 0; - float State2 = 0.0f; - float State3 = 0.0f; - float State4 = 0.0f; - float State5 = 0.0f; - float State6 = 0.0f; - float State7 = 0.0f; - float State8 = 0.0f; - float State9 = 0.0f; - float State10 = 0.0f; - float State11 = 0.0f; - int32 State12 = 0; - }; - - class AttackerStateUpdate final : public ServerPacket - { - public: - AttackerStateUpdate() : ServerPacket(SMSG_ATTACKER_STATE_UPDATE, 70) { } - - WorldPacket const* Write() override; - - Optional<Spells::SpellCastLogData> LogData; - uint32 HitInfo = 0; // Flags - ObjectGuid AttackerGUID; - ObjectGuid VictimGUID; - int32 Damage = 0; - int32 OverDamage = -1; // (damage - health) or -1 if unit is still alive - Optional<SubDamage> SubDmg; - uint8 VictimState = 0; - int32 AttackerState = -1; - int32 MeleeSpellID = 0; - int32 BlockAmount = 0; - int32 RageGained = 0; - UnkAttackerState UnkState; - float Unk = 0.0f; - }; - class CancelCombat final : public ServerPacket { public: @@ -258,6 +210,16 @@ namespace WorldPackets int32 Honor = 0; int32 Rank = 0; }; + + class BreakTarget final : public ServerPacket + { + public: + BreakTarget() : ServerPacket(SMSG_BREAK_TARGET, 16) { } + + WorldPacket const* Write() override; + + ObjectGuid UnitGUID; + }; } } diff --git a/src/server/game/Server/Packets/InstancePackets.cpp b/src/server/game/Server/Packets/InstancePackets.cpp index 18533ad9edb..3c0a4ccdb90 100644 --- a/src/server/game/Server/Packets/InstancePackets.cpp +++ b/src/server/game/Server/Packets/InstancePackets.cpp @@ -80,3 +80,16 @@ WorldPacket const* WorldPackets::Instance::InstanceSaveCreated::Write() return &_worldPacket; } + +void WorldPackets::Instance::InstanceLockResponse::Read() +{ + AcceptLock = _worldPacket.ReadBit(); +} + +WorldPacket const* WorldPackets::Instance::RaidGroupOnly::Write() +{ + _worldPacket << Delay; + _worldPacket << Reason; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/InstancePackets.h b/src/server/game/Server/Packets/InstancePackets.h index ebcf8f5f0cf..78539684865 100644 --- a/src/server/game/Server/Packets/InstancePackets.h +++ b/src/server/game/Server/Packets/InstancePackets.h @@ -115,6 +115,27 @@ namespace WorldPackets bool Gm = false; }; + + class InstanceLockResponse final : public ClientPacket + { + public: + InstanceLockResponse(WorldPacket&& packet) : ClientPacket(CMSG_INSTANCE_LOCK_RESPONSE, std::move(packet)) { } + + void Read() override; + + bool AcceptLock = false; + }; + + class RaidGroupOnly final : public ServerPacket + { + public: + RaidGroupOnly() : ServerPacket(SMSG_RAID_GROUP_ONLY, 4 + 4) { } + + WorldPacket const* Write() override; + + int32 Delay = 0; + uint32 Reason = 0; + }; } } diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index 6d7fdffc73b..26dda8e646e 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -381,6 +381,7 @@ WorldPacket const* WorldPackets::Item::ItemCooldown::Write() { _worldPacket << ItemGuid; _worldPacket << uint32(SpellID); + _worldPacket << uint32(Cooldown); return &_worldPacket; } diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h index 69a6c5ab997..d179f03b041 100644 --- a/src/server/game/Server/Packets/ItemPackets.h +++ b/src/server/game/Server/Packets/ItemPackets.h @@ -376,12 +376,13 @@ namespace WorldPackets class ItemCooldown final : public ServerPacket { public: - ItemCooldown() : ServerPacket(SMSG_ITEM_COOLDOWN, 20) { } + ItemCooldown() : ServerPacket(SMSG_ITEM_COOLDOWN, 24) { } WorldPacket const* Write() override; ObjectGuid ItemGuid; uint32 SpellID = 0; + uint32 Cooldown = 0; }; class ItemEnchantTimeUpdate final : public ServerPacket diff --git a/src/server/game/Server/Packets/LootPackets.cpp b/src/server/game/Server/Packets/LootPackets.cpp index 029196d22f7..ce0d267778f 100644 --- a/src/server/game/Server/Packets/LootPackets.cpp +++ b/src/server/game/Server/Packets/LootPackets.cpp @@ -56,8 +56,8 @@ WorldPacket const* WorldPackets::Loot::LootResponse::Write() _worldPacket.FlushBits(); } - _worldPacket.WriteBit(PersonalLooting); _worldPacket.WriteBit(Acquired); + _worldPacket.WriteBit(PersonalLooting); _worldPacket.WriteBit(AELooting); _worldPacket.FlushBits(); @@ -121,3 +121,26 @@ WorldPacket const* WorldPackets::Loot::LootReleaseResponse::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Loot::LootList::Write() +{ + _worldPacket << Owner; + + _worldPacket.WriteBit(Master.is_initialized()); + _worldPacket.WriteBit(RoundRobinWinner.is_initialized()); + + _worldPacket.FlushBits(); + + if (Master) + _worldPacket << *Master; + + if (RoundRobinWinner) + _worldPacket << *RoundRobinWinner; + + return &_worldPacket; +} + +void WorldPackets::Loot::SetLootSpecialization::Read() +{ + _worldPacket >> SpecID; +} diff --git a/src/server/game/Server/Packets/LootPackets.h b/src/server/game/Server/Packets/LootPackets.h index fd8f545a19f..9bdd8bd3a4f 100644 --- a/src/server/game/Server/Packets/LootPackets.h +++ b/src/server/game/Server/Packets/LootPackets.h @@ -166,6 +166,28 @@ namespace WorldPackets ObjectGuid LootObj; ObjectGuid Owner; }; + + class LootList final : public ServerPacket + { + public: + LootList() : ServerPacket(SMSG_LOOT_LIST, 3 * 16) { } + + WorldPacket const* Write() override; + + ObjectGuid Owner; + Optional<ObjectGuid> Master; + Optional<ObjectGuid> RoundRobinWinner; + }; + + class SetLootSpecialization final : public ClientPacket + { + public: + SetLootSpecialization(WorldPacket&& packet) : ClientPacket(CMSG_SET_LOOT_SPECIALIZATION, std::move(packet)) { } + + void Read() override; + + uint32 SpecID = 0; + }; } } diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index 448a1f2b790..7c45810bc13 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -146,7 +146,9 @@ WorldPacket const* WorldPackets::Misc::TutorialFlags::Write() void WorldPackets::Misc::TutorialSetFlag::Read() { Action = _worldPacket.ReadBits(2); - _worldPacket >> TutorialBit; + + if (Action == TUTORIAL_ACTION_UPDATE) + _worldPacket >> TutorialBit; } WorldPacket const* WorldPackets::Misc::WorldServerInfo::Write() @@ -538,3 +540,8 @@ WorldPacket const* WorldPackets::Misc::SetPlayHoverAnim::Write() return &_worldPacket; } + +void WorldPackets::Misc::SetPvP::Read() +{ + EnablePVP = _worldPacket.ReadBit(); +} diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index caffb0afa11..ea1d32b73cc 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -686,6 +686,32 @@ namespace WorldPackets ObjectGuid UnitGUID; bool PlayHoverAnim = false; }; + + class OpeningCinematic final : public ClientPacket + { + public: + OpeningCinematic(WorldPacket&& packet) : ClientPacket(CMSG_OPENING_CINEMATIC, std::move(packet)) { } + + void Read() override { } + }; + + class TogglePvP final : public ClientPacket + { + public: + TogglePvP(WorldPacket&& packet) : ClientPacket(CMSG_TOGGLE_PVP, std::move(packet)) { } + + void Read() override { } + }; + + class SetPvP final : public ClientPacket + { + public: + SetPvP(WorldPacket&& packet) : ClientPacket(CMSG_SET_PVP, std::move(packet)) { } + + void Read() override; + + bool EnablePVP = false; + }; } } diff --git a/src/server/game/Server/Packets/PacketUtilities.h b/src/server/game/Server/Packets/PacketUtilities.h index f92d949d1be..4837ee9e69c 100644 --- a/src/server/game/Server/Packets/PacketUtilities.h +++ b/src/server/game/Server/Packets/PacketUtilities.h @@ -21,6 +21,7 @@ #include "ByteBuffer.h" #include <G3D/Vector2.h> #include <G3D/Vector3.h> +#include <sstream> inline ByteBuffer& operator<<(ByteBuffer& data, G3D::Vector2 const& v) { @@ -48,6 +49,85 @@ inline ByteBuffer& operator>>(ByteBuffer& data, G3D::Vector3& v) namespace WorldPackets { + class PacketArrayMaxCapacityException : public ByteBufferException + { + public: + PacketArrayMaxCapacityException(std::size_t requestedSize, std::size_t sizeLimit) + { + std::ostringstream builder; + builder << "Attempted to read more array elements from packet " << requestedSize << " than allowed " << sizeLimit; + message().assign(builder.str()); + } + }; + + /** + * Utility class for automated prevention of loop counter spoofing in client packets + */ + template<typename T, std::size_t N = 1000 /*select a sane default limit*/> + class Array + { + typedef std::vector<T> storage_type; + + typedef typename storage_type::value_type value_type; + typedef typename storage_type::size_type size_type; + typedef typename storage_type::reference reference; + typedef typename storage_type::const_reference const_reference; + typedef typename storage_type::iterator iterator; + typedef typename storage_type::const_iterator const_iterator; + + public: + Array() : _limit(N) { } + Array(size_type limit) : _limit(limit) { } + + iterator begin() { return _storage.begin(); } + const_iterator begin() const { return _storage.begin(); } + + iterator end() { return _storage.end(); } + const_iterator end() const { return _storage.end(); } + + size_type size() const { return _storage.size(); } + bool empty() const { return _storage.empty(); } + + reference operator[](size_type i) { return _storage[i]; } + const_reference operator[](size_type i) const { return _storage[i]; } + + void resize(size_type newSize) + { + if (newSize > _limit) + throw PacketArrayMaxCapacityException(newSize, _limit); + + _storage.resize(newSize); + } + + void reserve(size_type newSize) + { + if (newSize > _limit) + throw PacketArrayMaxCapacityException(newSize, _limit); + + _storage.reserve(newSize); + } + + void push_back(value_type const& value) + { + if (_storage.size() >= _limit) + throw PacketArrayMaxCapacityException(_storage.size() + 1, _limit); + + _storage.push_back(value); + } + + void push_back(value_type&& value) + { + if (_storage.size() >= _limit) + throw PacketArrayMaxCapacityException(_storage.size() + 1, _limit); + + _storage.push_back(std::forward<value_type>(value)); + } + + private: + storage_type _storage; + size_type _limit; + }; + template <typename T> class CompactArray { diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp index 1ca4d8095d0..332aa959a1e 100644 --- a/src/server/game/Server/Packets/PartyPackets.cpp +++ b/src/server/game/Server/Packets/PartyPackets.cpp @@ -541,6 +541,14 @@ void WorldPackets::Party::PartyMemberStats::Initialize(Player const* player) } } +WorldPacket const* WorldPackets::Party::PartyKillLog::Write() +{ + _worldPacket << Player; + _worldPacket << Victim; + + return &_worldPacket; +} + ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupPhase const& phase) { data << phase.Flags; diff --git a/src/server/game/Server/Packets/PartyPackets.h b/src/server/game/Server/Packets/PartyPackets.h index 34e8097f985..cb0e4aac440 100644 --- a/src/server/game/Server/Packets/PartyPackets.h +++ b/src/server/game/Server/Packets/PartyPackets.h @@ -594,6 +594,17 @@ namespace WorldPackets std::vector<RaidMarker*> RaidMarkers; }; + + class PartyKillLog final : public ServerPacket + { + public: + PartyKillLog() : ServerPacket(SMSG_PARTY_KILL_LOG, 2 * 16) { } + + WorldPacket const* Write() override; + + ObjectGuid Player; + ObjectGuid Victim; + }; } } diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp index 687ab6402f4..9e5309cdba3 100644 --- a/src/server/game/Server/Packets/QuestPackets.cpp +++ b/src/server/game/Server/Packets/QuestPackets.cpp @@ -276,17 +276,17 @@ WorldPacket const* WorldPackets::Quest::QuestGiverOfferRewardMessage::Write() _worldPacket.WriteBits(QuestTitle.size(), 9); _worldPacket.WriteBits(RewardText.size(), 12); - _worldPacket.WriteBits(PortraitTurnInText.size(), 10); - _worldPacket.WriteBits(PortraitGiverName.size(), 8); _worldPacket.WriteBits(PortraitGiverText.size(), 10); + _worldPacket.WriteBits(PortraitGiverName.size(), 8); + _worldPacket.WriteBits(PortraitTurnInText.size(), 10); _worldPacket.WriteBits(PortraitTurnInName.size(), 8); _worldPacket.FlushBits(); _worldPacket.WriteString(QuestTitle); _worldPacket.WriteString(RewardText); - _worldPacket.WriteString(PortraitTurnInText); - _worldPacket.WriteString(PortraitGiverName); _worldPacket.WriteString(PortraitGiverText); + _worldPacket.WriteString(PortraitGiverName); + _worldPacket.WriteString(PortraitTurnInText); _worldPacket.WriteString(PortraitTurnInName); return &_worldPacket; @@ -359,10 +359,10 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestDetails::Write() _worldPacket.WriteBits(QuestTitle.size(), 9); _worldPacket.WriteBits(DescriptionText.size(), 12); _worldPacket.WriteBits(LogDescription.size(), 12); - _worldPacket.WriteBits(PortraitTurnInText.size(), 10); - _worldPacket.WriteBits(PortraitTurnInName.size(), 8); _worldPacket.WriteBits(PortraitGiverText.size(), 10); _worldPacket.WriteBits(PortraitGiverName.size(), 8); + _worldPacket.WriteBits(PortraitTurnInText.size(), 10); + _worldPacket.WriteBits(PortraitTurnInName.size(), 8); _worldPacket.WriteBit(DisplayPopup); _worldPacket.WriteBit(StartCheat); _worldPacket.WriteBit(AutoLaunched); @@ -371,10 +371,10 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestDetails::Write() _worldPacket.WriteString(QuestTitle); _worldPacket.WriteString(DescriptionText); _worldPacket.WriteString(LogDescription); - _worldPacket.WriteString(PortraitTurnInText); - _worldPacket.WriteString(PortraitTurnInName); _worldPacket.WriteString(PortraitGiverText); _worldPacket.WriteString(PortraitGiverName); + _worldPacket.WriteString(PortraitTurnInText); + _worldPacket.WriteString(PortraitTurnInName); return &_worldPacket; } @@ -495,10 +495,46 @@ void WorldPackets::Quest::QuestConfirmAccept::Read() _worldPacket >> QuestID; } -WorldPacket const* WorldPackets::Quest::QuestPushResult::Write() +WorldPacket const* WorldPackets::Quest::QuestPushResultResponse::Write() { _worldPacket << SenderGUID; _worldPacket << uint8(Result); return &_worldPacket; } + +void WorldPackets::Quest::QuestPushResult::Read() +{ + _worldPacket >> SenderGUID; + _worldPacket >> QuestID; + _worldPacket >> Result; +} + +WorldPacket const* WorldPackets::Quest::QuestGiverInvalidQuest::Write() +{ + _worldPacket << Reason; + + _worldPacket.WriteBit(SendErrorMessage); + _worldPacket.WriteBits(ReasonText.length(), 9); + + _worldPacket.FlushBits(); + + _worldPacket.WriteString(ReasonText); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Quest::QuestUpdateFailedTimer::Write() +{ + _worldPacket << QuestID; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Quest::QuestGiverQuestFailed::Write() +{ + _worldPacket << QuestID; + _worldPacket << Reason; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index ef5817fccd8..2e4d2b5d2f4 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -251,11 +251,11 @@ namespace WorldPackets int32 PortraitTurnIn = 0; int32 PortraitGiver = 0; - std::string PortraitGiverText; std::string QuestTitle; - std::string PortraitTurnInText; - std::string PortraitGiverName; std::string RewardText; + std::string PortraitGiverText; + std::string PortraitGiverName; + std::string PortraitTurnInText; std::string PortraitTurnInName; QuestGiverOfferReward QuestData; int32 QuestPackageID = 0; @@ -332,10 +332,10 @@ namespace WorldPackets std::vector<int32> LearnSpells; int32 PortraitTurnIn = 0; int32 PortraitGiver = 0; - std::string PortraitTurnInText; - std::string PortraitTurnInName; std::string PortraitGiverText; std::string PortraitGiverName; + std::string PortraitTurnInText; + std::string PortraitTurnInName; std::string QuestTitle; std::string LogDescription; std::string DescriptionText; @@ -485,10 +485,10 @@ namespace WorldPackets int32 QuestID = 0; }; - class QuestPushResult final : public ServerPacket + class QuestPushResultResponse final : public ServerPacket { public: - QuestPushResult() : ServerPacket(SMSG_QUEST_PUSH_RESULT, 16 + 1) { } + QuestPushResultResponse() : ServerPacket(SMSG_QUEST_PUSH_RESULT, 16 + 1) { } WorldPacket const* Write() override; @@ -503,6 +503,51 @@ namespace WorldPackets WorldPacket const* Write() override { return &_worldPacket; } }; + + class QuestPushResult final : public ClientPacket + { + public: + QuestPushResult(WorldPacket&& packet) : ClientPacket(CMSG_QUEST_PUSH_RESULT, std::move(packet)) { } + + void Read() override; + + ObjectGuid SenderGUID; + uint32 QuestID = 0; + uint8 Result = 0; + }; + + class QuestGiverInvalidQuest final : public ServerPacket + { + public: + QuestGiverInvalidQuest() : ServerPacket(SMSG_QUEST_GIVER_INVALID_QUEST, 6) { } + + WorldPacket const* Write() override; + + uint32 Reason = 0; + bool SendErrorMessage = false; + std::string ReasonText; + }; + + class QuestUpdateFailedTimer final : public ServerPacket + { + public: + QuestUpdateFailedTimer() : ServerPacket(SMSG_QUEST_UPDATE_FAILED_TIMER, 4) { } + + WorldPacket const* Write() override; + + uint32 QuestID = 0; + }; + + class QuestGiverQuestFailed final : public ServerPacket + { + public: + QuestGiverQuestFailed() : ServerPacket(SMSG_QUEST_GIVER_QUEST_FAILED, 8) { } + + WorldPacket const* Write() override; + + uint32 QuestID = 0; + uint32 Reason = 0; + }; } } diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index 91821780575..2f7bec3d3ba 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -77,6 +77,14 @@ WorldPacket const* WorldPackets::Spells::SendUnlearnSpells::Write() return &_worldPacket; } +void WorldPackets::Spells::SpellCastLogData::Initialize(Unit const* unit) +{ + Health = unit->GetHealth(); + AttackPower = unit->GetTotalAttackPowerValue(unit->getClass() == CLASS_HUNTER ? RANGED_ATTACK : BASE_ATTACK); + SpellPower = unit->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_SPELL); + PowerData.emplace_back(int32(unit->getPowerType()), unit->GetPower(unit->getPowerType())); +} + ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData const& spellCastLogData) { data << spellCastLogData.Health; diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index f5df5e32da0..fbd53c0527c 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -135,6 +135,8 @@ namespace WorldPackets struct SpellLogPowerData { + SpellLogPowerData(int32 powerType, int32 amount) : PowerType(powerType), Amount(amount) { } + int32 PowerType = 0; int32 Amount = 0; }; @@ -145,6 +147,8 @@ namespace WorldPackets int32 AttackPower = 0; int32 SpellPower = 0; std::vector<SpellLogPowerData> PowerData; + + void Initialize(Unit const* unit); }; struct AuraDataInfo diff --git a/src/server/game/Server/Packets/VoidStoragePackets.cpp b/src/server/game/Server/Packets/VoidStoragePackets.cpp index a635d57666d..43a1f070d8d 100644 --- a/src/server/game/Server/Packets/VoidStoragePackets.cpp +++ b/src/server/game/Server/Packets/VoidStoragePackets.cpp @@ -65,17 +65,14 @@ WorldPacket const* WorldPackets::VoidStorage::VoidStorageContents::Write() void WorldPackets::VoidStorage::VoidStorageTransfer::Read() { _worldPacket >> Npc; - _worldPacket >> DepositsCount; - _worldPacket >> WithdrawalsCount; + Deposits.resize(_worldPacket.read<uint32>()); + Withdrawals.resize(_worldPacket.read<uint32>()); - if (WithdrawalsCount > VOID_STORAGE_MAX_WITHDRAW || DepositsCount > VOID_STORAGE_MAX_DEPOSIT) - return; + for (ObjectGuid& deposit : Deposits) + _worldPacket >> deposit; - for (uint32 i = 0; i < DepositsCount; ++i) - _worldPacket >> Deposits[i]; - - for (uint32 i = 0; i < WithdrawalsCount; ++i) - _worldPacket >> Withdrawals[i]; + for (ObjectGuid& withdrawal : Withdrawals) + _worldPacket >> withdrawal; } WorldPacket const* WorldPackets::VoidStorage::VoidStorageTransferChanges::Write() diff --git a/src/server/game/Server/Packets/VoidStoragePackets.h b/src/server/game/Server/Packets/VoidStoragePackets.h index 9790b328e72..b84f0cf2678 100644 --- a/src/server/game/Server/Packets/VoidStoragePackets.h +++ b/src/server/game/Server/Packets/VoidStoragePackets.h @@ -90,10 +90,8 @@ namespace WorldPackets void Read() override; - std::array<ObjectGuid, VOID_STORAGE_MAX_WITHDRAW> Withdrawals; - uint32 WithdrawalsCount = 0; - std::array<ObjectGuid, VOID_STORAGE_MAX_DEPOSIT> Deposits; - uint32 DepositsCount = 0; + Array<ObjectGuid, VOID_STORAGE_MAX_WITHDRAW> Withdrawals; + Array<ObjectGuid, VOID_STORAGE_MAX_DEPOSIT> Deposits; ObjectGuid Npc; }; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index fd7b00301b2..22be0707a90 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -23,6 +23,7 @@ #include "Packets/BankPackets.h" #include "Packets/BattlegroundPackets.h" #include "Packets/BlackMarketPackets.h" +#include "Packets/CalendarPackets.h" #include "Packets/ChannelPackets.h" #include "Packets/CharacterPackets.h" #include "Packets/ChatPackets.h" @@ -155,8 +156,8 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(opcode, status, processing, WorldPacket, handler); DEFINE_HANDLER(CMSG_ACCEPT_GUILD_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::AcceptGuildInvite, &WorldSession::HandleGuildAcceptInvite); - DEFINE_HANDLER(CMSG_ACCEPT_LEVEL_GRANT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::RaF::AcceptLevelGrant, &WorldSession::HandleAcceptGrantLevel); - DEFINE_HANDLER(CMSG_ACCEPT_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::AcceptTrade, &WorldSession::HandleAcceptTradeOpcode); + DEFINE_HANDLER(CMSG_ACCEPT_LEVEL_GRANT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::RaF::AcceptLevelGrant, &WorldSession::HandleAcceptGrantLevel); + DEFINE_HANDLER(CMSG_ACCEPT_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::AcceptTrade, &WorldSession::HandleAcceptTradeOpcode); DEFINE_HANDLER(CMSG_ACCEPT_WARGAME_INVITE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_ACTIVATE_TAXI, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleActivateTaxiOpcode ); DEFINE_HANDLER(CMSG_ADD_BATTLENET_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -180,19 +181,19 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_AUCTION_SELL_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionSellItem, &WorldSession::HandleAuctionSellItem); DEFINE_HANDLER(CMSG_AUTH_CONTINUED_SESSION, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); DEFINE_HANDLER(CMSG_AUTH_SESSION, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); - DEFINE_HANDLER(CMSG_AUTOBANK_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Bank::AutoBankItem, &WorldSession::HandleAutoBankItemOpcode); + DEFINE_HANDLER(CMSG_AUTOBANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Bank::AutoBankItem, &WorldSession::HandleAutoBankItemOpcode); DEFINE_HANDLER(CMSG_AUTOBANK_REAGENT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_AUTOSTORE_BANK_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Bank::AutoStoreBankItem, &WorldSession::HandleAutoStoreBankItemOpcode); + DEFINE_HANDLER(CMSG_AUTOSTORE_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Bank::AutoStoreBankItem, &WorldSession::HandleAutoStoreBankItemOpcode); DEFINE_HANDLER(CMSG_AUTOSTORE_BANK_REAGENT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_AUTO_EQUIP_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoEquipItem, &WorldSession::HandleAutoEquipItemOpcode); - DEFINE_HANDLER(CMSG_AUTO_EQUIP_ITEM_SLOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoEquipItemSlot, &WorldSession::HandleAutoEquipItemSlotOpcode); - DEFINE_HANDLER(CMSG_AUTO_STORE_BAG_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoStoreBagItem, &WorldSession::HandleAutoStoreBagItemOpcode); + DEFINE_HANDLER(CMSG_AUTO_EQUIP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoEquipItem, &WorldSession::HandleAutoEquipItemOpcode); + DEFINE_HANDLER(CMSG_AUTO_EQUIP_ITEM_SLOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoEquipItemSlot, &WorldSession::HandleAutoEquipItemSlotOpcode); + DEFINE_HANDLER(CMSG_AUTO_STORE_BAG_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoStoreBagItem, &WorldSession::HandleAutoStoreBagItemOpcode); DEFINE_HANDLER(CMSG_BANKER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBankerActivateOpcode); - DEFINE_HANDLER(CMSG_BATTLEFIELD_LEAVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlefieldLeave, &WorldSession::HandleBattlefieldLeaveOpcode); - DEFINE_HANDLER(CMSG_BATTLEFIELD_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlefieldListRequest, &WorldSession::HandleBattlefieldListOpcode); - DEFINE_HANDLER(CMSG_BATTLEFIELD_PORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlefieldPort, &WorldSession::HandleBattleFieldPortOpcode); - DEFINE_HANDLER(CMSG_BATTLEMASTER_HELLO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBattlemasterHelloOpcode); - DEFINE_HANDLER(CMSG_BATTLEMASTER_JOIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlemasterJoin, &WorldSession::HandleBattlemasterJoinOpcode); + DEFINE_HANDLER(CMSG_BATTLEFIELD_LEAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlefieldLeave, &WorldSession::HandleBattlefieldLeaveOpcode); + DEFINE_HANDLER(CMSG_BATTLEFIELD_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlefieldListRequest, &WorldSession::HandleBattlefieldListOpcode); + DEFINE_HANDLER(CMSG_BATTLEFIELD_PORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlefieldPort, &WorldSession::HandleBattleFieldPortOpcode); + DEFINE_HANDLER(CMSG_BATTLEMASTER_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBattlemasterHelloOpcode); + DEFINE_HANDLER(CMSG_BATTLEMASTER_JOIN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlemasterJoin, &WorldSession::HandleBattlemasterJoinOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEMASTER_JOIN_ARENA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlemasterJoinArena ); DEFINE_HANDLER(CMSG_BATTLEMASTER_JOIN_SKIRMISH, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLENET_CHALLENGE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -212,17 +213,17 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_BATTLE_PET_SET_FLAGS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PET_SUMMON, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PET_UPDATE_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_BEGIN_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::BeginTrade, &WorldSession::HandleBeginTradeOpcode); + DEFINE_HANDLER(CMSG_BEGIN_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::BeginTrade, &WorldSession::HandleBeginTradeOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_BF_MGR_ENTRY_INVITE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBfEntryInviteResponse ); DEFINE_OPCODE_HANDLER_OLD(CMSG_BF_MGR_QUEUE_EXIT_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBfExitRequest); DEFINE_OPCODE_HANDLER_OLD(CMSG_BF_MGR_QUEUE_INVITE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBfQueueInviteResponse ); DEFINE_HANDLER(CMSG_BF_MGR_QUEUE_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_BINDER_ACTIVATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBinderActivateOpcode); + DEFINE_HANDLER(CMSG_BINDER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBinderActivateOpcode); DEFINE_HANDLER(CMSG_BLACK_MARKET_BID_ON_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_BLACK_MARKET_OPEN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::BlackMarket::BlackMarketOpen, &WorldSession::HandleBlackMarketOpen); + DEFINE_HANDLER(CMSG_BLACK_MARKET_OPEN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::BlackMarket::BlackMarketOpen, &WorldSession::HandleBlackMarketOpen); DEFINE_HANDLER(CMSG_BLACK_MARKET_REQUEST_ITEMS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_BUG_REPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Ticket::BugReport, &WorldSession::HandleBugReportOpcode); - DEFINE_HANDLER(CMSG_BUSY_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::BusyTrade, &WorldSession::HandleBusyTradeOpcode); + DEFINE_HANDLER(CMSG_BUG_REPORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::BugReport, &WorldSession::HandleBugReportOpcode); + DEFINE_HANDLER(CMSG_BUSY_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::BusyTrade, &WorldSession::HandleBusyTradeOpcode); DEFINE_HANDLER(CMSG_BUY_BACK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::BuyBackItem, &WorldSession::HandleBuybackItem); DEFINE_HANDLER(CMSG_BUY_BANK_SLOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Bank::BuyBankSlot, &WorldSession::HandleBuyBankSlotOpcode); DEFINE_HANDLER(CMSG_BUY_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::BuyItem, &WorldSession::HandleBuyItemOpcode); @@ -230,21 +231,21 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_BUY_WOW_TOKEN_CONFIRM, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BUY_WOW_TOKEN_START, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CAGE_BATTLE_PET, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_ADD_EVENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarAddEvent ); + DEFINE_HANDLER(CMSG_CALENDAR_ADD_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Calendar::CalendarAddEvent, &WorldSession::HandleCalendarAddEvent); DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_COMPLAIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarComplain ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_COPY_EVENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarCopyEvent ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_EVENT_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarEventInvite ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_EVENT_MODERATOR_STATUS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarEventModeratorStatus); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_EVENT_RSVP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarEventRsvp ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_EVENT_SIGN_UP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarEventSignup ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_EVENT_STATUS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarEventStatus ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_GET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarGetCalendar ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_GET_EVENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarGetEvent ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_GET_NUM_PENDING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarGetNumPending ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_GUILD_FILTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarGuildFilter ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_REMOVE_EVENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarRemoveEvent ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_REMOVE_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarEventRemoveInvite ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_UPDATE_EVENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarUpdateEvent ); + DEFINE_HANDLER(CMSG_CALENDAR_COPY_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Calendar::CalendarCopyEvent, &WorldSession::HandleCalendarCopyEvent); + DEFINE_HANDLER(CMSG_CALENDAR_EVENT_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Calendar::CalendarEventInvite, &WorldSession::HandleCalendarEventInvite); + DEFINE_HANDLER(CMSG_CALENDAR_EVENT_MODERATOR_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Calendar::CalendarEventModeratorStatus, &WorldSession::HandleCalendarEventModeratorStatus); + DEFINE_HANDLER(CMSG_CALENDAR_EVENT_RSVP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Calendar::CalendarEventRSVP, &WorldSession::HandleCalendarEventRsvp); + DEFINE_HANDLER(CMSG_CALENDAR_EVENT_SIGN_UP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Calendar::CalendarEventSignUp, &WorldSession::HandleCalendarEventSignup); + DEFINE_HANDLER(CMSG_CALENDAR_EVENT_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Calendar::CalendarEventStatus, &WorldSession::HandleCalendarEventStatus); + DEFINE_HANDLER(CMSG_CALENDAR_GET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Calendar::CalendarGetCalendar, &WorldSession::HandleCalendarGetCalendar); + DEFINE_HANDLER(CMSG_CALENDAR_GET_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Calendar::CalendarGetEvent, &WorldSession::HandleCalendarGetEvent); + DEFINE_HANDLER(CMSG_CALENDAR_GET_NUM_PENDING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Calendar::CalendarGetNumPending, &WorldSession::HandleCalendarGetNumPending); + DEFINE_HANDLER(CMSG_CALENDAR_GUILD_FILTER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Calendar::CalendarGuildFilter, &WorldSession::HandleCalendarGuildFilter); + DEFINE_HANDLER(CMSG_CALENDAR_REMOVE_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Calendar::CalendarRemoveEvent, &WorldSession::HandleCalendarRemoveEvent); + DEFINE_HANDLER(CMSG_CALENDAR_REMOVE_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Calendar::CalendarRemoveInvite, &WorldSession::HandleCalendarEventRemoveInvite); + DEFINE_HANDLER(CMSG_CALENDAR_UPDATE_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Calendar::CalendarUpdateEvent, &WorldSession::HandleCalendarUpdateEvent); DEFINE_HANDLER(CMSG_CANCEL_AURA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::CancelAura, &WorldSession::HandleCancelAuraOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_AUTO_REPEAT_SPELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelAutoRepeatSpellOpcode); DEFINE_HANDLER(CMSG_CANCEL_CAST, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Spells::CancelCast, &WorldSession::HandleCancelCastOpcode); @@ -262,7 +263,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHANGE_BAG_SLOT_FLAG, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHANGE_MONUMENT_APPEARANCE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_CHANGE_SUB_GROUP, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Party::ChangeSubGroup, &WorldSession::HandleChangeSubGroupOpcode); + DEFINE_HANDLER(CMSG_CHANGE_SUB_GROUP, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::ChangeSubGroup, &WorldSession::HandleChangeSubGroupOpcode); DEFINE_HANDLER(CMSG_CHARACTER_RENAME_REQUEST, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharacterRenameRequest, &WorldSession::HandleCharRenameOpcode); DEFINE_HANDLER(CMSG_CHAR_CUSTOMIZE, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharCustomize, &WorldSession::HandleCharCustomizeOpcode); DEFINE_HANDLER(CMSG_CHAR_DELETE, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharDelete, &WorldSession::HandleCharDeleteOpcode); @@ -318,8 +319,8 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_CHECK_RAF_EMAIL_ENABLED, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHOICE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_CLEAR_RAID_MARKER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::ClearRaidMarker, &WorldSession::HandleClearRaidMarker); - DEFINE_HANDLER(CMSG_CLEAR_TRADE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::ClearTradeItem, &WorldSession::HandleClearTradeItemOpcode); + DEFINE_HANDLER(CMSG_CLEAR_RAID_MARKER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::ClearRaidMarker, &WorldSession::HandleClearRaidMarker); + DEFINE_HANDLER(CMSG_CLEAR_TRADE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::ClearTradeItem, &WorldSession::HandleClearTradeItemOpcode); DEFINE_HANDLER(CMSG_CLIENT_PORT_GRAVEYARD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::PortGraveyard, &WorldSession::HandlePortGraveyard); DEFINE_HANDLER(CMSG_CLOSE_INTERACTION, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_COMMENTATOR_ENABLE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -333,7 +334,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_COMPLETE_MOVIE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_CONFIRM_RESPEC_WIPE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleConfirmRespecWipeOpcode ); DEFINE_HANDLER(CMSG_CONNECT_TO_FAILED, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); - DEFINE_HANDLER(CMSG_CONVERT_RAID, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Party::ConvertRaid, &WorldSession::HandleConvertRaidOpcode); + DEFINE_HANDLER(CMSG_CONVERT_RAID, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::ConvertRaid, &WorldSession::HandleConvertRaidOpcode); DEFINE_HANDLER(CMSG_CREATE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CreateCharacter, &WorldSession::HandleCharCreateOpcode); DEFINE_HANDLER(CMSG_CREATE_SHIPMENT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_DB_QUERY_BULK, STATUS_AUTHED, PROCESS_INPLACE, WorldPackets::Query::DBQueryBulk, &WorldSession::HandleDBQueryBulk); @@ -343,7 +344,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_DEL_FRIEND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::DelFriend, &WorldSession::HandleDelFriendOpcode); DEFINE_HANDLER(CMSG_DEL_IGNORE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::DelIgnore, &WorldSession::HandleDelIgnoreOpcode); DEFINE_HANDLER(CMSG_DEPOSIT_REAGENT_BANK, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_DESTROY_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::DestroyItem, &WorldSession::HandleDestroyItemOpcode); + DEFINE_HANDLER(CMSG_DESTROY_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::DestroyItem, &WorldSession::HandleDestroyItemOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_BOOT_PLAYER_VOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgSetBootVoteOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_GET_JOIN_STATUS, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleDFGetJoinStatus ); DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_GET_SYSTEM_INFO, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleDFGetSystemInfo ); @@ -359,9 +360,9 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_DISCARDED_TIME_SYNC_ACKS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_DISMISS_CRITTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleDismissCritter ); DEFINE_HANDLER(CMSG_DO_MASTER_LOOT_ROLL, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_DO_READY_CHECK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::DoReadyCheck, &WorldSession::HandleDoReadyCheckOpcode); - DEFINE_HANDLER(CMSG_DUEL_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Duel::DuelResponse, &WorldSession::HandleDuelResponseOpcode); - DEFINE_HANDLER(CMSG_EJECT_PASSENGER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::EjectPassenger, &WorldSession::HandleEjectPassenger); + DEFINE_HANDLER(CMSG_DO_READY_CHECK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::DoReadyCheck, &WorldSession::HandleDoReadyCheckOpcode); + DEFINE_HANDLER(CMSG_DUEL_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Duel::DuelResponse, &WorldSession::HandleDuelResponseOpcode); + DEFINE_HANDLER(CMSG_EJECT_PASSENGER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::EjectPassenger, &WorldSession::HandleEjectPassenger); DEFINE_HANDLER(CMSG_EMOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::EmoteClient, &WorldSession::HandleEmoteOpcode); DEFINE_HANDLER(CMSG_ENABLE_NAGLE, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); DEFINE_OPCODE_HANDLER_OLD(CMSG_ENABLE_TAXI_NODE, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiQueryAvailableNodes ); @@ -404,7 +405,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_GM_TICKET_GET_CASE_STATUS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Ticket::GMTicketGetCaseStatus, &WorldSession::HandleGMTicketGetCaseStatusOpcode); DEFINE_HANDLER(CMSG_GM_TICKET_GET_SYSTEM_STATUS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Ticket::GMTicketGetSystemStatus, &WorldSession::HandleGMTicketSystemStatusOpcode); DEFINE_HANDLER(CMSG_GOSSIP_SELECT_OPTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::GossipSelectOption, &WorldSession::HandleGossipSelectOptionOpcode); - DEFINE_HANDLER(CMSG_GRANT_LEVEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::RaF::GrantLevel, &WorldSession::HandleGrantLevel); + DEFINE_HANDLER(CMSG_GRANT_LEVEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::RaF::GrantLevel, &WorldSession::HandleGrantLevel); DEFINE_HANDLER(CMSG_GUILD_ADD_BATTLENET_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GUILD_ADD_RANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildAddRank, &WorldSession::HandleGuildAddRank); DEFINE_HANDLER(CMSG_GUILD_ASSIGN_MEMBER_RANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildAssignMemberRank, &WorldSession::HandleGuildAssignRank); @@ -451,22 +452,22 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_GUILD_UPDATE_INFO_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildUpdateInfoText, &WorldSession::HandleGuildUpdateInfoText); DEFINE_HANDLER(CMSG_GUILD_UPDATE_MOTD_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildUpdateMotdText, &WorldSession::HandleGuildUpdateMotdText); DEFINE_HANDLER(CMSG_HEARTH_AND_RESURRECT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Battleground::HearthAndResurrect, &WorldSession::HandleHearthAndResurrect); - DEFINE_HANDLER(CMSG_IGNORE_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::IgnoreTrade, &WorldSession::HandleIgnoreTradeOpcode); + DEFINE_HANDLER(CMSG_IGNORE_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::IgnoreTrade, &WorldSession::HandleIgnoreTradeOpcode); DEFINE_HANDLER(CMSG_INCREASE_CAST_TIME_FOR_SPELL, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_INITIATE_ROLE_POLL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::InitiateRolePoll, &WorldSession::HandleInitiateRolePoll); - DEFINE_HANDLER(CMSG_INITIATE_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::InitiateTrade, &WorldSession::HandleInitiateTradeOpcode); - DEFINE_HANDLER(CMSG_INSPECT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Inspect::Inspect, &WorldSession::HandleInspectOpcode); - DEFINE_HANDLER(CMSG_INSPECT_PVP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Inspect::InspectPVPRequest, &WorldSession::HandleInspectPVP); - DEFINE_OPCODE_HANDLER_OLD(CMSG_INSTANCE_LOCK_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleInstanceLockResponse); + DEFINE_HANDLER(CMSG_INITIATE_ROLE_POLL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::InitiateRolePoll, &WorldSession::HandleInitiateRolePoll); + DEFINE_HANDLER(CMSG_INITIATE_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::InitiateTrade, &WorldSession::HandleInitiateTradeOpcode); + DEFINE_HANDLER(CMSG_INSPECT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Inspect::Inspect, &WorldSession::HandleInspectOpcode); + DEFINE_HANDLER(CMSG_INSPECT_PVP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Inspect::InspectPVPRequest, &WorldSession::HandleInspectPVP); + DEFINE_HANDLER(CMSG_INSTANCE_LOCK_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Instance::InstanceLockResponse, &WorldSession::HandleInstanceLockResponse); DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_PURCHASE_REFUND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemRefund ); - DEFINE_HANDLER(CMSG_ITEM_TEXT_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Query::ItemTextQuery, &WorldSession::HandleItemTextQuery); + DEFINE_HANDLER(CMSG_ITEM_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::ItemTextQuery, &WorldSession::HandleItemTextQuery); DEFINE_HANDLER(CMSG_JOIN_PET_BATTLE_QUEUE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_JOIN_RATED_BATTLEGROUND, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_KEEP_ALIVE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); DEFINE_HANDLER(CMSG_KEYBOUND_OVERRIDE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LEARN_PET_SPECIALIZATION_GROUP, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_LEARN_TALENTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Talent::LearnTalents, &WorldSession::HandleLearnTalentsOpcode); - DEFINE_HANDLER(CMSG_LEAVE_GROUP, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Party::LeaveGroup, &WorldSession::HandleLeaveGroupOpcode); + DEFINE_HANDLER(CMSG_LEARN_TALENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Talent::LearnTalents, &WorldSession::HandleLearnTalentsOpcode); + DEFINE_HANDLER(CMSG_LEAVE_GROUP, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::LeaveGroup, &WorldSession::HandleLeaveGroupOpcode); DEFINE_HANDLER(CMSG_LEAVE_PET_BATTLE_QUEUE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LFG_LIST_APPLY_TO_GROUP, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LFG_LIST_CANCEL_APPLICATION, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -494,11 +495,11 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_LOGOUT_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::LogoutRequest, &WorldSession::HandleLogoutRequestOpcode); DEFINE_HANDLER(CMSG_LOG_DISCONNECT, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); DEFINE_HANDLER(CMSG_LOG_STREAMING_ERROR, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_LOOT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootItem, &WorldSession::HandleAutostoreLootItemOpcode); - DEFINE_HANDLER(CMSG_LOOT_MONEY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootMoney, &WorldSession::HandleLootMoneyOpcode); - DEFINE_HANDLER(CMSG_LOOT_RELEASE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootRelease, &WorldSession::HandleLootReleaseOpcode); - DEFINE_HANDLER(CMSG_LOOT_ROLL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootRoll, &WorldSession::HandleLootRoll); - DEFINE_HANDLER(CMSG_LOOT_UNIT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootUnit, &WorldSession::HandleLootOpcode); + DEFINE_HANDLER(CMSG_LOOT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootItem, &WorldSession::HandleAutostoreLootItemOpcode); + DEFINE_HANDLER(CMSG_LOOT_MONEY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootMoney, &WorldSession::HandleLootMoneyOpcode); + DEFINE_HANDLER(CMSG_LOOT_RELEASE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootRelease, &WorldSession::HandleLootReleaseOpcode); + DEFINE_HANDLER(CMSG_LOOT_ROLL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootRoll, &WorldSession::HandleLootRoll); + DEFINE_HANDLER(CMSG_LOOT_UNIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootUnit, &WorldSession::HandleLootOpcode); DEFINE_HANDLER(CMSG_LOW_LEVEL_RAID1, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LOW_LEVEL_RAID2, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_MAIL_CREATE_TEXT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailCreateTextItem, &WorldSession::HandleMailCreateTextItem); @@ -580,15 +581,15 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_OBJECT_UPDATE_FAILED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::ObjectUpdateFailed, &WorldSession::HandleObjectUpdateFailedOpcode); DEFINE_HANDLER(CMSG_OBJECT_UPDATE_RESCUED, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::ObjectUpdateRescued, &WorldSession::HandleObjectUpdateRescuedOpcode); DEFINE_HANDLER(CMSG_OFFER_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::OfferPetition, &WorldSession::HandleOfferPetition); - DEFINE_OPCODE_HANDLER_OLD(CMSG_OPENING_CINEMATIC, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOpeningCinematic ); + DEFINE_HANDLER(CMSG_OPENING_CINEMATIC, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::OpeningCinematic, &WorldSession::HandleOpeningCinematic); DEFINE_HANDLER(CMSG_OPEN_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::OpenItem, &WorldSession::HandleOpenItemOpcode); DEFINE_HANDLER(CMSG_OPEN_MISSION_NPC, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_OPEN_SHIPMENT_NPC, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_OPEN_TRADESKILL_NPC, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_OPT_OUT_OF_LOOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::OptOutOfLoot, &WorldSession::HandleOptOutOfLootOpcode); - DEFINE_HANDLER(CMSG_PARTY_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyInviteClient, &WorldSession::HandlePartyInviteOpcode); - DEFINE_HANDLER(CMSG_PARTY_INVITE_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyInviteResponse, &WorldSession::HandlePartyInviteResponseOpcode); - DEFINE_HANDLER(CMSG_PARTY_UNINVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyUninvite, &WorldSession::HandlePartyUninviteOpcode); + DEFINE_HANDLER(CMSG_OPT_OUT_OF_LOOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::OptOutOfLoot, &WorldSession::HandleOptOutOfLootOpcode); + DEFINE_HANDLER(CMSG_PARTY_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyInviteClient, &WorldSession::HandlePartyInviteOpcode); + DEFINE_HANDLER(CMSG_PARTY_INVITE_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyInviteResponse, &WorldSession::HandlePartyInviteResponseOpcode); + DEFINE_HANDLER(CMSG_PARTY_UNINVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyUninvite, &WorldSession::HandlePartyUninviteOpcode); DEFINE_HANDLER(CMSG_PETITION_BUY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionBuy, &WorldSession::HandlePetitionBuy); DEFINE_HANDLER(CMSG_PETITION_RENAME_GUILD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionRenameGuild, &WorldSession::HandlePetitionRenameGuild); DEFINE_HANDLER(CMSG_PETITION_SHOW_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionShowList, &WorldSession::HandlePetitionShowList); @@ -635,7 +636,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_QUERY_REALM_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUERY_SCENARIO_POI, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUERY_TIME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryTime, &WorldSession::HandleQueryTimeOpcode); - DEFINE_HANDLER(CMSG_QUERY_VOID_STORAGE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::QueryVoidStorage, &WorldSession::HandleVoidStorageQuery); + DEFINE_HANDLER(CMSG_QUERY_VOID_STORAGE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::QueryVoidStorage, &WorldSession::HandleVoidStorageQuery); DEFINE_HANDLER(CMSG_QUEST_CONFIRM_ACCEPT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestConfirmAccept, &WorldSession::HandleQuestConfirmAccept); DEFINE_HANDLER(CMSG_QUEST_GIVER_ACCEPT_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverAcceptQuest, &WorldSession::HandleQuestgiverAcceptQuestOpcode); DEFINE_HANDLER(CMSG_QUEST_GIVER_CHOOSE_REWARD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverChooseReward, &WorldSession::HandleQuestgiverChooseRewardOpcode); @@ -647,11 +648,11 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_QUEST_GIVER_STATUS_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Quest::QuestGiverStatusQuery, &WorldSession::HandleQuestgiverStatusQueryOpcode); DEFINE_HANDLER(CMSG_QUEST_LOG_REMOVE_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestLogRemoveQuest, &WorldSession::HandleQuestLogRemoveQuest); DEFINE_HANDLER(CMSG_QUEST_POI_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QuestPOIQuery, &WorldSession::HandleQuestPOIQuery); - DEFINE_OPCODE_HANDLER_OLD(CMSG_QUEST_PUSH_RESULT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestPushResult ); + DEFINE_HANDLER(CMSG_QUEST_PUSH_RESULT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestPushResult, &WorldSession::HandleQuestPushResult); DEFINE_HANDLER(CMSG_QUEUED_MESSAGES_END, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_RANDOM_ROLL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::RandomRollClient, &WorldSession::HandleRandomRollOpcode); - DEFINE_HANDLER(CMSG_READY_CHECK_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Party::ReadyCheckResponseClient, &WorldSession::HandleReadyCheckResponseOpcode); - DEFINE_HANDLER(CMSG_READ_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::ReadItem, &WorldSession::HandleReadItem); + DEFINE_HANDLER(CMSG_RANDOM_ROLL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::RandomRollClient, &WorldSession::HandleRandomRollOpcode); + DEFINE_HANDLER(CMSG_READY_CHECK_RESPONSE, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::ReadyCheckResponseClient, &WorldSession::HandleReadyCheckResponseOpcode); + DEFINE_HANDLER(CMSG_READ_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::ReadItem, &WorldSession::HandleReadItem); DEFINE_HANDLER(CMSG_RECLAIM_CORPSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::ReclaimCorpse, &WorldSession::HandleReclaimCorpse); DEFINE_HANDLER(CMSG_RECRUIT_A_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REDEEM_WOW_TOKEN_CONFIRM, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -669,10 +670,10 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_REQUEST_FORCED_REACTIONS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Reputation::RequestForcedReactions, &WorldSession::HandleRequestForcedReactionsOpcode); DEFINE_HANDLER(CMSG_REQUEST_GUILD_PARTY_STATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::RequestGuildPartyState, &WorldSession::HandleGuildRequestPartyState); DEFINE_HANDLER(CMSG_REQUEST_GUILD_REWARDS_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Guild::RequestGuildRewardsList, &WorldSession::HandleRequestGuildRewardsList); - DEFINE_HANDLER(CMSG_REQUEST_HONOR_STATS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Inspect::RequestHonorStats, &WorldSession::HandleRequestHonorStatsOpcode); + DEFINE_HANDLER(CMSG_REQUEST_HONOR_STATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Inspect::RequestHonorStats, &WorldSession::HandleRequestHonorStatsOpcode); DEFINE_HANDLER(CMSG_REQUEST_LFG_LIST_BLACKLIST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_REQUEST_PARTY_JOIN_UPDATES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::RequestPartyJoinUpdates, &WorldSession::HandleRequestPartyJoinUpdates); - DEFINE_HANDLER(CMSG_REQUEST_PARTY_MEMBER_STATS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::RequestPartyMemberStats, &WorldSession::HandleRequestPartyMemberStatsOpcode); + DEFINE_HANDLER(CMSG_REQUEST_PARTY_JOIN_UPDATES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::RequestPartyJoinUpdates, &WorldSession::HandleRequestPartyJoinUpdates); + DEFINE_HANDLER(CMSG_REQUEST_PARTY_MEMBER_STATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::RequestPartyMemberStats, &WorldSession::HandleRequestPartyMemberStatsOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_PET_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPetInfoOpcode ); DEFINE_HANDLER(CMSG_REQUEST_PLAYED_TIME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::RequestPlayedTime, &WorldSession::HandlePlayedTime); DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_PVP_REWARDS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleRequestPvpReward ); @@ -710,41 +711,41 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_SET_ACTION_BUTTON, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::SetActionButton, &WorldSession::HandleSetActionButtonOpcode); DEFINE_HANDLER(CMSG_SET_ACTIVE_MOVER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Movement::SetActiveMover, &WorldSession::HandleSetActiveMoverOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ACTIVE_VOICE_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetActiveVoiceChannel ); - DEFINE_HANDLER(CMSG_SET_ADVANCED_COMBAT_LOGGING, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_SET_ADVANCED_COMBAT_LOGGING, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::ClientConfig::SetAdvancedCombatLogging, &WorldSession::HandleSetAdvancedCombatLogging); DEFINE_HANDLER(CMSG_SET_ASSISTANT_LEADER, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Party::SetAssistantLeader, &WorldSession::HandleSetAssistantLeaderOpcode); DEFINE_HANDLER(CMSG_SET_BACKPACK_AUTOSORT_DISABLED, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SET_BANK_AUTOSORT_DISABLED, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SET_BANK_BAG_SLOT_FLAG, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SET_CONTACT_NOTES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Social::SetContactNotes, &WorldSession::HandleSetContactNotesOpcode); + DEFINE_HANDLER(CMSG_SET_CONTACT_NOTES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::SetContactNotes, &WorldSession::HandleSetContactNotesOpcode); DEFINE_HANDLER(CMSG_SET_CURRENCY_FLAGS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SET_DIFFICULTY_ID, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SET_DUNGEON_DIFFICULTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetDungeonDifficulty, &WorldSession::HandleSetDungeonDifficultyOpcode); - DEFINE_HANDLER(CMSG_SET_EVERYONE_IS_ASSISTANT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Party::SetEveryoneIsAssistant, &WorldSession::HandleSetEveryoneIsAssistant); + DEFINE_HANDLER(CMSG_SET_EVERYONE_IS_ASSISTANT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::SetEveryoneIsAssistant, &WorldSession::HandleSetEveryoneIsAssistant); DEFINE_HANDLER(CMSG_SET_FACTION_AT_WAR, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::SetFactionAtWar, &WorldSession::HandleSetFactionAtWar); DEFINE_HANDLER(CMSG_SET_FACTION_INACTIVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::SetFactionInactive, &WorldSession::HandleSetFactionInactiveOpcode); DEFINE_HANDLER(CMSG_SET_FACTION_NOT_AT_WAR, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::SetFactionNotAtWar, &WorldSession::HandleSetFactionNotAtWar); DEFINE_HANDLER(CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SET_LFG_BONUS_FACTION_ID, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SET_LOOT_METHOD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::SetLootMethod, &WorldSession::HandleSetLootMethodOpcode); - DEFINE_HANDLER(CMSG_SET_LOOT_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_SET_LOOT_METHOD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::SetLootMethod, &WorldSession::HandleSetLootMethodOpcode); + DEFINE_HANDLER(CMSG_SET_LOOT_SPECIALIZATION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::SetLootSpecialization, &WorldSession::HandleSetLootSpecialization); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_PARTY_ASSIGNMENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePartyAssignmentOpcode ); - DEFINE_HANDLER(CMSG_SET_PARTY_LEADER, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Party::SetPartyLeader, &WorldSession::HandleSetPartyLeaderOpcode); + DEFINE_HANDLER(CMSG_SET_PARTY_LEADER, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::SetPartyLeader, &WorldSession::HandleSetPartyLeaderOpcode); DEFINE_HANDLER(CMSG_SET_PET_SLOT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_PLAYER_DECLINED_NAMES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetPlayerDeclinedNames ); DEFINE_HANDLER(CMSG_SET_PREFERRED_CEMETERY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SET_PVP, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_SET_PVP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetPvP, &WorldSession::HandleSetPvP); DEFINE_HANDLER(CMSG_SET_RAID_DIFFICULTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetRaidDifficulty, &WorldSession::HandleSetRaidDifficultyOpcode); DEFINE_HANDLER(CMSG_SET_ROLE, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::SetRole, &WorldSession::HandleSetRoleOpcode); - DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SAVED_INSTANCE_EXTEND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetSavedInstanceExtend ); + DEFINE_HANDLER(CMSG_SET_SAVED_INSTANCE_EXTEND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Calendar::SetSavedInstanceExtend, &WorldSession::HandleSetSavedInstanceExtend); DEFINE_HANDLER(CMSG_SET_SELECTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetSelection, &WorldSession::HandleSetSelectionOpcode); DEFINE_HANDLER(CMSG_SET_SHEATHED, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Combat::SetSheathed, &WorldSession::HandleSetSheathedOpcode); DEFINE_HANDLER(CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SET_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Talent::SetSpecialization, &WorldSession::HandleSetSpecializationOpcode); + DEFINE_HANDLER(CMSG_SET_SPECIALIZATION, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Talent::SetSpecialization, &WorldSession::HandleSetSpecializationOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_TAXI_BENCHMARK_MODE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTaxiBenchmarkOpcode ); DEFINE_HANDLER(CMSG_SET_TITLE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::SetTitle, &WorldSession::HandleSetTitleOpcode); - DEFINE_HANDLER(CMSG_SET_TRADE_CURRENCY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::SetTradeCurrency, &WorldSession::HandleSetTradeCurrencyOpcode); - DEFINE_HANDLER(CMSG_SET_TRADE_GOLD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::SetTradeGold, &WorldSession::HandleSetTradeGoldOpcode); - DEFINE_HANDLER(CMSG_SET_TRADE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::SetTradeItem, &WorldSession::HandleSetTradeItemOpcode); + DEFINE_HANDLER(CMSG_SET_TRADE_CURRENCY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::SetTradeCurrency, &WorldSession::HandleSetTradeCurrencyOpcode); + DEFINE_HANDLER(CMSG_SET_TRADE_GOLD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::SetTradeGold, &WorldSession::HandleSetTradeGoldOpcode); + DEFINE_HANDLER(CMSG_SET_TRADE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::SetTradeItem, &WorldSession::HandleSetTradeItemOpcode); DEFINE_HANDLER(CMSG_SET_USING_PARTY_GARRISON, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SET_WATCHED_FACTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::SetWatchedFaction, &WorldSession::HandleSetWatchedFactionOpcode); DEFINE_HANDLER(CMSG_SHOWING_CLOAK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::ShowingCloak, &WorldSession::HandleShowingCloakOpcode); @@ -758,7 +759,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_SORT_REAGENT_BANK_BAGS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SPELL_CLICK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::SpellClick, &WorldSession::HandleSpellClick); DEFINE_HANDLER(CMSG_SPIRIT_HEALER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::SpiritHealerActivate, &WorldSession::HandleSpiritHealerActivate); - DEFINE_HANDLER(CMSG_SPLIT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::SplitItem, &WorldSession::HandleSplitItemOpcode); + DEFINE_HANDLER(CMSG_SPLIT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SplitItem, &WorldSession::HandleSplitItemOpcode); DEFINE_HANDLER(CMSG_STAND_STATE_CHANGE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::StandStateChange, &WorldSession::HandleStandStateChangeOpcode); DEFINE_HANDLER(CMSG_START_SPECTATOR_WAR_GAME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_START_WAR_GAME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -768,10 +769,10 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Ticket::SupportTicketSubmitSuggestion, &WorldSession::HandleSupportTicketSubmitSuggestion); DEFINE_HANDLER(CMSG_SUSPEND_COMMS_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SUSPEND_TOKEN_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SWAP_INV_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::SwapInvItem, &WorldSession::HandleSwapInvItemOpcode); - DEFINE_HANDLER(CMSG_SWAP_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::SwapItem, &WorldSession::HandleSwapItem); - DEFINE_HANDLER(CMSG_SWAP_SUB_GROUPS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Party::SwapSubGroups, &WorldSession::HandleSwapSubGroupsOpcode); - DEFINE_HANDLER(CMSG_SWAP_VOID_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::SwapVoidItem, &WorldSession::HandleVoidSwapItem); + DEFINE_HANDLER(CMSG_SWAP_INV_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SwapInvItem, &WorldSession::HandleSwapInvItemOpcode); + DEFINE_HANDLER(CMSG_SWAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SwapItem, &WorldSession::HandleSwapItem); + DEFINE_HANDLER(CMSG_SWAP_SUB_GROUPS, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::SwapSubGroups, &WorldSession::HandleSwapSubGroupsOpcode); + DEFINE_HANDLER(CMSG_SWAP_VOID_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::SwapVoidItem, &WorldSession::HandleVoidSwapItem); DEFINE_HANDLER(CMSG_TABARD_VENDOR_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleTabardVendorActivateOpcode); DEFINE_HANDLER(CMSG_TALK_TO_GOSSIP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleGossipHelloOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_TAXI_NODE_STATUS_QUERY, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiNodeStatusQueryOpcode ); @@ -783,11 +784,11 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_TIME_SYNC_RESPONSE_DROPPED, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_TIME_SYNC_RESPONSE_FAILED, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_TOGGLE_DIFFICULTY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_OPCODE_HANDLER_OLD(CMSG_TOGGLE_PVP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTogglePvP ); + DEFINE_HANDLER(CMSG_TOGGLE_PVP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::TogglePvP, &WorldSession::HandleTogglePvP); DEFINE_HANDLER(CMSG_TOTEM_DESTROYED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Totem::TotemDestroyed, &WorldSession::HandleTotemDestroyed); DEFINE_HANDLER(CMSG_TOY_SET_FAVORITE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_TRAINER_BUY_SPELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::NPC::TrainerBuySpell, &WorldSession::HandleTrainerBuySpellOpcode); - DEFINE_HANDLER(CMSG_TRAINER_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleTrainerListOpcode); + DEFINE_HANDLER(CMSG_TRAINER_BUY_SPELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::TrainerBuySpell, &WorldSession::HandleTrainerBuySpellOpcode); + DEFINE_HANDLER(CMSG_TRAINER_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleTrainerListOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_TRANSMOGRIFY_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTransmogrifyItems ); DEFINE_HANDLER(CMSG_TURN_IN_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::TurnInPetition, &WorldSession::HandleTurnInPetition); DEFINE_HANDLER(CMSG_TUTORIAL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::TutorialSetFlag, &WorldSession::HandleTutorialFlag); @@ -796,15 +797,15 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_TWITTER_DISCONNECT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_TWITTER_POST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_UI_TIME_REQUEST, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::UITimeRequest, &WorldSession::HandleUITimeRequest); - DEFINE_HANDLER(CMSG_UNACCEPT_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::UnacceptTrade, &WorldSession::HandleUnacceptTradeOpcode); + DEFINE_HANDLER(CMSG_UNACCEPT_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::UnacceptTrade, &WorldSession::HandleUnacceptTradeOpcode); DEFINE_HANDLER(CMSG_UNDELETE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::UndeleteCharacter, &WorldSession::HandleCharUndeleteOpcode); DEFINE_HANDLER(CMSG_UNLEARN_SKILL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::UnlearnSkill, &WorldSession::HandleUnlearnSkillOpcode); DEFINE_HANDLER(CMSG_UNLEARN_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_UNLOCK_VOID_STORAGE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::UnlockVoidStorage, &WorldSession::HandleVoidStorageUnlock); + DEFINE_HANDLER(CMSG_UNLOCK_VOID_STORAGE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::UnlockVoidStorage, &WorldSession::HandleVoidStorageUnlock); DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::ClientConfig::UserClientUpdateAccountData, &WorldSession::HandleUpdateAccountData); DEFINE_HANDLER(CMSG_UPDATE_CLIENT_SETTINGS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_UPDATE_MISSILE_TRAJECTORY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateMissileTrajectory ); - DEFINE_HANDLER(CMSG_UPDATE_RAID_TARGET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::UpdateRaidTarget, &WorldSession::HandleUpdateRaidTargetOpcode); + DEFINE_HANDLER(CMSG_UPDATE_RAID_TARGET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::UpdateRaidTarget, &WorldSession::HandleUpdateRaidTargetOpcode); DEFINE_HANDLER(CMSG_UPDATE_VAS_PURCHASE_STATES, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Token::UpdateListedAuctionableTokens, &WorldSession::HandleUpdateListedAuctionableTokens); DEFINE_HANDLER(CMSG_UPDATE_WOW_TOKEN_COUNT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -812,20 +813,20 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_UPGRADE_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_USED_FOLLOW, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_USE_CRITTER_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_USE_EQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::UseEquipmentSet, &WorldSession::HandleUseEquipmentSet); + DEFINE_HANDLER(CMSG_USE_EQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::UseEquipmentSet, &WorldSession::HandleUseEquipmentSet); DEFINE_HANDLER(CMSG_USE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::UseItem, &WorldSession::HandleUseItemOpcode); DEFINE_HANDLER(CMSG_USE_TOY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_VIOLENCE_LEVEL, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Misc::ViolenceLevel, &WorldSession::HandleViolenceLevel); + DEFINE_HANDLER(CMSG_VIOLENCE_LEVEL, STATUS_AUTHED, PROCESS_INPLACE, WorldPackets::Misc::ViolenceLevel, &WorldSession::HandleViolenceLevel); DEFINE_HANDLER(CMSG_VOICE_ADD_IGNORE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_VOICE_DEL_IGNORE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_VOICE_SESSION_ENABLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleVoiceSessionEnableOpcode ); - DEFINE_HANDLER(CMSG_VOID_STORAGE_TRANSFER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::VoidStorageTransfer, &WorldSession::HandleVoidStorageTransfer); + DEFINE_HANDLER(CMSG_VOID_STORAGE_TRANSFER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::VoidStorageTransfer, &WorldSession::HandleVoidStorageTransfer); DEFINE_OPCODE_HANDLER_OLD(CMSG_WARDEN_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWardenDataOpcode ); DEFINE_HANDLER(CMSG_WHO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Who::WhoRequestPkt, &WorldSession::HandleWhoOpcode); DEFINE_HANDLER(CMSG_WHO_IS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Who::WhoIsRequest, &WorldSession::HandleWhoIsOpcode); DEFINE_HANDLER(CMSG_WORLD_PORT_RESPONSE, STATUS_TRANSFER, PROCESS_THREADUNSAFE, WorldPackets::Movement::WorldPortResponse, &WorldSession::HandleMoveWorldportAckOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_WORLD_TELEPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWorldTeleportOpcode ); - DEFINE_HANDLER(CMSG_WRAP_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::WrapItem, &WorldSession::HandleWrapItem); + DEFINE_HANDLER(CMSG_WRAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::WrapItem, &WorldSession::HandleWrapItem); #undef DEFINE_OPCODE_HANDLER_OLD #undef DEFINE_HANDLER @@ -885,19 +886,19 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AVAILABLE_VOICE_CHANNEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BARBER_SHOP_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_PORT_DENIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_ACTIVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_NONE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_QUEUED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_ACTIVE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_NONE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_QUEUED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_INFO_THROTTLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_INIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_JOINED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_LEFT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_POSITIONS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_JOINED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_LEFT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_POSITIONS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_POINTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLENET_CHALLENGE_ABORT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLENET_CHALLENGE_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -934,7 +935,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_QUEUE_REQUEST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_QUEUE_STATUS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_STATE_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDER_CONFIRM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDER_CONFIRM, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BIND_POINT_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_OPEN_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -943,30 +944,30 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_WON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BONUS_ROLL_EMPTY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BOSS_KILL_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BREAK_TARGET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BREAK_TARGET, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_SUCCEEDED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CACHE_VERSION, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_CLEAR_PENDING_ACTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_COMMAND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INITIAL_INVITES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_NOTES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_REMOVED_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_UPDATED_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_CLEAR_PENDING_ACTION, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INITIAL_INVITES, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_ALERT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_NOTES, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_REMOVED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_REMOVED_ALERT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_UPDATED_ALERT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_RAID_LOCKOUT_ADDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_RAID_LOCKOUT_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_RAID_LOCKOUT_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_CALENDAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_EVENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_NUM_PENDING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_CALENDAR, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_EVENT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_NUM_PENDING, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAMERA_SHAKE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_AUTO_REPEAT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_COMBAT, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -974,7 +975,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_SCENE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_SPELL_VISUAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_SPELL_VISUAL_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAN_DUEL_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAN_DUEL_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAST_FAILED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CATEGORY_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLEGE_MODE_REWARDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1021,7 +1022,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_LOSS_OF_CONTROL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_SPELL_CHARGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_TARGET, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_COIN_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COIN_REMOVED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMBAT_EVENT_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_MAP_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1053,11 +1054,11 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEATH_RELEASE_LOC, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEFENSE_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DELETE_CHAR, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DESTROY_ARENA_UNIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DESTROY_ARENA_UNIT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DESTRUCTIBLE_BUILDING_DAMAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DIFFERENT_INSTANCE_FROM_PARTY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISENCHANT_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPEL_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_GAME_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1067,12 +1068,12 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_TOAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DROP_NEW_CONNECTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_COUNTDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_IN_BOUNDS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_OUT_OF_BOUNDS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_REQUESTED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_WINNER, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_COUNTDOWN, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_IN_BOUNDS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_OUT_OF_BOUNDS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_REQUESTED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_WINNER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DURABILITY_DAMAGE_DEATH, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_EMOTE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENABLE_BARBER_SHOP, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1096,10 +1097,10 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCED_DEATH_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_OBJECT_RELINK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_FRIEND_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FRIEND_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_CUSTOM_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_DESPAWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_DESPAWN, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_RESET_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1165,10 +1166,10 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_POI, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_ACTION_THROTTLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DECLINE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DESTROYED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_NEW_LEADER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_UNINVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DECLINE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DESTROYED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_NEW_LEADER, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_UNINVITE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DELETED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_EARNED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_MEMBERS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1253,12 +1254,12 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVENTORY_CHANGE_FAILURE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_IS_QUEST_COMPLETE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_ENCHANT_TIME_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_ENCHANT_TIME_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_EXPIRE_PURCHASE_REFUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PURCHASE_REFUND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PUSH_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TIME_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TIME_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_KICK_REASON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARN_TALENT_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1306,12 +1307,12 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ALL_PASSED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_CONTENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ITEM_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MONEY_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MONEY_NOTIFY, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE_ALL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_REMOVED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLLS_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLL_WON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1427,12 +1428,12 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_SHIPMENT_NPC_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_OVERRIDE_LIGHT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAGE_TEXT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_COMMAND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_INVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_KILL_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAUSE_MIRROR_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_INVITE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_KILL_LOG, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAUSE_MIRROR_TIMER, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PENDING_RAID_LOCK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_ALREADY_SIGNED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_RENAME_GUILD_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1491,8 +1492,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_POWER_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRE_RESSURECT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRINT_NOTIFICATION, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROC_RESIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROPOSE_LEVEL_GRANT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROC_RESIST, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROPOSE_LEVEL_GRANT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_LOG_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1513,11 +1514,11 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_COMPLETION_NPC_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_CONFIRM_ACCEPT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_FORCE_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_INVALID_QUEST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_INVALID_QUEST, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_DETAILS, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_REQUEST_ITEMS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_STATUS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1530,24 +1531,24 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_ADD_PVP_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_FAILED_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_FAILED_TIMER, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAF_EMAIL_ENABLED_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_DIFFICULTY_SET, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_GROUP_ONLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_GROUP_ONLY, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_INSTANCE_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_MARKERS_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RANDOM_ROLL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_MARKERS_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RANDOM_ROLL, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RATED_BATTLEFIELD_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_COMPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_STARTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_OK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_COMPLETED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_STARTED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_OK, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_SPLIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECRUIT_A_FRIEND_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_EXPIRED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_FAILURE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_FAILURE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFRESH_COMPONENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFRESH_SPELL_HISTORY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REMOVE_ITEM_PASSIVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1568,9 +1569,9 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_TOKEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_REQUEST, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESYNC_RUNES, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_CHANGED_INFORM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_CHANGED_INFORM, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_CHOSEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_POLL_INFORM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_POLL_INFORM, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RUNE_REGEN_DEBUG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENARIO_BOOT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENARIO_COMPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1589,8 +1590,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SELL_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_ITEM_PASSIVES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_KNOWN_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_RAID_TARGET_UPDATE_ALL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_RAID_TARGET_UPDATE_SINGLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_RAID_TARGET_UPDATE_ALL, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_RAID_TARGET_UPDATE_SINGLE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_CHARGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_HISTORY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_UNLEARN_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1602,7 +1603,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_AI_ANIM_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ALL_TASK_PROGRESS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ANIM_TIER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_CURRENCY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_CURRENCY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_DF_FAST_LAUNCH_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_DUNGEON_DIFFICULTY, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_AT_WAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1619,12 +1620,12 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PCT_SPELL_MODIFIER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PET_SPECIALIZATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAYER_DECLINED_NAMES_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAY_HOVER_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAY_HOVER_ANIM, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROFICIENCY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_SPELL_CHARGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TASK_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TIME_ZONE_INFORMATION, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_VEHICLE_REC_ID, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_VEHICLE_REC_ID, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_BANK, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_MAILBOX, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1637,30 +1638,30 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_CHANNEL_START, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_CHANNEL_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DAMAGE_SHIELD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DELAYED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DISPELL_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_ENERGIZE_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_EXECUTE_LOG, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DAMAGE_SHIELD, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DELAYED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DISPELL_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_ENERGIZE_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_EXECUTE_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILED_OTHER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILURE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_GO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_HEAL_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_INSTAKILL_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_INTERRUPT_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_MISS_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_MULTISTRIKE_EFFECT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_HEAL_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_INSTAKILL_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_INTERRUPT_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_MISS_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_MULTISTRIKE_EFFECT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_NON_MELEE_DAMAGE_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_OR_DAMAGE_IMMUNE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_PERIODIC_AURA_LOG, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_OR_DAMAGE_IMMUNE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_PERIODIC_AURA_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_START, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_UPDATE_CHAIN_TARGETS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_UPDATE_CHAIN_TARGETS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPIRIT_HEALER_CONFIRM, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_STAND_STATE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_ELAPSED_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_ELAPSED_TIMERS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_LOOT_ROLL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_MIRROR_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_MIRROR_TIMER, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_ELAPSED_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_MIRROR_TIMER, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1685,14 +1686,14 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_TITLE_LOST, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOTEM_CREATED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOTEM_MOVED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_BUY_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_STATUS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_UPDATED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_BUY_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_LIST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_ABORTED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_PENDING, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_CINEMATIC, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TURN_IN_PETITION_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TUTORIAL_FLAGS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TWITTER_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1722,11 +1723,11 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_PARENTAL_CONTROLS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_SESSION_LEAVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_SESSION_ROSTER_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_ITEM_SWAP_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_CONTENTS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_TRANSFER_CHANGES, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_TRANSFER_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_ITEM_SWAP_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_CONTENTS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_FAILED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_TRANSFER_CHANGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_TRANSFER_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WAIT_QUEUE_FINISH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WAIT_QUEUE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WARDEN_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index d9bd2d8ecc6..bc5b2ef69b6 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -48,6 +48,7 @@ #include "ClientConfigPackets.h" #include "MiscPackets.h" #include "ChatPackets.h" +#include "PacketUtilities.h" #include <zlib.h> @@ -427,6 +428,11 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) break; } } + catch (WorldPackets::PacketArrayMaxCapacityException const& pamce) + { + TC_LOG_ERROR("network", "PacketArrayMaxCapacityException: %s while parsing %s from %s.", + pamce.what(), GetOpcodeNameForLogging(static_cast<OpcodeClient>(packet->GetOpcode())).c_str(), GetPlayerInfo().c_str()); + } catch (ByteBufferException const&) { TC_LOG_ERROR("network", "WorldSession::Update ByteBufferException occured while parsing a packet (opcode: %u) from client %s, accountid=%i. Skipped packet.", diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 9c092ec98a1..18f7afab82f 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -122,6 +122,25 @@ namespace WorldPackets class BlackMarketOpen; } + namespace Calendar + { + class CalendarAddEvent; + class CalendarCopyEvent; + class CalendarEventInvite; + class CalendarEventModeratorStatus; + class CalendarEventRSVP; + class CalendarEventSignUp; + class CalendarEventStatus; + class CalendarGetCalendar; + class CalendarGetEvent; + class CalendarGetNumPending; + class CalendarGuildFilter; + class CalendarRemoveEvent; + class CalendarRemoveInvite; + class CalendarUpdateEvent; + class SetSavedInstanceExtend; + } + namespace Character { struct CharacterCreateInfo; @@ -162,6 +181,7 @@ namespace WorldPackets { class RequestAccountData; class UserClientUpdateAccountData; + class SetAdvancedCombatLogging; } namespace Channel @@ -278,6 +298,7 @@ namespace WorldPackets namespace Instance { class InstanceInfo; + class InstanceLockResponse; class ResetInstances; } @@ -307,6 +328,7 @@ namespace WorldPackets class LootRelease; class LootMoney; class LootRoll; + class SetLootSpecialization; } namespace Mail @@ -346,6 +368,9 @@ namespace WorldPackets class FarSight; class LoadCUFProfiles; class SaveCUFProfiles; + class OpeningCinematic; + class TogglePvP; + class SetPvP; } namespace Movement @@ -453,6 +478,7 @@ namespace WorldPackets class QuestGiverQueryQuest; class QuestGiverAcceptQuest; class QuestLogRemoveQuest; + class QuestPushResult; } namespace RaF @@ -599,11 +625,11 @@ enum AccountDataType #define REGISTERED_ADDON_PREFIX_SOFTCAP 64 -enum TutorialAction +enum TutorialAction : uint8 { - TUTORIAL_ACTION_RESET = 0, - TUTORIAL_ACTION_UPDATE = 1, - TUTORIAL_ACTION_CLEAR = 2 + TUTORIAL_ACTION_RESET = 1, + TUTORIAL_ACTION_CLEAR = 2, + TUTORIAL_ACTION_UPDATE = 3 }; /* @@ -972,7 +998,7 @@ class WorldSession void HandleCharRaceOrFactionChangeCallback(PreparedQueryResult result, WorldPackets::Character::CharRaceOrFactionChangeInfo* factionChangeInfo); void HandleRandomizeCharNameOpcode(WorldPackets::Character::GenerateRandomCharacterName& packet); void HandleReorderCharacters(WorldPackets::Character::ReorderCharacters& reorderChars); - void HandleOpeningCinematic(WorldPacket& recvData); + void HandleOpeningCinematic(WorldPackets::Misc::OpeningCinematic& packet); void HandleGetUndeleteCooldownStatus(WorldPackets::Character::GetUndeleteCharacterCooldownStatus& /*getCooldown*/); void HandleUndeleteCooldownStatusCallback(PreparedQueryResult result); void HandleCharUndeleteOpcode(WorldPackets::Character::UndeleteCharacter& undeleteInfo); @@ -1027,6 +1053,8 @@ class WorldSession void HandleLootOpcode(WorldPackets::Loot::LootUnit& packet); void HandleLootReleaseOpcode(WorldPackets::Loot::LootRelease& packet); void HandleLootMasterGiveOpcode(WorldPacket& recvPacket); + void HandleSetLootSpecialization(WorldPackets::Loot::SetLootSpecialization& packet); + void HandleWhoOpcode(WorldPackets::Who::WhoRequestPkt& whoRequest); void HandleLogoutRequestOpcode(WorldPackets::Character::LogoutRequest& logoutRequest); void HandleLogoutCancelOpcode(WorldPackets::Character::LogoutCancel& logoutCancel); @@ -1039,7 +1067,8 @@ class WorldSession void HandleSupportTicketSubmitComplaint(WorldPackets::Ticket::SupportTicketSubmitComplaint& packet); void HandleBugReportOpcode(WorldPackets::Ticket::BugReport& bugReport); - void HandleTogglePvP(WorldPacket& recvPacket); + void HandleTogglePvP(WorldPackets::Misc::TogglePvP& packet); + void HandleSetPvP(WorldPackets::Misc::SetPvP& packet); void HandleSetSelectionOpcode(WorldPackets::Misc::SetSelection& packet); void HandleStandStateChangeOpcode(WorldPackets::Misc::StandStateChange& packet); @@ -1066,6 +1095,7 @@ class WorldSession void HandleUpdateAccountData(WorldPackets::ClientConfig::UserClientUpdateAccountData& packet); void HandleRequestAccountData(WorldPackets::ClientConfig::RequestAccountData& request); + void HandleSetAdvancedCombatLogging(WorldPackets::ClientConfig::SetAdvancedCombatLogging& setAdvancedCombatLogging); void HandleSetActionButtonOpcode(WorldPackets::Spells::SetActionButton& packet); void HandleGameObjectUseOpcode(WorldPackets::GameObject::GameObjUse& packet); @@ -1292,7 +1322,7 @@ class WorldSession void HandleQuestgiverCompleteQuest(WorldPackets::Quest::QuestGiverCompleteQuest& packet); void HandleQuestgiverQuestAutoLaunch(WorldPacket& recvPacket); void HandlePushQuestToParty(WorldPacket& recvPacket); - void HandleQuestPushResult(WorldPacket& recvPacket); + void HandleQuestPushResult(WorldPackets::Quest::QuestPushResult& packet); void HandleChatMessageOpcode(WorldPackets::Chat::ChatMessage& chatMessage); void HandleChatMessageWhisperOpcode(WorldPackets::Chat::ChatMessageWhisper& chatMessageWhisper); @@ -1396,7 +1426,7 @@ class WorldSession void HandleTimeSyncResponse(WorldPackets::Misc::TimeSyncResponse& packet); void HandleWhoIsOpcode(WorldPackets::Who::WhoIsRequest& packet); void HandleResetInstancesOpcode(WorldPackets::Instance::ResetInstances& packet); - void HandleInstanceLockResponse(WorldPacket& recvPacket); + void HandleInstanceLockResponse(WorldPackets::Instance::InstanceLockResponse& packet); // Looking for Dungeon/Raid void HandleLfgSetCommentOpcode(WorldPacket& recvData); @@ -1460,25 +1490,25 @@ class WorldSession void HandleAcceptGrantLevel(WorldPackets::RaF::AcceptLevelGrant& acceptLevelGrant); // Calendar - void HandleCalendarGetCalendar(WorldPacket& recvData); - void HandleCalendarGetEvent(WorldPacket& recvData); - void HandleCalendarGuildFilter(WorldPacket& recvData); - void HandleCalendarAddEvent(WorldPacket& recvData); - void HandleCalendarUpdateEvent(WorldPacket& recvData); - void HandleCalendarRemoveEvent(WorldPacket& recvData); - void HandleCalendarCopyEvent(WorldPacket& recvData); - void HandleCalendarEventInvite(WorldPacket& recvData); - void HandleCalendarEventRsvp(WorldPacket& recvData); - void HandleCalendarEventRemoveInvite(WorldPacket& recvData); - void HandleCalendarEventStatus(WorldPacket& recvData); - void HandleCalendarEventModeratorStatus(WorldPacket& recvData); + void HandleCalendarGetCalendar(WorldPackets::Calendar::CalendarGetCalendar& calendarGetCalendar); + void HandleCalendarGetEvent(WorldPackets::Calendar::CalendarGetEvent& calendarGetEvent); + void HandleCalendarGuildFilter(WorldPackets::Calendar::CalendarGuildFilter& calendarGuildFilter); + void HandleCalendarAddEvent(WorldPackets::Calendar::CalendarAddEvent& calendarAddEvent); + void HandleCalendarUpdateEvent(WorldPackets::Calendar::CalendarUpdateEvent& calendarUpdateEvent); + void HandleCalendarRemoveEvent(WorldPackets::Calendar::CalendarRemoveEvent& calendarRemoveEvent); + void HandleCalendarCopyEvent(WorldPackets::Calendar::CalendarCopyEvent& calendarCopyEvent); + void HandleCalendarEventInvite(WorldPackets::Calendar::CalendarEventInvite& calendarEventInvite); + void HandleCalendarEventRsvp(WorldPackets::Calendar::CalendarEventRSVP& calendarEventRSVP); + void HandleCalendarEventRemoveInvite(WorldPackets::Calendar::CalendarRemoveInvite& calendarRemoveInvite); + void HandleCalendarEventStatus(WorldPackets::Calendar::CalendarEventStatus& calendarEventStatus); + void HandleCalendarEventModeratorStatus(WorldPackets::Calendar::CalendarEventModeratorStatus& calendarEventModeratorStatus); void HandleCalendarComplain(WorldPacket& recvData); - void HandleCalendarGetNumPending(WorldPacket& recvData); - void HandleCalendarEventSignup(WorldPacket& recvData); + void HandleCalendarGetNumPending(WorldPackets::Calendar::CalendarGetNumPending& calendarGetNumPending); + void HandleCalendarEventSignup(WorldPackets::Calendar::CalendarEventSignUp& calendarEventSignUp); void SendCalendarRaidLockout(InstanceSave const* save, bool add); void SendCalendarRaidLockoutUpdated(InstanceSave const* save); - void HandleSetSavedInstanceExtend(WorldPacket& recvData); + void HandleSetSavedInstanceExtend(WorldPackets::Calendar::SetSavedInstanceExtend& setSavedInstanceExtend); // Void Storage void HandleVoidStorageUnlock(WorldPackets::VoidStorage::UnlockVoidStorage& unlockVoidStorage); diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 321a7635e4e..6407b29924a 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -206,13 +206,15 @@ void WorldSocket::ReadHandler() } // just received fresh new payload - if (!ReadDataHandler()) + ReadDataHandlerResult result = ReadDataHandler(); + _headerBuffer.Reset(); + if (result != ReadDataHandlerResult::Ok) { - CloseSocket(); + if (result != ReadDataHandlerResult::WaitingForQuery) + CloseSocket(); + return; } - - _headerBuffer.Reset(); } AsyncRead(); @@ -264,7 +266,7 @@ bool WorldSocket::ReadHeaderHandler() return true; } -bool WorldSocket::ReadDataHandler() +WorldSocket::ReadDataHandlerResult WorldSocket::ReadDataHandler() { if (_initialized) { @@ -287,7 +289,7 @@ bool WorldSocket::ReadDataHandler() { case CMSG_PING: LogOpcodeText(opcode, sessionGuard); - return HandlePing(packet); + return HandlePing(packet) ? ReadDataHandlerResult::Ok : ReadDataHandlerResult::Error; case CMSG_AUTH_SESSION: { LogOpcodeText(opcode, sessionGuard); @@ -296,13 +298,13 @@ bool WorldSocket::ReadDataHandler() // locking just to safely log offending user is probably overkill but we are disconnecting him anyway if (sessionGuard.try_lock()) TC_LOG_ERROR("network", "WorldSocket::ProcessIncoming: received duplicate CMSG_AUTH_SESSION from %s", _worldSession->GetPlayerInfo().c_str()); - return false; + return ReadDataHandlerResult::Error; } std::shared_ptr<WorldPackets::Auth::AuthSession> authSession = std::make_shared<WorldPackets::Auth::AuthSession>(std::move(packet)); authSession->Read(); HandleAuthSession(authSession); - break; + return ReadDataHandlerResult::WaitingForQuery; } case CMSG_AUTH_CONTINUED_SESSION: { @@ -312,13 +314,13 @@ bool WorldSocket::ReadDataHandler() // locking just to safely log offending user is probably overkill but we are disconnecting him anyway if (sessionGuard.try_lock()) TC_LOG_ERROR("network", "WorldSocket::ProcessIncoming: received duplicate CMSG_AUTH_CONTINUED_SESSION from %s", _worldSession->GetPlayerInfo().c_str()); - return false; + return ReadDataHandlerResult::Error; } std::shared_ptr<WorldPackets::Auth::AuthContinuedSession> authSession = std::make_shared<WorldPackets::Auth::AuthContinuedSession>(std::move(packet)); authSession->Read(); HandleAuthContinuedSession(authSession); - break; + return ReadDataHandlerResult::WaitingForQuery; } case CMSG_KEEP_ALIVE: LogOpcodeText(opcode, sessionGuard); @@ -326,7 +328,7 @@ bool WorldSocket::ReadDataHandler() case CMSG_LOG_DISCONNECT: LogOpcodeText(opcode, sessionGuard); packet.rfinish(); // contains uint32 disconnectReason; - return true; + break; case CMSG_ENABLE_NAGLE: LogOpcodeText(opcode, sessionGuard); SetNoDelay(false); @@ -350,14 +352,14 @@ bool WorldSocket::ReadDataHandler() if (!_worldSession) { TC_LOG_ERROR("network.opcode", "ProcessIncoming: Client not authed opcode = %u", uint32(opcode)); - return false; + return ReadDataHandlerResult::Error; } OpcodeHandler const* handler = opcodeTable[opcode]; if (!handler) { TC_LOG_ERROR("network.opcode", "No defined handler for opcode %s sent by %s", GetOpcodeNameForLogging(static_cast<OpcodeClient>(packet.GetOpcode())).c_str(), _worldSession->GetPlayerInfo().c_str()); - return true; + break; } // Our Idle timer will reset on any non PING opcodes. @@ -374,7 +376,7 @@ bool WorldSocket::ReadDataHandler() { std::string initializer(reinterpret_cast<char const*>(_packetBuffer.GetReadPointer()), std::min(_packetBuffer.GetActiveSize(), ClientConnectionInitialize.length())); if (initializer != ClientConnectionInitialize) - return false; + return ReadDataHandlerResult::Error; _compressionStream = new z_stream(); _compressionStream->zalloc = (alloc_func)NULL; @@ -386,7 +388,7 @@ bool WorldSocket::ReadDataHandler() if (z_res != Z_OK) { TC_LOG_ERROR("network", "Can't initialize packet compression (zlib: deflateInit) Error code: %i (%s)", z_res, zError(z_res)); - return false; + return ReadDataHandlerResult::Error; } _initialized = true; @@ -395,7 +397,7 @@ bool WorldSocket::ReadDataHandler() HandleSendAuthSession(); } - return true; + return ReadDataHandlerResult::Ok; } void WorldSocket::LogOpcodeText(OpcodeClient opcode, std::unique_lock<std::mutex> const& guard) const @@ -765,6 +767,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<WorldPackets::Auth:: _queryCallback = io_service().wrap(std::bind(&WorldSocket::LoadSessionPermissionsCallback, this, std::placeholders::_1)); _queryFuture = _worldSession->LoadPermissionsAsync(); + AsyncRead(); } void WorldSocket::LoadSessionPermissionsCallback(PreparedQueryResult result) @@ -831,6 +834,7 @@ void WorldSocket::HandleAuthContinuedSessionCallback(std::shared_ptr<WorldPacket } sWorld->AddInstanceSocket(shared_from_this(), accountId); + AsyncRead(); } void WorldSocket::HandleConnectToFailed(WorldPackets::Auth::ConnectToFailed& connectToFailed) diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index 9b51b564c8e..e2ea2f2d273 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -95,7 +95,15 @@ protected: void OnClose() override; void ReadHandler() override; bool ReadHeaderHandler(); - bool ReadDataHandler(); + + enum class ReadDataHandlerResult + { + Ok = 0, + Error = 1, + WaitingForQuery = 2 + }; + + ReadDataHandlerResult ReadDataHandler(); private: void CheckIpCallback(PreparedQueryResult result); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 473b3a98c56..1550510123e 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -32,6 +32,7 @@ #include "Battleground.h" #include "OutdoorPvPMgr.h" #include "GridNotifiers.h" +#include "GridNotifiersImpl.h" #include "ScriptMgr.h" #include "Vehicle.h" #include "Battlefield.h" @@ -1161,7 +1162,7 @@ bool AuraEffect::IsAffectingSpell(SpellInfo const* spell) const void AuraEffect::SendTickImmune(Unit* target, Unit* caster) const { if (caster) - caster->SendSpellDamageImmune(target, m_spellInfo->Id); + caster->SendSpellDamageImmune(target, m_spellInfo->Id, true); } void AuraEffect::PeriodicTick(AuraApplication * aurApp, Unit* caster) const @@ -6084,11 +6085,10 @@ void AuraEffect::HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const overkill = 0; SpellPeriodicAuraLogInfo pInfo(this, damage, overkill, absorb, resist, 0.0f, crit); - target->SendPeriodicAuraLog(&pInfo); caster->ProcDamageAndSpell(target, procAttacker, procVictim, procEx, damage, BASE_ATTACK, GetSpellInfo()); - caster->DealDamage(target, damage, &cleanDamage, DOT, GetSpellInfo()->GetSchoolMask(), GetSpellInfo(), true); + target->SendPeriodicAuraLog(&pInfo); } bool AuraEffect::IsAreaAuraEffect() const @@ -6171,7 +6171,13 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c TC_LOG_DEBUG("spells.periodic", "PeriodicTick: %s health leech of %s for %u dmg inflicted by %u abs is %u", GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), damage, GetId(), absorb); - caster->SendSpellNonMeleeDamageLog(target, GetId(), damage, GetSpellInfo()->GetSchoolMask(), absorb, resist, false, 0, crit); + SpellNonMeleeDamage log(caster, target, GetId(), GetSpellInfo()->GetSchoolMask()); + log.damage = damage - absorb - resist; + log.absorb = absorb; + log.resist = resist; + log.periodicLog = true; + if (crit) + log.HitInfo |= SPELL_HIT_TYPE_CRIT; // Set trigger flag uint32 procAttacker = PROC_FLAG_DONE_PERIODIC; @@ -6193,6 +6199,9 @@ void AuraEffect::HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) c int32 gain = caster->HealBySpell(caster, GetSpellInfo(), heal); caster->getHostileRefManager().threatAssist(caster, gain * 0.5f, GetSpellInfo()); } + + log.damage = new_damage; + caster->SendSpellNonMeleeDamageLog(&log); } void AuraEffect::HandlePeriodicHealthFunnelAuraTick(Unit* target, Unit* caster) const @@ -6345,7 +6354,6 @@ void AuraEffect::HandlePeriodicManaLeechAuraTick(Unit* target, Unit* caster) con float gainMultiplier = GetSpellEffectInfo()->CalcValueMultiplier(caster); SpellPeriodicAuraLogInfo pInfo(this, drainedAmount, 0, 0, 0, gainMultiplier, false); - target->SendPeriodicAuraLog(&pInfo); int32 gainAmount = int32(drainedAmount * gainMultiplier); int32 gainedAmount = 0; @@ -6369,6 +6377,8 @@ void AuraEffect::HandlePeriodicManaLeechAuraTick(Unit* target, Unit* caster) con caster->CastCustomSpell(caster, 32554, &feedAmount, NULL, NULL, true, NULL, this); } } + + target->SendPeriodicAuraLog(&pInfo); } void AuraEffect::HandleObsModPowerAuraTick(Unit* target, Unit* caster) const @@ -6398,12 +6408,12 @@ void AuraEffect::HandleObsModPowerAuraTick(Unit* target, Unit* caster) const GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), amount, GetId()); SpellPeriodicAuraLogInfo pInfo(this, amount, 0, 0, 0, 0.0f, false); - target->SendPeriodicAuraLog(&pInfo); - int32 gain = target->ModifyPower(powerType, amount); if (caster) target->getHostileRefManager().threatAssist(caster, float(gain) * 0.5f, GetSpellInfo()); + + target->SendPeriodicAuraLog(&pInfo); } void AuraEffect::HandlePeriodicEnergizeAuraTick(Unit* target, Unit* caster) const @@ -6430,12 +6440,12 @@ void AuraEffect::HandlePeriodicEnergizeAuraTick(Unit* target, Unit* caster) cons int32 amount = std::max(m_amount, 0); SpellPeriodicAuraLogInfo pInfo(this, amount, 0, 0, 0, 0.0f, false); - target->SendPeriodicAuraLog(&pInfo); TC_LOG_DEBUG("spells.periodic", "PeriodicTick: %s energize %s for %u dmg inflicted by %u", GetCasterGUID().ToString().c_str(), target->GetGUID().ToString().c_str(), amount, GetId()); int32 gain = target->ModifyPower(powerType, amount); + target->SendPeriodicAuraLog(&pInfo); if (caster) target->getHostileRefManager().threatAssist(caster, float(gain) * 0.5f, GetSpellInfo()); @@ -6469,8 +6479,6 @@ void AuraEffect::HandlePeriodicPowerBurnAuraTick(Unit* target, Unit* caster) con caster->DealDamageMods(damageInfo.target, damageInfo.damage, &damageInfo.absorb); - caster->SendSpellNonMeleeDamageLog(&damageInfo); - // Set trigger flag uint32 procAttacker = PROC_FLAG_DONE_PERIODIC; uint32 procVictim = PROC_FLAG_TAKEN_PERIODIC; @@ -6480,7 +6488,8 @@ void AuraEffect::HandlePeriodicPowerBurnAuraTick(Unit* target, Unit* caster) con caster->ProcDamageAndSpell(damageInfo.target, procAttacker, procVictim, procEx, damageInfo.damage, BASE_ATTACK, spellProto); - caster->DealSpellDamage(&damageInfo, true); + damageInfo.damage = caster->DealSpellDamage(&damageInfo, true); + caster->SendSpellNonMeleeDamageLog(&damageInfo); } void AuraEffect::HandleProcTriggerSpellAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo) @@ -6523,9 +6532,9 @@ void AuraEffect::HandleProcTriggerDamageAuraProc(AuraApplication* aurApp, ProcEv damage = triggerTarget->SpellDamageBonusTaken(target, GetSpellInfo(), damage, SPELL_DIRECT_DAMAGE, GetSpellEffectInfo()); target->CalculateSpellDamageTaken(&damageInfo, damage, GetSpellInfo()); target->DealDamageMods(damageInfo.target, damageInfo.damage, &damageInfo.absorb); - target->SendSpellNonMeleeDamageLog(&damageInfo); TC_LOG_DEBUG("spells", "AuraEffect::HandleProcTriggerDamageAuraProc: Triggering %u spell damage from aura %u proc", damage, GetId()); - target->DealSpellDamage(&damageInfo, true); + damageInfo.damage = target->DealSpellDamage(&damageInfo, true); + target->SendSpellNonMeleeDamageLog(&damageInfo); } void AuraEffect::HandleRaidProcFromChargeAuraProc(AuraApplication* aurApp, ProcEventInfo& /*eventInfo*/) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 945580b0ee3..26da12b1840 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2417,9 +2417,6 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) caster->CalculateSpellDamageTaken(&damageInfo, m_damage, m_spellInfo, m_attackType, target->crit); caster->DealDamageMods(damageInfo.target, damageInfo.damage, &damageInfo.absorb); - // Send log damage message to client - caster->SendSpellNonMeleeDamageLog(&damageInfo); - procEx |= createProcExtendMask(&damageInfo, missInfo); procVictim |= PROC_FLAG_TAKEN_DAMAGE; @@ -2434,7 +2431,10 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) m_damage = damageInfo.damage; - caster->DealSpellDamage(&damageInfo, true); + damageInfo.damage = caster->DealSpellDamage(&damageInfo, true); + + // Send log damage message to client + caster->SendSpellNonMeleeDamageLog(&damageInfo); } // Passive spell hits/misses or active spells only misses (only triggers) else @@ -4083,7 +4083,7 @@ void Spell::SendSpellExecuteLog() spellExecuteLog.Effects.push_back(spellLogEffect); } - m_caster->SendMessageToSet(spellExecuteLog.Write(), true); + m_caster->SendCombatLogMessage(&spellExecuteLog); } void Spell::ExecuteLogEffectTakeTargetPower(uint8 effIndex, Unit* target, uint32 powerType, uint32 points, float amplitude) diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 23d183330f2..3f96dc551d3 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -391,10 +391,14 @@ void Spell::EffectEnvironmentalDMG(SpellEffIndex /*effIndex*/) uint32 resist = 0; m_caster->CalcAbsorbResist(unitTarget, m_spellInfo->GetSchoolMask(), SPELL_DIRECT_DAMAGE, damage, &absorb, &resist, m_spellInfo); - - m_caster->SendSpellNonMeleeDamageLog(unitTarget, m_spellInfo->Id, damage, m_spellInfo->GetSchoolMask(), absorb, resist, false, 0, false); + SpellNonMeleeDamage log(m_caster, unitTarget, m_spellInfo->Id, m_spellInfo->GetSchoolMask()); + log.damage = damage - absorb - resist; + log.absorb = absorb; + log.resist = resist; if (unitTarget->GetTypeId() == TYPEID_PLAYER) - unitTarget->ToPlayer()->EnvironmentalDamage(DAMAGE_FIRE, damage); + log.damage = unitTarget->ToPlayer()->EnvironmentalDamage(DAMAGE_FIRE, damage); + + m_caster->SendSpellNonMeleeDamageLog(&log); } void Spell::EffectSchoolDMG(SpellEffIndex effIndex) diff --git a/src/server/scripts/Commands/cs_battlenet_account.cpp b/src/server/scripts/Commands/cs_battlenet_account.cpp index 767a75f0b36..9c6098f70d9 100644 --- a/src/server/scripts/Commands/cs_battlenet_account.cpp +++ b/src/server/scripts/Commands/cs_battlenet_account.cpp @@ -70,8 +70,6 @@ public: if (!*args) return false; - std::string email; - ///- %Parse the command line arguments char* accountName = strtok((char*)args, " "); char* password = strtok(NULL, " "); diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index b9a22162e2e..bade0600b9b 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -491,7 +491,7 @@ public: static bool HandleDebugSendQuestPartyMsgCommand(ChatHandler* handler, char const* args) { uint32 msg = atoul(args); - handler->GetSession()->GetPlayer()->SendPushToPartyResponse(handler->GetSession()->GetPlayer(), msg); + handler->GetSession()->GetPlayer()->SendPushToPartyResponse(handler->GetSession()->GetPlayer(), static_cast<QuestPushReason>(msg)); return true; } diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 83c8d55aec3..a16d4324b87 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -2294,7 +2294,7 @@ public: handler->GetSession()->GetPlayer()->DealDamageMods(target, damage, &absorb); handler->GetSession()->GetPlayer()->DealDamage(target, damage, NULL, DIRECT_DAMAGE, schoolmask, NULL, false); - handler->GetSession()->GetPlayer()->SendAttackStateUpdate (HITINFO_AFFECTS_VICTIM, target, 1, schoolmask, damage, absorb, resist, VICTIMSTATE_HIT, 0); + handler->GetSession()->GetPlayer()->SendAttackStateUpdate(HITINFO_AFFECTS_VICTIM, target, 1, schoolmask, damage, absorb, resist, VICTIMSTATE_HIT, 0); return true; } @@ -2306,9 +2306,10 @@ public: return false; SpellNonMeleeDamage damageInfo(handler->GetSession()->GetPlayer(), target, spellid, sSpellMgr->GetSpellInfo(spellid)->SchoolMask); + damageInfo.damage = damage; handler->GetSession()->GetPlayer()->DealDamageMods(damageInfo.target, damageInfo.damage, &damageInfo.absorb); + damageInfo.damage = target->DealSpellDamage(&damageInfo, true); target->SendSpellNonMeleeDamageLog(&damageInfo); - target->DealSpellDamage(&damageInfo, true); return true; } diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index 6e712a16c97..71232530505 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -149,13 +149,7 @@ enum Actions ACTION_MONITOR_CORPOREALITY = 3, // Orb Carrier - ACTION_SHOOT = 4, - - // Living Inferno - ACTION_SUMMON_LIVING_EMBERS = 5, - - // Meteor Flame - ACTION_SUMMON_FLAME = 6 + ACTION_SHOOT = 4 }; enum Phases @@ -1005,7 +999,7 @@ class npc_meteor_strike_initial : public CreatureScript if (HalionAI* halionAI = CAST_AI(HalionAI, owner->AI())) { Position const* ownerPos = halionAI->GetMeteorStrikePosition(); - float randomAdjustment = frand(0.0f, static_cast<float>(M_PI / 7.0f)); + float randomAdjustment = frand(0.0f, static_cast<float>(M_PI / 5.0f)); float angle[4]; angle[0] = me->GetAngle(ownerPos); angle[1] = angle[0] + randomAdjustment; @@ -1089,7 +1083,7 @@ class npc_meteor_strike : public CreatureScript if (_events.ExecuteEvent() == EVENT_SPAWN_METEOR_FLAME) { - Position pos = me->GetNearPosition(5.0f, frand(0.0f, static_cast<float>(M_PI / 8.0f))); + Position pos = me->GetNearPosition(5.0f, frand(-static_cast<float>(M_PI / 6.0f), static_cast<float>(M_PI / 6.0f))); if (Creature* flame = me->SummonCreature(NPC_METEOR_STRIKE_FLAME, pos, TEMPSUMMON_TIMED_DESPAWN, 25000)) flame->AI()->SetGUID(me->GetGUID()); } @@ -1149,8 +1143,7 @@ class npc_meteor_strike_flame : public CreatureScript if (meteorStrike->AI()->GetData(DATA_SPAWNED_FLAMES) > 5) return; - Position pos = me->GetNearPosition(5.0f, frand(0.0f, static_cast<float>(M_PI / 8.0f))); - + Position pos = me->GetNearPosition(5.0f, frand(-static_cast<float>(M_PI / 6.0f), static_cast<float>(M_PI / 6.0f))); if (Creature* flame = me->SummonCreature(NPC_METEOR_STRIKE_FLAME, pos, TEMPSUMMON_TIMED_DESPAWN, 25000)) flame->AI()->SetGUID(_rootOwnerGuid); } @@ -1357,7 +1350,7 @@ class go_twilight_portal : public GameObjectScript _spellId = gameobject->GetGOInfo()->goober.spell; break; case GO_HALION_PORTAL_1: - case GO_HALION_PORTAL_2: // Not used, not seen in sniffs. Just in case. + case GO_HALION_PORTAL_2: gameobject->SetPhaseMask(0x1, true); /// Because WDB template has non-existent spell ID, not seen in sniffs either, meh _spellId = SPELL_TWILIGHT_REALM; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index 423c1049452..c53906b5b38 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -1093,8 +1093,8 @@ class spell_sindragosa_s_fury : public SpellScriptLoader SpellNonMeleeDamage damageInfo(GetCaster(), GetHitUnit(), GetSpellInfo()->Id, GetSpellInfo()->SchoolMask); damageInfo.damage = damage; + damageInfo.damage = GetCaster()->DealSpellDamage(&damageInfo, false); GetCaster()->SendSpellNonMeleeDamageLog(&damageInfo); - GetCaster()->DealSpellDamage(&damageInfo, false); } void Register() override diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index a93d23fa233..ce3153f48ab 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -794,9 +794,10 @@ class spell_warl_health_funnel : public SpellScriptLoader modOwner->ApplySpellMod(GetId(), SPELLMOD_COST, damage); SpellNonMeleeDamage damageInfo(caster, caster, GetSpellInfo()->Id, GetSpellInfo()->SchoolMask); + damageInfo.periodicLog = true; damageInfo.damage = damage; + damageInfo.damage = caster->DealSpellDamage(&damageInfo, false); caster->SendSpellNonMeleeDamageLog(&damageInfo); - caster->DealSpellDamage(&damageInfo, false); } void Register() override diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 233ec96bab8..9fa6e7f29ec 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -79,7 +79,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() "position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " "resettalents_time, talentTree, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " - "health, power1, power2, power3, power4, power5, power6, instance_id, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels, raidDifficulty, legacyRaidDifficulty " + "health, power1, power2, power3, power4, power5, power6, instance_id, talentGroupsCount, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels, raidDifficulty, legacyRaidDifficulty " "FROM characters WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_GROUP_MEMBER, "SELECT guid FROM group_member WHERE memberGuid = ?", CONNECTION_BOTH); @@ -393,13 +393,13 @@ void CharacterDatabaseConnection::DoPrepareStatements() "extra_flags, stable_slots, at_login, zone, " "death_expire_time, taxi_path, totalKills, " "todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, " - "power4, power5, power6, latency, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels) VALUES " - "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); + "power4, power5, power6, latency, talentGroupsCount, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels) VALUES " + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,playerBytes=?,playerBytes2=?,playerFlags=?," "map=?,instance_id=?,dungeonDifficulty=?,raidDifficulty=?,legacyRaidDifficulty=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?," "logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,talentTree=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," "totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?," - "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,latency=?,talentGroupsCount=?,activeTalentGroup=?,exploredZones=?," + "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,latency=?,talentGroupsCount=?,activeTalentGroup=?,lootSpecId=?,exploredZones=?," "equipmentCache=?,knownTitles=?,actionBars=?,grantableLevels=?,online=? WHERE guid=?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_ADD_AT_LOGIN_FLAG, "UPDATE characters SET at_login = at_login | ? WHERE guid = ?", CONNECTION_ASYNC); @@ -612,10 +612,10 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_INS_ITEMCONTAINER_MONEY, "INSERT INTO item_loot_money (container_id, money) VALUES (?, ?)", CONNECTION_ASYNC); // Calendar - PrepareStatement(CHAR_REP_CALENDAR_EVENT, "REPLACE INTO calendar_events (id, creator, title, description, type, dungeon, eventtime, flags, time2) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_CALENDAR_EVENT, "DELETE FROM calendar_events WHERE id = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_REP_CALENDAR_INVITE, "REPLACE INTO calendar_invites (id, event, invitee, sender, status, statustime, rank, text) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_CALENDAR_INVITE, "DELETE FROM calendar_invites WHERE id = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_REP_CALENDAR_EVENT, "REPLACE INTO calendar_events (EventID, Owner, Title, Description, EventType, TextureID, Date, Flags, LockDate) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_CALENDAR_EVENT, "DELETE FROM calendar_events WHERE EventID = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_REP_CALENDAR_INVITE, "REPLACE INTO calendar_invites (InviteID, EventID, Invitee, Sender, Status, ResponseTime, ModerationRank, Note) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_CALENDAR_INVITE, "DELETE FROM calendar_invites WHERE InviteID = ?", CONNECTION_ASYNC); // Pet PrepareStatement(CHAR_SEL_PET_SLOTS, "SELECT owner, slot FROM character_pet WHERE owner = ? AND slot >= ? AND slot <= ? ORDER BY slot", CONNECTION_ASYNC); diff --git a/src/server/shared/Networking/MessageBuffer.h b/src/server/shared/Networking/MessageBuffer.h index d0c65f05c3d..95e138655aa 100644 --- a/src/server/shared/Networking/MessageBuffer.h +++ b/src/server/shared/Networking/MessageBuffer.h @@ -84,9 +84,9 @@ public: // Ensures there's "some" free space, make sure to call Normalize() before this void EnsureFreeSpace() { - // Double the size of the buffer if it's already full + // resize buffer if it's already full if (GetRemainingSpace() == 0) - _storage.resize(_storage.size() * 2); + _storage.resize(_storage.size() * 3 / 2); } void Write(void const* data, std::size_t size) |
