From f1a886182c29a55509f7b70b4689ba9cea7c0966 Mon Sep 17 00:00:00 2001 From: Not Date: Mon, 28 Mar 2022 13:13:21 +0200 Subject: [PATCH] v1.2.12 --- leaderboard.lua | 100 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 84 insertions(+), 16 deletions(-) diff --git a/leaderboard.lua b/leaderboard.lua index a2f582d..645c637 100644 --- a/leaderboard.lua +++ b/leaderboard.lua @@ -19,7 +19,10 @@ local F_SPBEXP = 0x8 local clearcheats = false -local startTime = 6 * TICRATE + (3 * TICRATE / 4) +local START_TIME = 6 * TICRATE + (3 * TICRATE / 4) +local AFK_TIMEOUT = TICRATE * 5 +local AFK_BALANCE = TICRATE * 60 +local PREVENT_JOIN_TIME = START_TIME + TICRATE * 5 -- patch caching function local cachePatches @@ -92,6 +95,20 @@ else print("Failed to open file: ", FILENAME) end +local function allowJoin(v) + local y + if v then + y = "yes" + --hud.enable("freeplay") + else + y = "no" + -- Why in gods name does this work on a local server but fails on a public one + --hud.disable("freeplay") + end + + COM_BufInsertText(server, "allowteamchange " + y) +end + local function ingame() local n = 0 for p in players.iterate do @@ -103,11 +120,12 @@ local function ingame() end local function initLeaderboard(player) - if disable and leveltime < startTime then + if disable and leveltime < START_TIME then disable = ingame() > 1 else disable = disable or ingame() > 1 end + player.afkTimeout = leveltime end addHook("PlayerSpawn", initLeaderboard) @@ -220,6 +238,8 @@ addHook("MapLoad", function() timeFinished = 0 splits = {} prevLap = 0 + + allowJoin(true) --printTable(lb) end ) @@ -496,8 +516,37 @@ local function regLap(player) end end +local function getGamer() + for p in players.iterate do + if p.valid and not p.spectator then + return p + end + end +end + local function think() + if disable then + if ingame() > 1 then + for p in players.iterate do + if p.valid and not p.spectator and not p.exiting then + if p.cmd.buttons then + p.afkTimeout = leveltime + end + if p.afkTimeout + AFK_BALANCE < leveltime then + p.spectator = true + chatprint("\x89" + p.name + " was moved to the other team for game balance", true) + end + end + end + else + for p in players.iterate do + if p.valid and not p.spectator then + p.afkTimeout = leveltime + end + end + end + help = true return end @@ -505,9 +554,10 @@ local function think() showSplit = showSplit - 1 end - if leveltime < startTime then + local p = getGamer() + if leveltime < START_TIME then -- Help message - if leveltime == startTime - TICRATE * 3 then + if leveltime == START_TIME - TICRATE * 3 then if ingame() == 1 then if help then help = false @@ -520,16 +570,10 @@ local function think() -- Autospec if leveltime == 1 then - local gamer = nil - for p in players.iterate do - if p.valid and not p.spectator then - gamer = #p - end - end - if gamer then - for p in players.iterate do - if p.valid and p.spectator then - COM_BufInsertText(p, string.format("view \"%d\"", gamer)) + if p then + for s in players.iterate do + if s.valid and s.spectator then + COM_BufInsertText(s, string.format("view \"%d\"", #p)) end end end @@ -537,7 +581,7 @@ local function think() -- Gamemode flags Flags = $ & !(F_SPBATK | F_SPBEXP | F_SPBBIG | F_SPBJUS) - if leveltime > startTime - (3 * TICRATE) / 2 and server.SPBArunning then + if leveltime > START_TIME - (3 * TICRATE) / 2 and server.SPBArunning then Flags = $ | F_SPBATK if server.SPBAexpert then Flags = $ | F_SPBEXP @@ -563,16 +607,40 @@ local function think() end end - for p in players.iterate do + local cv_teamchange = CV_FindVar("allowteamchange") + if p then + if p.cmd.buttons then + p.afkTimeout = leveltime + end + + if leveltime > PREVENT_JOIN_TIME and p.afkTimeout + AFK_TIMEOUT > leveltime then + if cv_teamchange.value then + allowJoin(false) + end + elseif p.afkTimeout + AFK_TIMEOUT < leveltime then + if not cv_teamchange.value then + allowJoin(true) + end + end + if p.laps >= mapheaderinfo[gamemap].numlaps and timeFinished == 0 then timeFinished = p.realtime saveTime(p) end regLap(p) + elseif cv_teamchange.value == 0 then + allowJoin(true) end end addHook("ThinkFrame", think) +local function resetTeamchange() + if not CV_FindVar("allowteamchange").value then + allowJoin(true) + end +end +addHook("IntermissionThinker", resetTeamchange) + local function netvars(net) lb = net($) end