2016-02-13 11:19:37 +00:00
-- WolfAdmin module for Wolfenstein: Enemy Territory servers.
-- Copyright (C) 2015 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 <http://www.gnu.org/licenses/>.
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 db = require " luascripts.wolfadmin.db.db "
local game = require " luascripts.wolfadmin.game.game "
local stats = require " luascripts.wolfadmin.players.stats "
local sprees = { }
local revivespreeMessages = {
[ 3 ] = {
[ " msg " ] = " ^dis on a ^2revive spree^d! " ,
[ " sound " ] = " " ,
} ,
[ 5 ] = {
[ " msg " ] = " ^dis a ^2revive magnet^d! " ,
[ " sound " ] = " " ,
} ,
[ 10 ] = {
[ " msg " ] = " ^dis a ^2syringe maniac^d! " ,
[ " sound " ] = " " ,
} ,
[ 15 ] = {
[ " msg " ] = " ^dis the new ^2Dr. Frankenstein^d! " ,
[ " sound " ] = " " ,
} ,
}
local currentRecords -- cached version
local currentMapId
function sprees . get ( )
local records = currentRecords
if records [ " ksrecord " ] and records [ " ksrecord " ] > 0 then
records [ " ksname " ] = db.getlastalias ( records [ " ksplayer " ] ) [ " alias " ]
end
if records [ " dsrecord " ] and records [ " dsrecord " ] > 0 then
records [ " dsname " ] = db.getlastalias ( records [ " dsplayer " ] ) [ " alias " ]
end
if records [ " rsrecord " ] and records [ " rsrecord " ] > 0 then
records [ " rsname " ] = db.getlastalias ( records [ " rsplayer " ] ) [ " alias " ]
end
return records
end
2016-02-13 11:20:14 +00:00
function sprees . reset ( truncate )
if truncate then
db.removeallrecords ( )
else
db.removerecords ( currentMapId )
end
2016-02-13 11:19:37 +00:00
currentRecords = db.getrecords ( currentMapId )
end
function sprees . load ( )
local map = db.getmap ( game.getMap ( ) )
if map then
currentMapId = map [ " id " ]
db.updatemap ( currentMapId , os.time ( ) )
else
db.addmap ( game.getMap ( ) , os.time ( ) )
currentMapId = db.getmap ( game.getMap ( ) ) [ " id " ]
end
currentRecords = db.getrecords ( currentMapId )
return db.getrecordscount ( currentMapId )
end
function sprees . oninit ( levelTime , randomSeed , restartMap )
2016-02-13 11:20:14 +00:00
if
( settings.get ( " db_type " ) == " cfg " and settings.get ( " g_fileSprees " ) ~= " " ) or
( settings.get ( " db_type " ) ~= " cfg " and settings.get ( " g_spreeRecords " ) ~= 0 )
then
2016-02-13 11:19:37 +00:00
sprees.load ( )
events.handle ( " onGameStateChange " , sprees.ongamestatechange )
end
end
events.handle ( " onGameInit " , sprees.oninit )
function sprees . onconnect ( clientId , firstTime , isBot )
stats.set ( clientId , " currentKillSpree " , 0 )
stats.set ( clientId , " longestKillSpree " , 0 )
stats.set ( clientId , " currentDeathSpree " , 0 )
stats.set ( clientId , " longestDeathSpree " , 0 )
stats.set ( clientId , " currentReviveSpree " , 0 )
stats.set ( clientId , " longestReviveSpree " , 0 )
end
events.handle ( " onClientConnect " , sprees.onconnect )
function sprees . ongamestatechange ( gameState )
2016-02-13 11:20:14 +00:00
if gameState == constants.GAME_RUNNING then
events.handle ( " onPlayerDeath " , sprees.ondeath )
events.handle ( " onPlayerRevive " , sprees.onrevive )
elseif gameState == constants.GAME_INTERMISSION then
2016-02-13 11:19:37 +00:00
if currentRecords [ " ksrecord " ] and currentRecords [ " ksrecord " ] > 0 then
if db.getrecord ( currentMapId , constants.RECORD_KILL ) then
db.updaterecord ( currentMapId , os.time ( ) , constants.RECORD_KILL , currentRecords [ " ksrecord " ] , currentRecords [ " ksplayer " ] )
else
db.addrecord ( currentMapId , os.time ( ) , constants.RECORD_KILL , currentRecords [ " ksrecord " ] , currentRecords [ " ksplayer " ] )
end
et.trap_SendConsoleCommand ( et.EXEC_APPEND , " chat \" ^dsprees: ^9longest kill spree (^7 " .. currentRecords [ " ksrecord " ] .. " ^9) by ^7 " .. db.getlastalias ( currentRecords [ " ksplayer " ] ) [ " alias " ] .. " ^9. \" ; " )
end
if currentRecords [ " dsrecord " ] and currentRecords [ " dsrecord " ] > 0 then
if db.getrecord ( currentMapId , constants.RECORD_DEATH ) then
db.updaterecord ( currentMapId , os.time ( ) , constants.RECORD_DEATH , currentRecords [ " dsrecord " ] , currentRecords [ " dsplayer " ] )
else
db.addrecord ( currentMapId , os.time ( ) , constants.RECORD_DEATH , currentRecords [ " dsrecord " ] , currentRecords [ " dsplayer " ] )
end
et.trap_SendConsoleCommand ( et.EXEC_APPEND , " chat \" ^dsprees: ^9longest death spree (^7 " .. currentRecords [ " dsrecord " ] .. " ^9) by ^7 " .. db.getlastalias ( currentRecords [ " dsplayer " ] ) [ " alias " ] .. " ^9. \" ; " )
end
if currentRecords [ " rsrecord " ] and currentRecords [ " rsrecord " ] > 0 then
if db.getrecord ( currentMapId , constants.RECORD_REVIVE ) then
db.updaterecord ( currentMapId , os.time ( ) , constants.RECORD_REVIVE , currentRecords [ " rsrecord " ] , currentRecords [ " rsplayer " ] )
else
db.addrecord ( currentMapId , os.time ( ) , constants.RECORD_REVIVE , currentRecords [ " rsrecord " ] , currentRecords [ " rsplayer " ] )
end
et.trap_SendConsoleCommand ( et.EXEC_APPEND , " chat \" ^dsprees: ^9longest revive spree (^7 " .. currentRecords [ " rsrecord " ] .. " ^9) by ^7 " .. db.getlastalias ( currentRecords [ " rsplayer " ] ) [ " alias " ] .. " ^9. \" ; " )
end
end
end
function sprees . ondeath ( victimId , killerId , mod )
if killerId == 1022 then -- killed by map
stats.set ( victimId , " currentKillSpree " , 0 )
stats.add ( victimId , " currentDeathSpree " , 1 )
stats.set ( victimId , " currentReviveSpree " , 0 )
stats.set ( victimId , " longestDeathSpree " , stats.get ( victimId , " currentDeathSpree " ) > stats.get ( victimId , " longestDeathSpree " ) and stats.get ( victimId , " currentDeathSpree " ) or stats.get ( victimId , " longestDeathSpree " ) )
elseif victimId == killerId then -- suicides
-- happens when a bot disconnects, it selfkills before leaving, thus emptying the
-- player data table, resulting in errors. I'm sorry for your spree records, bots.
if not wolfa_isPlayer ( victimId ) then return end
stats.set ( victimId , " currentKillSpree " , 0 )
stats.add ( victimId , " currentDeathSpree " , 1 )
stats.set ( victimId , " currentReviveSpree " , 0 )
stats.set ( victimId , " longestDeathSpree " , stats.get ( victimId , " currentDeathSpree " ) > stats.get ( victimId , " longestDeathSpree " ) and stats.get ( victimId , " currentDeathSpree " ) or stats.get ( victimId , " longestDeathSpree " ) )
2016-02-13 11:20:14 +00:00
if ( settings.get ( " g_botRecords " ) == 1 or not stats.get ( victimId , " isBot " ) ) and ( not currentRecords [ " dsrecord " ] or stats.get ( victimId , " longestDeathSpree " ) > currentRecords [ " dsrecord " ] ) then
2016-02-13 11:19:37 +00:00
currentRecords [ " dsplayer " ] = db.getplayerid ( victimId )
currentRecords [ " dsrecord " ] = stats.get ( victimId , " longestDeathSpree " )
end
else -- regular kills
if et.gentity_get ( victimId , " sess.sessionTeam " ) == et.gentity_get ( killerId , " sess.sessionTeam " ) then
-- teamkill handling
else
stats.add ( killerId , " currentKillSpree " , 1 )
stats.set ( killerId , " currentDeathSpree " , 0 )
stats.set ( killerId , " longestKillSpree " , stats.get ( killerId , " currentKillSpree " ) > stats.get ( killerId , " longestKillSpree " ) and stats.get ( killerId , " currentKillSpree " ) or stats.get ( killerId , " longestKillSpree " ) )
2016-02-13 11:20:14 +00:00
if ( settings.get ( " g_botRecords " ) == 1 or not stats.get ( killerId , " isBot " ) ) and ( not currentRecords [ " ksrecord " ] or stats.get ( killerId , " longestKillSpree " ) > currentRecords [ " ksrecord " ] ) then
2016-02-13 11:19:37 +00:00
currentRecords [ " ksplayer " ] = db.getplayerid ( killerId )
currentRecords [ " ksrecord " ] = stats.get ( killerId , " longestKillSpree " )
end
-- happens when a bot disconnects, it selfkills before leaving, thus emptying the
-- player data table, resulting in errors. I'm sorry for your spree records, bots.
if not wolfa_isPlayer ( victimId ) then return end
stats.set ( victimId , " currentKillSpree " , 0 )
stats.add ( victimId , " currentDeathSpree " , 1 )
stats.set ( victimId , " currentReviveSpree " , 0 )
stats.set ( victimId , " longestDeathSpree " , stats.get ( victimId , " currentDeathSpree " ) > stats.get ( victimId , " longestDeathSpree " ) and stats.get ( victimId , " currentDeathSpree " ) or stats.get ( victimId , " longestDeathSpree " ) )
2016-02-13 11:20:14 +00:00
if ( settings.get ( " g_botRecords " ) == 1 or not stats.get ( victimId , " isBot " ) ) and ( not currentRecords [ " dsrecord " ] or stats.get ( victimId , " longestDeathSpree " ) > currentRecords [ " dsrecord " ] ) then
2016-02-13 11:19:37 +00:00
currentRecords [ " dsplayer " ] = db.getplayerid ( victimId )
currentRecords [ " dsrecord " ] = stats.get ( victimId , " longestDeathSpree " )
end
end
end
end
function sprees . onrevive ( clientMedic , clientVictim )
stats.add ( clientMedic , " currentReviveSpree " , 1 )
stats.set ( clientMedic , " longestReviveSpree " , stats.get ( clientMedic , " currentReviveSpree " ) > stats.get ( clientMedic , " longestReviveSpree " ) and stats.get ( clientMedic , " currentReviveSpree " ) or stats.get ( clientMedic , " longestReviveSpree " ) )
if revivespreeMessages [ stats.get ( clientMedic , " currentReviveSpree " ) ] then
et.trap_SendConsoleCommand ( et.EXEC_APPEND , " chat \" ^1REVIVE SPREE! ^* " .. stats.get ( clientMedic , " playerName " ) .. " ^* " .. revivespreeMessages [ stats.get ( clientMedic , " currentReviveSpree " ) ] [ " msg " ] .. " ^d(^3 " .. stats.get ( clientMedic , " currentReviveSpree " ) .. " ^drevives in a row!) \" ; " )
end
2016-02-13 11:20:14 +00:00
if ( settings.get ( " g_botRecords " ) == 1 or not stats.get ( clientMedic , " isBot " ) ) and ( not currentRecords [ " rsrecord " ] or stats.get ( clientMedic , " longestReviveSpree " ) > currentRecords [ " rsrecord " ] ) then
2016-02-13 11:19:37 +00:00
currentRecords [ " rsplayer " ] = db.getplayerid ( clientMedic )
currentRecords [ " rsrecord " ] = stats.get ( clientMedic , " longestReviveSpree " )
end
end
return sprees