mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
Upload
This commit is contained in:
324
lua/pac3/core/shared/movement.lua
Normal file
324
lua/pac3/core/shared/movement.lua
Normal file
@@ -0,0 +1,324 @@
|
||||
--[[
|
||||
| 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)
|
||||
Reference in New Issue
Block a user