diff --git a/leaderboard.lua b/leaderboard.lua index c969380..08e7dd9 100644 --- a/leaderboard.lua +++ b/leaderboard.lua @@ -1221,9 +1221,45 @@ local function writeStats() end end -local function saveTime(player) +local function checkFlags(p) + local flags = 0 - scoreTable = $ or {} + -- Encore + if encoremode then + flags = $ | F_ENCORE + end + + if not cv_spbatk then + cv_spbatk = CV_FindVar("spbatk") + end + + -- SPBAttack + if server.SPBArunning and cv_spbatk.value then + flags = $ | F_SPBATK + + if server.SPBAexpert then + flags = $ | F_SPBEXP + end + if p.SPBAKARTBIG then + flags = $ | F_SPBBIG + end + if p.SPBAjustice then + flags = $ | F_SPBJUS + end + end + + return flags +end + +local function saveTime(player) + -- Disqualify if the flags changed mid trial. + if checkFlags(player) != Flags then + print("Game mode change detected! Time has been disqualified.") + S_StartSound(nil, 110) + return + end + + scoreTable = $ or {} local pskin = skins[player.mo.skin] local newscore = score_t( @@ -1387,13 +1423,7 @@ local function think() end -- Autospec - -- Encore if leveltime == 1 then - Flags = $ & !F_ENCORE - if encoremode then - Flags = $ | F_ENCORE - end - if p then for s in players.iterate do if s.valid and s.spectator then @@ -1402,49 +1432,30 @@ local function think() end end end - if not cv_spbatk then - cv_spbatk = CV_FindVar("spbatk") - end - -- Gamemode flags - Flags = $ & !(F_SPBATK | F_SPBEXP | F_SPBBIG | F_SPBJUS) - if server.SPBArunning - and cv_spbatk.value - and leveltime > START_TIME - (3 * TICRATE) / 2 then - Flags = $ | F_SPBATK - if server.SPBAexpert then - Flags = $ | F_SPBEXP - end + Flags = 0 + if leveltime > START_TIME - (3 * TICRATE) / 2 then if clearcheats then clearcheats = false - for q in players.iterate do - q.SPBAKARTBIG = false - q.SPBAjustice = false - q.SPBAshutup = false + if p then + p.SPBAKARTBIG = false + p.SPBAjustice = false + p.SPBAshutup = false end end - if p then - if p.SPBAKARTBIG then - Flags = $ | F_SPBBIG - end - if p.SPBAjustice then - Flags = $ | F_SPBJUS - end - end + Flags = checkFlags(p) -- make sure the spb actually spawned - if leveltime == START_TIME - 1 then + if server.SPBArunning and leveltime == START_TIME - 1 then if not (server.SPBAbomb and server.SPBAbomb.valid) then -- it didn't spawn, clear spb flags Flags = $ & !(F_SPBATK | F_SPBEXP | F_SPBBIG | F_SPBJUS) end end - else hud.enable("freeplay") end - end scoreTable = getScoreTable(gamemap, Flags) @@ -1454,6 +1465,12 @@ local function think() end if p then + -- must be done before browser control + if p.laps >= mapheaderinfo[gamemap].numlaps and timeFinished == 0 then + timeFinished = p.realtime + saveTime(p) + end + -- Scroll controller -- Spectators can't input buttons so let the gamer do it if drawState == DS_SCROLL then @@ -1509,10 +1526,6 @@ local function think() 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)