lua: (noq) added NOQ svn 199

This commit is contained in:
Radegast 2013-12-22 19:28:34 +01:00
parent fa6564bdd1
commit 560a2c8b88
15 changed files with 4565 additions and 0 deletions

2917
noq/noq.lua Normal file

File diff suppressed because it is too large Load diff

136
noq/noq_commands.cfg Normal file
View file

@ -0,0 +1,136 @@
# <PARAMETER> = text followed by the command. (Can be used to enter multiple values.
# For example: pb_sv_kick <PARAMETER> can be used to enter slot number, length of kick, and reason.)
# <CLIENT_ID> = the client id of the calling player.
# <PLAYER_LAST_VICTIM_(ID|NAME|CNAME|WEAPON)> = last player, you killed
# <PLAYER_LAST_KILLER_(ID|NAME|CNAME|WEAPON)> = last player, that killed you
# <PLAYER_CLASS> = class of calling player
# <PLAYER_TEAM> = side / team of calling player
# <PLAYER> = Name of the calling player (without color codes)
# <COLOR_PLAYER> = Name of the calling player (with color codes)
# <GUID> = Guid of the calling player (without color codes)
# parallel: all attributes for the second player(specified via part of name or slotnumber):
#<PART2_CLASS> = class
#<PART2_TEAM> = team
#<PART2CNAME> = colored name
#<PART2ID> = id
#<PART2PBID> = punkbuster slotnumber
#<PART2GUID> = guid
#<PART2LEVEL> = adminlevel
#<PART2NAME> = name without color
0 - help =
#Level - command = rcon command
#command Examples:
#0 - ref = ref referee <CLIENT_ID>
#2 - vkick = clientkick <PLAYER_LAST_KILLER_ID>
#A bad example would be
#0 - kick player = clientkick <PARAMETER>
#This is a bad example because you cannot have spaces in your command. But you can have underscores.
# PLEASE NOTE: PARAMETER IS UNSAFE
# Rcon Shortcuts (Work with all mods / etmain)
2 - start = start_match
help = Starts the match
syntax = !start
2 - swap = swap_teams
2 - reset = reset_match
2 - ref = ref referee <CLIENT_ID>
2 - unref = ref unReferee <CLIENT_ID>
2 - shuffle = shuffle_teams
2 - map_restart = map_restart
2 - pbkick = pb_sv_kick <PART2ID>
3 - cancelvote = cancelvote
3 - passvote = passvote
3 - cp = cp <PARAMETER>
3 - qsay = qsay <PARAMETER>
3 - devmap = devmap <PARAMETER>
3 - exec = exec <PARAMETER>
# Referee Commands (only ETPRO)
#2 - putallies = ref putallies <PART2ID>
#2 - putspec = ref remove <PART2ID>
#2 - putaxis = ref putaxis <PART2ID>
#3 - pause = ref pause
#3 - unpause = ref unpause
#2 - allready = ref allready
#2 - lock = ref lock
#2 - unlock = ref unlock
#2 - speclock = ref speclock
#2 - specunlock = ref specunlock
#2 - nextmap = ref nextmap
#2 - mutespecs = ref mutespecs
#2 - unmutespecs = ref unmutespecs
#3 - map = ref map <PARAMETER>
#3 - campaign = ref campaign <PARAMETER>
#3 - gametype = ref gametype <PARAMETER>
#3 - config = ref config <PARAMETER>
#3 - pub = ref pub
#3 - comp = ref comp
#1 - cointoss = ref cointoss
# Shuffle without restart
2 - shuffle_norestart = ref shuffleteamsxp_norestart
2 - shuffleteamsxp_norestart = ref shuffleteamsxp_norestart
# campaign functions
3 - campaign = campaign <PARAMETER>
# To kick a player without temporary ban. Change the message, if you like.
2 - fkick = pb_sv_kick <PART2PBID> 0 Come back in, if you want
# Shortcut to make the called a shoutcaster / remove his statua
3 - ms = makeShoutcaster <CLIENT_ID>
0 - rs = removeShoutcaster <CLIENT_ID>
# Moves the calling person into the specific team
#2 - putmeaxis = ref putaxis <CLIENT_ID>
#2 - putmeallies = ref putallies <CLIENT_ID>
#2 - putmespec = ref remove <CLIENT_ID>
#FUN
#0 - moo = qsay ^1MOO!!!!!!!!!!!!!! ; qsay ^2MOO 2!!!!!!!!!!!!!!!!
0 - drunk = qsay ^3DONT TELL ME ^1WHEN I'VE HAD ENOUGH!
0 - stup = qsay ^2It's better to lose than to win
0 - croyt = qsay ^2HOW DO YOU NOT DIE!!!!
0 - aim = qsay ^2*Get some glasses for pete's sake*
0 - beer = qsay A nice sexy waitress brings ^7<COLOR_PLAYER>^7 a nice cup of beer!
help = Gives the target a beer
syntax = !beer playername/slot
0 - pizza = qsay Someone calls Mario, and he brings ^7<COLOR_PLAYER>^7 a hot pepperoni pizza!
0 - coke = qsay ^3Ah... A delicious glass of cold Coca Cola[tm] (*thinks ^7<COLOR_PLAYER>^3 while he drinks*)
0 - pfstinkt = qsay ^3Uh, that smell of the panzer is pretty strong today ... ^3(^7<COLOR_PLAYER>^3's opinion)
0 - bye = qsay ^7<COLOR_PLAYER>^3 waves his hand to say ^1GOOD BYE^3. We surely meet later! ; playsound -1 sound/misc/bye.wav
0 - backrage = qsay ^3Wow, <PLAYER_LAST_KILLER_CNAME> ^3has backrage skills with his uber ^1<PLAYER_LAST_KILLER_WEAPON>
0 - porn = qsay ^3Press F7 to download!
0 - aimbot = qsay ^3!execute aimbot.cfg
0 - dean = qsay ^1Warning, med pile sited!
0 - pack = qsay ^3Run and heal! Come back when you're ready to get pwnd!
0 - tk = qsay Wait! Don't shoot! My teammates will kill me for you!
1 - holyshit = playsound sound/misc/holyshit.wav
1 - denied = playsound sound/misc/Denied.wav
1 - headshot1 = playsound sound/misc/boomheadshot.wav
1 - headshot2 = playsound sound/misc/Headshot.wav
1 - prick = playsound sound/misc/prick.wav
2 - respect = playsound sound/misc/respect_x.wav
1 - victory = playsound sound/misc/victory.wav
1 - jackass = playsound sound/misc/DONKEY.wav
1 - looser = playsound sound/misc/ae821.wav
1 - goodnews = playsound sound/misc/goodnews.wav
1 - nogodno = playsound sound/misc/nogodno.wav
#0 - random = qsay <RANDOM_CNAME> ^3is on the <RANDOM_TEAM> team as a <RANDOM_CLASS>!
#for spamming
0 - owned = qsay ^1Ha^3ha^5ha^3, I owned ^7<PLAYER_LAST_VICTIM_CNAME>^3 with my ^7<PLAYER_LAST_VICTIM_WEAPON>^3!!!
0 - pants = qsay ^1No^3no^5noooo^3, I was killed by ^7<PLAYER_LAST_KILLER_CNAME>^3 with a ^7<PLAYER_LAST_KILLER_WEAPON>^3!!!
0 - whoami = qsay I am <COLOR_PLAYER>^7. I play ^3<PLAYER_CLASS>^7 on the ^3<PLAYER_TEAM>^7 side.
0 - victimized = qsay <PLAYER_LAST_VICTIM_CNAME>^1, You've just been victimized by <COLOR_PLAYER>^1's <PLAYER_LAST_VICTIM_WEAPON>!!!
#other
#2 - vkick = clientkick <PLAYER_LAST_KILLER_ID>
#2 - vmute = ref mute <PLAYER_LAST_KILLER_ID>
#3 - bluerespawn = forcecvar g_bluelimbotime <PARAMETER>
#3 - redrespawn = forcecvar g_redlimbotime <PARAMETER>
#2 - showtk = $LUA$ showTkTable(<CLIENT_ID>)

42
noq/noq_config.cfg.sample Normal file
View file

@ -0,0 +1,42 @@
-- Make this file your own ...
return {
-- Table: {1}
{
["dbms"]="mySQL",
["dbname"]="dbname",
["dbuser"]="dbuser",
["dbpassword"]="dbpass",
["dbhostname"]="dbhost",
["dbport"]="3306",
["useDB"]="1",
["mail"] = "0",
["mailserv"] = "XXX",
["mailport"] = "25",
["mailfrom"] = "<XXX>",
["recordbots"] = "0",
["color"] = "^3",
["commandprefix"] = "!",
["debug"] = "0",
["debugquerries"] = "0",
["persgamestartmessage"] = "Welcome to the server",
["persgamestartmessagelocation"] = "cpm",
["xprestore"] = "1",
["pussyfactor"] = "1",
["usecommands"] = "0",
["polldistance"] = "120",
["maxSelfKills"] = "3",
["evenerCheckallSec"] = "40",
["nextmapVoteSec"] = "0",
["lognames"]="1",
["irchost"]="",
["ircport"]="1337",
["teamdamageMessage1"] = "You do love your mates!",
["teamdamageMessage2"] = "you hit your mates from time to time!",
["teamdamageMessage3"] = "you don't care about teambleeding very much!",
["teamdamageMessage4"] = "your nickname is a synonym of collateral damage!",
["teamdamageMessage5"] = "you don't care about teams - everybody is your enemy!",
["teamdamageMessage6"] = "you are a counteragent killing more of your own team. Get paid by enemy?",
["deleteSessionsOlderXMonths"] = "0",
},
}

331
noq/noq_db.lua Normal file
View file

@ -0,0 +1,331 @@
-- The NOQ - No Quarter Lua next generation game manager
--
-- A Shrubbot replacement and also kind of new game manager and tracking system based on mysql or sqlite3.
-- Both are supported and in case of sqlite there is no extra sqlite installation needed.
--
-- NQ Lua team 2009-2011 - No warranty :)
-- NQ Lua team is:
-- ailmanki
-- BubbaG1
-- Hose
-- IlDuca
-- IRATA [*]
-- Luborg
-------------------------------------------------------------------------------
-- DBMS
-------------------------------------------------------------------------------
--
-- We could allocate this each time, but since are used lot of times is better to make them global
-- TODO: cur and res are exactly the same things, so we could save memory using only one of them
-- cur = {} -- Will handle the SQL commands returning informations ( es: SELECT )
-- res = {} -- Will handle SQL commands without outputs ( es: INSERT )
-- row = {} -- To manipulate the outputs of SQL command
-- --row1 = {} -- To manipulate the outputs of SQL command in case we need more than one request
-- TODO: does this apply here also? how to do then? ['cur'] and reference it each time?
--
-- TODO: Check for various injections possibilities, create a function to sanitize input!
-- TODO: Merge double code..
DBCon = {
-- Database managment system to use
['dbms'] = getConfig("dbms"), -- possible values mySQL, SQLite
['dbname'] = getConfig("dbname"),
['debugquerries'] = tonumber(getConfig("debugquerries")),
['con'] = nil,
['env'] = nil,
['cur'] = {},
['row'] = {},
['DoConnect'] = function( self )
-- Handle different dbms
if self.dbms == "mySQL" then
require "luasql.mysql"
self.env = assert( luasql.mysql() )
self.con = assert( self.env:connect(self.dbname, getConfig("dbuser"), getConfig("dbpassword"), getConfig("dbhostname"), getConfig("dbport")) )
elseif self.dbms == "SQLite" then
require "luasql.sqlite3"
self.env = assert( luasql.sqlite3() )
-- this opens OR creates a sqlite db - if this file is loaded db is created -fix this?
self.con = assert( self.env:connect( self.dbname ) )
elseif self.dbms == "postgreSQL" then
require "luasql.postgresql"
self.env = assert( luasql.postgresql() )
self.con = assert( self.env:connect(self.dbname, getConfig("dbuser"), getConfig("dbpassword"), getConfig("dbhostname"), getConfig("dbport")) )
else
-- stop script
error("DBMS not supported.")
end
end,
-------------------------------------------------------------------------------
-- DoDisconnect
-- Does close connection to the DBMS
-------------------------------------------------------------------------------
['DoDisconnect'] = function ( self )
self.con:close()
self.env:close()
end,
-------------------------------------------------------------------------------
-- GetVersion
-- Returns DB Version
-------------------------------------------------------------------------------
['GetVersion'] = function( self )
-- Check the database version
self.cur = assert( self.con:execute("SELECT version FROM version ORDER BY id DESC LIMIT 1") )
self.row = self.cur:fetch ({}, "a")
self.cur:close()
return self.row.version -- FIXME: tonumber(self.row.version)
end,
-------------------------------------------------------------------------------
-- SetPlayerAlias
-- Adds an Alias if not existing
-------------------------------------------------------------------------------
['SetPlayerAlias'] = function( self, thisName, thisGuid )
-- search alias based on guid and name
local thisName = string.gsub(thisName,"\'", "\\\'")
self.cur = assert (self.con:execute("SELECT * FROM log WHERE guid1='".. thisGuid .."' AND type='3' AND textxml='<name>".. thisName .."</name>' LIMIT 1"))
self.row = self.cur:fetch ({}, "a")
self.cur:close()
if self.row then
--nothing to do, player name (alias) exists
else
self.cur = assert (self.con:execute("INSERT INTO log (guid1, type, textxml) \
VALUES ('".. thisGuid .."', 3, '<name>".. thisName .."</name>')"))
end
end,
-------------------------------------------------------------------------------
-- GetLogTypefor
-- Searches your type to guid out of the DB
-------------------------------------------------------------------------------
['GetLogTypefor'] = function( self, thisType, thisGuid , thisGuid2 )
local query = "SELECT * FROM log WHERE type='" .. thisType .. "'"
if thisGuid ~= nil then
query = query .. " AND guid1='" .. thisGuid .. "'"
end
if thisGuid2 ~= nil then
query = query .. " AND guid2='" .. thisGuid2 .. "'"
end
--Search the in the database
self.cur = assert (self.con:execute(query))
local numrows = self.cur:numrows()
local pms = {}
if numrows ~= 0 then
for i=1, numrows +1, 1 do
pms[i] = self.cur:fetch ({}, "a")
end
self.cur:close()
return pms
else
return nil
end
end,
-------------------------------------------------------------------------------
-- SetLogEntry
-- Searches your type to guid out of the DB
-------------------------------------------------------------------------------
['SetLogEntry'] = function( self, thisType, thisGuid , thisGuid2, thisXmltext )
self.cur = assert (self.con:execute("INSERT INTO log (guid1, guid2, type, textxml) \
VALUES ('".. thisGuid .."','".. thisGuid2 .."', '".. thisType .."', '".. thisXmltext .."')"))
end,
-------------------------------------------------------------------------------
-- GetPlayerAliases
-- Gives back a table with all aliases know from this player
-------------------------------------------------------------------------------
['GetPlayerAliases'] = function( self, _guid)
local db = self:GetLogTypefor(3,_guid)
aliases = {}
if db ~= nil then
for i,v in ipairs(db) do
v = string.sub(v.textxml, 7, -8) -- <name>FOOBAR</name> cut the tag
aliases[v] = v
end
return aliases
else
return nil
end
end,
-------------------------------------------------------------------------------
-- DelOM
-- Deletes a entry by its id and guid2(used for offlinemsgs)
-------------------------------------------------------------------------------
['DelOM'] = function( self, thisid, thisguid)
self.cur = assert (self.con:execute("DELETE FROM log WHERE id='"..thisid.."' AND guid1='"..thisguid.."'"))
end,
-------------------------------------------------------------------------------
-- DelMail
-- Deletes all entrys for guid with id 5(used for offlinemsgs)
-------------------------------------------------------------------------------
['DelMail'] = function( self, thisguid)
self.cur = assert (self.con:execute("DELETE FROM log WHERE type=5 and guid1='"..thisguid.."'"))
end,
-------------------------------------------------------------------------------
-- GetPlayerbyReg
-- Searches Player by registered Name
-------------------------------------------------------------------------------
['GetPlayerbyReg'] = function( self, name )
self.cur = assert (self.con:execute("SELECT * FROM player WHERE user='".. name .."' LIMIT 1"))
player = self.cur:fetch ({}, "a")
self.cur:close()
return player
end,
-------------------------------------------------------------------------------
-- DoCreateNewPlayer
-- Create a new Player: write to Database, set Xp 0
-- maybe could also be used to reset Player, as pkey is unique
-------------------------------------------------------------------------------
['DoCreateNewPlayer'] = function( self, pkey, isBot, netname, updatedate, createdate, conname )
self.cur = assert( self.con:execute("INSERT INTO player (pkey, isBot, netname, cleanname, updatedate, createdate, conname) VALUES ('"
..pkey.."', "
..isBot..", '"
..netname.."', '"
..et.Q_CleanStr(netname).."', '"
..updatedate .."', '"
..createdate .."', '"
..conname.."')"))
end,
-------------------------------------------------------------------------------
-- SetPlayerSession
-- This is the regular sessions ave of a player
-------------------------------------------------------------------------------
['SetPlayerSession'] = function ( self, player, map, slot)
-- TODO: Think about using this earlier, is this the injection check ?
-- Yes, its an escape function for ' (wich should be the only character allowed by et and with a special meaning for SQL)
-- TODO: What about ET clients which are modified?
local name = string.gsub(player["netname"],"\'", "\\\'")
local sessquery = "INSERT INTO session (pkey, slot, map, ip, netname, cleanname, valid, start, end, sstime, axtime, altime, sptime, xp0, xp1, xp2, xp3, xp4, xp5, xp6, xptot, acc, kills, tkills, death) VALUES ('"
..player["pkey"].."', '"
..slot.."', '"
..map.."', '"
..player["ip"].."', '"
..name.."', '"
..et.Q_CleanStr(name).."', "
.."1"..", '"
..player["start"].."','"
..timehandle('N').. "', '"
-- TODO : check if this works. Is the output from 'D' option in the needed format for the database?
..timehandle('D','N',player["start"]).."' , '"
..player["axtime"].."', '"
..player["altime"].."', '"
..player["sptime"].."', '"
..player["xp0"].."', '"
..player["xp1"].."', '"
..player["xp2"].."', '"
..player["xp3"].."', '"
..player["xp4"].."', '"
..player["xp5"].."', '"
..player["xp6"].."', '"
..player["xptot"].."', '"
.."0".."', '"
..player["kills"].."', '"
..player["tkills"].."', '"
..player["death"].. "')"
if self.debugquerries == 1 then
et.G_LogPrint( "\n\n".. sessquery .. "\n\n" )
end
self.cur = assert (self.con:execute(sessquery))
end,
-------------------------------------------------------------------------------
-- SetPlayerSession_WCD
-- This is called when a player disconnects while connecting
-------------------------------------------------------------------------------
['SetPlayerSessionWCD'] = function ( self, pkey, slot, map, ip, valid, start, ende, sstime, uci )
local query = "INSERT INTO session (pkey, slot, map, ip, valid, start, end, sstime, uci) VALUES ('"
..pkey.."', '"
..slot.."', '"
..map.."', '"
..ip.."', '"
..valid.."', '"
..start.."', '"
..ende.."' , '"
-- TODO : check if this works. Is the output from 'D' option in the needed format for the database?
..sstime.."' , '"
..uci.."')"
if self.debugquerries == 1 then
et.G_LogPrint( "\n\n".. query .. "\n\n" )
end
self.cur = assert (self.con:execute( query ))
end,
-------------------------------------------------------------------------------
-- SetPlayerInfo
-- Sets PlayerInfos
-------------------------------------------------------------------------------
['SetPlayerInfo'] = function (self, player)
local name = string.gsub(player["netname"],"\'", "\\\'")
self.cur = assert (self.con:execute("UPDATE player SET clan='".. player["clan"] .."', \
netname='".. name .."',\
cleanname='"..et.Q_CleanStr(name).."',\
xp0='".. player["xp0"] .."', \
xp1='".. player["xp1"] .."', \
xp2='".. player["xp2"] .."', \
xp3='".. player["xp3"] .."', \
xp4='".. player["xp4"] .."', \
xp5='".. player["xp5"] .."', \
xp6='".. player["xp6"] .."', \
xptot='"..player["xptot"] .. "',\
level='".. player["level"] .."', \
banreason='".. player["banreason"] .."', \
bannedby='".. player["bannedby"] .."', \
banexpire='".. player["banexpire"] .."', \
mutedreason='".. player["mutedreason"] .."', \
mutedby='".. player["mutedby"] .."', \
muteexpire='".. player["muteexpire"] .."', \
warnings='".. player["warnings"] .."', \
suspect='".. player["suspect"] .."' \
WHERE pkey='".. player["pkey"] .."'"))
end,
-------------------------------------------------------------------------------
-- GetPlayerInfo
-- Returns PlayerInfo table
-------------------------------------------------------------------------------
['GetPlayerInfo'] = function( self, thisGuid )
--Search the GUID in the database ( GUID is UNIQUE, so we just have 1 result, stop searching when we have it )
self.cur = assert (self.con:execute("SELECT * FROM player WHERE pkey='".. thisGuid .."' LIMIT 1"))
self.row = self.cur:fetch ({}, "a")
self.cur:close()
return self.row
end,
['DoRegisterUser'] = function ( self, user, password, pkey )
self.cur = assert (self.con:execute("UPDATE player SET user='"..user.."', password=MD5('"..password.."') WHERE pkey='"..pkey.."'"))
end,
-- TODO delete old session if (based on config setting), used in function et_ShutdownGame and cleanSessionCMD
['DoDeleteOldSessions'] = function ( self, months )
-- TODO @luborg this DATE_SUB() is mysql only
self.cur = assert (self.con:execute("DELETE FROM session WHERE `end` < DATE_SUB(CURDATE(), INTERVAL "..months.." MONTH)"))
end
}
return 1

409
noq/noq_i.lua Normal file
View file

@ -0,0 +1,409 @@
--
-- NOQ installer noq_i.lua - as part of the NOQ
--
--
-- Remove this script from game server path after installation
--
--------------------------------------------------------------------------------
color = "^5"
version = "1"
commandprefix = "!"
debug = 1 -- debug 0/1
tablespacer = " " -- use something like " " or "|"
--------------------------------------------------------------------------------
env = nil
con = nil
res = {}
fs_game = et.trap_Cvar_Get("fs_game")
homepath = et.trap_Cvar_Get("fs_homepath")
scriptpath = homepath .. "/" .. fs_game .. "/noq/" -- full qualified path for the NOQ scripts
-------------------------------------------------------------------------------
-- table functions - don't move down or edit!
-------------------------------------------------------------------------------
-- TODO: we use same functions in the noq.lua
-- Find a way to use more centralized
-- The table load
function table.load( sfile )
-- catch marker for stringtable
if string.sub( sfile,-3,-1 ) == "--|" then
tables,err = loadstring( sfile )
else
tables,err = loadfile( sfile )
end
if err then return _,err
end
tables = tables()
for idx = 1,#tables do
local tolinkv,tolinki = {},{}
for i,v in pairs( tables[idx] ) do
if type( v ) == "table" and tables[v[1]] then
table.insert( tolinkv,{ i,tables[v[1]] } )
end
if type( i ) == "table" and tables[i[1]] then
table.insert( tolinki,{ i,tables[i[1]] } )
end
end
-- link values, first due to possible changes of indices
for _,v in ipairs( tolinkv ) do
tables[idx][v[1]] = v[2]
end
-- link indices
for _,v in ipairs( tolinki ) do
tables[idx][v[2]],tables[idx][v[1]] = tables[idx][v[1]],nil
end
end
return tables[1]
end
-- Gets varvalue else null
function getConfig( varname )
local value = noqvartable[varname]
if value then
return value
else
et.G_Print("warning, invalid config value for " .. varname .. "\n")
return "null"
end
end
et.G_LogPrint("Loading NOQ config from ".. scriptpath.."\n")
noqvartable = assert(table.load( scriptpath .. "noq_config.cfg"))
--------------------------------------------------------------------------------
-- Handle different dbms
if getConfig("dbms") == "mySQL" then
require "luasql.mysql"
env = assert( luasql.mysql() )
con = assert( env:connect(getConfig("dbname"), getConfig("dbuser"), getConfig("dbpassword"), getConfig("dbhostname"), getConfig("dbport")) )
elseif getConfig("dbms") == "SQLite" then
require "luasql.sqlite3"
env = assert( luasql.sqlite3() )
-- this opens OR creates a sqlite db - if this file is loaded db is created -fix this?
con = assert( env:connect( getConfig("dbname") ) )
else
-- stop script
error("DBMS not supported.")
end
--------------------------------------------------------------------------------
function et_InitGame( levelTime, randomSeed, restart )
et.trap_SendServerCommand( -1 ,"chat \"" .. color .. "NOQ install " .. version ) -- keep this message so admins know the script is up & running
et.RegisterModname( "NOQ install " .. version .. " " .. et.FindSelf() )
end
function et_ConsoleCommand( command )
if debug == 1 then
et.trap_SendServerCommand( -1 ,"chat \"" .. color .. "ConsoleCommand - command: " .. command )
end
if string.lower(et.trap_Argv(0)) == commandprefix.."sqlcreate" then
createTablesDBMS()
elseif string.lower(et.trap_Argv(0)) == commandprefix.."sqlupdate" then
updateTablesDBMS()
elseif string.lower(et.trap_Argv(0)) == commandprefix.."sqldrop" then
dropTablesDBMS()
elseif string.lower(et.trap_Argv(0)) == commandprefix.."sqlclean" then
-- drop all tables
cleanTablesDBMS()
end
-- add more cmds here ...
end
--
function cleanTablesDBMS()
res = assert(con:execute"delete from player")
et.G_Print(res .. "\n")
res = assert(con:execute"delete from session")
et.G_Print(res .. "\n")
res = assert(con:execute"delete from log")
et.G_Print(res .. "\n")
end
-- For future versions if the db structure does exist
function updateTablesDBMS()
-- alter tables ...
end
function dropTablesDBMS()
res = assert(con:execute"DROP TABLE session")
et.G_Print(res .. "\n")
res = assert(con:execute"DROP TABLE player")
et.G_Print(res .. "\n")
res = assert(con:execute"DROP TABLE log")
et.G_Print(res .. "\n")
res = assert(con:execute"DROP TABLE level")
et.G_Print(res .. "\n")
res = assert(con:execute"DROP TABLE version")
et.G_Print(res .. "\n")
end
function createTablesDBMS()
-- IMPORTANT NOTES for default field values:
-- Mandatory fields to create a table are set as NOT NULL
-- A non existing time is NULL
-- If you add more fields create usefull default values ...
et.G_Print(color .. commandprefix.."sqlcreate for ".. getConfig("dbms") .." started\n")
-- SQLite
if getConfig("dbms") == "SQLite" then
-- Notes:
-- We store timestamps as INTEGER - Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC.
res = assert(con:execute"CREATE TABLE IF NOT EXISTS player ( \
id INTEGER PRIMARY KEY, \
pkey TEXT UNIQUE NOT NULL, \
conname TEXT NOT NULL, \
regname TEXT DEFAULT '', \
netname TEXT DEFAULT '', \
cleanname TEXT DEFAULT '', \
isBot INTEGER DEFAULT 0, \
clan TEXT DEFAULT '', \
level INTEGER DEFAULT 0, \
flags TEXT DEFAULT '', \
user TEXT DEFAULT '', \
password TEXT DEFAULT '', \
email TEXT DEFAULT '', \
xp0 INTEGER DEFAULT 0, \
xp1 INTEGER DEFAULT 0, \
xp2 INTEGER DEFAULT 0, \
xp3 INTEGER DEFAULT 0, \
xp4 INTEGER DEFAULT 0, \
xp5 INTEGER DEFAULT 0, \
xp6 INTEGER DEFAULT 0, \
xptot INTEGER DEFAULT 0, \
banreason TEXT DEFAULT '', \
bannedby TEXT DEFAULT '', \
banexpire DATE DEFAULT '1000-01-01 00:00:00', \
mutedreason TEXT DEFAULT '', \
mutedby TEXT DEFAULT '', \
muteexpire DATE DEFAULT '1000-01-01 00:00:00', \
warnings INTEGER DEFAULT 0, \
suspect INTEGER DEFAULT 0, \
regdate DATE DEFAULT NULL, \
updatedate DATE DEFAULT CURRENT_DATE, \
createdate DATE DEFAULT CURRENT_DATE)" )
et.G_Print(res .. "\n")
res = assert(con:execute"CREATE TABLE IF NOT EXISTS log ( \
id INTEGER PRIMARY KEY, \
guid1 TEXT NOT NULL, \
guid2 TEXT DEFAULT NULL, \
type INTEGER DEFAULT NULL, \
textxml TEXT DEFAULT NULL, \
createdate DATE DEFAULT CURRENT_DATE)")
et.G_Print(res .. "\n")
res = assert(con:execute"CREATE TABLE IF NOT EXISTS session ( \
id INTEGER PRIMARY KEY, \
pkey INTEGER NOT NULL, \
slot INTEGER NOT NULL, \
map TEXT NOT NULL, \
ip TEXT DEFAULT '', \
netname TEXT DEFAULT '', \
cleanname TEXT DEFAULT '', \
valid INTEGER DEFAULT NULL, \
start DATE DEFAULT CURRENT_DATE, \
end DATE DEFAULT NULL, \
sptime INTEGER DEFAULT NULL, \
axtime INTEGER DEFAULT NULL, \
altime INTEGER DEFAULT NULL, \
lctime INTEGER DEFAULT NULL, \
sstime INTEGER DEFAULT NULL, \
xp0 INTEGER DEFAULT 0, \
xp1 INTEGER DEFAULT 0, \
xp2 INTEGER DEFAULT 0, \
xp3 INTEGER DEFAULT 0, \
xp4 INTEGER DEFAULT 0, \
xp5 INTEGER DEFAULT 0, \
xp6 INTEGER DEFAULT 0, \
xptot INTEGER DEFAULT 0, \
acc REAL DEFAULT 0.0, \
kills INTEGER DEFAULT 0, \
tkills INTEGER DEFAULT 0, \
death INTEGER DEFAULT 0, \
revives INTEGER DEFAULT 0, \
uci INTEGER DEFAULT 0)" )
et.G_Print(res .. "\n")
res = assert(con:execute"CREATE TABLE IF NOT EXISTS level ( \
id INTEGER PRIMARY KEY, \
pseudo TEXT UNIQUE NOT NULL, \
name TEXT NOT NULL, \
greetings TEXT DEFAULT '', \
flags TEXT NOT NULL)" )
et.G_Print(res .. "\n")
res = assert(con:execute"CREATE TABLE IF NOT EXISTS version ( \
id INTEGER PRIMARY KEY, \
version INTEGER NOT NULL UNIQUE )" )
et.G_Print(res .. "\n")
-- SQLite needs exra cmds for setting up an index (anybody knows syntax for create table stmd?)
-- player
res = assert(con:execute"CREATE INDEX p_regname ON player( regname )" )
et.G_Print(res .. "\n")
res = assert(con:execute"CREATE INDEX p_netname ON player( netname )" )
et.G_Print(res .. "\n")
--log
res = assert(con:execute"CREATE INDEX l_guid ON log (guid1, guid2)" )
et.G_Print(res .. "\n")
-- session
res = assert(con:execute"CREATE INDEX s_pkey ON session ( pkey )" )
et.G_Print(res .. "\n")
res = assert(con:execute"CREATE INDEX s_ip ON session ( ip )" )
et.G_Print(res .. "\n")
res = assert(con:execute"CREATE INDEX s_end ON session ( end )" )
et.G_Print(res .. "\n")
-- insert data
res = assert(con:execute("INSERT INTO version VALUES ( '1', '" .. version .. "' )"))
et.G_Print(res .. "\n")
-- TODO: create level entries
-- mySQL
elseif getConfig("dbms") == "mySQL" then
res = assert(con:execute"CREATE TABLE player ( \
id INT PRIMARY KEY AUTO_INCREMENT, \
pkey VARCHAR(32) UNIQUE NOT NULL, \
conname VARCHAR(36) NOT NULL, \
regname VARCHAR(36) DEFAULT '', \
netname VARCHAR(36) DEFAULT '', \
cleanname VARCHAR(36) DEFAULT '', \
isBot BOOLEAN DEFAULT 0, \
clan VARCHAR(20) DEFAULT '', \
level INT DEFAULT 0, \
flags VARCHAR(50) DEFAULT '', \
user VARCHAR(20) DEFAULT '', \
password VARCHAR(32) DEFAULT '', \
email VARCHAR(50) DEFAULT '', \
xp0 INT DEFAULT 0, \
xp1 INT DEFAULT 0, \
xp2 INT DEFAULT 0, \
xp3 INT DEFAULT 0, \
xp4 INT DEFAULT 0, \
xp5 INT DEFAULT 0, \
xp6 INT DEFAULT 0, \
xptot INT DEFAULT 0, \
banreason VARCHAR(1024) DEFAULT '', \
bannedby VARCHAR(36) DEFAULT '', \
banexpire DATETIME DEFAULT '1000-01-01 00:00:00', \
mutedreason VARCHAR(1024) DEFAULT '', \
mutedby VARCHAR(36) DEFAULT '', \
muteexpire DATETIME DEFAULT '1000-01-01 00:00:00', \
warnings SMALLINT DEFAULT 0, \
suspect TINYINT DEFAULT 0, \
regdate DATETIME DEFAULT NULL, \
updatedate TIMESTAMP DEFAULT '0000-00-00 00:00:00' on update CURRENT_TIMESTAMP, \
createdate DATETIME NOT NULL, \
INDEX(`regname`), \
INDEX(`netname`) \
) ENGINE=InnoDB" )
et.G_Print(res .. "\n")
res = assert(con:execute"CREATE TABLE IF NOT EXISTS log ( \
id INT PRIMARY KEY AUTO_INCREMENT, \
guid1 VARCHAR(32) NOT NULL, \
guid2 VARCHAR(32) DEFAULT NULL, \
type INT DEFAULT NULL, \
textxml VARCHAR(2056) DEFAULT NULL, \
createdate DATETIME NOT NULL, \
INDEX(`guid1`), \
INDEX(`guid2`) \
) ENGINE=InnoDB" )
et.G_Print(res .. "\n")
res = assert(con:execute"CREATE TABLE session ( \
id INT PRIMARY KEY AUTO_INCREMENT, \
pkey VARCHAR(32) NOT NULL, \
slot SMALLINT NOT NULL, \
map VARCHAR(36) NOT NULL, \
ip VARCHAR(25) DEFAULT '', \
netname VARCHAR(36) DEFAULT '', \
cleanname VARCHAR(36) DEFAULT '', \
valid BOOLEAN DEFAULT NULL, \
start DATETIME NOT NULL, \
end DATETIME DEFAULT NULL, \
sptime TIME DEFAULT NULL, \
axtime TIME DEFAULT NULL, \
altime TIME DEFAULT NULL, \
lctime TIME DEFAULT NULL, \
sstime TIME DEFAULT NULL, \
xp0 INT DEFAULT 0, \
xp1 INT DEFAULT 0, \
xp2 INT DEFAULT 0, \
xp3 INT DEFAULT 0, \
xp4 INT DEFAULT 0, \
xp5 INT DEFAULT 0, \
xp6 INT DEFAULT 0, \
xptot INT DEFAULT 0, \
acc DOUBLE (10,2) DEFAULT 0.0, \
kills SMALLINT DEFAULT 0, \
tkills SMALLINT DEFAULT 0, \
death SMALLINT DEFAULT 0, \
revives SMALLINT DEFAULT 0, \
uci TINYINT DEFAULT 0, \
INDEX(`pkey`), \
INDEX(`ip`), \
INDEX(`end`) \
) ENGINE=InnoDB" )
et.G_Print(res .. "\n")
res = assert(con:execute"CREATE TABLE IF NOT EXISTS level ( \
id INT PRIMARY KEY AUTO_INCREMENT, \
pseudo VARCHAR(15) UNIQUE NOT NULL, \
name VARCHAR(36) NOT NULL, \
greetings VARCHAR(150) DEFAULT '', \
flags VARCHAR(50) NOT NULL)" )
et.G_Print(res .. "\n")
res = assert(con:execute"CREATE TABLE version ( \
id INT PRIMARY KEY AUTO_INCREMENT, \
version INT NOT NULL UNIQUE \
) ENGINE=InnoDB" )
et.G_Print(res .. "\n")
-- mySQL needs a trigger to add the current date/time to a datetime field
res = assert(con:execute"CREATE TRIGGER trigger_player_insert \
BEFORE INSERT ON `player` FOR EACH ROW SET NEW.createdate = NOW();" )
et.G_Print(res .. "\n")
res = assert(con:execute"CREATE TRIGGER trigger_log_insert \
BEFORE INSERT ON `log` FOR EACH ROW SET NEW.createdate = NOW();" )
et.G_Print(res .. "\n")
-- insert data
res = assert(con:execute(string.format("INSERT INTO version VALUES ( 1, %s )",version)))
et.G_Print(res .. "\n")
end
et.G_Print(color .. commandprefix.."sqlcreate database created version: "..version .."\n")
end
function shuttdownDBMS()
if getConfig("dbms") == "mySQL" or getConfig("dbms") == "SQLite" then
con:close()
env:close()
else
-- should never happen
error("DBMS not supported.")
end
end
function et_ShutdownGame( restart )
shuttdownDBMS()
end

83
noq/noq_mods.cfg Normal file
View file

@ -0,0 +1,83 @@
-- put this file into your noquarter path (fs_homepath)
-- never change values here unless you exactly know what you are doing
return {
-- Table: {1}
{
[0]="MOD_UNKNOWN",
"MOD_MACHINEGUN",
"MOD_BROWNING",
"MOD_MG42",
"MOD_GRENADE",
"MOD_KNIFE",
"MOD_LUGER",
"MOD_COLT",
"MOD_MP40",
"MOD_THOMPSON",
"MOD_STEN",
"MOD_GARAND",
"MOD_SILENCER",
"MOD_FG42",
"MOD_FG42_SCOPE",
"MOD_PANZERFAUST",
"MOD_GRENADE_LAUNCHER",
"MOD_FLAMETHROWER",
"MOD_GRENADE_PINEAPPLE",
"MOD_MAPMORTAR",
"MOD_MAPMORTAR_SPLASH",
"MOD_KICKED",
"MOD_DYNAMITE",
"MOD_AIRSTRIKE",
"MOD_SYRINGE",
"MOD_AMMO",
"MOD_ARTY",
"MOD_WATER",
"MOD_SLIME",
"MOD_LAVA",
"MOD_CRUSH",
"MOD_TELEFRAG",
"MOD_FALLING",
"MOD_SUICIDE",
"MOD_TARGET_LASER",
"MOD_TRIGGER_HURT",
"MOD_EXPLOSIVE",
"MOD_CARBINE",
"MOD_KAR98",
"MOD_GPG40",
"MOD_M7",
"MOD_LANDMINE",
"MOD_SATCHEL",
"MOD_SMOKEBOMB",
"MOD_MOBILE_MG42",
"MOD_SILENCED_COLT",
"MOD_GARAND_SCOPE",
"MOD_CRUSH_CONSTRUCTION",
"MOD_CRUSH_CONSTRUCTIONDEATH",
"MOD_CRUSH_CONSTRUCTIONDEATH_NOATTACKER",
"MOD_K43",
"MOD_K43_SCOPE",
"MOD_MORTAR",
"MOD_AKIMBO_COLT",
"MOD_AKIMBO_LUGER",
"MOD_AKIMBO_SILENCEDCOLT",
"MOD_AKIMBO_SILENCEDLUGER",
"MOD_SMOKEGRENADE",
"MOD_SWAP_PLACES",
"MOD_SWITCHTEAM",
"MOD_GOOMBA",
"MOD_POISON",
"MOD_FEAR",
"MOD_CENSORED",
"MOD_SHOTGUN",
"MOD_BACKSTAB",
"MOD_MOBILE_BROWNING",
"MOD_BAR",
"MOD_STG44",
"MOD_BAZOOKA",
"MOD_STEN_MKII",
"MOD_MP34",
"MOD_VENOM",
"MOD_SHOVE",
"MOD_THROWKNIFE",
"MOD_NUM_MODS",
},
}

84
noq/noq_mods_130.cfg Normal file
View file

@ -0,0 +1,84 @@
-- put this file into your noquarter path (fs_homepath)
-- never change values here unless you exactly know what you are doing
return {
-- Table: {1}
{
[0]="MOD_UNKNOWN",
"MOD_MACHINEGUN",
"MOD_BROWNING",
"MOD_MG42",
"MOD_GRENADE",
"MOD_KNIFE",
"MOD_LUGER",
"MOD_COLT",
"MOD_MP40",
"MOD_THOMPSON",
"MOD_STEN",
"MOD_GARAND",
"MOD_SILENCER",
"MOD_FG42",
"MOD_FG42_SCOPE",
"MOD_PANZERFAUST",
"MOD_GRENADE_LAUNCHER",
"MOD_FLAMETHROWER",
"MOD_GRENADE_PINEAPPLE",
"MOD_MAPMORTAR",
"MOD_MAPMORTAR_SPLASH",
"MOD_KICKED",
"MOD_DYNAMITE",
"MOD_AIRSTRIKE",
"MOD_SYRINGE",
"MOD_AMMO",
"MOD_ARTY",
"MOD_WATER",
"MOD_SLIME",
"MOD_LAVA",
"MOD_CRUSH",
"MOD_TELEFRAG",
"MOD_FALLING",
"MOD_SUICIDE",
"MOD_TARGET_LASER",
"MOD_TRIGGER_HURT",
"MOD_EXPLOSIVE",
"MOD_CARBINE",
"MOD_KAR98",
"MOD_GPG40",
"MOD_M7",
"MOD_LANDMINE",
"MOD_SATCHEL",
"MOD_SMOKEBOMB",
"MOD_MOBILE_MG42",
"MOD_SILENCED_COLT",
"MOD_GARAND_SCOPE",
"MOD_CRUSH_CONSTRUCTION",
"MOD_CRUSH_CONSTRUCTIONDEATH",
"MOD_CRUSH_CONSTRUCTIONDEATH_NOATTACKER",
"MOD_K43",
"MOD_K43_SCOPE",
"MOD_MORTAR",
"MOD_AKIMBO_COLT",
"MOD_AKIMBO_LUGER",
"MOD_AKIMBO_SILENCEDCOLT",
"MOD_AKIMBO_SILENCEDLUGER",
"MOD_SMOKEGRENADE",
"MOD_SWAP_PLACES",
"MOD_SWITCHTEAM",
"MOD_GOOMBA",
"MOD_POISON",
"MOD_FEAR",
"MOD_CENSORED",
"MOD_SHOTGUN",
"MOD_BACKSTAB",
"MOD_MOBILE_BROWNING",
"MOD_BAR",
"MOD_STG44",
"MOD_BAZOOKA",
"MOD_JOHNSON",
"MOD_MP34",
"MOD_VENOM",
"MOD_SHOVE",
"MOD_THROWKNIFE",
"MOD_JOHNSON_SCOPE",
"MOD_NUM_MODS",
},
}

83
noq/noq_mods_names.cfg Normal file
View file

@ -0,0 +1,83 @@
-- put this file into your noquarter path (fs_homepath)
-- never change values here unless you exactly know what you are doing
return {
-- Table: {1}
{
MOD_UNKNOWN=0,
MOD_MACHINEGUN=1,
MOD_BROWNING=2,
MOD_MG42=3,
MOD_GRENADE=4,
MOD_KNIFE=5,
MOD_LUGER=6,
MOD_COLT=7,
MOD_MP40=8,
MOD_THOMPSON=9,
MOD_STEN=10,
MOD_GARAND=11,
MOD_SILENCER=12,
MOD_FG42=13,
MOD_FG42_SCOPE=14,
MOD_PANZERFAUST=15,
MOD_GRENADE_LAUNCHER=16,
MOD_FLAMETHROWER=17,
MOD_GRENADE_PINEAPPLE=18,
MOD_MAPMORTAR=19,
MOD_MAPMORTAR_SPLASH=20,
MOD_KICKED=21,
MOD_DYNAMITE=22,
MOD_AIRSTRIKE=23,
MOD_SYRINGE=24,
MOD_AMMO=25,
MOD_ARTY=26,
MOD_WATER=27,
MOD_SLIME=28,
MOD_LAVA=29,
MOD_CRUSH=30,
MOD_TELEFRAG=31,
MOD_FALLING=32,
MOD_SUICIDE=33,
MOD_TARGET_LASER=34,
MOD_TRIGGER_HURT=35,
MOD_EXPLOSIVE=36,
MOD_CARBINE=37,
MOD_KAR98=38,
MOD_GPG40=39,
MOD_M7=40,
MOD_LANDMINE=41,
MOD_SATCHEL=42,
MOD_SMOKEBOMB=43,
MOD_MOBILE_MG42=44,
MOD_SILENCED_COLT=45,
MOD_GARAND_SCOPE=46,
MOD_CRUSH_CONSTRUCTION=47,
MOD_CRUSH_CONSTRUCTIONDEATH=48,
MOD_CRUSH_CONSTRUCTIONDEATH_NOATTACKER=49,
MOD_K43=50,
MOD_K43_SCOPE=51,
MOD_MORTAR=52,
MOD_AKIMBO_COLT=53,
MOD_AKIMBO_LUGER=54,
MOD_AKIMBO_SILENCEDCOLT=55,
MOD_AKIMBO_SILENCEDLUGER=56,
MOD_SMOKEGRENADE=57,
MOD_SWAP_PLACES=58,
MOD_SWITCHTEAM=59,
MOD_GOOMBA=60,
MOD_POISON=61,
MOD_FEAR=62,
MOD_CENSORED=63,
MOD_SHOTGUN=64,
MOD_BACKSTAB=65,
MOD_MOBILE_BROWNING=66,
MOD_BAR=67,
MOD_STG44=68,
MOD_BAZOOKA=69,
MOD_STEN_MKII=70,
MOD_MP34=71,
MOD_VENOM=72,
MOD_SHOVE=73,
MOD_THROWKNIFE=74,
MOD_NUM_MODS=75,
},
}

View file

@ -0,0 +1,84 @@
-- put this file into your noquarter path (fs_homepath)
-- never change values here unless you exactly know what you are doing
return {
-- Table: {1}
{
MOD_UNKNOWN=0,
MOD_MACHINEGUN=1,
MOD_BROWNING=2,
MOD_MG42=3,
MOD_GRENADE=4,
MOD_KNIFE=5,
MOD_LUGER=6,
MOD_COLT=7,
MOD_MP40=8,
MOD_THOMPSON=9,
MOD_STEN=10,
MOD_GARAND=11,
MOD_SILENCER=12,
MOD_FG42=13,
MOD_FG42_SCOPE=14,
MOD_PANZERFAUST=15,
MOD_GRENADE_LAUNCHER=16,
MOD_FLAMETHROWER=17,
MOD_GRENADE_PINEAPPLE=18,
MOD_MAPMORTAR=19,
MOD_MAPMORTAR_SPLASH=20,
MOD_KICKED=21,
MOD_DYNAMITE=22,
MOD_AIRSTRIKE=23,
MOD_SYRINGE=24,
MOD_AMMO=25,
MOD_ARTY=26,
MOD_WATER=27,
MOD_SLIME=28,
MOD_LAVA=29,
MOD_CRUSH=30,
MOD_TELEFRAG=31,
MOD_FALLING=32,
MOD_SUICIDE=33,
MOD_TARGET_LASER=34,
MOD_TRIGGER_HURT=35,
MOD_EXPLOSIVE=36,
MOD_CARBINE=37,
MOD_KAR98=38,
MOD_GPG40=39,
MOD_M7=40,
MOD_LANDMINE=41,
MOD_SATCHEL=42,
MOD_SMOKEBOMB=43,
MOD_MOBILE_MG42=44,
MOD_SILENCED_COLT=45,
MOD_GARAND_SCOPE=46,
MOD_CRUSH_CONSTRUCTION=47,
MOD_CRUSH_CONSTRUCTIONDEATH=48,
MOD_CRUSH_CONSTRUCTIONDEATH_NOATTACKER=49,
MOD_K43=50,
MOD_K43_SCOPE=51,
MOD_MORTAR=52,
MOD_AKIMBO_COLT=53,
MOD_AKIMBO_LUGER=54,
MOD_AKIMBO_SILENCEDCOLT=55,
MOD_AKIMBO_SILENCEDLUGER=56,
MOD_SMOKEGRENADE=57,
MOD_SWAP_PLACES=58,
MOD_SWITCHTEAM=59,
MOD_GOOMBA=60,
MOD_POISON=61,
MOD_FEAR=62,
MOD_CENSORED=63,
MOD_SHOTGUN=64,
MOD_BACKSTAB=65,
MOD_MOBILE_BROWNING=66,
MOD_BAR=67,
MOD_STG44=68,
MOD_BAZOOKA=69,
MOD_JOHNSON=70,
MOD_MP34=71,
MOD_VENOM=72,
MOD_SHOVE=73,
MOD_THROWKNIFE=74,
MOD_JOHNSON_SCOPE=75
MOD_NUM_MODS=76,
},
}

74
noq/noq_weapons.cfg Normal file
View file

@ -0,0 +1,74 @@
-- put this file into your noquarter path (fs_homepath)
-- never change values here unless you exactly know what you are doing
-- TODO: We can use better names here
return {
-- Table: {1}
{
[0]="WP_NONE",
"WP_KNIFE",
"WP_LUGER",
"WP_MP40",
"WP_GRENADE_LAUNCHER",
"WP_PANZERFAUST",
"WP_FLAMETHROWER",
"WP_COLT",
"WP_THOMPSON",
"WP_GRENADE_PINEAPPLE",
"WP_STEN",
"WP_MEDIC_SYRINGE",
"WP_AMMO",
"WP_ARTY",
"WP_SILENCER",
"WP_DYNAMITE",
"WP_SMOKETRAIL",
"VERYBIGEXPLOSION",
"WP_MEDKIT",
"WP_BINOCULARS",
"WP_PLIERS",
"WP_SMOKE_MARKER",
"WP_KAR98",
"WP_CARBINE",
"WP_GARAND",
"WP_LANDMINE",
"WP_SATCHEL",
"WP_SATCHEL_DET",
"WP_SMOKE_BOMB",
"WP_MOBILE_MG42",
"WP_K43",
"WP_FG42",
"WP_DUMMY_MG42",
"WP_MORTAR",
"WP_AKIMBO_COLT",
"WP_AKIMBO_LUGER",
"WP_GPG40",
"WP_M7",
"WP_SILENCED_COLT",
"WP_GARAND_SCOPE",
"WP_K43_SCOPE",
"WP_FG42SCOPE",
"WP_MORTAR_SET",
"WP_MEDIC_ADRENALINE",
"WP_AKIMBO_SILENCEDCOLT",
"WP_AKIMBO_SILENCEDLUGER",
"WP_MOBILE_MG42_SET",
"WP_SHOTGUN",
"WP_KNIFE_KABAR",
"WP_MOBILE_BROWNING",
"WP_MOBILE_BROWNING_SET",
"WP_BAR",
"WP_BAR_SET",
"WP_STG44",
"WP_STEN_MKII",
"WP_BAZOOKA",
"WP_MP34",
"WP_MORTAR2",
"WP_MORTAR2_SET",
"WP_VENOM",
"WP_POISON_SYRINGE",
"WP_FOOTKICK",
"WP_NUM_WEAPONS",
},
}

75
noq/noq_weapons_130.cfg Normal file
View file

@ -0,0 +1,75 @@
-- put this file into your noquarter path (fs_homepath)
-- never change values here unless you exactly know what you are doing
-- TODO: We can use better names here
return {
-- Table: {1}
{
[0]="WP_NONE",
"WP_KNIFE",
"WP_LUGER",
"WP_MP40",
"WP_GRENADE_LAUNCHER",
"WP_PANZERFAUST",
"WP_FLAMETHROWER",
"WP_COLT",
"WP_THOMPSON",
"WP_GRENADE_PINEAPPLE",
"WP_STEN",
"WP_MEDIC_SYRINGE",
"WP_AMMO",
"WP_ARTY",
"WP_SILENCER",
"WP_DYNAMITE",
"WP_SMOKETRAIL",
"VERYBIGEXPLOSION",
"WP_MEDKIT",
"WP_BINOCULARS",
"WP_PLIERS",
"WP_SMOKE_MARKER",
"WP_KAR98",
"WP_CARBINE",
"WP_GARAND",
"WP_LANDMINE",
"WP_SATCHEL",
"WP_SATCHEL_DET",
"WP_SMOKE_BOMB",
"WP_MOBILE_MG42",
"WP_K43",
"WP_FG42",
"WP_DUMMY_MG42",
"WP_MORTAR",
"WP_AKIMBO_COLT",
"WP_AKIMBO_LUGER",
"WP_GPG40",
"WP_M7",
"WP_SILENCED_COLT",
"WP_GARAND_SCOPE",
"WP_K43_SCOPE",
"WP_FG42SCOPE",
"WP_MORTAR_SET",
"WP_MEDIC_ADRENALINE",
"WP_AKIMBO_SILENCEDCOLT",
"WP_AKIMBO_SILENCEDLUGER",
"WP_MOBILE_MG42_SET",
"WP_SHOTGUN",
"WP_KNIFE_KABAR",
"WP_MOBILE_BROWNING",
"WP_MOBILE_BROWNING_SET",
"WP_BAR",
"WP_BAR_SET",
"WP_STG44",
"WP_JOHNSON",
"WP_BAZOOKA",
"WP_MP34",
"WP_MORTAR2",
"WP_MORTAR2_SET",
"WP_VENOM",
"WP_POISON_SYRINGE",
"WP_FOOTKICK",
"WP_JOHNSON_SCOPE",
"WP_NUM_WEAPONS",
},
}

71
noq/noq_weapons_names.cfg Normal file
View file

@ -0,0 +1,71 @@
-- put this file into your noquarter path (fs_homepath)
-- never change values here unless you exactly know what you are doing
return {
-- Table: {1}
{
WP_NONE=0,
WP_KNIFE=1,
WP_LUGER=2,
WP_MP40=3,
WP_GRENADE_LAUNCHER=4,
WP_PANZERFAUST=5,
WP_FLAMETHROWER=6,
WP_COLT=7,
WP_THOMPSON=8,
WP_GRENADE_PINEAPPLE=9,
WP_STEN=10,
WP_MEDIC_SYRINGE=11,
WP_AMMO=12,
WP_ARTY=13,
WP_SILENCER=14,
WP_DYNAMITE=15,
WP_SMOKETRAIL=16,
VERYBIGEXPLOSION=17,
WP_MEDKIT=18,
WP_BINOCULARS=19,
WP_PLIERS=20,
WP_SMOKE_MARKER=21,
WP_KAR98=22,
WP_CARBINE=23,
WP_GARAND=24,
WP_LANDMINE=25,
WP_SATCHEL=26,
WP_SATCHEL_DET=27,
WP_SMOKE_BOMB=28,
WP_MOBILE_MG42=29,
WP_K43=30,
WP_FG42=31,
WP_DUMMY_MG42=32,
WP_MORTAR=33,
WP_AKIMBO_COLT=34,
WP_AKIMBO_LUGER=35,
WP_GPG40=36,
WP_M7=37,
WP_SILENCED_COLT=38,
WP_GARAND_SCOPE=39,
WP_K43_SCOPE=40,
WP_FG42SCOPE=41,
WP_MORTAR_SET=42,
WP_MEDIC_ADRENALINE=43,
WP_AKIMBO_SILENCEDCOLT=44,
WP_AKIMBO_SILENCEDLUGER=45,
WP_MOBILE_MG42_SET=46,
WP_SHOTGUN=47,
WP_KNIFE_KABAR=48,
WP_MOBILE_BROWNING=49,
WP_MOBILE_BROWNING_SET=50,
WP_BAR=51,
WP_BAR_SET=52,
WP_STG44=53,
WP_STEN_MKII=54,
WP_BAZOOKA=55,
WP_MP34=56,
WP_MORTAR2=57,
WP_MORTAR2_SET=58,
WP_VENOM=59,
WP_POISON_SYRINGE=60,
WP_FOOTKICK=61,
WP_NUM_WEAPONS=62,
},
}

View file

@ -0,0 +1,72 @@
-- put this file into your noquarter path (fs_homepath)
-- never change values here unless you exactly know what you are doing
return {
-- Table: {1}
{
WP_NONE=0,
WP_KNIFE=1,
WP_LUGER=2,
WP_MP40=3,
WP_GRENADE_LAUNCHER=4,
WP_PANZERFAUST=5,
WP_FLAMETHROWER=6,
WP_COLT=7,
WP_THOMPSON=8,
WP_GRENADE_PINEAPPLE=9,
WP_STEN=10,
WP_MEDIC_SYRINGE=11,
WP_AMMO=12,
WP_ARTY=13,
WP_SILENCER=14,
WP_DYNAMITE=15,
WP_SMOKETRAIL=16,
VERYBIGEXPLOSION=17,
WP_MEDKIT=18,
WP_BINOCULARS=19,
WP_PLIERS=20,
WP_SMOKE_MARKER=21,
WP_KAR98=22,
WP_CARBINE=23,
WP_GARAND=24,
WP_LANDMINE=25,
WP_SATCHEL=26,
WP_SATCHEL_DET=27,
WP_SMOKE_BOMB=28,
WP_MOBILE_MG42=29,
WP_K43=30,
WP_FG42=31,
WP_DUMMY_MG42=32,
WP_MORTAR=33,
WP_AKIMBO_COLT=34,
WP_AKIMBO_LUGER=35,
WP_GPG40=36,
WP_M7=37,
WP_SILENCED_COLT=38,
WP_GARAND_SCOPE=39,
WP_K43_SCOPE=40,
WP_FG42SCOPE=41,
WP_MORTAR_SET=42,
WP_MEDIC_ADRENALINE=43,
WP_AKIMBO_SILENCEDCOLT=44,
WP_AKIMBO_SILENCEDLUGER=45,
WP_MOBILE_MG42_SET=46,
WP_SHOTGUN=47,
WP_KNIFE_KABAR=48,
WP_MOBILE_BROWNING=49,
WP_MOBILE_BROWNING_SET=50,
WP_BAR=51,
WP_BAR_SET=52,
WP_STG44=53,
WP_JOHNSON=54,
WP_BAZOOKA=55,
WP_MP34=56,
WP_MORTAR2=57,
WP_MORTAR2_SET=58,
WP_VENOM=59,
WP_POISON_SYRINGE=60,
WP_FOOTKICK=61,
WP_JOHNSON_SCOPE=62,
WP_NUM_WEAPONS=63,
},
}

86
noq/nqconst.lua Normal file
View file

@ -0,0 +1,86 @@
-- IRATA [*] - based on etconst.lua from ETPro but slightly modified to fit for NQ
-- never change values here unless you exactly know what you are doing
-- misc q_shared.h
et.MAX_CLIENTS = 64
et.MAX_MODELS = 256
et.MAX_SOUNDS = 256
et.MAX_CS_SKINS = 64
et.MAX_CSSTRINGS = 32
et.MAX_CS_SHADERS = 32
et.MAX_SERVER_TAGS = 256
et.MAX_TAG_FILES = 64
et.MAX_MULTI_SPAWNTARGETS = 16
et.MAX_DLIGHT_CONFIGSTRINGS = 16
et.MAX_SPLINE_CONFIGSTRINGS = 8
-- misc bg_public.h
et.MAX_OID_TRIGGERS = 18
et.MAX_CHARACTERS = 16
et.MAX_TAGCONNECTS = 64
et.MAX_FIRETEAMS = 12
et.MAX_MOTDLINES = 6
-- Config string:
-- q_shared.h
et.CS_SERVERINFO = 0 -- an info string with all the serverinfo cvars
et.CS_SYSTEMINFO = 1 -- an info string for server system to client system configuration (timescale, etc)
-- bg_public.h
et.CS_MUSIC = 2
et.CS_WARMUP = 5 -- server time when the match will be restarted
et.CS_VOTE_TIME = 6
et.CS_VOTE_STRING = 7
et.CS_VOTE_YES = 8
et.CS_VOTE_NO = 9
et.CS_GAME_VERSION = 10
et.CS_LEVEL_START_TIME = 11 -- so the timer only shows the current level
et.CS_INTERMISSION = 12 -- when 1, intermission will start in a second or two
et.CS_MULTI_INFO = 13
et.CS_MULTI_MAPWINNER = 14
et.CS_MULTI_OBJECTIVE = 15
et.CS_SCREENFADE = 17 -- Ridah, used to tell clients to fade their screen to black/normal
et.CS_FOGVARS = 18 -- (SA) used for saving the current state/settings of the fog
et.CS_SKYBOXORG = 19 -- this is where we should view the skybox from
et.CS_TARGETEFFECT = 20
et.CS_WOLFINFO = 21
et.CS_FIRSTBLOOD = 22 -- Team that has first blood
et.CS_ROUNDSCORES1 = 23 -- Axis round wins
et.CS_ROUNDSCORES2 = 24 -- Allied round wins
et.CS_MUSIC_QUEUE = 25
et.CS_SCRIPT_MOVER_NAMES = 26
et.CS_CONSTRUCTION_NAMES = 27
et.CS_REINFSEEDS = 28 -- Reinforcement seeds
et.CS_SERVERTOGGLES = 29 -- Shows current enable/disabled settings (for voting UI)
et.CS_GLOBALFOGVARS = 30
et.CS_AXIS_MAPS_XP = 31
et.CS_ALLIED_MAPS_XP = 32
et.CS_INTERMISSION_START_TIME = 33
et.CS_ENDGAME_STATS = 34
et.CS_CHARGETIMES = 35
et.CS_FILTERCAMS = 36
et.CS_NOQUARTERINFO = 37
et.CS_SKILLLEVELS = 38
et.CS_FORCECVAR = 39
et.CS_SVCVAR = 40
et.CS_CONFIGNAME = 41
et.CS_CSMETHODINFO = 42
et.CS_MODELS = 64
et.CS_SOUNDS = ( et.CS_MODELS + et.MAX_MODELS )
et.CS_SHADERS = ( et.CS_SOUNDS + et.MAX_SOUNDS )
et.CS_SHADERSTATE = ( et.CS_SHADERS + et.MAX_CS_SHADERS )
et.CS_SKINS = ( et.CS_SHADERSTATE + 1 )
et.CS_CHARACTERS = ( et.CS_SKINS + et.MAX_CS_SKINS )
et.CS_PLAYERS = ( et.CS_CHARACTERS + et.MAX_CHARACTERS )
et.CS_MULTI_SPAWNTARGETS = ( et.CS_PLAYERS + et.MAX_CLIENTS )
et.CS_OID_TRIGGERS = ( et.CS_MULTI_SPAWNTARGETS + et.MAX_MULTI_SPAWNTARGETS )
et.CS_OID_DATA = ( et.CS_OID_TRIGGERS + et.MAX_OID_TRIGGERS )
et.CS_DLIGHTS = ( et.CS_OID_DATA + et.MAX_OID_TRIGGERS )
et.CS_SPLINES = ( et.CS_DLIGHTS + et.MAX_DLIGHT_CONFIGSTRINGS )
et.CS_TAGCONNECTS = ( et.CS_SPLINES + et.MAX_SPLINE_CONFIGSTRINGS )
et.CS_FIRETEAMS = ( et.CS_TAGCONNECTS + et.MAX_TAGCONNECTS )
et.CS_CUSTMOTD = ( et.CS_FIRETEAMS + et.MAX_FIRETEAMS )
et.CS_STRINGS = ( et.CS_CUSTMOTD + et.MAX_MOTDLINES )
et.CS_MAX = ( et.CS_STRINGS + et.MAX_CSSTRINGS )
return 1

18
noq/readme.txt Normal file
View file

@ -0,0 +1,18 @@
The NOQ - No Quarter Lua next generation game manager
A Shrubbot replacement and also kind of new game manager and tracking system based on mysql or sqlite3.
Both are supported and in case of sqlite there is no extra sqlite installation needed.
NQ Lua team 2009-2011 - No warranty :)
NQ Lua team is:
ailmanki
BubbaG1
Hose
IlDuca
IRATA [*]
Luborg
For Information about install/config look in the noq.lua file, or get fresh info at:
http://dev.kernwaffe.de/projects/noq/wiki
The NOQ Team - have fun!