aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp12
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp1
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h3
-rw-r--r--src/server/game/Calendar/CalendarMgr.cpp284
-rw-r--r--src/server/game/Calendar/CalendarMgr.h105
-rw-r--r--src/server/game/Entities/Creature/Creature.h5
-rw-r--r--src/server/game/Entities/Player/Player.cpp208
-rw-r--r--src/server/game/Entities/Player/Player.h25
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp293
-rw-r--r--src/server/game/Entities/Unit/Unit.h26
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp50
-rw-r--r--src/server/game/Groups/Group.cpp18
-rw-r--r--src/server/game/Guilds/Guild.cpp18
-rw-r--r--src/server/game/Handlers/CalendarHandler.cpp487
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp2
-rw-r--r--src/server/game/Handlers/GroupHandler.cpp6
-rw-r--r--src/server/game/Handlers/LootHandler.cpp14
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp44
-rw-r--r--src/server/game/Handlers/QueryHandler.cpp49
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp28
-rw-r--r--src/server/game/Handlers/VoidStorageHandler.cpp24
-rw-r--r--src/server/game/Loot/LootMgr.h3
-rw-r--r--src/server/game/Maps/Map.cpp4
-rw-r--r--src/server/game/Maps/MapManager.cpp4
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h82
-rw-r--r--src/server/game/Quests/QuestDef.h54
-rw-r--r--src/server/game/Server/Packets/BattlegroundPackets.cpp6
-rw-r--r--src/server/game/Server/Packets/BattlegroundPackets.h10
-rw-r--r--src/server/game/Server/Packets/CalendarPackets.cpp468
-rw-r--r--src/server/game/Server/Packets/CalendarPackets.h548
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.cpp9
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.h5
-rw-r--r--src/server/game/Server/Packets/ClientConfigPackets.cpp5
-rw-r--r--src/server/game/Server/Packets/ClientConfigPackets.h10
-rw-r--r--src/server/game/Server/Packets/CombatLogPackets.cpp332
-rw-r--r--src/server/game/Server/Packets/CombatLogPackets.h196
-rw-r--r--src/server/game/Server/Packets/CombatPackets.cpp65
-rw-r--r--src/server/game/Server/Packets/CombatPackets.h58
-rw-r--r--src/server/game/Server/Packets/InstancePackets.cpp13
-rw-r--r--src/server/game/Server/Packets/InstancePackets.h21
-rw-r--r--src/server/game/Server/Packets/ItemPackets.cpp1
-rw-r--r--src/server/game/Server/Packets/ItemPackets.h3
-rw-r--r--src/server/game/Server/Packets/LootPackets.cpp25
-rw-r--r--src/server/game/Server/Packets/LootPackets.h22
-rw-r--r--src/server/game/Server/Packets/MiscPackets.cpp9
-rw-r--r--src/server/game/Server/Packets/MiscPackets.h26
-rw-r--r--src/server/game/Server/Packets/PacketUtilities.h80
-rw-r--r--src/server/game/Server/Packets/PartyPackets.cpp8
-rw-r--r--src/server/game/Server/Packets/PartyPackets.h11
-rw-r--r--src/server/game/Server/Packets/QuestPackets.cpp54
-rw-r--r--src/server/game/Server/Packets/QuestPackets.h59
-rw-r--r--src/server/game/Server/Packets/SpellPackets.cpp8
-rw-r--r--src/server/game/Server/Packets/SpellPackets.h4
-rw-r--r--src/server/game/Server/Packets/VoidStoragePackets.cpp15
-rw-r--r--src/server/game/Server/Packets/VoidStoragePackets.h6
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp395
-rw-r--r--src/server/game/Server/WorldSession.cpp6
-rw-r--r--src/server/game/Server/WorldSession.h76
-rw-r--r--src/server/game/Server/WorldSocket.cpp36
-rw-r--r--src/server/game/Server/WorldSocket.h10
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp35
-rw-r--r--src/server/game/Spells/Spell.cpp10
-rw-r--r--src/server/game/Spells/SpellEffects.cpp10
-rw-r--r--src/server/scripts/Commands/cs_battlenet_account.cpp2
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp2
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp5
-rw-r--r--src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp17
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp2
-rw-r--r--src/server/scripts/Spells/spell_warlock.cpp3
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.cpp16
-rw-r--r--src/server/shared/Networking/MessageBuffer.h4
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)