aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Handlers')
-rw-r--r--src/server/game/Handlers/BattleGroundHandler.cpp11
-rw-r--r--src/server/game/Handlers/CalendarHandler.cpp17
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp35
-rw-r--r--src/server/game/Handlers/NPCHandler.cpp33
4 files changed, 65 insertions, 31 deletions
diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp
index 87ce5123100..e03cd9c51b1 100644
--- a/src/server/game/Handlers/BattleGroundHandler.cpp
+++ b/src/server/game/Handlers/BattleGroundHandler.cpp
@@ -636,14 +636,17 @@ void WorldSession::HandleRequestRatedPvpInfo(WorldPackets::Battleground::Request
void WorldSession::HandleGetPVPOptionsEnabled(WorldPackets::Battleground::GetPVPOptionsEnabled& /*getPvPOptionsEnabled*/)
{
- // This packet is completely irrelevant, it triggers PVP_TYPES_ENABLED lua event but that is not handled in interface code as of 6.1.2
WorldPackets::Battleground::PVPOptionsEnabled pvpOptionsEnabled;
+ pvpOptionsEnabled.RatedBattlegrounds = false;
+ pvpOptionsEnabled.PugBattlegrounds = true;
+ pvpOptionsEnabled.WargameBattlegrounds = false;
pvpOptionsEnabled.WargameArenas = false;
pvpOptionsEnabled.RatedArenas = false;
- pvpOptionsEnabled.WargameBattlegrounds = false;
pvpOptionsEnabled.ArenaSkirmish = false;
- pvpOptionsEnabled.PugBattlegrounds = true;
- pvpOptionsEnabled.RatedBattlegrounds = false;
+ pvpOptionsEnabled.SoloShuffle = false;
+ pvpOptionsEnabled.RatedSoloShuffle = false;
+ pvpOptionsEnabled.BattlegroundBlitz = false;
+ pvpOptionsEnabled.RatedBattlegroundBlitz = false;
SendPacket(pvpOptionsEnabled.Write());
}
diff --git a/src/server/game/Handlers/CalendarHandler.cpp b/src/server/game/Handlers/CalendarHandler.cpp
index 346cc303315..209babfec10 100644
--- a/src/server/game/Handlers/CalendarHandler.cpp
+++ b/src/server/game/Handlers/CalendarHandler.cpp
@@ -61,9 +61,9 @@ void WorldSession::HandleCalendarGetCalendar(WorldPackets::Calendar::CalendarGet
packet.ServerTime = currTime;
CalendarInviteStore playerInvites = sCalendarMgr->GetPlayerInvites(guid);
- for (auto const& invite : playerInvites)
+ for (CalendarInvite const* invite : playerInvites)
{
- WorldPackets::Calendar::CalendarSendCalendarInviteInfo inviteInfo;
+ WorldPackets::Calendar::CalendarSendCalendarInviteInfo& inviteInfo = packet.Invites.emplace_back();
inviteInfo.EventID = invite->GetEventId();
inviteInfo.InviteID = invite->GetInviteId();
inviteInfo.InviterGuid = invite->GetSenderGUID();
@@ -71,14 +71,12 @@ void WorldSession::HandleCalendarGetCalendar(WorldPackets::Calendar::CalendarGet
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);
- for (auto const& event : playerEvents)
+ for (CalendarEvent const* event : playerEvents)
{
- WorldPackets::Calendar::CalendarSendCalendarEventInfo eventInfo;
+ WorldPackets::Calendar::CalendarSendCalendarEventInfo& eventInfo = packet.Events.emplace_back();
eventInfo.EventID = event->GetEventId();
eventInfo.Date = event->GetDate();
eventInfo.EventClubID = event->GetGuildId();
@@ -87,20 +85,15 @@ void WorldSession::HandleCalendarGetCalendar(WorldPackets::Calendar::CalendarGet
eventInfo.Flags = event->GetFlags();
eventInfo.OwnerGuid = event->GetOwnerGUID();
eventInfo.TextureID = event->GetTextureId();
-
- packet.Events.push_back(eventInfo);
}
for (InstanceLock const* lock : sInstanceLockMgr.GetInstanceLocksForPlayer(_player->GetGUID()))
{
- WorldPackets::Calendar::CalendarSendCalendarRaidLockoutInfo lockoutInfo;
-
+ WorldPackets::Calendar::CalendarSendCalendarRaidLockoutInfo& lockoutInfo = packet.RaidLockouts.emplace_back();
lockoutInfo.MapID = lock->GetMapId();
lockoutInfo.DifficultyID = lock->GetDifficultyId();
lockoutInfo.ExpireTime = int32(std::max(std::chrono::duration_cast<Seconds>(lock->GetEffectiveExpiryTime() - GameTime::GetSystemTime()).count(), SI64LIT(0)));
lockoutInfo.InstanceID = lock->GetInstanceId();
-
- packet.RaidLockouts.push_back(lockoutInfo);
}
SendPacket(packet.Write());
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index 1472ce1fea0..d499ba13c11 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -403,10 +403,7 @@ void WorldSession::HandleCharEnum(CharacterDatabaseQueryHolder const& holder)
do
{
Field* fields = customizationsResult->Fetch();
- std::vector<UF::ChrCustomizationChoice>& customizationsForCharacter = customizations[fields[0].GetUInt64()];
-
- customizationsForCharacter.emplace_back();
- UF::ChrCustomizationChoice& choice = customizationsForCharacter.back();
+ UF::ChrCustomizationChoice& choice = customizations[fields[0].GetUInt64()].emplace_back();
choice.ChrCustomizationOptionID = fields[1].GetUInt32();
choice.ChrCustomizationChoiceID = fields[2].GetUInt32();
@@ -457,8 +454,6 @@ void WorldSession::HandleCharEnum(CharacterDatabaseQueryHolder const& holder)
while (result->NextRow() && charEnum.Characters.size() < MAX_CHARACTERS_PER_REALM);
}
- charEnum.IsAlliedRacesCreationAllowed = CanAccessAlliedRaces();
-
for (std::pair<uint8 const, RaceUnlockRequirement> const& requirement : sObjectMgr->GetRaceUnlockRequirements())
{
WorldPackets::Character::EnumCharactersResult::RaceUnlock raceUnlock;
@@ -1166,9 +1161,8 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder const& holder)
// Send MOTD
{
- WorldPackets::System::MOTD motd;
- motd.Text = &sWorld->GetMotd();
- SendPacket(motd.Write());
+ for (std::string const& motdLine : sWorld->GetMotd())
+ sWorld->SendServerMessage(SERVER_MSG_STRING, motdLine, pCurrChar);
}
SendSetTimeZoneInformation();
@@ -2797,6 +2791,29 @@ void WorldSession::HandleCharUndeleteOpcode(WorldPackets::Character::UndeleteCha
}));
}
+void WorldSession::HandleSavePersonalEmblem(WorldPackets::Character::SavePersonalEmblem const& savePersonalEmblem)
+{
+ if (!_player->GetNPCIfCanInteractWith(savePersonalEmblem.Vendor, UNIT_NPC_FLAG_NONE, UNIT_NPC_FLAG_2_PERSONAL_TABARD_DESIGNER))
+ {
+ SendPacket(WorldPackets::Character::PlayerSavePersonalEmblem(ERR_GUILDEMBLEM_INVALIDVENDOR).Write());
+ return;
+ }
+
+ if (!EmblemInfo::ValidateEmblemColors(savePersonalEmblem.PersonalTabard.EmblemStyle, savePersonalEmblem.PersonalTabard.EmblemColor,
+ savePersonalEmblem.PersonalTabard.BorderStyle, savePersonalEmblem.PersonalTabard.BorderColor,
+ savePersonalEmblem.PersonalTabard.BackgroundColor))
+ {
+ SendPacket(WorldPackets::Character::PlayerSavePersonalEmblem(ERR_GUILDEMBLEM_INVALID_TABARD_COLORS).Write());
+ return;
+ }
+
+ _player->SetPersonalTabard(savePersonalEmblem.PersonalTabard.EmblemStyle, savePersonalEmblem.PersonalTabard.EmblemColor,
+ savePersonalEmblem.PersonalTabard.BorderStyle, savePersonalEmblem.PersonalTabard.BorderColor,
+ savePersonalEmblem.PersonalTabard.BackgroundColor);
+
+ SendPacket(WorldPackets::Character::PlayerSavePersonalEmblem(ERR_GUILDEMBLEM_SUCCESS).Write());
+}
+
void WorldSession::SendCharCreate(ResponseCodes result, ObjectGuid const& guid /*= ObjectGuid::Empty*/)
{
WorldPackets::Character::CreateChar response;
diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp
index 0e23cc32c53..b8a0b8aa7ac 100644
--- a/src/server/game/Handlers/NPCHandler.cpp
+++ b/src/server/game/Handlers/NPCHandler.cpp
@@ -39,27 +39,48 @@
#include "Trainer.h"
#include "WorldPacket.h"
-void WorldSession::HandleTabardVendorActivateOpcode(WorldPackets::NPC::Hello& packet)
+enum class TabardVendorType : int32
{
- Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(packet.Unit, UNIT_NPC_FLAG_TABARDDESIGNER, UNIT_NPC_FLAG_2_NONE);
+ Guild = 0,
+ Personal = 1,
+};
+
+void WorldSession::HandleTabardVendorActivateOpcode(WorldPackets::NPC::TabardVendorActivate const& tabardVendorActivate)
+{
+ Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(tabardVendorActivate.Vendor, UNIT_NPC_FLAG_TABARDDESIGNER, UNIT_NPC_FLAG_2_NONE);
if (!unit)
{
- TC_LOG_DEBUG("network", "WORLD: HandleTabardVendorActivateOpcode - {} not found or you can not interact with him.", packet.Unit.ToString());
+ TC_LOG_DEBUG("network", "WORLD: HandleTabardVendorActivateOpcode - {} not found or you can not interact with him.", tabardVendorActivate.Vendor.ToString());
return;
}
+ TabardVendorType type = TabardVendorType(tabardVendorActivate.Type);
+ if (type != TabardVendorType::Guild && type != TabardVendorType::Personal)
+ return;
+
// remove fake death
if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
- SendTabardVendorActivate(packet.Unit);
+ SendTabardVendorActivate(tabardVendorActivate.Vendor, TabardVendorType(tabardVendorActivate.Type));
}
-void WorldSession::SendTabardVendorActivate(ObjectGuid guid)
+void WorldSession::SendTabardVendorActivate(ObjectGuid guid, TabardVendorType type)
{
WorldPackets::NPC::NPCInteractionOpenResult npcInteraction;
npcInteraction.Npc = guid;
- npcInteraction.InteractionType = PlayerInteractionType::TabardVendor;
+ npcInteraction.InteractionType = [&]
+ {
+ switch (type)
+ {
+ case TabardVendorType::Guild:
+ return PlayerInteractionType::GuildTabardVendor;
+ case TabardVendorType::Personal:
+ return PlayerInteractionType::PersonalTabardVendor;
+ default:
+ ABORT_MSG("Unsupported tabard vendor type %d", AsUnderlyingType(type));
+ }
+ }();
npcInteraction.Success = true;
SendPacket(npcInteraction.Write());
}