diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-05-14 20:40:55 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-05-14 20:40:55 +0200 |
commit | a12f93907083c1c7a8e6a33a3c1724625395af7e (patch) | |
tree | 5af177e53e366fd93d2f1bdb8a435011b33a2f00 | |
parent | 25c0aaa83fede6cd5214da00bb08a21c0b28c4be (diff) |
Core/PacketIO: Implemented SMSG_BROADCAST_SUMMON_CAST and SMSG_BROADCAST_SUMMON_RESPONSE
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 25 | ||||
-rw-r--r-- | src/server/game/Groups/Group.cpp | 10 | ||||
-rw-r--r-- | src/server/game/Groups/Group.h | 4 | ||||
-rw-r--r-- | src/server/game/Server/Packets/PartyPackets.cpp | 21 | ||||
-rw-r--r-- | src/server/game/Server/Packets/PartyPackets.h | 21 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 4 |
6 files changed, 74 insertions, 11 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 9c753a87360..9de8a7febb5 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -89,6 +89,7 @@ #include "Opcodes.h" #include "OutdoorPvP.h" #include "OutdoorPvPMgr.h" +#include "PartyPackets.h" #include "Pet.h" #include "PetPackets.h" #include "PoolMgr.h" @@ -25523,19 +25524,41 @@ void Player::SendSummonRequestFrom(Unit* summoner) summonRequest.SummonerVirtualRealmAddress = GetVirtualRealmAddress(); summonRequest.AreaID = summoner->GetZoneId(); SendDirectMessage(summonRequest.Write()); + + if (Group const* group = GetGroup()) + { + WorldPackets::Party::BroadcastSummonCast summonCast; + summonCast.Target = GetGUID(); + group->BroadcastPacket(summonCast.Write(), false, -1, GetGUID()); + } } void Player::SummonIfPossible(bool agree) { + auto broadcastSummonResponse = [&](bool accepted) + { + if (Group const* group = GetGroup()) + { + WorldPackets::Party::BroadcastSummonResponse summonResponse; + summonResponse.Target = GetGUID(); + summonResponse.Accepted = accepted; + group->BroadcastPacket(summonResponse.Write(), false, -1, GetGUID()); + } + }; + if (!agree) { m_summon_expire = 0; + broadcastSummonResponse(false); return; } // expire and auto declined if (m_summon_expire < GameTime::GetGameTime()) + { + broadcastSummonResponse(false); return; + } // stop taxi flight at summon FinishTaxiFlight(); @@ -25551,6 +25574,8 @@ void Player::SummonIfPossible(bool agree) RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags::Summon); TeleportTo(m_summon_location, 0, m_summon_instanceId); + + broadcastSummonResponse(true); } void Player::RemoveItemDurations(Item* item) diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index b0f787256d3..4dfa4dd7b7f 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1633,9 +1633,9 @@ void Group::UpdatePlayerOutOfRange(Player* player) } } -void Group::BroadcastAddonMessagePacket(WorldPacket const* packet, const std::string& prefix, bool ignorePlayersInBGRaid, int group /*= -1*/, ObjectGuid ignore /*= ObjectGuid::Empty*/) +void Group::BroadcastAddonMessagePacket(WorldPacket const* packet, const std::string& prefix, bool ignorePlayersInBGRaid, int group /*= -1*/, ObjectGuid ignore /*= ObjectGuid::Empty*/) const { - for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const* itr = GetFirstMember(); itr != nullptr; itr = itr->next()) { Player* player = itr->GetSource(); if (!player || (!ignore.IsEmpty() && player->GetGUID() == ignore) || (ignorePlayersInBGRaid && player->GetGroup() != this)) @@ -1646,11 +1646,11 @@ void Group::BroadcastAddonMessagePacket(WorldPacket const* packet, const std::st } } -void Group::BroadcastPacket(WorldPacket const* packet, bool ignorePlayersInBGRaid, int group, ObjectGuid ignoredPlayer) +void Group::BroadcastPacket(WorldPacket const* packet, bool ignorePlayersInBGRaid, int group, ObjectGuid ignoredPlayer) const { - for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next()) + for (GroupReference const* itr = GetFirstMember(); itr != nullptr; itr = itr->next()) { - Player* player = itr->GetSource(); + Player const* player = itr->GetSource(); if (!player || (!ignoredPlayer.IsEmpty() && player->GetGUID() == ignoredPlayer) || (ignorePlayersInBGRaid && player->GetGroup() != this)) continue; diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h index 682d856ab91..95cb2fc00bc 100644 --- a/src/server/game/Groups/Group.h +++ b/src/server/game/Groups/Group.h @@ -380,8 +380,8 @@ class TC_GAME_API Group worker(itr->GetSource()); } - void BroadcastPacket(WorldPacket const* packet, bool ignorePlayersInBGRaid, int group = -1, ObjectGuid ignoredPlayer = ObjectGuid::Empty); - void BroadcastAddonMessagePacket(WorldPacket const* packet, const std::string& prefix, bool ignorePlayersInBGRaid, int group = -1, ObjectGuid ignore = ObjectGuid::Empty); + void BroadcastPacket(WorldPacket const* packet, bool ignorePlayersInBGRaid, int group = -1, ObjectGuid ignoredPlayer = ObjectGuid::Empty) const; + void BroadcastAddonMessagePacket(WorldPacket const* packet, const std::string& prefix, bool ignorePlayersInBGRaid, int group = -1, ObjectGuid ignore = ObjectGuid::Empty) const; /*********************************************************/ /*** LOOT SYSTEM ***/ diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp index bcc6301a3df..0a3f79fb39d 100644 --- a/src/server/game/Server/Packets/PartyPackets.cpp +++ b/src/server/game/Server/Packets/PartyPackets.cpp @@ -604,8 +604,9 @@ void WorldPackets::Party::PartyMemberFullState::Initialize(Player const* player) MemberStats.WmoDoodadPlacementID = 0; // Vehicle - if (player->GetVehicle() && player->GetVehicle()->GetVehicleInfo()) - MemberStats.VehicleSeat = player->GetVehicle()->GetVehicleInfo()->SeatID[player->m_movementInfo.transport.seat]; + if (::Vehicle const* vehicle = player->GetVehicle()) + if (VehicleSeatEntry const* vehicleSeat = vehicle->GetSeatForPassenger(player)) + MemberStats.VehicleSeat = vehicleSeat->ID; // Auras for (AuraApplication const* aurApp : player->GetVisibleAuras()) @@ -680,3 +681,19 @@ WorldPacket const* WorldPackets::Party::PartyKillLog::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Party::BroadcastSummonCast::Write() +{ + _worldPacket << Target; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Party::BroadcastSummonResponse::Write() +{ + _worldPacket << Target; + _worldPacket.WriteBit(Accepted); + _worldPacket.FlushBits(); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/PartyPackets.h b/src/server/game/Server/Packets/PartyPackets.h index 0e350e01c70..a6576ecb440 100644 --- a/src/server/game/Server/Packets/PartyPackets.h +++ b/src/server/game/Server/Packets/PartyPackets.h @@ -642,6 +642,27 @@ namespace WorldPackets WorldPacket const* Write() override { return &_worldPacket; } }; + + class BroadcastSummonCast final : public ServerPacket + { + public: + BroadcastSummonCast() : ServerPacket(SMSG_BROADCAST_SUMMON_CAST, 16) { } + + WorldPacket const* Write() override; + + ObjectGuid Target; + }; + + class BroadcastSummonResponse final : public ServerPacket + { + public: + BroadcastSummonResponse() : ServerPacket(SMSG_BROADCAST_SUMMON_RESPONSE, 16 + 1) { } + + WorldPacket const* Write() override; + + ObjectGuid Target; + bool Accepted = false; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 5f932030f3f..21b4ce7a7d3 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1072,8 +1072,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_BOSS_KILL, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BREAK_TARGET, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BROADCAST_ACHIEVEMENT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BROADCAST_SUMMON_CAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BROADCAST_SUMMON_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BROADCAST_SUMMON_CAST, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BROADCAST_SUMMON_RESPONSE, 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_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); |