--Made by Bax/blur local block = {} block.maps = {} block.current = {} local replayingame = false local debug = false addHook("NetVars", function(net) block = net($) replayingame = 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) for player in players.iterate() if not block.maps[gamemap] 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].skin = 0 block.maps[gamemap].recordings[#player].color = 0 block.maps[gamemap].recordings[#player].name = 0 end else 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) 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 if player.realtime == leveltime - 1*TICRATE and o == 0 --resends when coundown is 3 1/2 chatprintf(player, " Player added, synching.") for player in players.iterate() if not player.replaybot COM_BufInsertText(server, "resendgamestate "..#player) -- synch i guess end end end end end end local function RR_ReplayPlayer() if (gametype & GT_RACE) for player in players.iterate() if player.replaybot and leveltime > 0 and leveltime < #block.current.angle player.mo.angle = block.current.angle[leveltime] player.cmd.buttons = block.current.buttons[leveltime] player.cmd.forwardmove = block.current.forwardmove[leveltime] player.cmd.sidemove = block.current.sidemove[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() --G_AddPlayer(skin, color, name, BOT_NONE) block.current = {} for player in players.iterate() block.maps = {} if player.replaybot COM_BufInsertText(server, "kick "..#player) end end if (gametype & GT_RACE) if isserver or isdedicatedserver local file = io.openlocal("RaceReplay/"..gamemap.."/best.sav2", "r+") if file file:close() block.current.x = {} local file = io.openlocal("RaceReplay/"..gamemap.."/x.sav2", "r+") for line in file:lines() do table.insert(block.current.x, line) end file:close() block.current.y = {} local file = io.openlocal("RaceReplay/"..gamemap.."/y.sav2", "r+") for line in file:lines() do table.insert(block.current.y, line) end file:close() block.current.z = {} local file = io.openlocal("RaceReplay/"..gamemap.."/z.sav2", "r+") for line in file:lines() do table.insert(block.current.z, line) end file:close() block.current.angle = {} local file = io.openlocal("RaceReplay/"..gamemap.."/angle.sav2", "r+") for line in file:lines() do table.insert(block.current.angle, line) end file:close() block.current.buttons = {} local file = io.openlocal("RaceReplay/"..gamemap.."/buttons.sav2", "r+") for line in file:lines() do table.insert(block.current.buttons, line) end file:close() block.current.sidemove = {} local file = io.openlocal("RaceReplay/"..gamemap.."/sidemove.sav2", "r+") for line in file:lines() do table.insert(block.current.sidemove, line) end file:close() block.current.forwardmove = {} local file = io.openlocal("RaceReplay/"..gamemap.."/forwardmove.sav2", "r+") for line in file:lines() do table.insert(block.current.forwardmove, line) end file:close() block.current.color = io.openlocal("RaceReplay/"..gamemap.."/color.sav2", "r+"):read("*a") block.current.skin = io.openlocal("RaceReplay/"..gamemap.."/skin.sav2", "r+"):read("*a") block.current.name = io.openlocal("RaceReplay/"..gamemap.."/name.sav2", "r+"):read("*a") local replayplayer = G_AddPlayer(block.current.skin, block.current.color, block.current.name, BOT_NONE) replayplayer.replaybot = true end end end end local function RR_RenderReplayBot() for player in players.iterate() if player.replaybot 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("PlayerThink", function(p) if (gametype & GT_RACE) 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.."/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) p.mo.alreadypassed = false end end) --Made by Bax/blur