--Made by Bax/blur local block = {} block.maps = {} block.current = {} local replayingame = false local switch = false local debug = false addHook("NetVars", function(net) block = net($) replayingame = net($) switch = net($) end) /* >[REFERENCE]< Every player gets recorded. Lowest time gets saved. When lowest time gets beaten. The last lowest time gets replaced Everything that needs to be recorded is: Player's Mobj X Player's Mobj Y Player's Mobj Z Player's Mobj Angle Player's CMD Buttons Player's CMD SideMove Player's CMD ForwardMove Player's Mobj Color Player's Name And Player's Skin file reference RaceReplay/{map}/x.sav2 RaceReplay/{map}/best.sav2 this is tiring. i dont give a crap. I'm still making this reusable */ local function RR_RecordPlayers() if (gametype & GT_RACE) or (gametype & GT_COMPETITION) for player in players.iterate() if player and player.mo.valid and (not block.maps[gamemap] and not player.replaybot) block.maps[gamemap] = {} block.maps[gamemap].recordings = {} for player in players.iterate() block.maps[gamemap].recordings[#player] = {} block.maps[gamemap].recordings[#player].x = {} block.maps[gamemap].recordings[#player].y = {} block.maps[gamemap].recordings[#player].z = {} block.maps[gamemap].recordings[#player].angle = {} block.maps[gamemap].recordings[#player].buttons = {} block.maps[gamemap].recordings[#player].sidemove = {} block.maps[gamemap].recordings[#player].forwardmove = {} --block.maps[gamemap].recordings[#player].drawangle = {} block.maps[gamemap].recordings[#player].skin = 0 block.maps[gamemap].recordings[#player].color = 0 block.maps[gamemap].recordings[#player].name = 0 end else if player and player.mo.valid and (block.maps[gamemap] and not player.replaybot) table.insert(block.maps[gamemap].recordings[#player].x, player.mo.x) table.insert(block.maps[gamemap].recordings[#player].y, player.mo.y) table.insert(block.maps[gamemap].recordings[#player].z, player.mo.z) table.insert(block.maps[gamemap].recordings[#player].angle, player.mo.angle) table.insert(block.maps[gamemap].recordings[#player].buttons, player.cmd.buttons) table.insert(block.maps[gamemap].recordings[#player].sidemove, player.cmd.sidemove) table.insert(block.maps[gamemap].recordings[#player].forwardmove, player.cmd.forwardmove) --table.insert(block.maps[gamemap].recordings[#player].drawangle, player.drawangle) block.maps[gamemap].recordings[#player].skin = player.mo.skin block.maps[gamemap].recordings[#player].color = player.mo.color block.maps[gamemap].recordings[#player].name = player.name if debug == true chatprint(block.maps[gamemap].recordings[#player].x[#block.maps[gamemap].recordings[#player].x].." <-X:#/T-> "..tostring(#block.maps[gamemap].recordings[#player].x)) chatprint(block.maps[gamemap].recordings[#player].y[#block.maps[gamemap].recordings[#player].y].." <-Y:#/T-> "..tostring(#block.maps[gamemap].recordings[#player].y)) chatprint(block.maps[gamemap].recordings[#player].z[#block.maps[gamemap].recordings[#player].z].." <-Z:#/T-> "..tostring(#block.maps[gamemap].recordings[#player].z)) end end end end end end local function RR_ReplayPlayer() if (gametype & GT_RACE) or (gametype & GT_COMPETITION) if block.current.skin and block.current.color and switch == false local replayplayer = G_AddPlayer(block.current.skin, block.current.color,"[Bot Recording]", BOT_NONE) replayplayer.replaybot = true switch = true end for player in players.iterate() if player.replaybot and leveltime > 0 and (block.current.angle and leveltime < #block.current.angle) if block.current.angle player.cmd.angleturn = block.current.angle[leveltime] / 65536 end if block.current.buttons player.cmd.buttons = block.current.buttons[leveltime] end if block.current.forwardmove player.cmd.forwardmove = block.current.forwardmove[leveltime] end if block.current.sidemove player.cmd.sidemove = block.current.sidemove[leveltime] end --player.drawangle = block.current.drawangle[leveltime] P_TeleportMove(player.mo, block.current.x[leveltime],block.current.y[leveltime],block.current.z[leveltime]) end end end end local function RR_MapLoad() switch = false --G_AddPlayer(skin, color, name, BOT_NONE) block.current = {} for player in players.iterate() block.maps = {} if player.replaybot if #player ~= 0 COM_BufInsertText(server, "kick "..#player) end end end if (gametype & GT_RACE) or (gametype & GT_COMPETITION) --local file = io.openlocal("RaceReplay/"..gamemap.."/best.sav2", "r") --file:close() /* block.current.x = {} local file = io.openlocal(path.."/x.sav2", "r+") for line in file:lines() do table.insert(block.current.x, line) end file:close() */ local path = "RaceReplay/"..gamemap io.open(path.."/x.sav2", "r", function(file, filename) if file block.current.x = {} for line in file:lines() table.insert(block.current.x, line) end end end) io.open(path.."/y.sav2", "r", function(file, filename) if file block.current.y = {} for line in file:lines() table.insert(block.current.y, line) end end end) io.open(path.."/z.sav2", "r", function(file, filename) if file block.current.z = {} for line in file:lines() table.insert(block.current.z, line) end end end) io.open(path.."/angle.sav2", "r", function(file, filename) if file block.current.angle = {} for line in file:lines() table.insert(block.current.angle, line) end end end) io.open(path.."/buttons.sav2", "r", function(file, filename) if file block.current.buttons = {} for line in file:lines() table.insert(block.current.buttons, line) end end end) io.open(path.."/sidemove.sav2", "r", function(file, filename) if file block.current.sidemove = {} for line in file:lines() table.insert(block.current.sidemove, line) end end end) io.open(path.."/forwardmove.sav2", "r", function(file, filename) if file block.current.forwardmove = {} for line in file:lines() table.insert(block.current.forwardmove, line) end end end) /* block.current.drawangle = {} local file = io.openlocal(path.."/drawangle.sav2", "r+") for line in file:lines() do table.insert(block.current.drawangle, line) end file:close() */ io.open(path.."/color.sav2", "r", function(file, filename) if file for line in file:lines() block.current.color = line print(line) end end end) io.open(path.."/skin.sav2", "r", function(file, filename) if file for line in file:lines() block.current.skin = line end end end) io.open(path.."/name.sav2", "r", function(file, filename) if file for line in file:lines() block.current.name = line print(line) end end end) for player in players.iterate() if player.replaybot and #player == 0 R_SetPlayerSkin(player, block.current.skin) player.color = block.current.color return end end end end local function RR_RenderReplayBot() for player in players.iterate() if player.replaybot player.pflags = $ | PF_GODMODE player.pflags = $ | PF_DIRECTIONCHAR player.mo.frame = $|FF_ADD end end end addHook("PreThinkFrame", RR_RecordPlayers) addHook("PreThinkFrame", RR_ReplayPlayer) addHook("PostThinkFrame", RR_RenderReplayBot) addHook("MapLoad", RR_MapLoad) addHook("PlayerCanDamage", function(player, mobj) if player and player.replaybot and player.valid return false end end) addHook("TouchSpecial", function(special, toucher) if toucher.player.replaybot return true -- overide pickup behavior end end) addHook("PlayerThink", function(p) if (gametype & GT_RACE) or (gametype & GT_COMPETITION) if p.realtime ~= leveltime - 4*TICRATE and p.realtime ~= 0 and p.mo.alreadypassed == false and (not p.replaybot) --chatprint(p.realtime) p.mo.alreadypassed = true if isserver or isdedicatedserver local file = io.openlocal("RaceReplay/"..gamemap.."/best.sav2", "r+") if (not file) or p.realtime < tonumber(file:read("*a")) or tonumber(file:read("*a")) --if p.realtime is less than read file local file = io.openlocal("RaceReplay/"..gamemap.."/best.sav2", "w+") file:write(p.realtime) file:close() local file = io.openlocal("RaceReplay/"..gamemap.."/x.sav2", "w+") file:write("") file:close() local file = io.openlocal("RaceReplay/"..gamemap.."/x.sav2", "a+") for i,v in ipairs(block.maps[gamemap].recordings[#p].x) file:write(v.."\n") end file:close() local file = io.openlocal("RaceReplay/"..gamemap.."/y.sav2", "w+") file:write("") file:close() local file = io.openlocal("RaceReplay/"..gamemap.."/y.sav2", "a+") for i,v in ipairs(block.maps[gamemap].recordings[#p].y) file:write(v.."\n") end file:close() local file = io.openlocal("RaceReplay/"..gamemap.."/z.sav2", "w+") file:write("") file:close() local file = io.openlocal("RaceReplay/"..gamemap.."/z.sav2", "a+") for i,v in ipairs(block.maps[gamemap].recordings[#p].z) file:write(v.."\n") end file:close() local file = io.openlocal("RaceReplay/"..gamemap.."/angle.sav2", "w+") file:write("") file:close() local file = io.openlocal("RaceReplay/"..gamemap.."/angle.sav2", "a+") for i,v in ipairs(block.maps[gamemap].recordings[#p].angle) file:write(v.."\n") end file:close() local file = io.openlocal("RaceReplay/"..gamemap.."/buttons.sav2", "w+") file:write("") file:close() local file = io.openlocal("RaceReplay/"..gamemap.."/buttons.sav2", "a+") for i,v in ipairs(block.maps[gamemap].recordings[#p].buttons) file:write(v.."\n") end file:close() local file = io.openlocal("RaceReplay/"..gamemap.."/sidemove.sav2", "w+") file:write("") file:close() local file = io.openlocal("RaceReplay/"..gamemap.."/sidemove.sav2", "a+") for i,v in ipairs(block.maps[gamemap].recordings[#p].sidemove) file:write(v.."\n") end file:close() local file = io.openlocal("RaceReplay/"..gamemap.."/forwardmove.sav2", "w+") file:write("") file:close() local file = io.openlocal("RaceReplay/"..gamemap.."/forwardmove.sav2", "a+") for i,v in ipairs(block.maps[gamemap].recordings[#p].forwardmove) file:write(v.."\n") end file:close() /* local file = io.openlocal("RaceReplay/"..gamemap.."/drawangle.sav2", "a+") for i,v in ipairs(block.maps[gamemap].recordings[#p].drawangle) file:write(v.."\n") end file:close() */ local file = io.openlocal("RaceReplay/"..gamemap.."/color.sav2", "w+") file:write(block.maps[gamemap].recordings[#p].color) file:close() local file = io.openlocal("RaceReplay/"..gamemap.."/name.sav2", "w+") file:write(block.maps[gamemap].recordings[#p].name) file:close() local file = io.openlocal("RaceReplay/"..gamemap.."/skin.sav2", "w+") file:write(block.maps[gamemap].recordings[#p].skin) file:close() end end end end end) addHook("PlayerSpawn", function(p) if (gametype & GT_RACE) or (gametype & GT_COMPETITION) p.mo.alreadypassed = false end end) hud.add(function(v) if (gametype & GT_RACE) or (gametype & GT_COMPETITION) if block.current.name v.drawString(90,180, "Best Name: \$block.current.name\", V_50TRANS, "small-right") end end end, "scores") --Made by Bax/blur