OnPlayerCommand: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
Patrick2562 (talk | contribs) |
||
(3 intermediate revisions by 2 users not shown) | |||
Line 13: | Line 13: | ||
==Result of cancelling this event== | ==Result of cancelling this event== | ||
The command will not be executed. | The command will not be executed. (Only server-side commands can be canceled.) | ||
==Example== | ==Example== | ||
<section name="Server" class="server" show="true"> | <section name="Server" class="server" show="true"> | ||
This example implements an anti-flood protection timer for commands | This example implements an anti-flood protection timer for commands. | ||
'''Be sure to give the resource a function.kickPlayer right. | |||
Also, note, that if the server freezes for a frame and a player executes a command 2x he/she'll get kicked, because those 2 commands will be processed after each other, with very little delay''' | |||
<syntaxhighlight lang="lua"> | <syntaxhighlight lang="lua"> | ||
local CMD_INTERVAL = 200 --// The interval that needs to pass before the player can execute another cmd | local CMD_INTERVAL = 200 --// The interval that needs to pass before the player can execute another cmd | ||
Line 23: | Line 25: | ||
local executions = setmetatable({}, { --// Metatable for non-existing indexes | local executions = setmetatable({}, { --// Metatable for non-existing indexes | ||
__index = function(t, | __index = function(t, player) | ||
return getTickCount()-CMD_INTERVAL | |||
end | end | ||
}) | }) | ||
Line 49: | Line 50: | ||
cancelEvent() | cancelEvent() | ||
end | end | ||
end) | |||
</syntaxhighlight> | |||
</section> | |||
<section name="Server" class="server" show="true"> | |||
Time limit specific commands. | |||
<syntaxhighlight lang="lua"> | |||
local LIMITED_COMMANDS = { | |||
-- ["COMMAND_NAME"] = TIME_LIMIT_IN_SEC | |||
["something"] = 5, -- Can use this command only once in every 5 sec | |||
["spam"] = 10, -- Can use this command only once in every 10 sec | |||
} | |||
local EXEC = {} | |||
addEventHandler("onPlayerCommand", root, function(cmd) | |||
local limit_sec = LIMITED_COMMANDS[cmd] | |||
if not limit_sec then return end | |||
local tick = getTickCount() | |||
if not EXEC[source] then EXEC[source] = {} end | |||
if not EXEC[source][cmd] then EXEC[source][cmd] = 0 end | |||
if EXEC[source][cmd] + (limit_sec * 1000) > tick then | |||
cancelEvent() | |||
return outputChatBox("#FF0000[ANTISPAM]#FFFFFF You can use this command once, in every "..limit_sec.." sec.", source, 255, 255, 255, true) | |||
end | |||
EXEC[source][cmd] = tick | |||
end) | |||
addEventHandler("onPlayerQuit", root, function() | |||
EXEC[source] = nil | |||
end) | end) | ||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 15:27, 31 August 2020
This event is triggered when a player issues a command.
Parameters
string command
Source
The source of this event is the player who tried to execute a command.
Result of cancelling this event
The command will not be executed. (Only server-side commands can be canceled.)
Example
Click to collapse [-]
ServerThis example implements an anti-flood protection timer for commands. Be sure to give the resource a function.kickPlayer right. Also, note, that if the server freezes for a frame and a player executes a command 2x he/she'll get kicked, because those 2 commands will be processed after each other, with very little delay
local CMD_INTERVAL = 200 --// The interval that needs to pass before the player can execute another cmd local KICK_AFTER_INTERVAL = 50 --// Kick the player if they execute more than 20 cmds/sec local executions = setmetatable({}, { --// Metatable for non-existing indexes __index = function(t, player) return getTickCount()-CMD_INTERVAL end }) addEventHandler("onPlayerCommand", root, function() if (executions[source]-getTickCount()<=CMD_INTERVAL) then if (executions[source]-getTickCount()<=KICK_AFTER_INTERVAL) then kickPlayer(source, "Anti-Flood", "Don't flood") end cancelEvent() end executions[source] = getTickCount() end )
This example disables the hardcoded command 'whois'
addEventHandler("onPlayerCommand",root, function(command) if (command == "whois") then cancelEvent() end end)
Click to collapse [-]
ServerTime limit specific commands.
local LIMITED_COMMANDS = { -- ["COMMAND_NAME"] = TIME_LIMIT_IN_SEC ["something"] = 5, -- Can use this command only once in every 5 sec ["spam"] = 10, -- Can use this command only once in every 10 sec } local EXEC = {} addEventHandler("onPlayerCommand", root, function(cmd) local limit_sec = LIMITED_COMMANDS[cmd] if not limit_sec then return end local tick = getTickCount() if not EXEC[source] then EXEC[source] = {} end if not EXEC[source][cmd] then EXEC[source][cmd] = 0 end if EXEC[source][cmd] + (limit_sec * 1000) > tick then cancelEvent() return outputChatBox("#FF0000[ANTISPAM]#FFFFFF You can use this command once, in every "..limit_sec.." sec.", source, 255, 255, 255, true) end EXEC[source][cmd] = tick end) addEventHandler("onPlayerQuit", root, function() EXEC[source] = nil end)
See Also
Player events
- onPlayerACInfo
- onPlayerBan
- onPlayerChangeNick
- onPlayerChat
- onPlayerClick
- onPlayerCommand
- onPlayerConnect
- onPlayerContact
- onPlayerDamage
- onPlayerJoin
- onPlayerLogin
- onPlayerLogout
- onPlayerMarkerHit
- onPlayerMarkerLeave
- onPlayerModInfo
- onPlayerMute
- onPlayerNetworkStatus
- onPlayerPickupHit
- onPlayerPickupLeave
- onPlayerPickupUse
- onPlayerPrivateMessage
- onPlayerQuit
- onPlayerScreenShot
- onPlayerSpawn
- onPlayerStealthKill
- onPlayerTarget
- onPlayerUnmute
- onPlayerVehicleEnter
- onPlayerVehicleExit
- onPlayerVoiceStart
- onPlayerVoiceStop
- onPlayerWasted
- onPlayerWeaponFire
- onPlayerWeaponSwitch
Event functions
- addEvent
- addEventHandler
- cancelEvent
- cancelLatentEvent
- getEventHandlers
- getLatentEventHandles
- getLatentEventStatus
- removeEventHandler
- triggerEvent
- wasEventCancelled