diff options
author | Shauren <shauren.trinity@gmail.com> | 2023-09-14 00:11:06 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2023-09-14 00:11:06 +0200 |
commit | c2f5ce2b0333a9bda341ea837340dd3ac4b19ae8 (patch) | |
tree | 15a8bacce27533a2ebaa85ec2aa31c22eabccc94 /src/server/game/Handlers/GroupHandler.cpp | |
parent | 097b5f3ec00f18161c9d616f60ed762eb722bde0 (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.cpp | 87 |
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()); + } +} |