aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/GroupHandler.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-09-14 00:11:06 +0200
committerShauren <shauren.trinity@gmail.com>2023-09-14 00:11:06 +0200
commitc2f5ce2b0333a9bda341ea837340dd3ac4b19ae8 (patch)
tree15a8bacce27533a2ebaa85ec2aa31c22eabccc94 /src/server/game/Handlers/GroupHandler.cpp
parent097b5f3ec00f18161c9d616f60ed762eb722bde0 (diff)
Core/Groups: Implemented 10.1.7 ping system
Diffstat (limited to 'src/server/game/Handlers/GroupHandler.cpp')
-rw-r--r--src/server/game/Handlers/GroupHandler.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp
index cf06a8c754f..374801b7e4e 100644
--- a/src/server/game/Handlers/GroupHandler.cpp
+++ b/src/server/game/Handlers/GroupHandler.cpp
@@ -649,3 +649,90 @@ void WorldSession::HandleClearRaidMarker(WorldPackets::Party::ClearRaidMarker& p
group->DeleteRaidMarker(packet.MarkerId);
}
+
+namespace
+{
+bool CanSendPing(Player const& player, PingSubjectType type, Group const*& group)
+{
+ if (type >= PingSubjectType::Max)
+ return false;
+
+ if (!player.GetSession()->CanSpeak())
+ return false;
+
+ group = player.GetGroup();
+ if (!group)
+ return false;
+
+ if (group->IsRestrictPingsToAssistants() && !group->IsLeader(player.GetGUID()) && !group->IsAssistant(player.GetGUID()))
+ return false;
+
+ return true;
+}
+}
+
+void WorldSession::HandleSetRestrictPingsToAssistants(WorldPackets::Party::SetRestrictPingsToAssistants const& setRestrictPingsToAssistants)
+{
+ Group* group = GetPlayer()->GetGroup(setRestrictPingsToAssistants.PartyIndex);
+ if (!group)
+ return;
+
+ if (!group->IsLeader(GetPlayer()->GetGUID()))
+ return;
+
+ group->SetRestrictPingsToAssistants(setRestrictPingsToAssistants.RestrictPingsToAssistants);
+}
+
+void WorldSession::HandleSendPingUnit(WorldPackets::Party::SendPingUnit const& pingUnit)
+{
+ Group const* group = nullptr;
+ if (!CanSendPing(*_player, pingUnit.Type, group))
+ return;
+
+ Unit const* target = ObjectAccessor::GetUnit(*_player, pingUnit.TargetGUID);
+ if (!target || !_player->HaveAtClient(target))
+ return;
+
+ WorldPackets::Party::ReceivePingUnit broadcastPingUnit;
+ broadcastPingUnit.SenderGUID = _player->GetGUID();
+ broadcastPingUnit.TargetGUID = pingUnit.TargetGUID;
+ broadcastPingUnit.Type = pingUnit.Type;
+ broadcastPingUnit.PinFrameID = pingUnit.PinFrameID;
+ broadcastPingUnit.Write();
+
+ for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
+ {
+ Player const* member = itr->GetSource();
+ if (_player == member || !_player->IsInMap(member))
+ continue;
+
+ member->SendDirectMessage(broadcastPingUnit.GetRawPacket());
+ }
+}
+
+void WorldSession::HandleSendPingWorldPoint(WorldPackets::Party::SendPingWorldPoint const& pingWorldPoint)
+{
+ Group const* group = nullptr;
+ if (!CanSendPing(*_player, pingWorldPoint.Type, group))
+ return;
+
+ if (_player->GetMapId() != pingWorldPoint.MapID)
+ return;
+
+ WorldPackets::Party::ReceivePingWorldPoint broadcastPingWorldPoint;
+ broadcastPingWorldPoint.SenderGUID = _player->GetGUID();
+ broadcastPingWorldPoint.MapID = pingWorldPoint.MapID;
+ broadcastPingWorldPoint.Point = pingWorldPoint.Point;
+ broadcastPingWorldPoint.Type = pingWorldPoint.Type;
+ broadcastPingWorldPoint.PinFrameID = pingWorldPoint.PinFrameID;
+ broadcastPingWorldPoint.Write();
+
+ for (GroupReference const* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
+ {
+ Player const* member = itr->GetSource();
+ if (_player == member || !_player->IsInMap(member))
+ continue;
+
+ member->SendDirectMessage(broadcastPingWorldPoint.GetRawPacket());
+ }
+}