--[[ | This file was obtained through the combined efforts | of Madbluntz & Plymouth Antiquarian Society. | | Credits: lifestorm, Gregory Wayne Rossel JR., | Maloy, DrPepper10 @ RIP, Atle! | | Visit for more: https://plymouth.thetwilightzone.ru/ --]] local L = pace.LanguageString local acsfnc = function(key, def) pace["View" .. key] = def pace["SetView" .. key] = function(val) pace["View" .. key] = val end pace["GetView" .. key] = function() return pace["View" .. key] or def end end acsfnc("Entity", NULL) acsfnc("Pos", Vector(5,5,5)) acsfnc("Angles", Angle(0,0,0)) acsfnc("FOV", 75) function pace.GetViewEntity() return pace.ViewEntity:IsValid() and pace.ViewEntity or pac.LocalPlayer end function pace.ResetView() if pace.Focused then local ent = pace.GetViewEntity() if not ent:IsValid() then local _, part = next(pac.GetLocalParts()) if part then ent = part:GetOwner() end end if ent:IsValid() then local fwd = ent.EyeAngles and ent:EyeAngles() or ent:GetAngles() -- Source Engine local angles fix if ent == pac.LocalPlayer and ent:GetVehicle():IsValid() then local ang = ent:GetVehicle():GetAngles() fwd = fwd + ang end fwd = fwd:Forward() fwd.z = 0 pace.ViewPos = ent:EyePos() + fwd * 128 pace.ViewAngles = (ent:EyePos() - pace.ViewPos):Angle() pace.ViewAngles:Normalize() end end end function pace.SetZoom(fov, smooth) if smooth then pace.ViewFOV = Lerp(FrameTime()*10, pace.ViewFOV, math.Clamp(fov,1,100)) else pace.ViewFOV = math.Clamp(fov,1,100) end end function pace.ResetZoom() pace.zoom_reset = 75 end local worldPanel = vgui.GetWorldPanel(); function worldPanel.OnMouseWheeled( self, scrollDelta ) if IsValid(pace.Editor) then local zoom_usewheel = GetConVar( "pac_zoom_mousewheel" ) if zoom_usewheel:GetInt() == 1 then local speed = 10 if input.IsKeyDown(KEY_LSHIFT) then speed = 50 end if input.IsKeyDown(KEY_LCONTROL) then speed = 1 end if vgui.GetHoveredPanel() == worldPanel then pace.Editor.zoomslider:SetValue(pace.ViewFOV - (scrollDelta * speed)) end end end end local held_ang = Angle(0,0,0) local held_mpos = Vector(0,0,0) local mcode, hoveredPanelCursor, isHoldingMovement function pace.GUIMousePressed(mc) if pace.mctrl.GUIMousePressed(mc) then return end if mc == MOUSE_LEFT and not pace.editing_viewmodel then held_ang = pace.ViewAngles * 1 held_mpos = Vector(input.GetCursorPos()) end if mc == MOUSE_RIGHT then pace.Call("OpenMenu") end hoveredPanelCursor = vgui.GetHoveredPanel() if IsValid(hoveredPanelCursor) then hoveredPanelCursor:SetCursor('sizeall') end mcode = mc isHoldingMovement = true end function pace.GUIMouseReleased(mc) isHoldingMovement = false if IsValid(hoveredPanelCursor) then hoveredPanelCursor:SetCursor('arrow') hoveredPanelCursor = nil end if pace.mctrl.GUIMouseReleased(mc) then return end if pace.editing_viewmodel or pace.editing_hands then return end mcode = nil if not GetConVar("pac_enable_editor_view"):GetBool() then pace.EnableView(true) else pac.RemoveHook("CalcView", "camera_part") pac.AddHook("GUIMousePressed", "editor", pace.GUIMousePressed) pac.AddHook("GUIMouseReleased", "editor", pace.GUIMouseReleased) pac.AddHook("ShouldDrawLocalPlayer", "editor", pace.ShouldDrawLocalPlayer, DLib and -4 or ULib and -1 or nil) pac.AddHook("CalcView", "editor", pace.CalcView, DLib and -4 or ULib and -1 or nil) pac.AddHook("HUDPaint", "editor", pace.HUDPaint) pac.AddHook("HUDShouldDraw", "editor", pace.HUDShouldDraw) pac.AddHook("PostRenderVGUI", "editor", pace.PostRenderVGUI) end end local function set_mouse_pos(x, y) input.SetCursorPos(x, y) held_ang = pace.ViewAngles * 1 held_mpos = Vector(x, y) return held_mpos * 1 end local WORLD_ORIGIN = Vector(0, 0, 0) local function CalcDrag() if pace.BusyWithProperties:IsValid() or pace.ActiveSpecialPanel:IsValid() or pace.editing_viewmodel or pace.editing_hands or pace.properties.search:HasFocus() then return end local focus = vgui.GetKeyboardFocus() if focus and focus:IsValid() and focus:GetName():lower():find('textentry') then return end if not system.HasFocus() then held_mpos = Vector(input.GetCursorPos()) end local ftime = FrameTime() * 50 local mult = 5 if input.IsKeyDown(KEY_LCONTROL) or input.IsKeyDown(KEY_RCONTROL) then mult = 0.1 end local origin local part = pace.current_part or NULL if not part:IsValid() then return end local owner = part:GetRootPart():GetOwner() if not owner:IsValid() then owner = pac.LocalPlayer end origin = owner:GetPos() if owner == pac.WorldEntity then if part:HasChildren() then for key, child in ipairs(part:GetChildren()) do if child.GetDrawPosition then part = child break end end end end if part.GetDrawPosition then origin = part:GetDrawPosition() end if not origin or origin == WORLD_ORIGIN then origin = pac.LocalPlayer:GetPos() end mult = mult * math.min(origin:Distance(pace.ViewPos) / 200, 3) if input.IsKeyDown(KEY_LSHIFT) then mult = mult + 5 end if not pace.IsSelecting then if mcode == MOUSE_LEFT then local mpos = Vector(input.GetCursorPos()) if mpos.x >= ScrW() - 1 then mpos = set_mouse_pos(1, gui.MouseY()) elseif mpos.x < 1 then mpos = set_mouse_pos(ScrW() - 2, gui.MouseY()) end if mpos.y >= ScrH() - 1 then mpos = set_mouse_pos(gui.MouseX(), 1) elseif mpos.y < 1 then mpos = set_mouse_pos(gui.MouseX(), ScrH() - 2) end local delta = (held_mpos - mpos) / 5 * math.rad(pace.ViewFOV) pace.ViewAngles.p = math.Clamp(held_ang.p - delta.y, -90, 90) pace.ViewAngles.y = held_ang.y + delta.x end end if input.IsKeyDown(KEY_W) then pace.ViewPos = pace.ViewPos + pace.ViewAngles:Forward() * mult * ftime elseif input.IsKeyDown(KEY_S) then pace.ViewPos = pace.ViewPos - pace.ViewAngles:Forward() * mult * ftime end if input.IsKeyDown(KEY_D) then pace.ViewPos = pace.ViewPos + pace.ViewAngles:Right() * mult * ftime elseif input.IsKeyDown(KEY_A) then pace.ViewPos = pace.ViewPos - pace.ViewAngles:Right() * mult * ftime end if input.IsKeyDown(KEY_SPACE) then if not IsValid(pace.timeline.frame) then pace.ViewPos = pace.ViewPos + pace.ViewAngles:Up() * mult * ftime end end --[[if input.IsKeyDown(KEY_LALT) then pace.ViewPos = pace.ViewPos + pace.ViewAngles:Up() * -mult * ftime end]] end local follow_entity = CreateClientConVar("pac_camera_follow_entity", "0", true) local enable_editor_view = CreateClientConVar("pac_enable_editor_view", "1", true) local lastEntityPos function pace.CalcView(ply, pos, ang, fov) if pace.editing_viewmodel or pace.editing_hands then pace.ViewPos = pos pace.ViewAngles = ang pace.ViewFOV = fov return end if follow_entity:GetBool() then local ent = pace.GetViewEntity() local pos = ent:GetPos() lastEntityPos = lastEntityPos or pos pace.ViewPos = pace.ViewPos + pos - lastEntityPos lastEntityPos = pos else lastEntityPos = nil end local pos, ang, fov = pac.CallHook("EditorCalcView", pace.ViewPos, pace.ViewAngles, pace.ViewFOV) if pos then pace.ViewPos = pos end if ang then pace.ViewAngles = ang end if fov then pace.ViewFOV = fov end return { origin = pace.ViewPos, angles = pace.ViewAngles, fov = pace.ViewFOV, } end function pace.ShouldDrawLocalPlayer() if not pace.editing_viewmodel and not pace.editing_hands then return true end end local notifText local notifDisplayTime, notifDisplayTimeFade = 0, 0 function pace.FlashNotification(text, timeToDisplay) timeToDisplay = timeToDisplay or math.Clamp(#text / 6, 1, 8) notifDisplayTime = RealTime() + timeToDisplay notifDisplayTimeFade = RealTime() + timeToDisplay * 1.1 notifText = text end function pace.PostRenderVGUI() if not pace.mctrl then return end local time = RealTime() if notifDisplayTimeFade > time then if notifDisplayTime > time then surface.SetTextColor(color_white) else surface.SetTextColor(255, 255, 255, 255 * (notifDisplayTimeFade - RealTime()) / (notifDisplayTimeFade - notifDisplayTime)) end surface.SetFont('Trebuchet18') local w = surface.GetTextSize(notifText) surface.SetTextPos(ScrW() / 2 - w / 2, 30) surface.DrawText(notifText) end if not isHoldingMovement then return end if pace.mctrl.LastThinkCall ~= FrameNumber() then surface.SetFont('Trebuchet18') surface.SetTextColor(color_white) local text = L'You are currently holding the camera, movement is disabled' local w = surface.GetTextSize(text) surface.SetTextPos(ScrW() / 2 - w / 2, 10) surface.DrawText(text) end end function pace.EnableView(b) if b then pac.AddHook("GUIMousePressed", "editor", pace.GUIMousePressed) pac.AddHook("GUIMouseReleased", "editor", pace.GUIMouseReleased) pac.AddHook("ShouldDrawLocalPlayer", "editor", pace.ShouldDrawLocalPlayer, DLib and -4 or ULib and -1 or nil) pac.AddHook("CalcView", "editor", pace.CalcView, DLib and -4 or ULib and -1 or nil) pac.RemoveHook("CalcView", "camera_part") pac.AddHook("HUDPaint", "editor", pace.HUDPaint) pac.AddHook("HUDShouldDraw", "editor", pace.HUDShouldDraw) pac.AddHook("PostRenderVGUI", "editor", pace.PostRenderVGUI) pace.Focused = true pace.ResetView() else lastEntityPos = nil pac.RemoveHook("GUIMousePressed", "editor") pac.RemoveHook("GUIMouseReleased", "editor") pac.RemoveHook("ShouldDrawLocalPlayer", "editor") pac.RemoveHook("CalcView", "editor") pac.RemoveHook("CalcView", "camera_part") pac.RemoveHook("HUDPaint", "editor") pac.RemoveHook("HUDShouldDraw", "editor") pac.RemoveHook("PostRenderVGUI", "editor") pace.SetTPose(false) end if not enable_editor_view:GetBool() then local ply = LocalPlayer() pac.RemoveHook("CalcView", "editor") pac.AddHook("CalcView", "camera_part", function(ply, pos, ang, fov, nearz, farz) for _, part in pairs(pac.GetLocalParts()) do if part:IsValid() and part.ClassName == "camera" then part:CalcShowHide() local temp = {} if not part:IsHidden() then pos, ang, fov, nearz, farz = part:CalcView(_,_,ply:EyeAngles()) temp.origin = pos temp.angles = ang temp.fov = fov temp.znear = nearz temp.zfar = farz temp.drawviewer = not part.DrawViewModel return temp end end end end) --pac.RemoveHook("ShouldDrawLocalPlayer", "editor") end end local function CalcAnimationFix(ent) if ent.SetEyeAngles then ent:SetEyeAngles(Angle(0,0,0)) end end local reset_pose_params = { "body_rot_z", "spine_rot_z", "head_rot_z", "head_rot_y", "head_rot_x", "walking", "running", "swimming", "rhand", "lhand", "rfoot", "lfoot", "move_yaw", "aim_yaw", "aim_pitch", "breathing", "vertical_velocity", "vehicle_steer", "body_yaw", "spine_yaw", "head_yaw", "head_pitch", "head_roll", } function pace.GetTPose() return pace.tposed end function pace.SetViewPart(part, reset_campos) pace.SetViewEntity(part:GetRootPart():GetOwner()) if reset_campos then pace.ResetView() end end function pace.HUDPaint() if mcode and not input.IsMouseDown(mcode) then mcode = nil end local ent = pace.GetViewEntity() if pace.IsFocused() then CalcDrag() if ent:IsValid() then pace.Call("Draw", ScrW(), ScrH()) end end end function pace.HUDShouldDraw(typ) if typ == "CHudEPOE" or (typ == "CHudCrosshair" and (pace.editing_viewmodel or pace.editing_hands)) then return false end end function pace.OnToggleFocus(show_editor) if pace.Focused then pace.KillFocus(show_editor) else pace.GainFocus(show_editor) end end function pace.SetTPose(b) local ply = pac.LocalPlayer if b then ply.pace_tpose_last_sequence = ply:GetSequence() ply.pace_tpose_last_layer_sequence = {} for i = 0, 16 do ply.pace_tpose_last_layer_sequence[i] = ply:GetLayerSequence(i) end local function reset_angles(ply) local ang = ply:EyeAngles() ang.p = 0 ply:SetEyeAngles(ang) ply:SetRenderAngles(ang) ply:SetAngles(ang) end local function get_ref_anim(ply) local id = ply:LookupSequence("reference") local id2 = ply:LookupSequence("ragdoll") return id ~= -1 and id or id2 ~= -1 and id2 or 0 end pac.AddHook("PrePlayerDraw", "pace_tpose", function(ply) if ply ~= pac.LocalPlayer then return end for i = 0, 16 do ply:SetLayerSequence(i, 0) end ply:SetSequence(get_ref_anim(ply)) reset_angles(ply) end) pac.AddHook("UpdateAnimation", "pace_tpose", function() local ply = pac.LocalPlayer ply:ClearPoseParameters() reset_angles(ply) for i = 0, ply:GetNumPoseParameters() - 1 do local name = ply:GetPoseParameterName(i) if name then ply:SetPoseParameter(name, 0) end end end) pac.AddHook("CalcMainActivity", "pace_tpose", function(ply) if ply == pac.LocalPlayer then for i = 0, 16 do ply:SetLayerSequence(i, 0) end local act = get_ref_anim(ply) return act, act end end) else pac.RemoveHook("PrePlayerDraw", "pace_tpose") pac.RemoveHook("UpdateAnimation", "pace_tpose") pac.RemoveHook("CalcMainActivity", "pace_tpose") if ply.pace_tpose_last_sequence then ply:SetSequence(ply.pace_tpose_last_sequence) ply.pace_tpose_last_sequence = nil end if ply.pace_tpose_last_layer_sequence then for i, seq in ipairs(ply.pace_tpose_last_layer_sequence) do ply:SetLayerSequence(i, seq) end ply.pace_tpose_last_layer_sequence = nil end end pace.tposed = b end pace.SetTPose(pace.tposed) function pace.ToggleCameraFollow() local c = GetConVar("pac_camera_follow_entity") RunConsoleCommand("pac_camera_follow_entity", c:GetBool() and "0" or "1") end function pace.GetBreathing() return pace.breathing end function pace.ResetEyeAngles() local ent = pace.GetViewEntity() if ent:IsValid() then if ent:IsPlayer() then RunConsoleCommand("+forward") timer.Simple(0, function() RunConsoleCommand("-forward") timer.Simple(0.1, function() RunConsoleCommand("+back") timer.Simple(0.015, function() RunConsoleCommand("-back") end) end) end) ent:SetEyeAngles(Angle(0, 0, 0)) else ent:SetAngles(Angle(0, 0, 0)) end pac.SetupBones(ent) end end