--pavetr.top/ds -- Serialization (pickle.lua edited 4 gmod) function pickle(t) return Pickle:clone():pickle_(t) end Pickle = { clone = function(t) local nt = {} for i, v in pairs(t) do nt[i] = v end return nt end } function Pickle:pickle_(root) if type(root) ~= "table" then error("can only pickle tables, not " .. type(root) .. "s") end self._tableToRef = {} self._refToTable = {} local savecount = 0 self:ref_(root) local s = "" while #self._refToTable > savecount do savecount = savecount + 1 local t = self._refToTable[savecount] s = s .. "{" for i, v in pairs(t) do s = string.format("%s[%s]=%s,", s, self:value_(i), self:value_(v)) end s = s .. "}," end return string.format("{%s}", s) end function Pickle:value_(v) local vtype = type(v) if vtype == "string" then return string.format("%q", v) elseif vtype == "number" then return v elseif vtype == "boolean" then return tostring(v) elseif vtype == "table" then return "{" .. self:ref_(v) .. "}" else end end function Pickle:ref_(t) local ref = self._tableToRef[t] if not ref then if t == self then error("can't pickle the pickle class") end table.insert(self._refToTable, t) ref = #self._refToTable self._tableToRef[t] = ref end return ref end function unpickle(s) if type(s) ~= "string" then error("can't unpickle a " .. type(s) .. ", only strings") end local gentables = CompileString("return " .. s, "Deserialize", false) local tables = gentables() for tnum = 1, #tables do local t = tables[tnum] local tcopy = {} for i, v in pairs(t) do tcopy[i] = v end for i, v in pairs(tcopy) do local ni, nv if type(i) == "table" then ni = tables[i[1]] else ni = i end if type(v) == "table" then nv = tables[v[1]] else nv = v end t[i] = nil t[ni] = nv end end return tables[1] end -- Movement Recorder MR = MR or {} -- CONFIG MR.PlaybackKey = 38 -- num1 MR.PlaybackLoopKey = 39 -- num2 MR.RecordKey = 41 -- num4 MR.StopKey = 40 -- num3 --CODE MR.atStart = false MR.playbackIterator = 1 MR.lastDistance = 0 MR.Movements = {} MR.isRecording = false MR.LoadedMovements = {} MR.MovementsName = {} MR.ClosestMovement = {} if (not file.Exists("MovementRecorder.dat", "DATA")) then file.Write("MovementRecorder.dat", "") end function MR.SaveMovement(movements) local frame = vgui.Create("DFrame") frame:SetSize(250, 100) frame:SetTitle("Movement Save") frame:Center() frame:MakePopup() local TextEntryPH = vgui.Create("DTextEntry", frame) TextEntryPH:Dock(TOP) TextEntryPH:DockMargin(0, 5, 0, 0) TextEntryPH:SetPlaceholderText("Movement Name") local DermaButton = vgui.Create("DButton", frame) DermaButton:SetText("Save Movement") DermaButton:Dock(TOP) DermaButton:DockMargin(0, 10, 0, 0) DermaButton.DoClick = function() file.Append("MovementRecorder.dat", TextEntryPH:GetValue() .. "|" .. pickle(movements) .. "\n") MR.Movements = {} MR.LoadMovement() end end function MR.LoadMovement() MR.LoadedMovements = {} MR.MovementsName = {} local uhu = string.Explode("\n", file.Read("MovementRecorder.dat")) for i = 1, #uhu do if (uhu[i] ~= "") then local huh = string.Explode("|", uhu[i]) if MR.LoadedMovements[huh[1]] == nil then table.insert(MR.MovementsName, huh[1]) MR.LoadedMovements[huh[1]] = unpickle(huh[2]) end end end end MR.LoadMovement() function MR.MoveToStart(destination, cmd) local deg2rad = (math.pi / 180) local deltaView, f1, f2 local viewangle_x = exechack_api.GetCheatAngle()["pitch"] local viewangle_y = exechack_api.GetCheatAngle()["yaw"] local viewangle_z = exechack_api.GetCheatAngle()["roll"] local fOldForward = cmd:GetForwardMove() local fOldSidemove = cmd:GetSideMove() if (destination < 0) then f1 = 360 + destination else f1 = destination end if (viewangle_y < 0) then f2 = 360 + viewangle_y else f2 = viewangle_y end if (f2 < f1) then deltaView = math.abs(f2 - f1) else deltaView = 360 - math.abs(f1 - f2) end deltaView = 360 - deltaView cmd:SetForwardMove(math.cos((deg2rad * deltaView)) * fOldForward + math.cos((deg2rad * (deltaView + 90))) * fOldSidemove) cmd:SetSideMove(math.sin((deg2rad * deltaView)) * fOldForward + math.sin((deg2rad * (deltaView + 90))) * fOldSidemove) end function MR.FindClosest() local minDistance = math.huge local minMovement = nil for k, v in pairs(MR.LoadedMovements) do if v ~= nil then local distance = LocalPlayer():GetPos():Distance(Vector(MR.LoadedMovements[k][1][8], MR.LoadedMovements[k][1][9], MR.LoadedMovements[k][1][10])) if distance < minDistance then minDistance = distance minMovement = v end end end if #MR.Movements ~= 0 then local distance = LocalPlayer():GetPos():Distance(Vector(MR.Movements[1][8], MR.Movements[1][9], MR.Movements[1][10])) if distance < minDistance then minDistance = distance minMovement = MR.Movements end end return minMovement end timer.Create("MR::Timer", 1, 0, function() if MR.isPlayback or MR.isPlaybackLoop then return end MR.ClosestMovement = MR.FindClosest() end) function MR.DrawPath(moves, opti, isPlayback) local lastPos = Vector(moves[1][8], moves[1][9], moves[1][10]) for i = 2, #moves / opti do local curPos = Vector(moves[i * opti][8], moves[i * opti][9], moves[i * opti][10]) if lastPos ~= nil and curPos ~= nil then if isPlayback then if i < MR.playbackIterator / opti then render.DrawLine(lastPos, curPos, Color(0, 0, 0), false) else render.DrawLine(lastPos, curPos, Color(255, 150, 0), false) end else render.DrawLine(lastPos, curPos, Color(255, 150, 0), false) end end lastPos = curPos end end hook.Add("HUDPaint", "MR::HUDPaint", function() if MR.isRecording then draw.SimpleTextOutlined('*RECORDING*', 'DermaLarge', ScrW() / 2, ScrH() / 5, Color(255, 150, 0, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0, 255)) end if MR.isPlayback then if MR.atStart then draw.SimpleTextOutlined('*PLAYBACK*', 'DermaLarge', ScrW() / 2, ScrH() / 5, Color(255, 150, 0, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0, 255)) else draw.SimpleTextOutlined('*GOING TO START POSITION*', 'DermaLarge', ScrW() / 2, ScrH() / 5, Color(255, 150, 0, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0, 255)) end cam.Start3D(EyePos(), EyeAngles()) MR.DrawPath(MR.ClosestMovement, 20, true) cam.End3D() else if ((MR.ClosestMovement ~= nil and #MR.ClosestMovement ~= 0) and (LocalPlayer():GetPos():Distance(Vector(MR.ClosestMovement[1][8], MR.ClosestMovement[1][9], MR.ClosestMovement[1][10])) < 1500)) then cam.Start3D(EyePos(), EyeAngles()) MR.DrawPath(MR.ClosestMovement, 20, false) cam.End3D() end end for k, v in pairs(MR.LoadedMovements) do if v ~= nil then local x, y, z = MR.LoadedMovements[k][1][8], MR.LoadedMovements[k][1][9], MR.LoadedMovements[k][1][10] local u = Vector(x, y, z):ToScreen() if LocalPlayer():GetPos():Distance(Vector(x, y, z)) < 1500 then cam.Start3D(EyePos(), EyeAngles()) local o = Vector(x - 10, y + 10, z) local g = Vector(x + 10, y + 10, z) local f = Vector(x + 10, y - 10, z) local d = Vector(x - 10, y - 10, z) render.DrawLine(o, g, Color(255, 0, 0), false) render.DrawLine(g, f, Color(255, 0, 0), false) render.DrawLine(f, d, Color(255, 0, 0), false) render.DrawLine(d, o, Color(255, 0, 0), false) cam.End3D() draw.SimpleTextOutlined(k, "Trebuchet18", u.x, u.y - 5, Color(255, 0, 0, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_BOTTOM, 1, Color(0, 0, 0, 255)) end end end end) function MR.InitMenu() if (MR.dFrame) then MR.dFrame:Remove() end MR.dFrame = vgui.Create("DFrame") MR.dFrame:SetPos(50, 50) MR.dFrame:SetSize(240, 250) MR.dFrame:SetTitle("Flemme Gui") MR.dFrame:SetVisible(true) MR.dFrame:MakePopup() MR.listViewMovement = vgui.Create("DListView", MR.dFrame) MR.listViewMovement:SetSize(MR.dFrame:GetWide(), 98) MR.listViewMovement:SetPos(0, 25) MR.listViewMovement:SetMultiSelect(false) MR.listViewMovement:SetHideHeaders(true) MR.listViewMovement:AddColumn("Movement") for i = 1, #MR.MovementsName do MR.listViewMovement:AddLine(MR.MovementsName[i]) end MR.listViewMovement.OnRowRightClick = function(panel, line) local m = DermaMenu() m.Paint = function(s, w, h) draw.RoundedBox(4, 0, 0, w, h, Color(50, 50, 50)) end m:AddOption("Delete Movement", function() local fuk = "" local tmp = "" for i = 1, #MR.MovementsName do if (MR.listViewMovement:GetLine(line):GetValue(1) == MR.MovementsName[i]) then tmp = MR.MovementsName[i] end end for k, v in pairs(string.Explode("\n", file.Read("MovementRecorder.dat"))) do if (v ~= "") then local huh = string.Explode("|", v) if (huh[1] ~= tmp) then fuk = fuk .. huh[1] .. "|" .. huh[2] .. "\n" end end end file.Write("MovementRecorder.dat", fuk) MR.LoadMovement() MR.InitMenu() end).Paint = function(self, w, h) if self:IsHovered() then self:SetTextColor(Color(255, 0, 0)) else self:SetTextColor(Color(220, 0, 0)) end draw.RoundedBox(4, 1, 1, w - 2, h - 2, Color(85, 85, 85)) end m:Open() end MR.listViewMovement.Paint = function() end for _, line in pairs(MR.listViewMovement:GetLines()) do function line:Paint(w, h) if (self:IsHovered()) then draw.RoundedBox(0, 0, 0, w, h, Color(60, 60, 60)) elseif (self:IsSelected()) then draw.RoundedBox(0, 0, 0, w, h, Color(50, 50, 50)) elseif (self:GetAltLine()) then draw.RoundedBox(0, 0, 0, w, h, Color(85, 85, 85)) else draw.RoundedBox(0, 0, 0, w, h, Color(100, 100, 100)) end end for _, column in pairs(line["Columns"]) do column:SetTextColor(Color(177, 177, 177)) end end MR.binderStart = vgui.Create("DBinder", MR.dFrame) MR.binderStart:SetSize(100, 25) MR.binderStart:SetPos(15, MR.listViewMovement:GetTall() + 55) MR.binderStart:SetValue(MR.PlaybackKey) function MR.binderStart:OnChange(num) MR.PlaybackKey = num end MR.labelStart = vgui.Create("DLabel", MR.dFrame) MR.labelStart:SetPos(35, select(2, MR.binderStart:GetPos()) - 25) MR.labelStart:SetText("Playback Key") MR.labelStart:SetSize(100, 25) MR.binderStartLoop = vgui.Create("DBinder", MR.dFrame) MR.binderStartLoop:SetSize(100, 25) MR.binderStartLoop:SetPos(select(1, MR.binderStart:GetPos()) + MR.binderStart:GetWide() + 10, select(2, MR.binderStart:GetPos())) MR.binderStartLoop:SetValue(MR.PlaybackLoopKey) function MR.binderStartLoop:OnChange(num) MR.PlaybackLoopKey = num end MR.labelStartLoop = vgui.Create("DLabel", MR.dFrame) MR.labelStartLoop:SetPos(select(1, MR.binderStart:GetPos()) + MR.binderStart:GetWide() + 15, select(2, MR.binderStart:GetPos()) - 25) MR.labelStartLoop:SetText("Playback Loop Key") MR.labelStartLoop:SetSize(100, 25) MR.binderRecord = vgui.Create("DBinder", MR.dFrame) MR.binderRecord:SetSize(100, 25) MR.binderRecord:SetPos(15, MR.dFrame:GetTall() - 40) MR.binderRecord:SetValue(MR.RecordKey) function MR.binderRecord:OnChange(num) MR.RecordKey = num end MR.labelRecord = vgui.Create("DLabel", MR.dFrame) MR.labelRecord:SetPos(40, select(2, MR.binderRecord:GetPos()) - 25) MR.labelRecord:SetText("Record Key") MR.labelRecord:SetSize(100, 25) MR.binderStop = vgui.Create("DBinder", MR.dFrame) MR.binderStop:SetSize(100, 25) MR.binderStop:SetPos(select(1, MR.binderRecord:GetPos()) + MR.binderRecord:GetWide() + 10, select(2, MR.binderRecord:GetPos())) MR.binderStop:SetValue(MR.StopKey) function MR.binderStop:OnChange(num) MR.StopKey = num end MR.labelStop = vgui.Create("DLabel", MR.dFrame) MR.labelStop:SetPos(select(1, MR.binderRecord:GetPos()) + MR.binderRecord:GetWide() + 40, select(2, MR.binderRecord:GetPos()) - 25) MR.labelStop:SetText("Stop Key") MR.labelStop:SetSize(100, 25) end MR.InitMenu() MR.switchKey1, MR.switchKey2, MR.switchKey3, MR.switchKey4 = 0, 0, 0, 0 hook.Add("Think", "MR::Think", function() if (input.IsKeyDown(MR.PlaybackKey) == true and MR.switchKey1 == 0) then MR.switchKey1 = 1 MR.playbackIterator = 1 MR.isPlayback = true MR.atStart = false MR.lastDistance = 0 chat.AddText('Playback Started') elseif (input.IsKeyDown(MR.PlaybackKey) == false and MR.switchKey1 == 1) then MR.switchKey1 = 0 end if (input.IsKeyDown(MR.PlaybackLoopKey) == true and MR.switchKey2 == 0) then MR.switchKey2 = 1 MR.playbackIterator = 1 MR.isPlayback = true MR.isPlaybackLoop = true MR.atStart = false MR.lastDistance = 0 chat.AddText('Playback Loop Started') elseif (input.IsKeyDown(MR.PlaybackLoopKey) == false and MR.switchKey2 == 1) then MR.switchKey2 = 0 end if (input.IsKeyDown(MR.RecordKey) == true and MR.switchKey3 == 0) then MR.switchKey3 = 1 MR.isRecording = true chat.AddText('Recording') elseif (input.IsKeyDown(MR.RecordKey) == false and MR.switchKey3 == 1) then MR.switchKey3 = 0 end if (input.IsKeyDown(MR.StopKey) == true and MR.switchKey4 == 0) then MR.switchKey4 = 1 if MR.isPlayback then MR.isPlayback = false MR.isPlaybackLoop = false chat.AddText('Playback stopped') end if MR.isRecording then MR.isRecording = false MR.SaveMovement(MR.Movements) chat.AddText('Recording stopped') end elseif (input.IsKeyDown(MR.StopKey) == false and MR.switchKey4 == 1) then MR.switchKey4 = 0 end end) hook.Add("CreateMove", "MR::CreateMove", function(cmd) if MR.isRecording then local tickMoves = {} local viewAnglesPitch = exechack_api.GetCheatAngle()["pitch"] local viewAnglesYaw = exechack_api.GetCheatAngle()["yaw"] local viewAnglesRoll = exechack_api.GetCheatAngle()["roll"] local forwardMove = cmd:GetForwardMove() local sideMove = cmd:GetSideMove() local upMove = cmd:GetUpMove() local buttons = cmd:GetButtons() local positionx = LocalPlayer():GetPos()["x"] local positiony = LocalPlayer():GetPos()["y"] local positionz = LocalPlayer():GetPos()["z"] table.insert(tickMoves, viewAnglesPitch) table.insert(tickMoves, viewAnglesYaw) table.insert(tickMoves, viewAnglesRoll) table.insert(tickMoves, forwardMove) table.insert(tickMoves, sideMove) table.insert(tickMoves, upMove) table.insert(tickMoves, buttons) table.insert(tickMoves, positionx) table.insert(tickMoves, positiony) table.insert(tickMoves, positionz) table.insert(MR.Movements, tickMoves) end if MR.isPlayback then if not MR.atStart then if #MR.ClosestMovement == 0 then return end local dist = LocalPlayer():GetPos():Distance(Vector(MR.ClosestMovement[1][8], MR.ClosestMovement[1][9], MR.ClosestMovement[1][10])) if MR.lastDistance ~= dist or dist > 1 then cmd:SetButtons(bit.bor(cmd:GetButtons(), IN_SPEED)) cmd:SetForwardMove(dist * 5) cmd:SetSideMove(0) local x, y, z = (Vector(MR.ClosestMovement[1][8], MR.ClosestMovement[1][9], MR.ClosestMovement[1][10]) - LocalPlayer():GetShootPos()):Angle() local ang2 = Angle(x, y, z)[2] MR.MoveToStart(ang2, cmd) MR.lastDistance = dist return else MR.atStart = true end end if MR.playbackIterator <= #MR.ClosestMovement then local tickMove = MR.ClosestMovement[MR.playbackIterator] cmd:SetViewAngles(Angle(tickMove[1], tickMove[2], tickMove[3])) exechack_api.SetCheatAngle(Angle(tickMove[1], tickMove[2], tickMove[3])) cmd:SetForwardMove(tickMove[4]) cmd:SetSideMove(tickMove[5]) cmd:SetUpMove(tickMove[6]) cmd:SetButtons(tickMove[7]) MR.playbackIterator = MR.playbackIterator + 1 else MR.isPlayback = false if MR.isPlaybackLoop then MR.playbackIterator = 1 MR.isPlayback = true MR.atStart = false MR.lastDistance = 0 end end end end)