Hello there. Before you ask, yes, I have searched how to make a command, I've tried plenty of different stuff, all of which didn't really work.
Now, before you ask this as-well, I JUST began lua coding (Literally, started a week ago and stopped after a day, began again today), so please, do not be all up on my ass about how much I fail.
This is the most recent way I tried to create a command, so please take a look at it:
[code]
include( 'mysql.lua' )
require( "chatcommand" )
chatcommand.Add( "/givecash", GivePlayerCash )
chatcommand.Add( "/setcash", SetPlayerCash )
chatcommand.Add( "/setadmin", SetPlayerAdmin )
[/code]
I have that in a seperate .lua file that I run under init.lua. Now, this is the module I use to create the command (not mine, took it and didn't edit anything):
[code]
if not SERVER then return end
local table = table
local string = string
local hook = hook
module "chatcommand"
-- Settings
Blocking = false
PrefixPrivate = "/"
PrefixPublic = "!"
local _commands = {}
function Add( name, func )
_commands[name:lower()] = func
end
function Remove( name )
_commands[name:lower()] = nil
end
function Run( player, command, arguments )
local func = _commands[command:lower()]
if not func then
if player:IsValid() and Blocking == true then
player:ChatPrint( "Unknown command: '" .. command .. "'\n" )
end
return false
end
func( player, command, arguments )
return true
end
local function ParseChat( player, text, team )
local txt = text
local prefix = txt:sub( 1,1 )
if prefix ~= PrefixPublic and prefix ~= PrefixPrivate then return end
txt = txt:sub( 2 )
local cmd = txt:match( "^(%S+)" )
txt = txt:gsub( "^(%S+)", "", 1 )
if cmd == txt then return "" end
-- This chunk of code is from Lexi, thanks :3
-- http://www.facepunch.com/showthread.php?t=827179
local quote = txt:sub( 1, 1 ) ~= '"'
local ret = {}
for chunk in txt:gmatch( '[^"]+' ) do
quote = not quote
if quote then
table.insert( ret, chunk )
else
for chunk in chunk:gmatch( "%S+" ) do
table.insert( ret, chunk )
end
end
end
local exists = Run( player, cmd, ret )
return (exists or Blocking) and ((prefix == PrefixPublic) and text or "") or text
end
hook.Add( "PlayerSay", "ChatCommand.ParseChat", ParseChat )
[/code]
Can someone please show me how to make a command, because these things don't work?
Also, these are the functions I use with the commands:
[code]
function GivePlayerCash( ply, oply, cash )
admin = sql.QueryValue("SELECT admin FROM pinfo WHERE steamid = '"..SteamID.."'")
ply:SetNWInt("admin", admin)
if admin >= 1 then
Money = ply:GetNWString("money")
oply:SetNWInt("money", Money + cash)
ply:ChatPrint("You gave "..oply:Nick().." "..cash.." dollars.")
else
ply:ChatPrint("You are not an admin!")
end
end
function SetPlayerCash( ply, oply, cash )
admin = sql.QueryValue("SELECT admin FROM pinfo WHERE steamid = '"..SteamID.."'")
if admin >= 1 then
oply:SetNWInt("money", cash)
ply:ChatPrint("You set "..oply:Nick().."'s cash to "..cash.." dollars.")
else
ply:ChatPrint("You are not an admin!")
end
end
function SetPlayerAdmin( ply, oply, adminlevel )
admin = sql.QueryValue("SELECT admin FROM pinfo WHERE steamid = '"..SteamID.."'")
if admin = 5 then
if adminlevel >= 6 or adminlevel <= -1 then
ply:ChatPrint("Invalid admin level (0-5)")
else
oply:SetNWInt("admin", adminlevel)
ply:ChatPrint("You set "..oply:Nick().."'s admin level to "..adminlevel.."")
end
else
ply:ChatPrint("You are not an admin!")
end
end
[/code]
I suppose I do not need to provide my database creation and shit, seeing as I actually took that from a tutorial and edited it (looks perfect, I have experience with mysql in the scripting language of PAWN for SA-MP.
Thanks, I am really looking forward to an answer.
Minimize use of global variables: [url]http://www.lua.org/pil/4.2.html[/url]
This is one way to do it:
[CODE]
-- lua/autorun/server/nice_name.lua
if !SERVER then return end
local function GivePlayerCash(ply, oply, cash)
-- Everything ok?
if !ValidEntity(ply) or !ValidEntity(oply) or !cash then return end
-- Get Steam ID of ply.
local SteamID = ply:SteamID()
-- Get group.
local admin = sql.QueryValue("SELECT admin FROM pinfo WHERE steamid = '"..SteamID.."'")
-- Set group.
ply:SetNWInt("admin", admin)
-- is ply an admin?
if admin >= 1 then
Money = ply:GetNWString("money")
oply:SetNWInt("money", Money + cash)
ply:ChatPrint("You gave "..oply:Nick().." "..cash.." dollars.")
else
ply:ChatPrint("You are not an admin!")
end
end
local function SetPlayerCash(ply, oply, cash)
if !ValidEntity(ply) or !ValidEntity(oply) or !cash then return end
local SteamID = ply:SteamID()
local admin = sql.QueryValue("SELECT admin FROM pinfo WHERE steamid = '"..SteamID.."'")
if admin >= 1 then
oply:SetNWInt("money", cash)
ply:ChatPrint("You set "..oply:Nick().."'s cash to "..cash.." dollars.")
else
ply:ChatPrint("You are not an admin!")
end
end
local function SetPlayerAdmin(ply, oply, adminlevel)
if !ValidEntity(ply) or !ValidEntity(oply) or !adminlevel then return end
local SteamID = ply:SteamID()
local admin = sql.QueryValue("SELECT admin FROM pinfo WHERE steamid = '"..SteamID.."'")
if admin == 5 then
if adminlevel >= 6 or adminlevel <= -1 then
ply:ChatPrint("Invalid admin level (0-5)")
else
oply:SetNWInt("admin", adminlevel)
ply:ChatPrint("You set "..oply:Nick().."'s admin level to "..adminlevel.."")
end
else
ply:ChatPrint("You are not an admin!")
end
end
-- We want to know what they say.
hook.Add("PlayerSay","GetCommand", function(pl,Text)
-- Get the length of the text.
local Length = string.len(Text)
--We can do this because the commands are around the same length.
if Length > 11 then
-- Lower the case.
local Low = string.lower(Text)
-- Get the beginning of the text.
local Beginning = string.sub(Low,1,9)
-- Do we find a command?
if string.find(Beginning,"/givecash") then
-- Get the rest of the text.
local Rest = string.sub(Low,11,Length)
-- Get the arguments.
local Args = string.Explode(" ", Rest)
-- Are all the arguments present and is the second argument a number?
if !Args[1] or !Args[2] or !tonumber(Args[2]) then
pl:ChatPrint("Missing arguments.")
return
end
local Found
local oply
-- Get all the players and loop through them.
for k, v in pairs(player.GetAll()) do
-- Does the nick name of the player contain the first argument and is it not the command giver? -> You can remove v != pl if you want to be able to apply this command to yourself.
if string.find(string.lower(v:Nick()),Args[1]) and v != pl then
-- Did we found another player?
if Found then
pl:ChatPrint("Two 2 or more players found.")
return
end
-- set oply to the identified player.
oply = v
-- Yep, we found one.
Found = true
end
end
-- Did we found one? if yes then run our function, if no then inform the command giver.
if Found then GivePlayerCash(pl, oply, tonumber(Args[2])) else pl:ChatPrint("No player found.") end
elseif string.find(Beginning,"/setcash") then
local Rest = string.sub(Low,10,Length)
local Args = string.Explode(" ", Rest)
if !Args[1] or !Args[2] or !tonumber(Args[2]) then
pl:ChatPrint("Missing arguments.")
return
end
local Found
local oply
for k, v in pairs(player.GetAll()) do
if string.find(string.lower(v:Nick()),Args[1]) and v != pl then
if Found then
pl:ChatPrint("Two 2 or more players found.")
return
end
oply = v
Found = true
end
end
if Found then SetPlayerCash(pl, oply, tonumber(Args[2])) else pl:ChatPrint("No player found.") end
elseif string.find(Beginning,"/setadmin") then
local Rest = string.sub(Low,11,Length)
local Args = string.Explode(" ", Rest)
if !Args[1] or !Args[2] or !tonumber(Args[2]) then
pl:ChatPrint("Missing arguments.")
return
end
local Found
local oply
for k, v in pairs(player.GetAll()) do
if string.find(string.lower(v:Nick()),Args[1]) and v != pl then
if Found then
pl:ChatPrint("Two 2 or more players found.")
return
end
oply = v
Found = true
end
end
if Found then SetPlayerAdmin(pl, oply, tonumber(Args[2])) else pl:ChatPrint("No player found.") end
end
end
end)
[/CODE]
To give the command say: command, part of player nick, number
-Sorry wrong tab-
Sorry, you need to Log In to post a reply to this thread.