mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-15 21:03:46 +03:00
366 lines
12 KiB
Lua
366 lines
12 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/
|
|
--]]
|
|
|
|
pk_pills.registerDrive("roll", {
|
|
think = function(ply, ent, options)
|
|
local aimYaw = Angle(0, ply:EyeAngles().y, 0)
|
|
local moveDir = Vector(0, 0, 0)
|
|
|
|
if (ply:KeyDown(IN_FORWARD)) then
|
|
moveDir = moveDir + aimYaw:Forward()
|
|
end
|
|
|
|
if (ply:KeyDown(IN_BACK)) then
|
|
moveDir = moveDir - aimYaw:Forward()
|
|
end
|
|
|
|
if (ply:KeyDown(IN_MOVERIGHT)) then
|
|
moveDir = moveDir + aimYaw:Right()
|
|
end
|
|
|
|
if (ply:KeyDown(IN_MOVELEFT)) then
|
|
moveDir = moveDir - aimYaw:Right()
|
|
end
|
|
|
|
local phys = ent:GetPhysicsObject()
|
|
if not IsValid(phys) then return end
|
|
local center = ent:LocalToWorld(phys:GetMassCenter())
|
|
moveDir:Normalize()
|
|
|
|
if options.rotcap then
|
|
local av = phys:GetAngleVelocity()
|
|
local abs = math.abs(av.x) + math.abs(av.y) + math.abs(av.z)
|
|
if abs > options.rotcap then return end
|
|
end
|
|
|
|
phys:ApplyForceOffset(moveDir * options.power, center + Vector(0, 0, 1))
|
|
phys:ApplyForceOffset(moveDir * -options.power, center + Vector(0, 0, -1))
|
|
end,
|
|
key = function(ply, ent, options, key)
|
|
if key == IN_JUMP and options.jump then
|
|
local shouldJump = false
|
|
|
|
if (ent:GetMoveType() == MOVETYPE_NONE) then
|
|
ent:SetMoveType(MOVETYPE_VPHYSICS)
|
|
ent:SetPos(ent:GetPos() + Vector(0, 0, ent:BoundingRadius() + options.burrow))
|
|
shouldJump = true
|
|
else
|
|
local trace = util.QuickTrace(ent:GetPos(), Vector(0, 0, -ent:BoundingRadius() + 2), ent)
|
|
|
|
if trace.Hit then
|
|
shouldJump = true
|
|
end
|
|
end
|
|
|
|
if shouldJump then
|
|
ent:GetPhysicsObject():ApplyForceCenter(Vector(0, 0, options.jump))
|
|
ent:PillSound("jump")
|
|
end
|
|
elseif key == IN_DUCK and options.burrow and ent:GetMoveType() == MOVETYPE_VPHYSICS then
|
|
local trace = util.QuickTrace(ent:GetPos(), Vector(0, 0, -ent:BoundingRadius() + 2), ent)
|
|
|
|
if trace.Hit and (trace.MatType == MAT_DIRT or trace.MatType == MAT_SAND) then
|
|
ent:PillSound("burrow")
|
|
local p = ent:GetPos()
|
|
ent:SetPos(Vector(p.x, p.y, trace.HitPos.z - options.burrow))
|
|
ent:SetMoveType(MOVETYPE_NONE)
|
|
|
|
if ent.formTable.model then
|
|
ent:SetModel(ent.formTable.model)
|
|
end
|
|
|
|
ent:PillLoopStopAll()
|
|
end
|
|
end
|
|
end
|
|
})
|
|
|
|
pk_pills.registerDrive("fly", {
|
|
think = function(ply, ent, options)
|
|
local phys = ent:GetPhysicsObject()
|
|
if not IsValid(phys) then return end
|
|
|
|
if phys:IsGravityEnabled() then
|
|
phys:EnableGravity(false)
|
|
end
|
|
|
|
--Lateral Movement
|
|
local move = Vector(0, 0, 0)
|
|
local rotatedAngle = ent:GetAngles()
|
|
local aim = Angle(0, ply:EyeAngles().y, 0)
|
|
|
|
if options.spin then
|
|
rotatedAngle = aim
|
|
end
|
|
|
|
if options.rotation then
|
|
rotatedAngle:RotateAroundAxis(rotatedAngle:Up(), options.rotation)
|
|
end
|
|
|
|
if options.rotation2 then
|
|
rotatedAngle:RotateAroundAxis(rotatedAngle:Right(), options.rotation2)
|
|
end
|
|
|
|
if options.rocketMode then
|
|
move = rotatedAngle:Forward() * options.speed
|
|
aim.p = math.Clamp(ply:EyeAngles().p, -50, 50)
|
|
else
|
|
if not options.tilt then
|
|
if (ply:KeyDown(IN_FORWARD)) then
|
|
move = rotatedAngle:Forward() * options.speed
|
|
elseif (ply:KeyDown(IN_BACK)) then
|
|
move = move + rotatedAngle:Forward() * -options.speed
|
|
end
|
|
|
|
if (ply:KeyDown(IN_MOVERIGHT)) then
|
|
move = move + rotatedAngle:Right() * options.speed
|
|
elseif (ply:KeyDown(IN_MOVELEFT)) then
|
|
move = move + rotatedAngle:Right() * -options.speed
|
|
end
|
|
|
|
aim.p = math.Clamp(ply:EyeAngles().p, -30, 30)
|
|
else
|
|
local baseDir = aim
|
|
|
|
if (ply:KeyDown(IN_FORWARD)) then
|
|
move = baseDir:Forward() * options.speed
|
|
aim.p = options.tilt or 0
|
|
elseif (ply:KeyDown(IN_BACK)) then
|
|
move = move + baseDir:Forward() * -options.speed
|
|
aim.p = -options.tilt or 0
|
|
end
|
|
|
|
if (ply:KeyDown(IN_MOVERIGHT)) then
|
|
move = move + baseDir:Right() * options.speed
|
|
aim.r = options.tilt or 0
|
|
elseif (ply:KeyDown(IN_MOVELEFT)) then
|
|
move = move + baseDir:Right() * -options.speed
|
|
aim.r = -options.tilt or 0
|
|
end
|
|
end
|
|
|
|
--UpDown
|
|
if (ply:KeyDown(IN_JUMP)) then
|
|
move = move + Vector(0, 0, options.speed * 2 / 3)
|
|
elseif (ply:KeyDown(IN_DUCK)) then
|
|
move = move + Vector(0, 0, -options.speed * 2 / 3)
|
|
end
|
|
end
|
|
|
|
phys:AddVelocity(move - phys:GetVelocity() * .02)
|
|
|
|
if options.rotation then
|
|
aim:RotateAroundAxis(aim:Up(), -options.rotation)
|
|
end
|
|
|
|
if options.rotation2 then
|
|
aim:RotateAroundAxis(aim:Right(), -options.rotation2)
|
|
end
|
|
|
|
--[[if options.spin then
|
|
aim=ent.spinAng or Angle(0,0,0)
|
|
aim=aim+Angle(0,-options.spin,0)
|
|
ent.spinAng=aim
|
|
end]]
|
|
local localAim = ent:WorldToLocalAngles(aim)
|
|
|
|
if options.spin then
|
|
localAim = Angle(0, -options.spin, 0)
|
|
end
|
|
|
|
local moveAng = Vector(0, 0, 0)
|
|
moveAng.y = localAim.p * 3
|
|
moveAng.z = localAim.y * 3
|
|
moveAng.x = localAim.r * 3
|
|
phys:AddAngleVelocity(-1 * phys:GetAngleVelocity() + moveAng)
|
|
end,
|
|
--return LocalAim
|
|
key = function(ply, ent, options, key) end
|
|
})
|
|
|
|
pk_pills.registerDrive("hover", {
|
|
think = function(ply, ent, options)
|
|
--UpDown
|
|
if not ply:KeyDown(IN_DUCK) then
|
|
local phys = ent:GetPhysicsObject()
|
|
if not IsValid(phys) then return end
|
|
--Lateral movement
|
|
local move = Vector(0, 0, 0)
|
|
local rotatedAngle = ent:GetAngles()
|
|
|
|
if (ply:KeyDown(IN_FORWARD)) then
|
|
move = rotatedAngle:Forward() * options.speed
|
|
elseif (ply:KeyDown(IN_BACK)) then
|
|
move = move + rotatedAngle:Forward() * -options.speed
|
|
end
|
|
|
|
if (ply:KeyDown(IN_MOVERIGHT)) then
|
|
move = move + rotatedAngle:Right() * options.speed
|
|
elseif (ply:KeyDown(IN_MOVELEFT)) then
|
|
move = move + rotatedAngle:Right() * -options.speed
|
|
end
|
|
|
|
phys:AddVelocity(move - phys:GetVelocity() * .02)
|
|
--Hovering
|
|
local tr = util.QuickTrace(ent:GetPos(), Vector(0, 0, -1) * (options.height or 100), ent)
|
|
|
|
if tr.Hit then
|
|
phys:AddVelocity(Vector(0, 0, 10))
|
|
end
|
|
|
|
local aim = Angle(0, ply:EyeAngles().y, 0)
|
|
local localAim = ent:WorldToLocalAngles(aim)
|
|
local moveAng = Vector(0, 0, 0)
|
|
moveAng.y = localAim.p * 3
|
|
moveAng.z = localAim.y * 3
|
|
moveAng.x = localAim.r * 3
|
|
phys:AddAngleVelocity(-1 * phys:GetAngleVelocity() + moveAng)
|
|
end
|
|
end,
|
|
key = function(ply, ent, options, key) end
|
|
})
|
|
|
|
pk_pills.registerDrive("swim", {
|
|
think = function(ply, ent, options)
|
|
local phys = ent:GetPhysicsObject()
|
|
|
|
if not ent.setupBuoyancy then
|
|
phys:SetBuoyancyRatio(.135)
|
|
ent.setupBuoyancy = true
|
|
end
|
|
|
|
local speed
|
|
|
|
if ent:WaterLevel() > 1 then
|
|
speed = options.speed
|
|
else
|
|
speed = options.speed / 3
|
|
|
|
if math.Rand(0, 1) > .9 then
|
|
ent:TakeDamage(1)
|
|
end
|
|
end
|
|
|
|
--Lateral Movement
|
|
local move = Vector(0, 0, 0)
|
|
local rotatedAngle = ent:GetAngles()
|
|
local aim = Angle(0, ply:EyeAngles().y, 0)
|
|
|
|
if (ply:KeyDown(IN_FORWARD)) then
|
|
move = rotatedAngle:Forward()
|
|
elseif (ply:KeyDown(IN_BACK)) then
|
|
move = move - rotatedAngle:Forward()
|
|
end
|
|
|
|
if (ply:KeyDown(IN_MOVERIGHT)) then
|
|
move = move + rotatedAngle:Right()
|
|
elseif (ply:KeyDown(IN_MOVELEFT)) then
|
|
move = move - rotatedAngle:Right()
|
|
end
|
|
|
|
aim.p = math.Clamp(ply:EyeAngles().p, -80, 80)
|
|
phys:AddVelocity(move * speed)
|
|
local localAim = ent:WorldToLocalAngles(aim)
|
|
local moveAng = Vector(0, 0, 0)
|
|
moveAng.y = localAim.p * 3
|
|
moveAng.z = localAim.y * 3
|
|
moveAng.x = localAim.r * 3
|
|
phys:AddAngleVelocity(-1 * phys:GetAngleVelocity() + moveAng)
|
|
end,
|
|
--return LocalAim
|
|
key = function(ply, ent, options, key) end
|
|
})
|
|
|
|
pk_pills.registerDrive("strider", {
|
|
think = function(ply, ent, options)
|
|
local h = ent:GetPoseParameter("body_height")
|
|
|
|
if h < 200 then
|
|
h = 200
|
|
ent:SetPoseParameter("body_height", h)
|
|
end
|
|
|
|
--UpDown
|
|
if ply:KeyDown(IN_JUMP) and h < 500 then
|
|
h = h + 5
|
|
ent:SetPoseParameter("body_height", h)
|
|
elseif ply:KeyDown(IN_DUCK) and h > 200 then
|
|
h = h - 5
|
|
ent:SetPoseParameter("body_height", h)
|
|
end
|
|
|
|
local run = ply:KeyDown(IN_SPEED)
|
|
local phys = ent:GetPhysicsObject()
|
|
local aim = Angle(0, ply:EyeAngles().y, 0)
|
|
local move = Vector(0, 0, 0)
|
|
|
|
if (ply:KeyDown(IN_FORWARD)) then
|
|
move = aim:Forward()
|
|
elseif (ply:KeyDown(IN_BACK)) then
|
|
move = move - aim:Forward()
|
|
end
|
|
|
|
if (ply:KeyDown(IN_MOVERIGHT)) then
|
|
move = move + aim:Right()
|
|
elseif (ply:KeyDown(IN_MOVELEFT)) then
|
|
move = move - aim:Right()
|
|
end
|
|
|
|
move:Normalize()
|
|
|
|
if (move:Length() > 0) then
|
|
ent:PillAnim("walk_all")
|
|
|
|
if run then
|
|
ent:SetPlaybackRate(2)
|
|
else
|
|
ent:SetPlaybackRate(1)
|
|
end
|
|
|
|
ent:SetPoseParameter("move_yaw", ent:WorldToLocalAngles(move:Angle()).y)
|
|
|
|
--Stepping
|
|
--Step Sounds
|
|
if not ent.lastStep then
|
|
ent.lastStep = 0
|
|
end
|
|
|
|
if ent.lastStep == 0 and ent:GetCycle() > 1 / 3 then
|
|
ent.lastStep = 1
|
|
ent:PillSound("step")
|
|
elseif ent.lastStep == 1 and ent:GetCycle() > 2 / 3 then
|
|
ent.lastStep = 2
|
|
ent:PillSound("step")
|
|
elseif ent.lastStep == 2 and ent:GetCycle() < 2 / 3 then
|
|
ent.lastStep = 0
|
|
ent:PillSound("step")
|
|
end
|
|
else
|
|
ent:SetPlaybackRate(1)
|
|
ent:PillAnim("Idle01")
|
|
end
|
|
|
|
--Datass
|
|
local tr = util.QuickTrace(ent:GetPos(), Vector(0, 0, -1) * h, ent)
|
|
|
|
if tr.Hit then
|
|
phys:AddVelocity(-ent:GetVelocity() + Vector(0, 0, 2000 * (1 - tr.Fraction)) + move * (run and 200 or 100))
|
|
end
|
|
|
|
local localAim = ent:WorldToLocalAngles(aim)
|
|
local moveAng = Vector(0, 0, 0)
|
|
moveAng.y = localAim.p * 3
|
|
moveAng.z = localAim.y * 3
|
|
moveAng.x = localAim.r * 3
|
|
phys:AddAngleVelocity(-1 * phys:GetAngleVelocity() + moveAng)
|
|
end,
|
|
key = function(ply, ent, options, key) end
|
|
})
|