From e19ca42a9dc83985e306866b04a9c2406ab3f88c Mon Sep 17 00:00:00 2001 From: gor_down Date: Fri, 28 Mar 2025 03:35:29 -0300 Subject: [PATCH] prevent uninvited users from changing the music --- src/commands/music.cpp | 13 +++++++++++++ src/packet/packet_mc.cpp | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/commands/music.cpp b/src/commands/music.cpp index 17b7a9f..e84ede9 100644 --- a/src/commands/music.cpp +++ b/src/commands/music.cpp @@ -34,6 +34,12 @@ void AOClient::cmdPlay(int argc, QStringList argv) return; } AreaData *l_area = server->getAreaById(areaId()); + if (l_area->lockStatus() == AreaData::LockStatus::SPECTATABLE && !l_area->invited().contains(clientId()) && !checkPermission(ACLRole::BYPASS_LOCKS)){ + // Non-invited players cannot play music in spectatable areas + sendServerMessage("You are not invited."); + return; + } + const ACLRole l_role = server->getACLRolesHandler()->getRoleById(m_acl_role_id); if (!l_area->owners().contains(clientId()) && !l_area->isPlayEnabled() && !l_role.checkPermission(ACLRole::CM)) { // Make sure we have permission to play music sendServerMessage("Free music play is disabled in this area."); @@ -58,7 +64,14 @@ void AOClient::cmdPlayAmbience(int argc, QStringList argv) sendServerMessage("You are blocked from changing the ambience."); return; } + AreaData *l_area = server->getAreaById(areaId()); + + if (l_area->lockStatus() == AreaData::LockStatus::SPECTATABLE && !l_area->invited().contains(clientId()) && !checkPermission(ACLRole::BYPASS_LOCKS)){ + // Non-invited players cannot play music in spectatable areas + sendServerMessage("You are not invited."); + return; + } if (!l_area->owners().contains(clientId()) && !l_area->isPlayEnabled()) { // Make sure we have permission to play music sendServerMessage("Free ambience play is disabled in this area."); return; diff --git a/src/packet/packet_mc.cpp b/src/packet/packet_mc.cpp index 5c7e7d9..6b2f276 100644 --- a/src/packet/packet_mc.cpp +++ b/src/packet/packet_mc.cpp @@ -32,8 +32,8 @@ void PacketMC::handlePacket(AreaData *area, AOClient &client) const if (client.getServer()->getMusicList().contains(l_argument) || client.m_music_manager->isCustom(client.areaId(), l_argument) || l_argument == "~stop.mp3") { // ~stop.mp3 is a dummy track used by 2.9+ // We have a song here - if (client.m_is_spectator) { - client.sendServerMessage("Spectator are blocked from changing the music."); + if (client.m_is_spectator || area->lockStatus() == AreaData::LockStatus::SPECTATABLE && !area->invited().contains(client.clientId()) && !client.checkPermission(ACLRole::BYPASS_LOCKS)) { + client.sendServerMessage("Spectators are blocked from changing the music."); return; }