aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-05-14 20:40:55 +0200
committerShauren <shauren.trinity@gmail.com>2022-05-14 20:40:55 +0200
commita12f93907083c1c7a8e6a33a3c1724625395af7e (patch)
tree5af177e53e366fd93d2f1bdb8a435011b33a2f00
parent25c0aaa83fede6cd5214da00bb08a21c0b28c4be (diff)
Core/PacketIO: Implemented SMSG_BROADCAST_SUMMON_CAST and SMSG_BROADCAST_SUMMON_RESPONSE
-rw-r--r--src/server/game/Entities/Player/Player.cpp25
-rw-r--r--src/server/game/Groups/Group.cpp10
-rw-r--r--src/server/game/Groups/Group.h4
-rw-r--r--src/server/game/Server/Packets/PartyPackets.cpp21
-rw-r--r--src/server/game/Server/Packets/PartyPackets.h21
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
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);