Files
wnsrc/lua/pac3/core/shared/movement.lua
lifestorm 73479cff9e Upload
2024-08-04 22:55:00 +03:00

325 lines
7.4 KiB
Lua

--[[
| 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 movementConvar = CreateConVar("pac_free_movement", -1, CLIENT and {FCVAR_REPLICATED} or {FCVAR_ARCHIVE, FCVAR_REPLICATED}, "allow players to modify movement. -1 apply only allow when noclip is allowed, 1 allow for all gamemodes, 0 to disable")
local default = {
JumpHeight = 200,
StickToGround = true,
GroundFriction = 0.12,
AirFriction = 0.01,
Gravity = Vector(0,0,-600),
Noclip = false,
MaxGroundSpeed = 750,
MaxAirSpeed = 1,
AllowZVelocity = false,
ReversePitch = false,
UnlockPitch = false,
VelocityToViewAngles = 0,
RollAmount = 0,
SprintSpeed = 750,
RunSpeed = 300,
WalkSpeed = 100,
DuckSpeed = 25,
FinEfficiency = 0,
FinLiftMode = "normal",
FinCline = false
}
if SERVER then
util.AddNetworkString("pac_modify_movement")
net.Receive("pac_modify_movement", function(len, ply)
local cvar = movementConvar:GetInt()
if cvar == 0 or (cvar == -1 and hook.Run("PlayerNoClip", ply, true)==false) then return end
local str = net.ReadString()
if str == "disable" then
ply.pac_movement = nil
else
if default[str] ~= nil then
local val = net.ReadType()
if type(val) == type(default[str]) then
ply.pac_movement = ply.pac_movement or table.Copy(default)
ply.pac_movement[str] = val
end
end
end
end)
end
if CLIENT then
local sensitivityConvar = GetConVar("sensitivity")
pac.AddHook("InputMouseApply", "custom_movement", function(cmd, x,y, ang)
local ply = pac.LocalPlayer
local self = ply.pac_movement
if not self then return end
if ply:GetMoveType() == MOVETYPE_NOCLIP then
if ply.pac_movement_viewang then
ang.r = 0
cmd:SetViewAngles(ang)
ply.pac_movement_viewang = nil
end
return
end
if self.UnlockPitch then
ply.pac_movement_viewang = ply.pac_movement_viewang or ang
ang = ply.pac_movement_viewang
local sens = sensitivityConvar:GetFloat() * 20
x = x / sens
y = y / sens
if ang.p > 89 or ang.p < -89 then
x = -x
end
ang.p = math.NormalizeAngle(ang.p + y)
ang.y = math.NormalizeAngle(ang.y + -x)
end
if self.ReversePitch then
ang.p = -ang.p
end
local vel = ply:GetVelocity()
local roll = math.Clamp(vel:Dot(-ang:Right()) * self.RollAmount, -89, 89)
if not vel:IsZero() then
if vel:Dot(ang:Forward()) < 0 then
vel = -vel
end
ang = LerpAngle(self.VelocityToViewAngles, ang, vel:Angle())
end
ang.r = roll
cmd:SetViewAngles(ang)
if self.UnlockPitch then
return true
end
end)
end
local function badMovetype(ply)
local mvtype = ply:GetMoveType()
return mvtype == MOVETYPE_OBSERVER
or mvtype == MOVETYPE_NOCLIP
or mvtype == MOVETYPE_LADDER
or mvtype == MOVETYPE_CUSTOM
or mvtype == MOVETYPE_ISOMETRIC
end
local frictionConvar = GetConVar("sv_friction")
pac.AddHook("Move", "custom_movement", function(ply, mv)
local self = ply.pac_movement
if not self then
if not ply.pac_custom_movement_reset then
if not badMovetype(ply) then
ply:SetGravity(1)
ply:SetMoveType(MOVETYPE_WALK)
if ply.pac_custom_movement_jump_height then
ply:SetJumpPower(ply.pac_custom_movement_jump_height)
ply.pac_custom_movement_jump_height = nil
end
end
ply.pac_custom_movement_reset = true
end
return
end
ply.pac_custom_movement_reset = nil
ply.pac_custom_movement_jump_height = ply.pac_custom_movement_jump_height or ply:GetJumpPower()
if badMovetype(ply) then return end
mv:SetForwardSpeed(0)
mv:SetSideSpeed(0)
mv:SetUpSpeed(0)
ply:SetJumpPower(self.JumpHeight)
if self.Noclip then
ply:SetMoveType(MOVETYPE_NONE)
else
ply:SetMoveType(MOVETYPE_WALK)
end
ply:SetGravity(0.00000000000000001)
local on_ground = ply:IsOnGround()
if not self.StickToGround then
ply:SetGroundEntity(NULL)
end
local speed = self.RunSpeed
if mv:KeyDown(IN_SPEED) then
speed = self.SprintSpeed
end
if mv:KeyDown(IN_WALK) then
speed = self.WalkSpeed
end
if mv:KeyDown(IN_DUCK) then
speed = self.DuckSpeed
end
-- speed = speed * FrameTime()
local ang = mv:GetAngles()
local vel = Vector()
if on_ground and self.StickToGround then
ang.p = 0
end
if mv:KeyDown(IN_FORWARD) then
vel = vel + ang:Forward()
elseif mv:KeyDown(IN_BACK) then
vel = vel - ang:Forward()
end
if mv:KeyDown(IN_MOVERIGHT) then
vel = vel + ang:Right()
elseif mv:KeyDown(IN_MOVELEFT) then
vel = vel - ang:Right()
end
vel = vel:GetNormalized() * speed
if self.AllowZVelocity then
if mv:KeyDown(IN_JUMP) then
vel = vel + ang:Up() * speed
elseif mv:KeyDown(IN_DUCK) then
vel = vel - ang:Up() * speed
end
end
if not self.AllowZVelocity then
vel.z = 0
end
local speed = vel
local vel = mv:GetVelocity()
if on_ground and not self.Noclip and self.StickToGround then -- work against ground friction
local sv_friction = frictionConvar:GetInt()
if sv_friction > 0 then
sv_friction = 1 - (sv_friction * 15) / 1000
vel = vel / sv_friction
end
end
vel = vel + self.Gravity * 0
-- todo: don't allow adding more velocity to existing velocity if it exceeds
-- but allow decreasing
if not on_ground then
local friction = self.AirFriction
friction = -(friction) + 1
vel = vel * friction
vel = vel + self.Gravity * 0.015
speed = speed:GetNormalized() * math.Clamp(speed:Length(), 0, self.MaxAirSpeed)
vel = vel + (speed * FrameTime()*(66.666*(-friction+1)))
else
local friction = self.GroundFriction
friction = -(friction) + 1
vel = vel * friction
speed = speed:GetNormalized() * math.min(speed:Length(), self.MaxGroundSpeed)
vel = vel + (speed * FrameTime()*(75.77*(-friction+1)))
vel = vel + self.Gravity * 0.015
end
if self.FinEfficiency > 0 then -- fin
local curvel = vel
local curup = ang:Forward()
local vec1 = curvel
local vec2 = curup
vec1 = vec1 - 2*(vec1:Dot(vec2))*vec2
local sped = vec1:Length()
local finalvec = curvel
local modf = math.abs(curup:Dot(curvel:GetNormalized()))
local nvec = (curup:Dot(curvel:GetNormalized()))
if (self.pln == 1) then
if nvec > 0 then
vec1 = vec1 + (curup * 10)
else
vec1 = vec1 + (curup * -10)
end
finalvec = vec1:GetNormalized() * (math.pow(sped, modf) - 1)
finalvec = finalvec:GetNormalized()
finalvec = (finalvec * self.FinEfficiency) + curvel
end
if (self.FinLiftMode ~= "none") then
if (self.FinLiftMode == "normal") then
local liftmul = 1 - math.abs(nvec)
finalvec = finalvec + (curup * liftmul * curvel:Length() * self.FinEfficiency) / 700
else
local liftmul = (nvec / math.abs(nvec)) - nvec
finalvec = finalvec + (curup * curvel:Length() * self.FinEfficiency * liftmul) / 700
end
end
finalvec = finalvec:GetNormalized()
finalvec = finalvec * curvel:Length()
if self.FinCline then
local trace = {
start = mv:GetOrigin(),
endpos = mv:GetOrigin() + Vector(0, 0, -1000000),
mask = 131083
}
local trc = util.TraceLine(trace)
local MatType = trc.MatType
if (MatType == 67 or MatType == 77) then
local heatvec = Vector(0, 0, 100)
local cline = ((2 * (heatvec:Dot(curup)) * curup - heatvec)) * (math.abs(heatvec:Dot(curup)) / 1000)
finalvec = finalvec + (cline * (self.FinEfficiency / 50))
end
end
vel = finalvec
end
mv:SetVelocity(vel)
if self.Noclip then
mv:SetOrigin(mv:GetOrigin() + vel * 0.01)
end
return false
end)