Skip to content

Commit

Permalink
internetradio: error fix & admin commands (#524)
Browse files Browse the repository at this point in the history
  • Loading branch information
ds1-e authored Jul 21, 2024
1 parent cf669db commit 5c16021
Show file tree
Hide file tree
Showing 5 changed files with 176 additions and 41 deletions.
2 changes: 1 addition & 1 deletion [gameplay]/internetradio/config/CRadioConfig.lua
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,4 @@ RADIO_SETTINGS_TEMPLATE = {
["boolean"] = true,
},
},
}
}
6 changes: 5 additions & 1 deletion [gameplay]/internetradio/config/SRadioConfig.lua
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,8 @@

RADIO_BOX_MODEL = 2229
RADIO_DESTROY_ON_VEHICLE_EXPLODE = false
RADIO_DESTROY_ON_VEHICLE_DESTROY = false
RADIO_DESTROY_ON_VEHICLE_DESTROY = false
RADIO_DESTROY_SPEAKER_COMMAND = "destroyspeaker"
RADIO_DESTROY_SPEAKER_ACCESS_RIGHT = "function.kickPlayer"
RADIO_DESTROY_SPEAKERS_IN_RANGE_COMMAND = "destroyspeakers"
RADIO_DESTROY_SPEAKERS_IN_RANGE_ACCESS_RIGHT = "function.kickPlayer"
23 changes: 16 additions & 7 deletions [gameplay]/internetradio/handle_radio/CHandleRadio.lua
Original file line number Diff line number Diff line change
Expand Up @@ -267,15 +267,24 @@ function clearPlayerSpeaker(playerOrSpeaker)
end

function isObjectSpeaker(objectElement)
local validElement = isElement(objectElement)

if (not validElement) then
return false
end

for playerElement, speakerData in pairs(playerSpeakers) do
local speakerBox = speakerData.speakerBox
local matchingElement = (speakerBox == objectElement)

if (matchingElement) then
local speakerSound = speakerSounds[playerElement]
local speakerDummy = speakerData.speakerDummy
if (speakerData) then
local speakerBox = speakerData.speakerBox
local matchingElement = (speakerBox == objectElement)

return true, speakerSound, speakerDummy
if (matchingElement) then
local speakerSound = speakerSounds[playerElement]
local speakerDummy = speakerData.speakerDummy

return true, speakerSound, speakerDummy
end
end
end

Expand Down Expand Up @@ -328,4 +337,4 @@ function clearSpeakersOnDestroyQuit()
clearPlayerSpeaker(source)
end
addEventHandler("onClientPlayerQuit", root, clearSpeakersOnDestroyQuit)
addEventHandler("onClientElementDestroy", resourceRoot, clearSpeakersOnDestroyQuit)
addEventHandler("onClientElementDestroy", resourceRoot, clearSpeakersOnDestroyQuit)
157 changes: 125 additions & 32 deletions [gameplay]/internetradio/handle_radio/SHandleRadio.lua
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,19 @@ function getPlayerSpeakerData(playerElement)
return playerSpeakerData
end

function clearPlayerSpeaker(playerOrSpeaker)
function clearPlayerSpeaker(playerOrSpeaker, forceDestroy)
for playerElement, speakerData in pairs(playerSpeakers) do
local speakerBox = speakerData.speakerBox
local matchingElement = (playerElement == playerOrSpeaker) or (speakerBox == playerOrSpeaker)

if (matchingElement) then
local boxElement = isElement(speakerBox)

if (boxElement) then
destroyElement(speakerBox)
if (forceDestroy) then
local boxElement = isElement(speakerBox)

if (boxElement) then
destroyElement(speakerBox)
end
end

playerSpeakers[playerElement] = nil
Expand All @@ -52,6 +55,25 @@ function clearPlayerSpeaker(playerOrSpeaker)
return false
end

function isObjectSpeaker(objectElement)
local validElement = isElement(objectElement)

if (not validElement) then
return false
end

for playerElement, speakerData in pairs(playerSpeakers) do
local speakerBox = speakerData.speakerBox
local matchingElement = (speakerBox == objectElement)

if (matchingElement) then
return true
end
end

return false
end

function onServerCreateSpeaker(streamURL)
if (not client) then
return false
Expand All @@ -69,16 +91,7 @@ function onServerCreateSpeaker(streamURL)
return false
end

local playerSpeakerData = getPlayerSpeakerData(client)

if (playerSpeakerData) then
local speakerBox = playerSpeakerData.speakerBox
local speakerElement = isElement(speakerBox)

if (speakerElement) then
destroyElement(speakerBox)
end
end
clearPlayerSpeaker(client, true)

local playerPosX, playerPosY, playerPosZ = getElementPosition(client)
local playerInterior = getElementInterior(client)
Expand Down Expand Up @@ -148,18 +161,7 @@ function onServerDestroySpeaker()
return false
end

local playerSpeakerData = getPlayerSpeakerData(client)

if (not playerSpeakerData) then
return false
end

local speakerBox = playerSpeakerData.speakerBox
local speakerElement = isElement(speakerBox)

if (speakerElement) then
destroyElement(speakerBox)
end
clearPlayerSpeaker(client, true)
end
addEvent("onServerDestroySpeaker", true)
addEventHandler("onServerDestroySpeaker", root, onServerDestroySpeaker)
Expand All @@ -175,11 +177,102 @@ function syncSpeakers(startedResource)
end
addEventHandler("onPlayerResourceStart", root, syncSpeakers)

function clearSpeakersOnDestroyQuit()
clearPlayerSpeaker(source)
function clearSpeakerOnPlayerQuit()
clearPlayerSpeaker(source, true)
end
addEventHandler("onPlayerQuit", root, clearSpeakerOnPlayerQuit)

function clearSpeakerOnElementDestroy()
clearPlayerSpeaker(source, false)
end
addEventHandler("onElementDestroy", resourceRoot, clearSpeakerOnElementDestroy)

function destroySpeakerAdminCommand(playerElement, _, targetPlayer)
local hasPlayerRightToDestroySpeaker = hasObjectPermissionTo(playerElement, RADIO_DESTROY_SPEAKER_ACCESS_RIGHT, false)

if (not hasPlayerRightToDestroySpeaker) then
outputChatBox("#ff8800[Speakers]: #ffffffYou have no access to #ff8800/"..RADIO_DESTROY_SPEAKER_COMMAND, playerElement, 255, 255, 255, true)

return false
end

if (not targetPlayer) then
outputChatBox("#ff8800[Speakers]: #ffffffSyntax: #ff8800/"..RADIO_DESTROY_SPEAKER_COMMAND.." <playerName>", playerElement, 255, 255, 255, true)

return false
end

local playerFromName = getPlayerFromPartialName(targetPlayer)

if (not playerFromName) then
outputChatBox("#ff8800[Speakers]: #ffffffPlayer #ff8800"..targetPlayer.." #ffffffnot found.", playerElement, 255, 255, 255, true)

return false
end

local speakerFound = clearPlayerSpeaker(playerFromName, true)
local speakerDestroyed = (speakerFound and "Successfully destroyed #ff8800"..targetPlayer.."#ffffff speaker." or "Player #ff8800"..targetPlayer.."#ffffff has no speaker.")
local speakerDestroyedMessage = "#ff8800[Speakers]: #ffffff"..speakerDestroyed

outputChatBox(speakerDestroyedMessage, playerElement, 255, 255, 255, true)
end
addCommandHandler(RADIO_DESTROY_SPEAKER_COMMAND, destroySpeakerAdminCommand)

function destroySpeakersInRangeAdminCommand(playerElement, _, searchRange)
local hasPlayerRightToDestroySpeaker = hasObjectPermissionTo(playerElement, RADIO_DESTROY_SPEAKERS_IN_RANGE_ACCESS_RIGHT, false)

if (not hasPlayerRightToDestroySpeaker) then
outputChatBox("#ff8800[Speakers]: #ffffffYou have no access to #ff8800/"..RADIO_DESTROY_SPEAKERS_IN_RANGE_COMMAND, playerElement, 255, 255, 255, true)

return false
end

local speakerSearchRange = tonumber(searchRange)
local validSearchRange = (speakerSearchRange and speakerSearchRange > 0)

if (not speakerSearchRange or not validSearchRange) then
outputChatBox("#ff8800[Speakers]: #ffffffSyntax: #ff8800/"..RADIO_DESTROY_SPEAKERS_IN_RANGE_COMMAND.." <searchRange>", playerElement, 255, 255, 255, true)

return false
end

local objectsTable = getElementsByType("object", resourceRoot)
local playerInterior = getElementInterior(playerElement)
local playerDimension = getElementDimension(playerElement)
local playerX, playerY, playerZ = getElementPosition(playerElement)
local totalDestroyedSpeakers = 0

for objectID = 1, #objectsTable do
local objectElement = objectsTable[objectID]
local objectSpeaker = isObjectSpeaker(objectElement)

if (objectSpeaker) then
local speakerInterior = getElementInterior(objectElement)
local speakerDimension = getElementDimension(objectElement)
local matchingInterior = (speakerInterior == playerInterior)
local matchingDimension = (speakerDimension == playerDimension)

if (matchingInterior and matchingDimension) then
local speakerX, speakerY, speakerZ = getElementPosition(objectElement)
local distanceToSpeaker = getDistanceBetweenPoints3D(playerX, playerY, playerZ, speakerX, speakerY, speakerZ)
local speakerInDistance = (distanceToSpeaker <= speakerSearchRange)

if (speakerInDistance) then
local speakerDestroyed = clearPlayerSpeaker(objectElement, true)

if (speakerDestroyed) then
local newCountOfDestroyedSpeakers = (totalDestroyedSpeakers + 1)

totalDestroyedSpeakers = newCountOfDestroyedSpeakers
end
end
end
end
end

outputChatBox("#ff8800[Speakers]: #ffffffDestroyed #ff8800"..totalDestroyedSpeakers.."#ffffff total speakers in range of #ff8800"..speakerSearchRange, playerElement, 255, 255, 255, true)
end
addEventHandler("onPlayerQuit", root, clearSpeakersOnDestroyQuit)
addEventHandler("onElementDestroy", resourceRoot, clearSpeakersOnDestroyQuit)
addCommandHandler(RADIO_DESTROY_SPEAKERS_IN_RANGE_COMMAND, destroySpeakersInRangeAdminCommand)

function destroyAttachedRadioOnVehicleExplodeOrDestroy()
local validElement = isElement(source)
Expand All @@ -203,9 +296,9 @@ function destroyAttachedRadioOnVehicleExplodeOrDestroy()
local attachedElementObject = (attachedElementType == "object")

if (attachedElementObject) then
local boxFound = clearPlayerSpeaker(attachedElement)
local speakerFound = clearPlayerSpeaker(attachedElement, true)

if (boxFound) then
if (speakerFound) then
break
end
end
Expand Down
29 changes: 29 additions & 0 deletions [gameplay]/internetradio/handle_radio/ShHandleRadio.lua
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,35 @@ function verifyRadioStreamURL(streamURL)
return true
end

function getPlayerFromPartialName(partialName)
if (not partialName) then
return false
end

local playerFromName = getPlayerFromName(partialName)

if (playerFromName) then
return playerFromName
end

local playersTable = getElementsByType("player")
local partialNameLower = string.lower(partialName)

for playerID = 1, #playersTable do
local playerElement = playersTable[playerID]
local playerName = getPlayerName(playerElement)
local playerNameLower = string.lower(playerName)
local playerNameWithoutColor = string.gsub(playerNameLower, "#%x%x%x%x%x%x", "")
local playerFound = string.find(playerNameWithoutColor, partialNameLower, 1, true)

if (playerFound) then
return playerElement
end
end

return false
end

function getOrSetPlayerDelay(playerElement, delayID, delayTime)
local validElement = isElement(playerElement)

Expand Down

0 comments on commit 5c16021

Please sign in to comment.