mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
325 lines
7.4 KiB
Lua
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)
|