diff --git a/luascripts/admin/admin.lua b/luascripts/admin/admin.lua
index 20cbedf..22b1b6e 100644
--- a/luascripts/admin/admin.lua
+++ b/luascripts/admin/admin.lua
@@ -19,6 +19,7 @@ local constants = require "luascripts.wolfadmin.util.constants"
local events = require "luascripts.wolfadmin.util.events"
local settings = require "luascripts.wolfadmin.util.settings"
local files = require "luascripts.wolfadmin.util.files"
+local util = require "luascripts.wolfadmin.util.util"
local db = require "luascripts.wolfadmin.db.db"
local stats = require "luascripts.wolfadmin.players.stats"
@@ -58,6 +59,10 @@ function admin.unmuteVoice(clientId)
stats.set(clientId, "voiceMute", false)
end
+function admin.putPlayer(clientId, teamId)
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "forceteam "..clientId.." "..util.getTeamCode(teamId)..";")
+end
+
function admin.lockTeam(teamId)
teamLocks[teamId] = false
end
diff --git a/luascripts/commands/admin/admintest.lua b/luascripts/commands/admin/admintest.lua
new file mode 100644
index 0000000..24da66c
--- /dev/null
+++ b/luascripts/commands/admin/admintest.lua
@@ -0,0 +1,28 @@
+
+-- WolfAdmin module for Wolfenstein: Enemy Territory servers.
+-- Copyright (C) 2015-2016 Timo 'Timothy' Smit
+
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- at your option any later version.
+
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+
+local auth = require "luascripts.wolfadmin.auth.auth"
+local commands = require "luascripts.wolfadmin.commands.commands"
+local stats = require "luascripts.wolfadmin.players.stats"
+local settings = require "luascripts.wolfadmin.util.settings"
+
+function commandAdminTest(clientId, cmdArguments)
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "cchat -1 \"^dadmintest: "..stats.get(clientId, "playerName").." ^9is a level "..auth.getlevel(clientId).." user (".."^7Guest".."^9).\";")
+
+ return true
+end
+commands.addadmin("admintest", commandAdminTest, auth.PERM_ADMINTEST, "display your current admin level", nil, (settings.get("g_standalone") == 0))
diff --git a/luascripts/commands/admin/finger.lua b/luascripts/commands/admin/finger.lua
new file mode 100644
index 0000000..4d19aeb
--- /dev/null
+++ b/luascripts/commands/admin/finger.lua
@@ -0,0 +1,61 @@
+
+-- WolfAdmin module for Wolfenstein: Enemy Territory servers.
+-- Copyright (C) 2015-2016 Timo 'Timothy' Smit
+
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- at your option any later version.
+
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+
+local auth = require "luascripts.wolfadmin.auth.auth"
+local commands = require "luascripts.wolfadmin.commands.commands"
+local stats = require "luascripts.wolfadmin.players.stats"
+local settings = require "luascripts.wolfadmin.util.settings"
+local util = require "luascripts.wolfadmin.util.util"
+
+function commandFinger(clientId, cmdArguments)
+ if cmdArguments[1] == nil then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dfinger usage: "..commands.getadmin("finger")["syntax"].."\";")
+
+ return true
+ elseif tonumber(cmdArguments[1]) == nil then
+ cmdClient = et.ClientNumberFromString(cmdArguments[1])
+ else
+ cmdClient = tonumber(cmdArguments[1])
+ end
+
+ if cmdClient == -1 then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dfinger: ^9no or multiple matches for '^7"..cmdArguments[1].."^9'.\";")
+
+ return true
+ elseif not et.gentity_get(cmdClient, "pers.netname") then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dfinger: ^9no connected player by that name or slot #\";")
+
+ return true
+ end
+
+ local stats = {
+ ["name"] = et.gentity_get(cmdClient, "pers.netname"),
+ ["cleanname"] = et.gentity_get(cmdClient, "pers.netname"):gsub("%^[^^]", ""),
+ ["codedsname"] = et.gentity_get(cmdClient, "pers.netname"):gsub("%^([^^])", "^^2%1"),
+ ["guid"] = et.gentity_get(cmdClient, "pers.netname"):gsub("%^([^^])", "^^2%1"),
+ ["slot"] = cmdClient,
+ ["guid"] = stats.get(cmdClient, "playerGUID"),
+ }
+
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dInformation about ^7"..stats["name"].."^d:\";")
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dName: ^2"..stats["cleanname"].." ("..stats["codedsname"]..")\";")
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dSlot: ^2"..stats["slot"]..(stats["slot"] < tonumber(et.trap_Cvar_Get("sv_privateClients")) and " ^9(private)" or "").."\";")
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dGUID: ^2"..stats["guid"].."\";")
+
+ return true
+end
+commands.addadmin("finger", commandFinger, auth.PERM_FINGER, "gives specific information about a player", "^9[^3name|slot#^9]", (settings.get("g_standalone") == 0))
diff --git a/luascripts/commands/admin/gib.lua b/luascripts/commands/admin/gib.lua
new file mode 100644
index 0000000..249db3a
--- /dev/null
+++ b/luascripts/commands/admin/gib.lua
@@ -0,0 +1,63 @@
+
+-- WolfAdmin module for Wolfenstein: Enemy Territory servers.
+-- Copyright (C) 2015-2016 Timo 'Timothy' Smit
+
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- at your option any later version.
+
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+
+local auth = require "luascripts.wolfadmin.auth.auth"
+local commands = require "luascripts.wolfadmin.commands.commands"
+local stats = require "luascripts.wolfadmin.players.stats"
+local settings = require "luascripts.wolfadmin.util.settings"
+
+function commandGib(clientId, cmdArguments)
+ if cmdArguments[1] == nil then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dgib usage: "..commands.getadmin("gib")["syntax"].."\";")
+
+ return true
+ elseif tonumber(cmdArguments[1]) == nil then
+ cmdClient = et.ClientNumberFromString(cmdArguments[1])
+ else
+ cmdClient = tonumber(cmdArguments[1])
+ end
+
+ if cmdClient == -1 then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dgib: ^9no or multiple matches for '^7"..cmdArguments[1].."^9'.\";")
+
+ return true
+ elseif not et.gentity_get(cmdClient, "pers.netname") then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dgib: ^9no connected player by that name or slot #\";")
+
+ return true
+ end
+
+ if auth.isallowed(cmdClient, "!") == 1 then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dgib: ^7"..et.gentity_get(cmdClient, "pers.netname").." ^9is immune to this command.\";")
+
+ return true
+ elseif auth.getlevel(cmdClient) > auth.getlevel(clientId) then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dgib: ^9sorry, but your intended victim has a higher admin level than you do.\";")
+
+ return true
+ end
+
+ -- GENTITYNUM_BITS 10 10
+ -- MAX_GENTITIES 1 << GENTITYNUM_BITS 20
+ -- ENTITYNUM_WORLD MAX_GENTITIES - 2 18
+ et.G_Damage(cmdClient, 18, 18, 500, 0, 0) -- MOD_UNKNOWN = 0
+
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "cchat -1 \"^dgib: ^7"..stats.get(cmdClient, "playerName").." ^9was gibbed.\";")
+
+ return true
+end
+commands.addadmin("gib", commandGib, auth.PERM_GIB, "insantly gibs a player", "^9(^3name|slot#^9) (^hreason^9)", (settings.get("g_standalone") == 0))
diff --git a/luascripts/commands/admin/help.lua b/luascripts/commands/admin/help.lua
index 2dd9a3d..68a6d7f 100644
--- a/luascripts/commands/admin/help.lua
+++ b/luascripts/commands/admin/help.lua
@@ -31,7 +31,7 @@ function commandHelp(clientId, cmdArguments)
end
end
- et.trap_SendConsoleCommand(et.EXEC_APPEND, "cchat "..clientId.." \"^dhelp: ^9"..#availableCommands.." "..((settings.get("g_standalone") == 0) and "additional " or "").."commands (open console for the full list)\";")
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "cchat "..clientId.." \"^dhelp: ^9"..#availableCommands.." "..((settings.get("g_standalone") == 1) and "available" or "additional").." commands (open console for the full list)\";")
local cmdsOnLine, cmdsBuffer = 0, ""
@@ -68,8 +68,4 @@ function commandHelp(clientId, cmdArguments)
return false
end
-<<<<<<< HEAD
-commands.addadmin("help", commandHelp, "h", "display commands available to you or help on a specific command", "^9(^hcommand^9)", true)
-=======
-commands.addadmin("help", commandHelp, auth.PERM_HELP, "display commands available to you or help on a specific command", "^9(^hcommand^9)", true)
->>>>>>> feature/auth
+commands.addadmin("help", commandHelp, auth.PERM_HELP, "display commands available to you or help on a specific command", "^9(^hcommand^9)", (settings.get("g_standalone") == 0))
diff --git a/luascripts/commands/admin/kick.lua b/luascripts/commands/admin/kick.lua
new file mode 100644
index 0000000..54c0eba
--- /dev/null
+++ b/luascripts/commands/admin/kick.lua
@@ -0,0 +1,57 @@
+
+-- WolfAdmin module for Wolfenstein: Enemy Territory servers.
+-- Copyright (C) 2015-2016 Timo 'Timothy' Smit
+
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- at your option any later version.
+
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+
+local auth = require "luascripts.wolfadmin.auth.auth"
+local settings = require "luascripts.wolfadmin.util.settings"
+local commands = require "luascripts.wolfadmin.commands.commands"
+
+function commandKick(clientId, cmdArguments)
+ if cmdArguments[1] == nil then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dkick usage: "..commands.getadmin("kick")["syntax"].."\";")
+
+ return true
+ elseif tonumber(cmdArguments[1]) == nil then
+ cmdClient = et.ClientNumberFromString(cmdArguments[1])
+ else
+ cmdClient = tonumber(cmdArguments[1])
+ end
+
+ if cmdClient == -1 then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dkick: ^9no or multiple matches for '^7"..cmdArguments[1].."^9'.\";")
+
+ return true
+ elseif not et.gentity_get(cmdClient, "pers.netname") then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dkick: ^9no connected player by that name or slot #\";")
+
+ return true
+ end
+
+ if auth.isallowed(cmdClient, "!") == 1 then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dkick: ^7"..et.gentity_get(cmdClient, "pers.netname").." ^9is immune to this command.\";")
+
+ return true
+ elseif auth.getlevel(cmdClient) > auth.getlevel(clientId) then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dkick: ^9sorry, but your intended victim has a higher admin level than you do.\";")
+
+ return true
+ end
+
+ et.trap_DropClient(cmdClient, "You have been kicked, Reason: "..(cmdArguments[2] and cmdArguments[2] or "kicked by admin"), 0)
+
+ return false
+end
+commands.addadmin("kick", commandKick, auth.PERM_KICK, "kick a player with an optional reason", "^9[^3name|slot#^9] ^9(^3reason^9)", (settings.get("g_standalone") == 0))
diff --git a/luascripts/commands/admin/listplayers.lua b/luascripts/commands/admin/listplayers.lua
new file mode 100644
index 0000000..3c5988d
--- /dev/null
+++ b/luascripts/commands/admin/listplayers.lua
@@ -0,0 +1,85 @@
+
+-- WolfAdmin module for Wolfenstein: Enemy Territory servers.
+-- Copyright (C) 2015-2016 Timo 'Timothy' Smit
+
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- at your option any later version.
+
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+
+local auth = require "luascripts.wolfadmin.auth.auth"
+
+local commands = require "luascripts.wolfadmin.commands.commands"
+
+local game = require "luascripts.wolfadmin.game.game"
+local fireteams = require "luascripts.wolfadmin.game.fireteams"
+
+local stats = require "luascripts.wolfadmin.players.stats"
+
+local constants = require "luascripts.wolfadmin.util.constants"
+local settings = require "luascripts.wolfadmin.util.settings"
+local util = require "luascripts.wolfadmin.util.util"
+
+function commandListPlayers(clientId, cmdArguments)
+ local players = {}
+
+ for playerId = 0, et.trap_Cvar_Get("sv_maxclients") - 1 do
+ if wolfa_isPlayer(playerId) then
+ table.insert(players, playerId)
+ end
+ end
+
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dCurrently ^7"..(#players).." ^dplayers online^d:\";")
+ for _, player in pairs(players) do
+ local guidStub
+
+ if stats.get(player, "isBot") then
+ guidStub = "OMNIBOT-"
+ else
+ guidStub = stats.get(player, "playerGUID"):sub(-8)
+ end
+
+ local teamColor, teamCode
+
+ if et.gentity_get(player, "pers.connected") then
+ teamColor = util.getTeamColor(tonumber(et.gentity_get(player, "sess.sessionTeam")))
+ teamCode = util.getTeamCode(tonumber(et.gentity_get(player, "sess.sessionTeam"))):upper():sub(1,1)
+ else
+ teamColor = "^8"
+ teamCode = "C"
+ end
+
+ local fireteamId, fireteamName = fireteams.getPlayerFireteamId(player), ""
+
+ if fireteamId then
+ fireteamName = fireteams.getName(fireteamId):sub(1, 1)
+ end
+
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^f"..string.format("%2i %s ^7%-2i %20s ^7(*%s) ^1%1s ^3%1s ^7%s ^7%s%s^7%s",
+ player, -- slot
+ teamCode, -- team
+ auth.getlevel(player), -- level
+ "Guest", -- levelname
+ guidStub, -- guid stub
+ (stats.get(player, "playerMuted") and "M" or ""), -- muted
+ fireteamName, -- fireteam
+ stats.get(player, "playerName"), -- name
+ "", -- alias open
+ "", -- alias
+ "" -- alias close
+ ).."\";")
+ end
+
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "cchat "..clientId.." \"^dlistplayers: ^9current player info was printed to the console.\";")
+
+ return true
+end
+commands.addadmin("listplayers", commandListPlayers, auth.PERM_LISTPLAYERS, "display a list of connected players, their slot numbers as well as their admin levels", nil, (settings.get("g_standalone") == 0))
diff --git a/luascripts/commands/admin/nextmap.lua b/luascripts/commands/admin/nextmap.lua
new file mode 100644
index 0000000..144c474
--- /dev/null
+++ b/luascripts/commands/admin/nextmap.lua
@@ -0,0 +1,29 @@
+
+-- WolfAdmin module for Wolfenstein: Enemy Territory servers.
+-- Copyright (C) 2015-2016 Timo 'Timothy' Smit
+
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- at your option any later version.
+
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+
+local auth = require "luascripts.wolfadmin.auth.auth"
+local commands = require "luascripts.wolfadmin.commands.commands"
+local settings = require "luascripts.wolfadmin.util.settings"
+
+function commandNextMap(clientId, cmdArguments)
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "cchat -1 \"^dnextmap: ^9next map was loaded.\";")
+
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "vstr nextmap")
+
+ return true
+end
+commands.addadmin("nextmap", commandNextMap, auth.PERM_NEXTMAP, "loads the next map", nil, (settings.get("g_standalone") == 0))
diff --git a/luascripts/commands/admin/pause.lua b/luascripts/commands/admin/pause.lua
new file mode 100644
index 0000000..c085874
--- /dev/null
+++ b/luascripts/commands/admin/pause.lua
@@ -0,0 +1,30 @@
+
+-- WolfAdmin module for Wolfenstein: Enemy Territory servers.
+-- Copyright (C) 2015-2016 Timo 'Timothy' Smit
+
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- at your option any later version.
+
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+
+local auth = require "luascripts.wolfadmin.auth.auth"
+local commands = require "luascripts.wolfadmin.commands.commands"
+local game = require "luascripts.wolfadmin.game.game"
+local settings = require "luascripts.wolfadmin.util.settings"
+
+function commandPause(clientId, cmdArguments)
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "cchat -1 \"^dpause: ^9map paused.\";")
+
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "ref pause")
+
+ return true
+end
+commands.addadmin("pause", commandPause, auth.PERM_RESTART, "pauses the game for all players", nil, (settings.get("g_standalone") == 0))
diff --git a/luascripts/commands/admin/put.lua b/luascripts/commands/admin/put.lua
new file mode 100644
index 0000000..29d05bb
--- /dev/null
+++ b/luascripts/commands/admin/put.lua
@@ -0,0 +1,73 @@
+
+-- WolfAdmin module for Wolfenstein: Enemy Territory servers.
+-- Copyright (C) 2015-2016 Timo 'Timothy' Smit
+
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- at your option any later version.
+
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+
+local admin = require "luascripts.wolfadmin.admin.admin"
+local auth = require "luascripts.wolfadmin.auth.auth"
+local commands = require "luascripts.wolfadmin.commands.commands"
+local constants = require "luascripts.wolfadmin.util.constants"
+local util = require "luascripts.wolfadmin.util.util"
+
+function commandPlayerLock(clientId, cmdArguments)
+ if cmdArguments[2] == nil or (cmdArguments[2] ~= constants.TEAM_AXIS_SC and cmdArguments[2] ~= constants.TEAM_ALLIES_SC and cmdArguments[2] ~= constants.TEAM_SPECTATORS_SC) then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dput usage: "..commands.getadmin("put")["syntax"].."\";")
+
+ return true
+ elseif tonumber(cmdArguments[1]) == nil then
+ cmdClient = et.ClientNumberFromString(cmdArguments[1])
+ else
+ cmdClient = tonumber(cmdArguments[1])
+ end
+
+ if cmdClient == -1 then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dput: ^9no or multiple matches for '^7"..cmdArguments[1].."^9'.\";")
+
+ return true
+ elseif not et.gentity_get(cmdClient, "pers.netname") then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dput: ^9no connected player by that name or slot #\";")
+
+ return true
+ end
+
+ if auth.isallowed(cmdClient, "!") == 1 then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dput: ^7"..et.gentity_get(cmdClient, "pers.netname").." ^9is immune to this command.\";")
+
+ return true
+ elseif auth.getlevel(cmdClient) > auth.getlevel(cmdClient) then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dput: ^9sorry, but your intended victim has a higher admin level than you do.\";")
+
+ return true
+ end
+
+ local team
+ if cmdArguments[2] == constants.TEAM_AXIS_SC then
+ team = constants.TEAM_AXIS
+ elseif cmdArguments[2] == constants.TEAM_ALLIES_SC then
+ team = constants.TEAM_ALLIES
+ elseif cmdArguments[2] == constants.TEAM_SPECTATORS_SC then
+ team = constants.TEAM_SPECTATORS
+ end
+
+ local teamname = util.getTeamColor(team)..util.getTeamName(team)
+
+ -- TODO fix behaviour, cannot unbalance teams (see g_svcmds.c:SetTeam)
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "chat \"^dput: ^7"..et.gentity_get(cmdClient, "pers.netname").." ^9has been put to "..teamname.."\";")
+
+ admin.putPlayer(cmdClient, team)
+
+ return true
+end
+commands.addadmin("put", commandPlayerLock, auth.PERM_LOCKPLAYER, "locks a player to a specific team", "^9[^3name|slot#^9]")
diff --git a/luascripts/commands/admin/restart.lua b/luascripts/commands/admin/restart.lua
new file mode 100644
index 0000000..38546d0
--- /dev/null
+++ b/luascripts/commands/admin/restart.lua
@@ -0,0 +1,37 @@
+
+-- WolfAdmin module for Wolfenstein: Enemy Territory servers.
+-- Copyright (C) 2015-2016 Timo 'Timothy' Smit
+
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- at your option any later version.
+
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+
+local auth = require "luascripts.wolfadmin.auth.auth"
+local commands = require "luascripts.wolfadmin.commands.commands"
+local game = require "luascripts.wolfadmin.game.game"
+local settings = require "luascripts.wolfadmin.util.settings"
+
+function commandRestart(clientId, cmdArguments)
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "cchat -1 \"^drestart: ^9map restarted.\";")
+
+ local currentState = game.getState()
+ local newState = 5 -- GS_RESET
+
+ if currentState == 0 or currentState == 3 then -- GS_PLAYING or GS_INTERMISSION
+ newState = 2 -- GS_WARMUP
+ end
+
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "map_restart 0 "..newState)
+
+ return true
+end
+commands.addadmin("restart", commandRestart, auth.PERM_RESTART, "restarts the current map", nil, (settings.get("g_standalone") == 0))
diff --git a/luascripts/commands/admin/slap.lua b/luascripts/commands/admin/slap.lua
new file mode 100644
index 0000000..0477366
--- /dev/null
+++ b/luascripts/commands/admin/slap.lua
@@ -0,0 +1,66 @@
+
+-- WolfAdmin module for Wolfenstein: Enemy Territory servers.
+-- Copyright (C) 2015-2016 Timo 'Timothy' Smit
+
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- at your option any later version.
+
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+
+local auth = require "luascripts.wolfadmin.auth.auth"
+local commands = require "luascripts.wolfadmin.commands.commands"
+local stats = require "luascripts.wolfadmin.players.stats"
+local settings = require "luascripts.wolfadmin.util.settings"
+
+function commandSlap(clientId, cmdArguments)
+ if cmdArguments[1] == nil then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dslap usage: "..commands.getadmin("slap")["syntax"].."\";")
+
+ return true
+ elseif tonumber(cmdArguments[1]) == nil then
+ cmdClient = et.ClientNumberFromString(cmdArguments[1])
+ else
+ cmdClient = tonumber(cmdArguments[1])
+ end
+
+ if cmdClient == -1 then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dslap: ^9no or multiple matches for '^7"..cmdArguments[1].."^9'.\";")
+
+ return true
+ elseif not et.gentity_get(cmdClient, "pers.netname") then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dslap: ^9no connected player by that name or slot #\";")
+
+ return true
+ end
+
+ if auth.isallowed(cmdClient, "!") == 1 then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dslap: ^7"..et.gentity_get(cmdClient, "pers.netname").." ^9is immune to this command.\";")
+
+ return true
+ elseif auth.getlevel(cmdClient) > auth.getlevel(clientId) then
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "csay "..clientId.." \"^dslap: ^9sorry, but your intended victim has a higher admin level than you do.\";")
+
+ return true
+ end
+
+ local newHealth = et.gentity_get(cmdClient, "health") - 20
+
+ if newHealth < 1 then
+ newHealth = 1
+ end
+
+ et.gentity_set(cmdClient, "health", newHealth)
+
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "cchat -1 \"^dslap: ^7"..stats.get(cmdClient, "playerName").." ^9was slapped.\";")
+
+ return true
+end
+commands.addadmin("slap", commandSlap, auth.PERM_SLAP, "give a player a specified amount of damage for a specified reason", "^9[^3name|slot#^9] (^hdamage^9) (^hreason^9)", (settings.get("g_standalone") == 0))
diff --git a/luascripts/commands/admin/time.lua b/luascripts/commands/admin/time.lua
new file mode 100644
index 0000000..0335234
--- /dev/null
+++ b/luascripts/commands/admin/time.lua
@@ -0,0 +1,27 @@
+
+-- WolfAdmin module for Wolfenstein: Enemy Territory servers.
+-- Copyright (C) 2015-2016 Timo 'Timothy' Smit
+
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- at your option any later version.
+
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+
+local auth = require "luascripts.wolfadmin.auth.auth"
+local commands = require "luascripts.wolfadmin.commands.commands"
+local settings = require "luascripts.wolfadmin.util.settings"
+
+function commandTime(clientId, cmdArguments)
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "cchat -1 \"^dtime: ^9current time is ^7"..os.date("%H:%M:%S").."^9.\";")
+
+ return true
+end
+commands.addadmin("time", commandTime, auth.PERM_TIME, "displays the local time", nil, (settings.get("g_standalone") == 0))
diff --git a/luascripts/commands/admin/unpause.lua b/luascripts/commands/admin/unpause.lua
new file mode 100644
index 0000000..9f1ad17
--- /dev/null
+++ b/luascripts/commands/admin/unpause.lua
@@ -0,0 +1,30 @@
+
+-- WolfAdmin module for Wolfenstein: Enemy Territory servers.
+-- Copyright (C) 2015-2016 Timo 'Timothy' Smit
+
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- at your option any later version.
+
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+
+local auth = require "luascripts.wolfadmin.auth.auth"
+local commands = require "luascripts.wolfadmin.commands.commands"
+local game = require "luascripts.wolfadmin.game.game"
+local settings = require "luascripts.wolfadmin.util.settings"
+
+function commandUnpause(clientId, cmdArguments)
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "cchat -1 \"^dpause: ^9map unpaused.\";")
+
+ et.trap_SendConsoleCommand(et.EXEC_APPEND, "ref unpause")
+
+ return true
+end
+commands.addadmin("unpause", commandUnpause, auth.PERM_PAUSE, "pauses the game for all players", nil, (settings.get("g_standalone") == 0))
diff --git a/luascripts/game/fireteams.lua b/luascripts/game/fireteams.lua
new file mode 100644
index 0000000..de176b9
--- /dev/null
+++ b/luascripts/game/fireteams.lua
@@ -0,0 +1,153 @@
+
+-- WolfAdmin module for Wolfenstein: Enemy Territory servers.
+-- Copyright (C) 2015-2016 Timo 'Timothy' Smit
+
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- at your option any later version.
+
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see .
+
+local teams = require "luascripts.wolfadmin.game.teams"
+
+local bits = require "luascripts.wolfadmin.util.bits"
+local constants = require "luascripts.wolfadmin.util.constants"
+local events = require "luascripts.wolfadmin.util.events"
+
+local fireteams = {}
+
+fireteams.FT_ALPHA = 0
+fireteams.FT_BRAVO = 1
+fireteams.FT_CHARLIE = 2
+fireteams.FT_DELTA = 3
+fireteams.FT_ECHO = 4
+fireteams.FT_FOXTROT = 5
+
+fireteams.NUM_FIRETEAMS = 6
+
+function fireteams.getId(fireteam)
+ return 893 + fireteam
+end
+
+function fireteams.isUsed(fireteamId)
+ if not fireteamId then
+ return nil
+ end
+
+ local data = et.trap_GetConfigstring(fireteamId)
+ local id = tonumber(et.Info_ValueForKey(data, "id"))
+
+ return (id ~= -1)
+end
+
+function fireteams.isPrivate(fireteamId)
+ if not fireteamId or not fireteams.isUsed(fireteamId) then
+ return nil
+ end
+
+ local data = et.trap_GetConfigstring(fireteamId)
+ local p = tonumber(et.Info_ValueForKey(data, "p"))
+
+ return (p == 1)
+end
+
+function fireteams.getName(fireteamId)
+ if not fireteamId or not fireteams.isUsed(fireteamId) then
+ return nil
+ end
+
+ local data = et.trap_GetConfigstring(fireteamId)
+ local id = tonumber(et.Info_ValueForKey(data, "id"))
+
+ local name
+
+ if id == fireteams.FT_ALPHA then
+ name = "Alpha"
+ elseif id == fireteams.FT_BRAVO then
+ name = "Bravo"
+ elseif id == fireteams.FT_CHARLIE then
+ name = "Charlie"
+ elseif id == fireteams.FT_DELTA then
+ name = "Delta"
+ elseif id == fireteams.FT_ECHO then
+ name = "Echo"
+ elseif id == fireteams.FT_FOXTROT then
+ name = "Foxtrot"
+ end
+
+ return name
+end
+
+function fireteams.getLeader(fireteamId)
+ if not fireteamId or not fireteams.isUsed(fireteamId) then
+ return nil
+ end
+
+ local data = et.trap_GetConfigstring(fireteamId)
+ local l = tonumber(et.Info_ValueForKey(data, "l"))
+
+ return l
+end
+
+function fireteams.getTeam(fireteamId)
+ if not fireteamId or not fireteams.isUsed(fireteamId) then
+ return nil
+ end
+
+ local data = et.trap_GetConfigstring(fireteamId)
+ local l = tonumber(et.Info_ValueForKey(data, "l"))
+ local team = et.gentity_get(l, "sess.sessionTeam")
+
+ return team
+end
+
+function fireteams.getMembers(fireteamId)
+ if not fireteamId or not fireteams.isUsed(fireteamId) then
+ return nil
+ end
+
+ local data = et.trap_GetConfigstring(fireteamId)
+
+ local members = {}
+
+ for i = 0, 15 do
+ local c = tonumber("0x0"..et.Info_ValueForKey(data, "c"):sub(16 - i, 16 - i))
+
+ for j = 0, 3 do
+ if bits.hasbit(c, 2^j) then
+ table.insert(members, (i * 4 + j))
+ end
+ end
+ end
+
+ return members
+end
+
+function fireteams.getPlayerFireteamId(clientId)
+ local hex = math.floor(clientId / 4)
+ local bit = clientId % 4
+
+ for i = 0, 11 do
+ local fireteamId = fireteams.getId(i)
+
+ if fireteams.isUsed(fireteamId) then -- please add a continue statement one day
+ local data = et.trap_GetConfigstring(fireteamId)
+ local c = tonumber("0x0"..et.Info_ValueForKey(data, "c"):sub(16 - hex, 16 - hex))
+
+ if bits.hasbit(c, 2^bit) then
+ return fireteamId
+ end
+ end
+ end
+
+ return nil
+end
+
+return fireteams