Your Filebase for Games like Return to Castle Wolfenstein , Enemy Territory and more ...
version = "1.0.2"
-- kspree.lua logic "stolen" from Vetinari's rspree.lua, who "stole" from etadmin_mod.pl and so on
-- CONSOLE COMMANDS : ksprees, kspeesall, kspreerecords
-- added: new readRecords() function
-- added: First Blood + Last Blood
-- added: Greatshot option, display last killers name v56
-- added: Sorry option, display last TKed's name v45
-- FIXME: recordMessage() does not work everytime -- FIXED !!!
-- FIXME: use wait_table[id] ~= nil --FIXED mmmhhh :/ ???
--
-- If you run etadmin_mod, change the following lines in "etadmin.cfg"
-- spree_detector = 0
-- longest_spree_display = 0
-- persistent_spree_record = 0
-- persistent_map_spree_record = 0
-- first_blood = 0
-- multikill_detector = 0
-- monsterkill_detector = 0
-- last_blood = 0
--
-------------------------------------------------------------------------------------
-------------------------------CONFIG START------------------------------------------
kspree_pos = "b 8"
kspree_color = "8"
kspree_cfg = "killingspree.txt"
record_cfg = "kspree-records.txt"
date_fmt = "%Y-%m-%d, %H:%M:%S"
kmultitk_announce = true -- announce multi TK
kmulti_announce = true -- announce multi/mega/ultra....kill
kmulti_sound = true -- multi-sounds
kspree_sound = true -- spree-sounds
kmulti_pos = "b 8" -- multi + megakill - position
kmonster_pos = "b 32" -- ultra + monster + ludicrous + holy shit - position
kmultitk_pos = "b 32" -- multi TK - position
kmulti_msg = "^7!!!! ^1Multi kill ^7> ^7%s ^7< ^1Multi kill^7 !!!!"
kmega_msg = "^7!!!! ^1Mega kill ^7> ^7%s ^7< ^1Mega kill^7 !!!!"
kultra_msg = "^7!!! ^1ULTRA KILL ^7> ^7%s ^7< ^1ULTRA KILL^7 !!!"
kmonster_msg = "^7!!! ^1MONSTER KILL ^7>>> ^7%s ^7<<< ^1MONSTER KILL^7 !!!"
kludicrous_msg = "^7OMG,^1LUDICROUS KILL ^7>>> ^7%s ^7<<< ^1LUDICROUS KILL^7"
kholyshit_msg = "^1H O L Y S H I T ^7>>> ^7%s ^7<<< ^1H O L Y S H I T^7"
kmultitk_msg = "^7!!! ^1Multi Teamkill ^7> ^7%s ^7< ^1Multi Teamkill^7 !!!"
firstbloodsound = "sound/misc/firstblood.wav"
multisound = "sound/misc/multikill.wav"
megasound = "sound/misc/megakill.wav"
ultrasound = "sound/misc/ultrakill.wav"
monstersound = "sound/misc/monsterkill.wav"
ludicroussound = "sound/misc/ludicrouskill.wav"
holyshitsound = "sound/misc/holyshit.wav"
multitksound = "sound/misc/cry.wav"
killingspreesound = "sound/misc/killingspree.wav"
rampagesound = "sound/misc/rampage.wav"
dominatingsound = "sound/misc/dominating.wav"
godlikesound = "sound/misc/godlike.wav"
unstoppablesound = "sound/misc/unstoppable.wav"
wickedsicksound = "sound/misc/wickedsick.wav"
pottersound = "sound/misc/potter.wav"
killingspree_private = false -- send killingspree message + sound to client only, if set to true
-- (You are on a killing spree), all other messages are global messages, like rampage and so on
kspree_cmd_enabled = true -- set to false to ignore the "kspree_cmd"
kspree_cmd = "!spree_record"
record_cmd = "!ksprees" -- command to print players with most multi,mega,ultra... kills
stats_cmd = "!stats" -- same as etadmin_mod's "!stats", prints personal killing records (i.e. multi,mega,ultra... kills)
statsme_cmd = "!statsme" -- shows ur personal killing stats (private)
srv_record = true -- set to true, if u want to save killing stats
record_last_nick = false -- set to true to keep the last known nick a guid has
records_expire = 60*60*24*5 -- in seconds! 60*60*24*5 == 5 days
allow_spree_sk = false -- allow new killing spree record, even if he killed himself
great_shot = true -- name of ur killer will be added if u vsay "GreatShot" within "great_shot_time" ms
great_shot_time = 5000 -- 5000 = 5 seconds = Five SECONDS
great_shot_repeat = false -- set to true, name will be added everytime u vsay Greatshot within "great_shot_time" ms
sorry = true -- name of ur last tk will be added if u vsay_team "Sorry" within "sorry_time" ms
sorry_time = 9000 -- 9000 = 9 seconds = Nine SECONDS
sorry_repeat = false -- set to true, name will be added everytime u vsay_team "sorry" within "sorry_time" ms
save_awards = true -- save Ludicrouskill + Holy Shit + Multi TK in textfile "awards_file"
awards_file = "awards.txt"
K_Sprees = { -- adjust them to ur needs
[5] = "is on a killing spree",
[10] = "is on a rampage!",
[15] = "is dominating!",
[20] = "is unstoppable!!",
[25] = "is godlike!!!",
[30] = "is wicked sick!!!!",
[35] = "is real POTTER!!!!!",
}
-------------------------------CONFIG END -------------------------------------------
-------------------------------------------------------------------------------------
et.MAX_WEAPONS = 50
EV_GLOBAL_CLIENT_SOUND = 54
killing_sprees = {}
kmax_spree = 0
kmax_id = nil
alltime_stats = {}
kmulti = {}
kmultitk = {}
wait_table = {}
kmap_record = false
srv_records = {}
kendofmap = false
keomap_done = false
gamestate = -1
first_blood = true
last_blood = ""
last_killer = {}
last_tk = {}
kteams = { [0]="Spectator", [1]="Axis", [2]="Allies", [3]="Unknown", }
function et_InitGame(levelTime, randomSeed, restart)
local func_start = et.trap_Milliseconds()
et.RegisterModname("kspree.lua "..version.." "..et.FindSelf())
sv_maxclients = tonumber(et.trap_Cvar_Get("sv_maxclients"))
local i = 0
for i=0, sv_maxclients-1 do
killing_sprees[i] = 0
kmulti[i] = { [1]=0, [2]=0, }
if kmultitk_announce then
kmultitk[i] = { [1]=0, [2]=0, }
end
end
i = readStats(kspree_cfg)
et.G_Printf("kspree.lua: loaded %d alltime stats from %s\n", i, kspree_cfg)
if srv_record then
i = readRecords(record_cfg)
et.G_Printf("kspree.lua: loaded %d alltime records from %s\n", i, record_cfg)
end
et.trap_SendConsoleCommand(et.EXEC_NOW,"sets KSpree_version "..version)
et.G_Printf("bennz's kspree.lua version "..version.." activated...\n")
et.G_Printf("kspree.lua: startup: %d ms\n", et.trap_Milliseconds() - func_start)
end
function sayClients(pos, msg)
et.G_Printf("kspree.lua: sayClients('%s', '%s')\n", pos, msg)
et.trap_SendServerCommand(-1, pos.." \""..msg.."^7\"\n")
end
-- printf wrapper for debugging
function et.G_Printf(...)
et.G_Print(string.format(unpack(arg)))
end
function et.G_ClientSound(clientnum, soundfile)
local tempentity = et.G_TempEntity(et.gentity_get(clientnum, "r.currentOrigin"), EV_GLOBAL_CLIENT_SOUND)
et.gentity_set(tempentity, "s.teamNum", clientnum)
et.gentity_set(tempentity, "s.eventParm", et.G_SoundIndex(soundfile))
end
function mapName ()
return(string.lower(et.trap_Cvar_Get("mapname")))
end
function teamName (t)
if t < 0 or t > 3 then
t = 3
end
return(kteams[t])
end
function getGuid (id)
return(string.lower(et.Info_ValueForKey(et.trap_GetUserinfo(id), "cl_guid")))
end
function playerName(id)
return(et.Info_ValueForKey(et.trap_GetUserinfo(id), "name"))
end
function findMaxKSpree()
local max = alltime_stats[mapName()]
if max == nil then
max = {}
end
return(max)
end
function saveStats(file, list)
local fd, len = et.trap_FS_FOpenFile(file, et.FS_WRITE)
if len == -1 then
et.G_Printf("kspree.lua: failed to open %s", file)
return(0)
end
local head = string.format("# %s, written %s\n", file, os.date())
et.trap_FS_Write(head, string.len(head), fd)
table.foreach(list,
function (first, arr)
local line = first .. ";".. table.concat(arr, ";").."\n"
et.trap_FS_Write(line, string.len(line), fd)
end
)
et.trap_FS_FCloseFile(fd)
end
function readStats(file)
local fd,len = et.trap_FS_FOpenFile( file, et.FS_READ )
local count = 0
if len <= 0 then
et.G_Printf("kspree.lua: no killingspree.txt\n")
else
local filestr = et.trap_FS_Read( fd, len )
et.trap_FS_FCloseFile( fd )
for map,frags,zwiebel,naim in string.gfind(filestr,"[^%#]([%_%w]*)%;(%d*)%;(%d*)%;([^%\n]*)") do
alltime_stats[map] = {
tonumber(frags),
tonumber(zwiebel),
naim
}
count = count + 1
end
end
return(count)
end
function readRecords(file)
local func_start = et.trap_Milliseconds()
local fd,len = et.trap_FS_FOpenFile( file, et.FS_READ )
local count = 0
if len == -1 then
et.G_Printf("kspree.lua: no Spree Records \n")
et.G_Printf("rspree.lua: readRecords(): %d ms\n", et.trap_Milliseconds() - func_start)
end
local guid,multi,mega,ultra,monster,ludic,kills,name,first,last
local now = tonumber(os.date("%s"))
local exp_diff = now - records_expire
local filestr = et.trap_FS_Read( fd, len )
et.trap_FS_FCloseFile( fd )
for guid,multi,mega,ultra,monster,ludic,kills,name,first,last in string.gfind(filestr,
"[^%#](%x+)%;(%d*)%;(%d*)%;(%d*)%;(%d*)%;(%d*)%;(%d*)%;([^;]*)%;(%d*)%;([^%\n]*)") do
local seen = tonumber(last)
if (records_expire == 0) or (exp_diff < seen) then
srv_records[guid] = {
tonumber(multi),
tonumber(mega),
tonumber(ultra),
tonumber(monster),
tonumber(ludic),
tonumber(kills),
name,
tonumber(first),
seen
}
count = count + 1
end
end
et.G_Printf("kspree.lua: readRecords(): %d ms\n", et.trap_Milliseconds() - func_start)
return(count)
end
function et_Print(text)
if kendofmap and string.find(text, "^WeaponStats: ") == 1 then
if not keomap_done then
if kmax_id ~= nil then
local re_name = playerName(kmax_id)
if re_name == "" then
re_name = "^0MIA" -- missing in action
end
local longest = ""
local max = findMaxKSpree()
if table.getn(max) == 3 then
if kmap_record then
longest = " ^"..kspree_color.."This is a New map record!"
saveStats(kspree_cfg, alltime_stats)
else
longest = string.format(" ^7[record: %d by %s^7 @%s]",
max[1], max[3], os.date(date_fmt, max[2]))
end
end
local msg = string.format("^7Longest killing spree: %s^7 with %d kills!%s",
re_name, kmax_spree, longest)
et.trap_SendConsoleCommand(et.EXEC_APPEND, "qsay \""..msg.."^7\"\n")
end
if srv_record then
saveStats(record_cfg, srv_records)
end
keomap_done = true
end
return(nil)
end
if text == "Exit: Timelimit hit.\n" or text == "Exit: Wolf EndRound.\n" then
kendofmap = true
for i = 0, sv_maxclients-1 do
if killing_sprees[i] > 0 then
checkKSpreeEnd(i, 1022, true)
end
end
if last_blood ~= "" then
msg = string.format("^7And the final kill of this round goes to: %s ^7!", last_blood )
et.trap_SendConsoleCommand(et.EXEC_APPEND, "qsay \""..msg.."^7\"\n")
end
return(nil)
end
end
function checkMultiKill (id)
local lvltime = et.trap_Milliseconds()
local guid = getGuid(id)
if (lvltime - kmulti[id][1]) < 3000 then
kmulti[id][2] = kmulti[id][2] + 1
if kmulti[id][2] == 3 then
wait_table[id] = {lvltime, 1}
elseif kmulti[id][2] == 4 then
wait_table[id] = {lvltime, 2}
elseif kmulti[id][2] == 5 then
wait_table[id] = {lvltime, 3}
elseif kmulti[id][2] == 6 then
wait_table[id] = {lvltime, 4}
elseif kmulti[id][2] == 7 then
wait_table[id] = {lvltime, 5}
if save_awards then
add_qwnage(id, 1)
end
elseif kmulti[id][2] == 8 then
wait_table[id] = {lvltime, 6}
if save_awards then
add_qwnage(id, 2)
end
end
else
kmulti[id][2] = 1
end
kmulti[id][1] = lvltime
end
function checkMultiTk(id)
local lvltime = et.trap_Milliseconds()
if (lvltime - kmultitk[id][1]) < 3000 then
kmultitk[id][2] = kmultitk[id][2] + 1
if kmultitk[id][2] == 3 then
sayClients(kmultitk_pos, string.format(kmultitk_msg, playerName(id)))
et.G_globalSound(multitksound)
if save_awards then
add_qwnage(id, 3)
end
end
else
kmultitk[id][2] = 1
end
kmultitk[id][1] = lvltime
end
function et_Obituary(victim, killer, mod)
if gamestate == 0 then
local v_teamid = et.gentity_get(victim, "sess.sessionTeam")
local k_teamid = et.gentity_get(killer, "sess.sessionTeam")
local weapon = et.gentity_get(victim, "s.weapon")
if (victim == killer) then -- suicide
if mod == 37 then
if not allow_spree_sk then
local max = findMaxKSpree()
if table.getn(max) == 3 then
if killing_sprees[victim] > max[1] then
sayClients(kspree_pos, string.format("^%sWhat a pity! ^7%s^%s killed himself. This would have been a new ^qspree record ^%s!",
kspree_color, playerName(victim), kspree_color, kspree_color))
end
end
else
checkKSpreeEnd(victim, killer, false)
end
end
killing_sprees[victim] = 0
elseif (v_teamid == k_teamid) then -- team kill
if kmultitk_announce then
checkMultiTk(killer)
end
if sorry then
last_tk[killer] = {playerName(victim) , et.trap_Milliseconds()}
end
checkKSpreeEnd(victim, killer, false)
killing_sprees[victim] = 0
else -- nomal kill
if killer ~= 1022 and killer ~= 1023 then -- no world / unknown kills
killing_sprees[killer] = killing_sprees[killer] + 1
local guid = getGuid(killer)
if srv_record and guid ~= "" then
-- guid;multi;mega;ultra;monster;ludicrous;revive;nick;firstseen;lastseen
if type(srv_records[guid]) ~= "table" then
srv_records[guid] = { 0, 0, 0, 0, 0, 0, playerName(killer), tonumber(os.date("%s")), 0 }
elseif table.getn(srv_records[guid]) ~= 9 then
srv_records[guid] = { 0, 0, 0, 0, 0, 0, playerName(killer), tonumber(os.date("%s")), 0 }
end
srv_records[guid][6] = srv_records[guid][6] + 1
srv_records[guid][9] = tonumber(os.date("%s"))
if record_last_nick or (srv_records[guid][7] == nil) then
srv_records[guid][7] = playerName(killer)
end
end
if killing_sprees[killer] > kmax_spree then
kmax_spree = killing_sprees[killer]
kmax_id = killer
end
if great_shot then
last_killer[victim] = { playerName(killer), et.trap_Milliseconds() }
end
if first_blood then
sayClients(kmonster_pos, string.format("%s ^1drew first BLOOD ^7!", playerName(killer) ))
et.G_globalSound(firstbloodsound)
first_blood = false
end
if kmulti_announce then
checkMultiKill(killer)
end
last_blood = playerName(killer)
checkKSprees(killer)
checkKSpreeEnd(victim, killer, true)
else
checkKSpreeEnd(victim, killer, false)
end
killing_sprees[victim] = 0
end
end -- gamestate
end
function checkKSpreeEnd(id, killer, normal_kill)
if killing_sprees[id] > 0 then
local m_name = playerName(id)
if m_name == "" then
m_name = "^0MIA" -- missing in action
end
local k_name = ""
if killer == 1022 then
k_name = "End of Round"
elseif killer == 1023 then
k_name = "unknown reasons"
else
k_name = playerName(killer)
end
local krecord = false
local msg = ""
if kmax_id == id and killing_sprees[id] == kmax_spree then
local max = findMaxKSpree()
if table.getn(max) == 3 and kmax_spree > max[1] then
alltime_stats[mapName()] = { kmax_spree, os.date("%s"), m_name }
kmap_record = true
krecord = true
elseif table.getn(max) == 0 then
alltime_stats[mapName()] = { kmax_spree, os.date("%s"), m_name }
kmap_record = true
krecord = true
end
end
if killing_sprees[id] >= 5 then
if normal_kill then -- i.e. no TK or suicide
sayClients(kspree_pos, string.format("%s^%s's killing spree ended (^7%d kills^%s), killed by ^7%s^%s!",
m_name, kspree_color, killing_sprees[id], kspree_color, k_name, kspree_color))
if krecord then
sayClients(kspree_pos, "^"..kspree_color.."This is a new map record!^7")
end
else
if krecord and killer <= sv_maxclients then
sayClients(kspree_pos, string.format("%s^%s's killing spree ended (^7%d kills^%s).",
m_name, kspree_color, killing_sprees[id], kspree_color))
sayClients(kspree_pos, "^"..kspree_color.."This is a new map record !^7")
end
end
end
end
end
function checkKSprees(id)
if killing_sprees[id] ~= 0 then
if math.mod(killing_sprees[id], 5) == 0 then
local spree_id = killing_sprees[id]
local spree = K_Sprees[killing_sprees[id]]
if killing_sprees[id] > 35 then
spree = K_Sprees[35]
end
if spree == nil then
spree = "is on a Killing spree"
et.G_Printf("kspree: Killing spree = nil\n")
end
if spree_id == 5 then
if killingspree_private then
local craap = string.format("%s ^%s: You are on a killing spree! (^75 kills in a row^%s)",
playerName(id), kspree_color, kspree_color)
et.trap_SendServerCommand( id, "b 8 \" "..craap.." \"\n")
--et.G_Sound( id , et.G_SoundIndex("sound/misc/killingspree.wav"))
et.G_ClientSound(id, killingspreesound)
else
sayClients(kspree_pos, string.format("%s^%s %s (^7%d kills in a row^%s)",
playerName(id), kspree_color, spree, killing_sprees[id], kspree_color))
if kspree_sound then
et.G_globalSound(killingspreesound)
end
end
else
sayClients(kspree_pos, string.format("%s^%s %s (^7%d kills in a row^%s)",
playerName(id), kspree_color, spree, killing_sprees[id], kspree_color))
if spree_id == 10 and kspree_sound then
et.G_globalSound(rampagesound)
elseif spree_id == 15 and kspree_sound then
et.G_globalSound(dominatingsound)
elseif spree_id == 20 and kspree_sound then
et.G_globalSound(godlikesound)
elseif spree_id == 25 and kspree_sound then
et.G_globalSound(unstoppablesound)
elseif spree_id == 30 and kspree_sound then
et.G_globalSound(wickedsicksound)
elseif spree_id == 35 and kspree_sound then
et.G_globalSound(pottersound)
end
end --spree_id == 5
end
end
end
function et_RunFrame(levelTime)
if math.mod(levelTime, 500) ~= 0 then return end
local ltm = et.trap_Milliseconds()
gamestate = tonumber(et.trap_Cvar_Get("gamestate"))
if gamestate == 0 then
-- wait before display multi/mega/monster/ludicrous-kill AND display highest
-- wait_table[id] = {lvltime, 2}
table.foreach(wait_table,
function(id, arr)
local guid = getGuid(id)
local m_name = playerName(id)
local startpause = tonumber(arr[1])
local whichkill = arr[2]
if whichkill == 1 and (startpause + 3100) < ltm then
sayClients(kmulti_pos, string.format(kmulti_msg, m_name))
if kmulti_sound then
et.G_globalSound(multisound)
end
if srv_record and guid ~= "" then
srv_records[guid][1] = srv_records[guid][1] + 1
end
wait_table[id] = nil
end
if whichkill == 2 and (startpause + 3100) < ltm then
sayClients(kmulti_pos, string.format(kmega_msg, m_name))
if kmulti_sound then
et.G_globalSound(megasound)
end
if srv_record and guid ~= "" then
srv_records[guid][2] = srv_records[guid][2] + 1
end
wait_table[id] = nil
end
if whichkill == 3 and (startpause + 3100) < ltm then
sayClients(kmonster_pos, string.format(kultra_msg, m_name))
if kmulti_sound then
et.G_globalSound(ultrasound)
end
if srv_record and guid ~= "" then
srv_records[guid][3] = srv_records[guid][3] + 1
end
wait_table[id] = nil
end
if whichkill == 4 and (startpause + 3100) < ltm then
sayClients(kmonster_pos, string.format(kmonster_msg, m_name))
if kmulti_sound then
et.G_globalSound(monstersound)
end
if srv_record and guid ~= "" then
srv_records[guid][4] = srv_records[guid][4] + 1
end
wait_table[id] = nil
end
if whichkill == 5 and (startpause + 3100) < ltm then
sayClients(kmonster_pos, string.format(kludicrous_msg, m_name))
if kmulti_sound then
et.G_globalSound(ludicroussound)
end
if srv_record and guid ~= "" then
srv_records[guid][5] = srv_records[guid][5] + 1
end
wait_table[id] = nil
end
if whichkill == 6 and (startpause + 900) < ltm then
sayClients(kmonster_pos, string.format(kholyshit_msg, m_name))
if kmulti_sound then
et.G_globalSound(holyshitsound)
end
wait_table[id] = nil
end
end) --end table.foreach
end -- gamestate
end
function et_ClientDisconnect(id)
killing_sprees[id] = 0
if great_shot and last_killer[id] ~= nil then
last_killer[id] = nil
end
if sorry and last_tk[id] ~= nil then
last_tk[id] = nil
end
if kmulti_announce and wait_table[id] ~= nil then
wait_table[id] = nil
end
end
function et_ClientCommand(id, command)
if et.trap_Argv(0) == "say" then
if kspree_cmd_enabled and et.trap_Argv(1) == kspree_cmd then
local map_msg = ""
local map_max = findMaxKSpree()
if table.getn(map_max) ~= 3 then
map_max = { 0, 0, nil }
end
if map_max[3] ~= nil then
map_msg = string.format("^1map: ^7%s^1: ^7%s^1 (^7%d^1) @ %s",
mapName(), map_max[3], map_max[1],
os.date(date_fmt, map_max[2]))
else
map_msg = string.format("^1map: ^7%s^1: ^7no record", mapName())
end
local all_msg = ""
local all_max = { 0, 0, nil }
table.foreach(alltime_stats,
function (map, arr)
if arr[1] > all_max[1] then
all_max = arr
end
end)
if all_max[3] ~= nil then
all_msg = string.format(" ^1[^7overall: %s^1 (^7%d^1) @ %s^1]",
all_max[3], all_max[1], os.date(date_fmt, all_max[2]))
end
et.trap_SendConsoleCommand(et.EXEC_APPEND, "qsay \"^1kspree_record: "..map_msg..all_msg.."^7\"\n")
elseif et.trap_Argv(1) == record_cmd and srv_record then
local rec_msg = recordMessage()
et.trap_SendConsoleCommand(et.EXEC_APPEND, "qsay \"^1kspree_record: "..rec_msg.."^7\"\n")
elseif et.trap_Argv(1) == stats_cmd and srv_record then
local stats_msg = statsMessage(id)
et.trap_SendConsoleCommand(et.EXEC_APPEND, "qsay \"^3stats: ^7"..stats_msg.."^7\"\n")
elseif et.trap_Argv(1) == statsme_cmd and srv_record then
local statsme_msg = statsMessage(id)
et.trap_SendServerCommand( id, "b 8 \"^3statsme: ^7"..statsme_msg.." ^7\"\n")
return(1)
end -- end elseif...
end -- et.trap_Argv(0) == "say"
if et.trap_Argv(0) == "vsay" then
if not great_shot then return end
local vsaystring = ParseString(et.trap_Argv(1))
if string.lower(vsaystring[1]) == "greatshot" and last_killer[id] ~= nil and table.getn(vsaystring) < 2 then
if (et.trap_Milliseconds() - tonumber(last_killer[id][2])) < great_shot_time then
local vsaymessage = "Great shot, ^7"..last_killer[id][1].."^r!"
et.trap_SendServerCommand(-1, "vchat 0 "..id.." 50 GreatShot "..math.random(1, 2).." \""..vsaymessage.."\"")
if not great_shot_repeat then
last_killer[id] = nil
end
return(1)
else
return(0)
end
end -- end lower
end -- vsay
if et.trap_Argv(0) == "vsay_team" then
if not sorry then return end
local vsaystring = ParseString(et.trap_Argv(1))
if string.lower(vsaystring[1]) == "sorry" and last_tk[id] ~= nil and table.getn(vsaystring) < 2 then
if (et.trap_Milliseconds() - tonumber(last_tk[id][2])) < sorry_time then
local vsaymessage = "^5Sorry, ^7"..last_tk[id][1].."^5!"
local ppos = et.gentity_get(id,"r.currentOrigin")
local TKer_team = et.gentity_get(id, "sess.sessionTeam")
local cmd = string.format("vtchat 0 %d 50 Sorry %d %d %d %d \"%s\"", id, ppos[1], ppos[2], ppos[3], math.random(1,3), vsaymessage)
for t=0, sv_maxclients-1, 1 do
if et.gentity_get(t, "sess.sessionTeam") == TKer_team then
et.trap_SendServerCommand(t, cmd)
end
end
if not sorry_repeat then
last_tk[id] = nil
end
return(1)
else
return(0)
end
end -- end lower
end -- vsay_team
return(0)
end
function ParseString(inputString)
local i = 1
local t = {}
for w in string.gfind(inputString, "([^%s]+)%s*") do
t[i]=w
i=i+1
end
return t
end
function statsMessage(id)
local guid = getGuid(id)
local stats_arr = {}
local name = playerName(id)
if type(srv_records[guid]) ~= "table" then
return("no killing stats for "..name.."^7")
else
local i = 1
for i=1, 5 do
if srv_records[guid][i] > 0 then
local whatkill = ""
if i == 1 then whatkill = "Multikills,"
elseif i == 2 then whatkill = "Megakills,"
elseif i == 3 then whatkill = "Ultrakills,"
elseif i == 4 then whatkill = "Monsterkills,"
elseif i == 5 then whatkill = "Ludicrouskills"
end
table.insert(stats_arr, string.format("^8%d ^7%s", srv_records[guid][i], whatkill))
end
end
local whathedid = ""
if table.getn(stats_arr) ~= 0 then
table.insert(stats_arr, 1, string.format("^7 has made:"))
table.insert(stats_arr, string.format("^7and"))
whathedid = table.concat(stats_arr, " ")
end
return(string.format("%s^7%s killed a total of ^8%d ^7players since %s",
name, whathedid ,srv_records[guid][6],
os.date(date_fmt, srv_records[guid][8])))
end
end
function recordMessage ()
local rec_arr = {}
local multi_rec = { 0, nil }
local mega_rec = { 0, nil }
local ultra_rec = { 0, nil }
local monster_rec = { 0, nil }
local ludicrous_rec = { 0, nil }
local kill_rec = { 0, nil }
--multikill
table.foreach(srv_records,
function (guid, arr)
if arr[1] > multi_rec[1] then
multi_rec = { arr[1], arr[7] }
end
if arr[2] > mega_rec[1] then
mega_rec = { arr[2], arr[7] }
end
if arr[3] > ultra_rec[1] then
ultra_rec = { arr[3], arr[7] }
end
if arr[4] > monster_rec[1] then
monster_rec = { arr[4], arr[7] }
end
if arr[5] > ludicrous_rec[1] then
ludicrous_rec = { arr[5], arr[7] }
end
if arr[6] > kill_rec[1] then
kill_rec = { arr[6], arr[7] }
end
end)
if multi_rec[2] ~= nil then
table.insert(rec_arr,
string.format("^7%s ^8(^7%d Multikills^8)^7",
multi_rec[2], multi_rec[1]))
end
if mega_rec[2] ~= nil then
table.insert(rec_arr,
string.format("^7%s ^8(^7%d Megakills^8)^7",
mega_rec[2], mega_rec[1]))
end
if ultra_rec[2] ~= nil then
table.insert(rec_arr,
string.format("^7%s ^8(^7%d Ultrakills^8)^7",
ultra_rec[2], ultra_rec[1]))
end
if monster_rec[2] ~= nil then
table.insert(rec_arr,
string.format("^7%s ^8(^7%d Monsterkills^8)^7",
monster_rec[2], monster_rec[1]))
end
if ludicrous_rec[2] ~= nil then
table.insert(rec_arr,
string.format("^7%s ^8(^7%d Ludicrouskills^8)^7",
ludicrous_rec[2], ludicrous_rec[1]))
end
if kill_rec[2] ~= nil then
table.insert(rec_arr,
string.format("^7%s ^7with a total of ^8%d ^7kills^7",
kill_rec[2], kill_rec[1]))
end
if table.getn(rec_arr) ~= 0 then
local oldest = 2147483647 -- 2^31 - 1
table.foreach(srv_records,
function(guid, arr)
if arr[8] < oldest then
oldest = arr[8]
end
end)
return("^7Top killers since "..os.date(date_fmt, oldest).. " are: "..table.concat(rec_arr, ", "))
else
return("^7no records found :(")
end
end
function add_qwnage(id, woot)
local fdqwnage,len = et.trap_FS_FOpenFile( "awards.txt", et.FS_APPEND )
if len == -1 then
et.G_Printf("kspree.lua: failed to save awards for %s\n", playerName(id))
else
if woot == 1 then
qwnage = playerName(id).. " - Ludicrous Kill - "..os.date().."\n"
elseif woot == 2 then
qwnage = playerName(id).. " - Holy Shit - "..os.date().."\n"
elseif woot == 3 then
qwnage = playerName(id).. " - Multi TK - "..os.date().."\n"
end
et.trap_FS_Write( qwnage, string.len(qwnage) ,fdqwnage )
et.trap_FS_FCloseFile( fdqwnage )
end
return(1)
end
function et_ConsoleCommand()
local cmd = et.trap_Argv(0)
local i = 0
if cmd == "ksprees" then
et.G_Printf("ksprees: --------------------\n")
for i=0, sv_maxclients-1 do
if killing_sprees[i] ~= nil and killing_sprees[i] ~= 0 then
et.G_Printf("^7ksprees: %d %s^7 (%s)^7\n",
killing_sprees[i],
playerName(i),
teamName(tonumber(et.gentity_get(i, "sess.sessionTeam"))))
end
end
et.G_Printf("^7ksprees: --------------------\n")
if kmax_id ~= nil then
et.G_Printf("^7Max: %s^7 with %d\n", playerName(kmax_id), kmax_spree)
end
return(1)
elseif cmd == "kspreesall" then
et.G_Printf("^7Alltime killing sprees:\n")
table.foreach(alltime_stats,
function (map, arr)
et.G_Printf("kspreesall: %s: %s^7 with %d kills @%s\n", map, arr[3], arr[1], os.date(date_fmt, arr[2]))
end
)
et.G_Printf("^7Alltime killing sprees END\n")
return(1)
elseif cmd == "kspreerecords" then
et.G_Printf("^1kspree_records: %s\n", recordMessage())
return(1)
end
return(0)
end
File size: 0.62 MB