beatrun-anims/cl (jumpanim.lua)/JumpAnim.lua
mightbeusual c84eb7c0d8 nevermind
2023-08-19 10:39:59 +08:00

1722 lines
No EOL
41 KiB
Lua

local animtable = {
lockang = false,
allowmove = true,
followplayer = true,
ignorez = false,
BodyAnimSpeed = 1,
deleteonend = false,
BodyLimitX = 90,
AnimString = "jumpslow",
CamIgnoreAng = true,
animmodelstring = "climbanim",
BodyLimitY = 180,
usefullbody = 2
}
fbanims = {
ladderexittoplefthand = true,
runfwdstart = true,
vaultkong = true,
walktostandleft = true,
wallrunverticalstart = true,
meleeair = true,
vaultonto = true,
fallinguncontrolled = true,
stand = true,
meslideend = true,
walkbalancefwd = true,
meleewrleft = true,
runfwd = true,
jumpzipline = true,
springboardleftleg = true,
jumpcoilend = true,
hangstraferight = true,
hangfoldedstart = true,
jumpslow = true,
hangheaveup = true,
jumpwrright = true,
meleeairhit = true,
vaultover = true,
jumpstill = true,
dodgejumpright = true,
jumpturnflyidle = true,
ladderclimbdownfast = true,
ladderclimbuprighthand = true,
wallrunverticalturn = true,
jumpturnlandidle = true,
hanghardstart = true,
hangstrafeleft = true,
walkfwd = true,
jumpfast = true,
meslidestart45 = true,
hangfoldedendhang = true,
wallrunleft = true,
zipline = true,
wallrunleftstart = true,
sprintfwd = true,
walkbalancelosebalanceright = true,
jumpwrleft = true,
grapplecenter = true,
swingstraight = true,
jumpcoil = true,
hang = true,
runland = true,
crouchfwd = true,
crouchbwd = true,
meslideloop = true,
crouchstill = true,
snatchsniper = true,
meslidestart = true,
ladderclimbuplefthandstill = true,
bargein = true,
meslideendprone = true,
diveidle = true,
diveslidestart = true,
diveslideidle = true,
wallrunright = true,
diveslideend = true,
vaultontohigh = true,
divestart = true,
hangfoldedheaveup = true,
vaultoverhigh = true,
ziplinestart = true,
dodgejumpleft = true,
evaderoll = true,
hanghardstart2 = true,
diestand = true,
jumpturnlandstand = true,
runbwd = true,
hanghardstartvertical = true,
walkbalancestill = true,
ladderenterbottom = true,
wallrunrightstart = true,
walkbalancefalloffleft = true,
wallrunvertical = true,
ladderclimbhangstart = true,
jumpturnland = true,
jumpturnlandstandgun = true,
meleewrright = true,
diestandlong = true,
ladderclimbuplefthand = true,
walkbalancelosebalanceleft = true,
jumpturnfly = true,
meslideloop45 = true,
meleeslide = true,
stepuprightleg = true,
ladderexittoprighthand = true,
ladderclimbuprighthandstill = true,
jumpidle = true,
jumpair = true,
walkbalancefalloffright = true,
meleeairstill = true,
swingjumpoff = true,
snatchscar = true
}
local jumpanims = {
jumpwrleft = true,
jumpfast = true,
jumpslow = true,
jumpwrright = true,
jumpstill = true,
jumpidle = true,
jumpair = true,
jumpcoil = true,
jumpzipline = true
}
local jumpanims2 = {
jumpfast = true,
jumpslow = true,
jumpstill = true
}
local runanims = {
crouchfwd = true,
crouchbwd = true,
walktostandleft = true,
stand = true,
runfwd = true,
walkfwd = true,
crouchstill = true,
sprintfwd = true,
runbwd = true
}
local events = {
ladderenter = true,
divestart = true,
fall = true,
ladderclimbleft = true,
jumpwallrun = true,
vaultonto = true,
ziplinestart = true,
hangstrafeleft = true,
hangstraferight = true,
climbhard = true,
walkbalancefwd = true,
hangfoldedheaveup = true,
jumpturnlandstand = true,
swingjump = true,
sidestepleft = true,
swingpiperight = true,
jumpfar = true,
hangfoldedstart = true,
jumpslide = true,
swingpipeleft = true,
ladderenterhang = true,
vault = true,
disarmsniper = true,
jumpstill = true,
climb = true,
stepup = true,
ladderclimbdownfast = true,
sidestepright = true,
jumpwallrunleft = true,
meleeslide = true,
meleeair = true,
disarmscar = true,
falluncontrolled = true,
meleewrright = true,
meleewrleft = true,
meleeairhit = true,
climbhard2 = true,
walkbalancestill = true,
hangfoldedendhang = true,
walkbalancefalloffleft = true,
walkbalancefalloffright = true,
swingbar = true,
jump = true,
jumpwallrunright = true,
coil = true,
ladderexittoplefthand = true,
climbheave = true,
diveslidestart = true,
bargedoor = true,
hangjump = true,
diveslideend = true,
landcoil = true,
ladderexittoprighthand = true,
hangend = true,
springboard = true,
vaultkong = true,
ladderclimbright = true,
meleeairstill = true,
vaultontohigh = true
}
local eventslut = {
ladderenter = "ladderenterbottom",
divestart = "divestart",
jumpwallrunright = "jumpwrleft",
hangfoldedheaveup = "hangfoldedheaveup",
jumpwallrun = "jumpfast",
hangstrafeleft = "hangstrafeleft",
ziplinestart = "ziplinestart",
climbhard2 = "hanghardstart2",
vaultonto = "vaultonto",
climbhard = "hanghardstart",
walkbalancefwd = "walkbalancefwd",
jumpwallrunleft = "jumpwrright",
jumpturnlandstand = "jumpturnlandstand",
swingjump = "swingjumpoff",
sidestepleft = "dodgejumpleft",
vaulthigh = "vaultoverhigh",
hangstraferight = "hangstraferight",
hangfoldedstart = "hangfoldedstart",
ladderexittoprighthand = "ladderexittoprighthand",
swingpipeleft = "stand",
ladderenterhang = "ladderclimbhangstart",
vault = "vaultover",
disarmsniper = "snatchsniper",
jumpstill = "jumpstill",
climb = "hanghardstartvertical",
stepup = "stepuprightleg",
springboard = "springboardleftleg",
ladderexittoplefthand = "ladderexittoplefthand",
slide45 = "meslidestart45",
sidestepright = "dodgejumpright",
meleeslide = "meleeslide",
disarmscar = "snatchscar",
falluncontrolled = "fallinguncontrolled",
meleewrright = "meleewrright",
meleeairhit = "meleeairhit",
meleewrleft = "meleewrleft",
meleeair = "meleeair",
jumpslide = "jumpfast",
hangfoldedendhang = "hangfoldedendhang",
walkbalancestill = "walkbalancestill",
walkbalancefalloffleft = "walkbalancefalloffleft",
walkbalancefalloffright = "walkbalancefalloffright",
swingbar = "swingstraight",
ladderclimbleft = "ladderclimbuplefthand",
coil = "jumpcoil",
fall = "jumpair",
climbheave = "hangheaveup",
slide = "meslidestart",
bargedoor = "bargein",
hangjump = "jumpfast",
diveslidestart = "diveslidestart",
landcoil = "jumpcoilend",
diveslideend = "diveslideend",
hangend = "jumpair",
ladderclimbdownfast = "ladderclimbdownfast",
swingpiperight = "stand",
vaultkong = "vaultkong",
ladderclimbright = "ladderclimbuprighthand",
meleeairstill = "meleeairstill",
vaultontohigh = "vaultontohigh"
}
local armfollowanims = {
stand = true,
diveslideidle = true,
walktostandleft = true,
diestandlong = true,
diveslidestart = true,
vaultoverhigh = true,
walkfwd = true
}
local armlock = {
meleeairhit = true,
bargein = true,
wallrunverticalstart = true,
ladderexittoprighthand = true,
meleeair = true,
ladderclimbuplefthand = true,
ladderexittoplefthand = true,
ladderenterbottom = true,
snatchsniper = true,
ladderclimbuplefthandstill = true,
ladderclimbuprighthandstill = true,
wallrunvertical = true,
ladderclimbdownfast = true,
ladderclimbuprighthand = true,
ladderclimbhangstart = true,
vaultontohigh = true,
snatchscar = true
}
local stillanims = {
jumpturnlandstandgun = true,
meslideloop = true,
jumpturnlandidle = true,
snatchsniper = true,
meslidestart = true,
meslideloop45 = true,
meslidestart45 = true,
bargein = true,
jumpturnflyidle = true,
jumpturnfly = true,
jumpturnlandstand = true,
jumpturnland = true,
meleeslide = true,
snatchscar = true
}
local arminterrupts = {
punchright = true,
doorbash = true,
punchmid = true,
punchleft = true
}
local transitionanims = {
hanghardstart = "hang",
divestart = "diveidle",
ladderexittoplefthand = "runfwd",
walktostandleft = "stand",
fallinguncontrolled = "runfwd",
vaultoverhigh = "runfwd",
vaultonto = "runfwd",
hangstrafeleft = "hang",
ladderclimbhangstart = "ladderclimbuprighthandstill",
hanghardstart2 = "hang",
meslideend = "runfwd",
hangfoldedheaveup = "runfwd",
jumpturnlandstand = "stand",
ziplinestart = "zipline",
springboardleftleg = "runfwd",
hanghardstartvertical = "hang",
hangstraferight = "hang",
zipline = "jumpzipline",
ladderenterbottom = "ladderclimbuplefthandstill",
hangheaveup = "runfwd",
dodgejumpleft = "stand",
walkbalancefalloffleft = "jumpair",
vaultover = "jumpair",
meleeairhit = "jumpair",
dodgejumpright = "stand",
meleeair = "jumpair",
walkbalancefalloffright = "jumpair",
swingjumpoff = "jumpslow",
wallrunverticalstart = "wallrunvertical",
jumpturnland = "jumpturnlandidle",
jumpcoilend = "runfwd",
bargeout = "runfwd",
jumpturnlandstandgun = "stand",
meleewrright = "jumpair",
diveslidestart = "diveslideidle",
diveslideend = "runfwd",
hangfoldedendhang = "hang",
ladderclimbuplefthand = "ladderclimbuplefthandstill",
jumpturnfly = "jumpturnflyidle",
meleewrleft = "jumpair",
vaultkong = "runfwd",
meleeslide = "meslideloop",
stepuprightleg = "runfwd",
snatchsniper = "stand",
ladderexittoprighthand = "runfwd",
meslideendprone = "jumpturnlandidle",
wallrunverticalturn = "jumpslow",
ladderclimbuprighthand = "ladderclimbuprighthandstill",
meleeairstill = "jumpair",
vaultontohigh = "runfwd",
snatchscar = "stand"
}
local nospinebend = {
ladderclimbuplefthand = true,
divestart = true,
hang = true,
hangfoldedheaveup = true,
ladderexittoprighthand = true,
ziplinestart = true,
hangfoldedendhang = true,
hangstrafeleft = true,
zipline = true,
hanghardstart2 = true,
snatchsniper = true,
grapplecenter = true,
hanghardstart = true,
ladderexittoplefthand = true,
diveidle = true,
hanghardstartvertical = true,
hangstraferight = true,
hangfoldedstart = true,
ladderenterbottom = true,
hangheaveup = true,
diveslidestart = true,
ladderclimbuplefthandstill = true,
ladderclimbuprighthandstill = true,
diveslideidle = true,
diveslideend = true,
wallrunvertical = true,
ladderclimbdownfast = true,
ladderclimbuprighthand = true,
ladderclimbhangstart = true,
vaultontohigh = true,
snatchscar = true
}
local worldarm = {
ladderclimbuplefthand = true,
ladderclimbuplefthandstill = true,
hanghardstart = true,
hangfoldedheaveup = true,
hang = true,
snatchsniper = true,
hangfoldedendhang = true,
hangstrafeleft = true,
bargein = true,
hanghardstart2 = true,
grapplecenter = true,
diveslidestart = true,
diveslideidle = true,
ladderexittoplefthand = true,
diveslideend = true,
hanghardstartvertical = true,
hangstraferight = true,
hangfoldedstart = true,
ladderenterbottom = true,
hangheaveup = true,
ladderexittoprighthand = true,
ladderclimbuprighthandstill = true,
ladderclimbdownfast = true,
ladderclimbuprighthand = true,
ladderclimbhangstart = true,
snatchscar = true
}
local ignorezarm = {
wallrunvertical = true,
hangfoldedstart = true,
hangfoldedendhang = true,
hangfoldedheaveup = true,
wallrunverticalstart = true,
diestandlong = true,
vaultontohigh = true
}
local nocyclereset = {
jumpwrright = true,
jumpwrleft = true,
meslidestart = true
}
local ignorebac = {
evaderoll = true,
meroll = true
}
local customspeed = {
vaultonto = 1.15,
vaultontohigh = 1
}
local vaultoverhighcam1 = Vector(0, 0, -7.5)
local vaultoverhighcam2 = Vector(0, 0, 0)
local vaultoverhigharm1 = Vector(4, -4, 13.5)
local vaultoverhigharm2 = Vector(4, 0, -2.5)
local ladderexitarm1 = Vector(-2.5, 0, 0)
local ladderexitarm2 = Vector(-10, 0, 0)
local vaultontohigharm1 = Vector(5, -10, 3.5)
local vaultontohigharm2 = Vector(10, 0, 0)
local snatchscarcam1 = Vector(0, 0, 0)
local snatchscarcam2 = Vector(10, 0, 5)
local customarmoffset = {
meslidestart = Vector(2, 5, 9.5),
meslideloop = Vector(2, 5, 9.5),
meslidestart45 = Vector(2, 5, 5),
meslideloop45 = Vector(2, 5, 5),
meslideend = Vector(2, 5, 9.5),
meslideendprone = Vector(2, 5, 9.5),
meleeslide = Vector(2, 5, 9.5),
jumpturnfly = Vector(0, 2.5, 7.5),
jumpturnflyidle = Vector(0, 2.5, 7.5),
jumpturnland = Vector(0, 2.5, 7.5),
jumpturnlandidle = Vector(0, 2.5, 7.5),
jumpturnlandstand = Vector(0, 2.5, 7.5),
jumpturnlandstandgun = Vector(0, 2.5, 7.5),
wallrunvertical = Vector(0, 0, 5),
wallrunverticalstart = Vector(0, 0, 5),
wallrunverticalturn = Vector(0, 0, 5),
vaultover = Vector(0, 4, -2.5),
vaultoverhigh = Vector(0, 0, 9.5),
vaultontohigh = Vector(5, -10, 2.5),
fallinguncontrolled = Vector(5, 0, 6),
ladderexittoplefthand = Vector(5, 0, 0),
ladderexittoprighthand = Vector(5, 0, 0),
ladderclimbhangstart = Vector(-5, 0, 0),
ladderenterbottom = Vector(-7.5, 0, 0),
crouchstill = Vector(-4, 0, -5),
crouchfwd = Vector(-4, 0, -5),
crouchbwd = Vector(0, 0, 0),
walkfwd = Vector(10, 0, -10),
runbwd = Vector(0, 0, 3),
stand = Vector(10, 0, -10),
walktostandleft = Vector(10, 0, -10)
}
local customcamoffset = {
jumpturnfly = Vector(0, 0, 7.5),
jumpturnflyidle = Vector(0, 0, 7.5),
jumpturnland = Vector(0, 0, 7.5),
jumpturnlandidle = Vector(0, 0, 7.5),
jumpturnlandstand = Vector(0, 0, 7.5),
jumpturnlandstandgun = Vector(0, 0, 7.5),
meslideendprone = Vector(0, 0, 7.5),
vaultover = Vector(0, 0, -2.5),
vaultoverhigh = Vector(0, 0, -7.5),
ladderexittoplefthand = Vector(-5, 0, 0),
ladderexittoprighthand = Vector(-5, 0, 0),
ladderenterbottom = Vector(-5, 0, 0),
hangstrafeleft = Vector(-2.5, 0, 0),
hangstraferight = Vector(-2.5, 0, 0),
snatchscar = snatchscarcam1,
crouchstill = Vector(0, 0, 2.5),
crouchfwd = Vector(0, 0, 2.5),
crouchbwd = Vector(0, 0, 2.5)
}
local transitionchecks = {
meleeairstill = function(ply)
if BodyAnimCycle >= 1 or ply:OnGround() then return true end
end,
swingjumpoff = function(ply)
if BodyAnimCycle >= 0.15 or ply:OnGround() then
BodyAnimCycle = 0
return true
end
end,
jumpcoilend = function(ply)
if ply:GetVelocity():Length() < 10 and BodyAnimCycle > 0.5 or BodyAnimCycle > 0.9 then return true end
end,
vaultover = function(ply)
if BodyAnimCycle >= 1 or ply:OnGround() and ply:GetMantle() == 0 then
BodyLimitX = 90
BodyLimitY = 180
return true
end
end,
vaultkong = function(ply)
if BodyAnimCycle >= 1 or ply:OnGround() and ply:GetMantle() == 0 then
BodyLimitX = 90
BodyLimitY = 180
return true
end
end,
vaultoverhigh = function(ply)
if BodyAnimCycle < 0.45 then
customarmoffset.vaultoverhigh = vaultoverhigharm1
customcamoffset.vaultoverhigh = vaultoverhighcam1
else
customarmoffset.vaultoverhigh = vaultoverhigharm2
customcamoffset.vaultoverhigh = vaultoverhighcam2
end
if BodyAnimCycle >= 1 or BodyAnimCycle > 0.75 and ply:OnGround() and ply:GetMantle() == 0 then
BodyLimitX = 90
BodyLimitY = 180
return true
else
BodyLimitX = 25
BodyLimitY = 40
end
end,
vaultontohigh = function(ply)
if BodyAnimCycle < 0.45 then
customarmoffset.vaultontohigh = vaultontohigharm1
else
customarmoffset.vaultontohigh = vaultontohigharm2
end
local ang = ply.OrigEyeAng
BodyAnim:SetAngles(ang)
if BodyAnimCycle >= 1 then
BodyLimitX = 90
BodyLimitY = 180
return true
elseif BodyAnimCycle >= 0.15 then
BodyLimitX = 10
BodyLimitY = 45
else
BodyLimitX = 10
BodyLimitY = 0
end
if BodyAnimCycle >= 0.45 then
local eyeang = ply:EyeAngles()
eyeang.x = 0
eyeang.z = 0
ply.OrigEyeAng = eyeang
BodyAnim:SetAngles(eyeang)
end
end,
zipline = function(ply)
if not IsValid(ply:GetZipline()) then
BodyAnimCycle = 0
return true
end
end,
jumpzipline = function(ply)
lockang = false
BodyLimitX = 90
BodyLimitY = 180
end,
stepuprightleg = function(ply)
if BodyAnimCycle >= 1 then return true end
end,
springboardleftleg = function(ply)
if BodyAnimCycle >= 0.75 or ply:OnGround() then return true end
end,
jumpturnlandstand = function(ply)
if BodyAnimCycle >= 0.85 then
BodyLimitX = 90
BodyLimitY = 180
return true
end
end,
jumpturnlandstandgun = function(ply)
if BodyAnimCycle >= 0.85 then
BodyLimitX = 90
BodyLimitY = 180
return true
end
end,
fallinguncontrolled = function(ply)
if not ply.FallStatic then return true end
end,
ladderclimbuplefthand = function(ply)
if BodyAnimCycle >= 0.75 then return true end
end,
ladderclimbuprighthand = function(ply)
if BodyAnimCycle >= 0.75 then return true end
end,
ladderenterbottom = function(ply)
if BodyAnimCycle >= 0.35 then return true end
end,
ladderexittoplefthand = function(ply)
if BodyAnimCycle < 0.25 then
customarmoffset.ladderexittoplefthand = ladderexitarm1
else
customarmoffset.ladderexittoplefthand = ladderexitarm2
end
if BodyAnimCycle >= 1 or ply:OnGround() then return true end
end,
ladderexittoprighthand = function(ply)
if BodyAnimCycle < 0.25 then
customarmoffset.ladderexittoprighthand = ladderexitarm1
else
customarmoffset.ladderexittoprighthand = ladderexitarm2
end
if BodyAnimCycle >= 1 or ply:OnGround() then return true end
end,
wallrunverticalturn = function(ply)
if ply:GetWallrun() ~= 4 then return true end
end,
hangfoldedheaveup = function(ply)
if BodyAnimCycle >= 0.65 then return true end
end,
hanghardstart = function(ply)
if BodyAnimCycle >= 1 then
ply.hangyaw = 0
return true
end
end,
hanghardstart2 = function(ply)
if BodyAnimCycle >= 0.75 then
ply.hangyaw = 0
return true
end
end,
snatchscar = function(ply)
lockang = true
if BodyAnimCycle < 0.35 or BodyAnimCycle > 0.8 then
customcamoffset.snatchscar = snatchscarcam1
else
customcamoffset.snatchscar = snatchscarcam2
end
if BodyAnimCycle >= 1 then
lockang = false
return true
end
end,
snatchsniper = function(ply)
lockang = true
if BodyAnimCycle >= 1 then
lockang = false
return true
end
end,
ziplinestart = function(ply)
if BodyAnimCycle >= 0.75 then return true end
end,
walkbalancefalloffleft = function(ply)
lockang = true
if BodyAnimCycle >= 1 then
lockang = false
return true
end
end,
walkbalancefalloffright = function(ply)
lockang = true
if BodyAnimCycle >= 1 then
lockang = false
return true
end
end
}
fbfunctions = {
vaultontohigh = function(ply) return true end,
swingstraight = function(ply)
BodyAnim:SetPoseParameter("swing", (ply:GetSBOffset() / 45 - 1) * 100)
end,
ziplinestart = function(ply)
if IsValid(ply:GetZipline()) then
lockang = true
CamIgnoreAng = false
BodyLimitX = 30
BodyLimitY = 90
local ang = ply.OrigEyeAng
BodyAnim:SetAngles(ang)
end
return true
end,
zipline = function(ply)
lockang = true
CamIgnoreAng = false
BodyLimitX = 30
BodyLimitY = 90
local ang = ply.OrigEyeAng
BodyAnim:SetAngles(ang)
return true
end,
hang = function(ply)
CamIgnoreAng = false
local ang = ply.OrigEyeAng
local eyeang = ply:EyeAngles()
local eyeangx = eyeang.x
eyeang.x = 0
BodyAnim:SetAngles(ang)
local mul = ang:Forward():Dot(eyeang:Forward()) + 1.1
mul = math.Clamp(mul, 0.4, 1)
BodyLimitX = 80 * mul
BodyLimitY = 175
local a = math.Clamp(math.AngleDifference(ang.y, eyeang.y), -179, 179)
if not ply.hangyaw then
ply.hangyaw = 0
end
if math.abs(a) < 42 then
a = 0
end
ply.hangyaw = Lerp(FrameTime() * 15, ply.hangyaw, a)
a = ply.hangyaw
if IsValid(BodyAnimArmCopy) and IsValid(BodyAnim) then
BodyAnim:SetPoseParameter("hang_yaw", a)
BodyAnimArmCopy:SetPoseParameter("hang_yaw", a)
a = LocalPlayer():EyeAngles().x
BodyAnim:SetPoseParameter("hang_pitch", a)
BodyAnimArmCopy:SetPoseParameter("hang_pitch", a)
end
if BodyLimitX <= eyeangx then
eyeang.x = BodyLimitX - 0.1
ply:SetEyeAngles(eyeang)
end
return true
end,
hangstrafeleft = function(ply)
BodyLimitY = 40
return true
end,
hangstraferight = function(ply)
BodyLimitY = 40
return true
end,
hanghardstartvertical = function(ply)
BodyLimitX = 30
BodyLimitY = 120
local ang = ply.OrigEyeAng
BodyAnim:SetAngles(ang)
return true
end,
hanghardstart = function(ply)
BodyLimitX = 30
BodyLimitY = 120
local ang = ply.OrigEyeAng
BodyAnim:SetAngles(ang)
return true
end,
hanghardstart2 = function(ply)
BodyLimitX = 30
BodyLimitY = 120
local ang = ply.OrigEyeAng
BodyAnim:SetAngles(ang)
return true
end,
hangheaveup = function(ply)
BodyLimitX = 30
BodyLimitY = 90
local ang = ply.OrigEyeAng
BodyAnim:SetAngles(ang)
return true
end,
hangfoldedstart = function(ply)
BodyLimitX = 30
BodyLimitY = 90
local ang = ply.OrigEyeAng
BodyAnim:SetAngles(ang)
return true
end,
hangfoldedendhang = function(ply)
BodyLimitX = 30
BodyLimitY = 90
local ang = ply.OrigEyeAng
BodyAnim:SetAngles(ang)
ply.hangyaw = 0
return true
end,
hangfoldedheaveup = function(ply)
BodyLimitX = 30
BodyLimitY = 90
local ang = ply.OrigEyeAng
BodyAnim:SetAngles(ang)
return true
end,
dodgejumpleft = function(ply)
BodyLimitX = 30
BodyLimitY = 180
end,
dodgejumpright = function(ply)
BodyLimitX = 30
BodyLimitY = 180
end,
ladderclimbdownfast = function(ply)
lockang = true
end
}
local defaultcamoffset = Vector()
local playermodelbones = {"ValveBiped.Bip01_L_UpperArm", "ValveBiped.Bip01_R_UpperArm"}
local fingers = {"ValveBiped.Bip01_L_Finger4", "ValveBiped.Bip01_L_Finger41", "ValveBiped.Bip01_L_Finger3", "ValveBiped.Bip01_L_Finger31", "ValveBiped.Bip01_L_Finger2", "ValveBiped.Bip01_L_Finger21", "ValveBiped.Bip01_L_Finger1", "ValveBiped.Bip01_L_Finger11", "ValveBiped.Bip01_R_Finger4", "ValveBiped.Bip01_R_Finger41", "ValveBiped.Bip01_R_Finger3", "ValveBiped.Bip01_R_Finger31", "ValveBiped.Bip01_R_Finger2", "ValveBiped.Bip01_R_Finger21", "ValveBiped.Bip01_R_Finger1", "ValveBiped.Bip01_R_Finger11"}
local fingerscustom = {
["ValveBiped.Bip01_L_Finger4"] = Angle(-10, 10, 0),
["ValveBiped.Bip01_L_Finger3"] = Angle(-10, 20, 0),
["ValveBiped.Bip01_L_Finger2"] = Angle(0, 20, 0),
["ValveBiped.Bip01_L_Finger1"] = Angle(10, 20, 0),
["ValveBiped.Bip01_R_Finger4"] = Angle(30, 10, 0),
["ValveBiped.Bip01_R_Finger3"] = Angle(20, 20, 0),
["ValveBiped.Bip01_R_Finger2"] = Angle(10, 20, 0)
}
eventsounds = {
hangfoldedendhang = {
[0.42] = "Handsteps.ConcreteHard",
[0.05] = "Handsteps.ConcreteSoft",
[0.25] = "Handsteps.ConcreteRelease",
[0.15] = "Handsteps.ConcreteRelease",
[0.5] = "Faith.StrainHard"
},
hangfoldedheaveup = {
[0.1] = "Faith.StrainHard"
},
hangfoldedstart = {
[0.1] = "Faith.Impact"
},
hangheaveup = {
[0] = "Faith.StrainMedium"
},
vaultontohigh = {
[0.2] = "Vault",
[0.05] = "Handsteps.ConcreteHard",
[0.25] = "Faith.StrainSoft",
[0.45] = "Footsteps.Concrete",
[0.5] = "Cloth.MovementRun",
[0.3] = "Cloth.VaultSwish"
},
vaultonto = {
[0.1] = "Footsteps.Concrete",
[0.01] = "Handsteps.ConcreteHard",
[0.025] = "Cloth.MovementRun"
},
vaultkong = {
[0.025] = "Vault"
},
snatchscar = {
[0.35] = "Melee.Foot",
[0.05] = "Melee.ArmSwoosh",
[0.1] = "Melee.LegSwoosh",
[0.15] = "Faith.StrainMedium"
},
meleeslide = {
[0.025] = "Melee.LegSwoosh"
},
meleewrleft = {
[0.035] = "Melee.LegSwoosh",
[0.075] = "Faith.StrainHard"
},
meleewrright = {
[0.035] = "Melee.LegSwoosh",
[0.075] = "Faith.StrainHard"
},
ladderclimbhangstart = {
[0] = "Footsteps.LadderHeavy",
[0.1] = "Land.Ladder"
},
ladderclimbuplefthand = {
[0] = "Release.Ladder",
[0.15] = "Footsteps.LadderMedium",
[0.2] = "Handsteps.Ladder"
},
ladderclimbuprighthand = {
[0] = "Release.Ladder",
[0.15] = "Footsteps.LadderMedium",
[0.2] = "Handsteps.Ladder"
},
ladderexittoplefthand = {
[0.45] = "Release.Ladder",
[0.1] = "Handsteps.Ladder",
[0.5] = "Release.Ladder",
[0.15] = "Handsteps.Ladder"
},
ladderexittoprighthand = {
[0.45] = "Release.Ladder",
[0.1] = "Handsteps.Ladder",
[0.5] = "Release.Ladder",
[0.15] = "Handsteps.Ladder"
},
jumpturnlandstand = {
[0.025] = "me_faith_cloth_roll_cloth.wav",
[0.25] = "Faith.StrainSoft",
[0.3] = "me_body_roll.wav"
}
}
local CharaName = "Faith"
local CharaLen = #CharaName
local function BodyEventSounds(anim)
local tbl = eventsounds[anim]
if tbl then
local ply = LocalPlayer()
for k, v in pairs(tbl) do
local func = nil
if v:Left(CharaLen) == CharaName then
func = ply.FaithVO
else
func = ply.EmitSound
end
timer.Simple(k, function()
func(ply, v)
end)
end
end
end
camint = 1
campos = Vector()
camang = Angle()
-- local customoffset = Vector()
-- local movedback = false
local customoffsetlerp = Vector()
local function JumpCalcView(view)
if not fbanims[BodyAnimString] then
hook.Remove("BodyAnimCalcView", "JumpCalcView")
hook.Remove("BodyAnimDrawArm", "JumpArmThink")
hook.Remove("PostDrawOpaqueRenderables", "JumpArmDraw")
if IsValid(BodyAnimArmCopy) then
BodyAnimArmCopy:Remove()
end
end
-- local eyepos = LocalPlayer():EyePos()
-- local vieworigin = view.origin
BodyAnim:SetupBones()
local m = BodyAnim:GetBoneMatrix(68)
local ang = nil -- local pos, ang = nil
if m then
ang = m:GetAngles()
pos = m:GetTranslation()
end
if IsValid(ang) then
ang:Sub(view.angles)
ang:Mul(camint)
view.angles:Add(ang)
end
customoffsetlerp = LerpVector(math.min(10 * FrameTime(), 1), customoffsetlerp, customcamoffset[BodyAnimString] or defaultcamoffset)
campos = view.origin
camang = view.angles
campos:Add(LocalToWorld(customoffsetlerp, angle_zero, vector_origin, BodyAnim:GetAngles()))
if IsValid(BodyAnim) and jumpanims[BodyAnimString] and BodyAnimCycle >= 1 then
BodyAnim:SetSequence(BodyAnim:LookupSequence("jumpidle"))
end
end
local function CreateBodyAnimArmCopy()
if not IsValid(BodyAnimArmCopy) and IsValid(BodyAnim) and not ignorebac[BodyAnimString] then
local ply = LocalPlayer()
BodyAnimArmCopy = ClientsideModel("models/" .. BodyAnimMDLString .. ".mdl", RENDERGROUP_BOTH)
local seq = BodyAnim:GetSequence()
if seq then
BodyAnimArmCopy:SetSequence(seq)
end
for num, _ in pairs(BodyAnim:GetBodyGroups()) do
BodyAnimArmCopy:SetBodygroup(num - 1, BodyAnim:GetBodygroup(num - 1))
BodyAnimArmCopy:SetSkin(BodyAnim:GetSkin())
end
for k, v in ipairs(fingers) do
local b = BodyAnimArmCopy:LookupBone(v)
if b then
BodyAnimArmCopy:ManipulateBoneAngles(b, Angle(0, 30, 0))
end
end
for k, v in pairs(fingerscustom) do
local b = BodyAnimArmCopy:LookupBone(k)
if b then
BodyAnimArmCopy:ManipulateBoneAngles(b, v)
end
end
ply.BAC = BodyAnimArmCopy
end
return BodyAnimArmCopy
end
hook.Add("BodyAnimRemove", "BodyAnimArmRemove", function()
if IsValid(BodyAnimArmCopy) then
BodyAnimArmCopy:Remove()
end
end)
local function JumpArmThink()
local bac = CreateBodyAnimArmCopy()
if IsValid(bac) then return true end
end
function ArmInterrupting(bac)
return IsValid(bac) and arminterrupts[bac:GetSequenceName(bac:GetSequence())]
end
local defaultarmoffset = Vector()
local armoffset = Vector()
local armoffsetlerp = Vector()
-- local drawnorigin = false
local drawnskytime = 0
local function JumpArmDraw(a, b, c)
local bac = CreateBodyAnimArmCopy()
if IsValid(bac) and not LocalPlayer():ShouldDrawLocalPlayer() and IsValid(BodyAnim) and not c then
local ply = LocalPlayer()
local ang = ply:EyeAngles()
ang.z = 0
if not nospinebend[BodyAnimString] then
BodyAnim:ManipulateBoneAngles(1, Angle(0, math.max(ang.x * 0.5, 0), 0))
else
BodyAnim:ManipulateBoneAngles(1, angle_zero)
end
cam.IgnoreZ(true)
-- local camposoff = campos - ply:EyePos()
local attachId = bac:LookupAttachment("eyes")
local offset = bac:GetAttachment(attachId)
if not offset then return end
local arminterrupting = ArmInterrupting(bac)
local arminterruptboost = arminterrupting and 4 or 1
armoffsetlerp = LerpVector(math.min(10 * FrameTime() * arminterruptboost, 1), armoffsetlerp, not arminterrupting and customarmoffset[BodyAnimString] or defaultarmoffset)
armoffset:Set(armoffsetlerp)
local pos = offset.Pos
local ang = offset.Ang
if not IsValid(BodyAnimMDLarm) then return end
BodyAnimMDLarm:SetNoDraw(true)
bac:SetParent(nil)
bac:SetAngles(angle_zero)
bac:SetPos(Vector(0, 0, -64))
if not worldarm[BodyAnimString] then
bac:SetRenderOrigin(bac:GetPos())
end
BodyAnimMDLarm:SetParent(bac)
if not ply.armfollowlerp then
ply.armfollowlerp = 0
end
if armfollowanims[BodyAnimString] and not ArmInterrupting(bac) then
ang.x = ply.armfollowlerp < 1 and Lerp(ply.armfollowlerp, 0, ply:EyeAngles().x) or ply:EyeAngles().x
ply.armfollowlerp = math.Approach(ply.armfollowlerp, 1, FrameTime() * 1.5)
elseif armlock[BodyAnimString] then
ang.x = ply:EyeAngles().x
ang.y = ply:EyeAngles().y - ply.OrigEyeAng.y
else
ang.x = ply.armfollowlerp > 0 and Lerp(ply.armfollowlerp, 0, ply:EyeAngles().x) or 0
ang.y = 0
ply.armfollowlerp = math.Approach(ply.armfollowlerp, 0, FrameTime() * 2.5 * arminterruptboost)
end
pos:Add(armoffset)
pos:Add(customoffsetlerp)
ang:Add(ViewTiltAngle)
if CamShake then
ang:Add(CamShakeAng)
end
local activewep = ply:GetActiveWeapon()
if IsValid(activewep) and activewep:GetClass() == "runnerhands" then
if not worldarm[BodyAnimString] then
cam.Start3D(pos, ang)
cam.IgnoreZ(ignorezarm[BodyAnimString] or false)
BodyAnimMDLarm:SetPos(pos)
bac:SetupBones()
BodyAnimMDLarm:DrawModel()
cam.End3D()
else
local armoff = LocalToWorld(armoffset, angle_zero, vector_origin, BodyAnim:GetAngles())
cam.IgnoreZ(ignorezarm[BodyAnimString] or false)
bac:SetAngles(BodyAnim:GetAngles())
bac:SetPos(BodyAnim:GetPos() + armoff)
bac:SetRenderOrigin(nil)
BodyAnimMDLarm:SetPos(BodyAnim:GetPos() + armoff)
bac:SetupBones()
BodyAnimMDLarm:DrawModel()
end
elseif IsValid(activewep) then
ply:DrawViewModel(true)
ply:GetViewModel():SetNoDraw(false)
end
cam.IgnoreZ(false)
local seq = BodyAnim:GetSequence()
if seq and (not arminterrupts[bac:GetSequenceName(bac:GetSequence())] or bac:GetCycle() >= 1) then
if bac:GetSequence() ~= seq then
for k, v in ipairs(fingers) do
local b = bac:LookupBone(v)
if b then
bac:ManipulateBoneAngles(b, Angle(0, 30, 0))
end
end
for k, v in pairs(fingerscustom) do
local b = bac:LookupBone(k)
if b then
bac:ManipulateBoneAngles(b, v)
end
end
end
bac:SetSequence(seq)
bac:SetCycle(BodyAnim:GetCycle() or 1)
elseif seq and drawnskytime < CurTime() then
bac:SetCycle(bac:GetCycle() + FrameTime() / bac:SequenceDuration())
end
if (not b or not skybox3d) and not worldarm[BodyAnimString] then
bac:SetRenderOrigin(campos)
drawnorigin = true
end
drawnskytime = CurTime()
end
end
hook.Add("PreRender", "JumpArmOriginVar", function()
drawnorigin = false
end)
hook.Add("PostDrawSkyBox", "JumpArm3DSky", function()
skybox3d = true
hook.Remove("PostDrawSkyBox", "JumpArm3DSky")
end)
hook.Add("CalcViewModelView", "lol", function(wep, vm, oldpos, oldang, pos, ang)
pos:Sub(oldpos)
pos:Add(campos)
ang:Sub(oldang)
ang:Add(camang)
if wep.m_ViewModel then
local vmoffsets = wep.ViewModelVars
local lerpaimpos = vmoffsets.LerpAimPos
lerpaimpos.y = 0
local cpos, cang = LocalToWorld(vector_origin, angle_zero, lerpaimpos, vmoffsets.LerpAimAngles)
pos:Add(cpos)
ang:Add(cang)
wep.m_ViewModel:SetRenderOrigin(pos)
wep.m_ViewModel:SetAngles(ang)
end
end)
local function JumpAnim(event, ply)
if events[event] then
local wasjumpanim = fbanims[BodyAnimString] and IsValid(BodyAnim)
if not wasjumpanim then
RemoveBodyAnim()
end
if event == "jump" or event == "jumpfar" or event:Left(11) == "jumpwallrun" and ply:GetWallrunDir():Dot(ply:EyeAngles():Forward()) < 0.75 then
if event == "jumpfar" then
animtable.AnimString = "jumpfast"
else
animtable.AnimString = "jumpslow"
end
lockang = false
CamIgnoreAng = true
BodyLimitX = 90
BodyLimitY = 180
else
BodyAnimCycle = 0
animtable.AnimString = eventslut[event]
end
BodyAnimString = animtable.AnimString
BodyEventSounds(BodyAnimString)
if not nocyclereset[BodyAnimString] then
BodyAnimCycle = 0
end
if not wasjumpanim then
StartBodyAnim(animtable)
if not IsValid(BodyAnim) then return end
CreateBodyAnimArmCopy()
if not ply:ShouldDrawLocalPlayer() or CurTime() < 10 then
for k, v in ipairs(playermodelbones) do
local b = BodyAnim:LookupBone(v)
if b then
BodyAnim:ManipulateBonePosition(b, Vector(0, 0, 100 * (k == 1 and -1 or 1)))
end
end
end
hook.Add("BodyAnimCalcView", "JumpCalcView", JumpCalcView)
hook.Add("BodyAnimDrawArm", "JumpArmThink", JumpArmThink)
hook.Add("PostDrawOpaqueRenderables", "JumpArmDraw", JumpArmDraw)
else
BodyAnim:ResetSequence(BodyAnim:LookupSequence(BodyAnimString))
end
end
end
hook.Add("OnParkour", "JumpAnim", JumpAnim)
function ArmInterrupt(anim)
if arminterrupts[anim] then
local arm = CreateBodyAnimArmCopy()
if IsValid(arm) then
for k, v in ipairs(fingers) do
local b = BodyAnimArmCopy:LookupBone(v)
if b then
arm:ManipulateBoneAngles(b, angle_zero)
end
end
for k, v in pairs(fingerscustom) do
local b = BodyAnimArmCopy:LookupBone(k)
if b then
arm:ManipulateBoneAngles(b, angle_zero)
end
end
arm:SetSequence(anim)
arm:SetCycle(0)
end
end
end
local lastwr = 0
hook.Add("Think", "FBAnimHandler", function()
local ply = LocalPlayer()
if not IsValid(BodyAnim) and ply:Alive() then
JumpAnim("fall", ply)
camjoint = "eyes"
BodyAnimSpeed = 1
BodyLimitX = 90
BodyLimitY = 180
end
if ply:GetWallrun() >= 2 then
BodyLimitY = 95
end
if ply:GetWallrun() == 0 and lastwr > 0 then
BodyLimitY = 180
end
lastwr = ply:GetWallrun()
end)
local animtr, animtr_result = nil, nil
local oldnewang = Angle()
local function JumpThink()
if IsValid(BodyAnim) then
if not animtr then
animtr = {}
animtr_result = {}
animtr.filter = ply
animtr.output = animtr_result
end
local lastBAString = BodyAnimString
BodyAnimString = BodyAnim:GetSequenceName(BodyAnim:GetSequence())
if fbanims[BodyAnimString] then
local ply = LocalPlayer()
if jumpanims[BodyAnimString] and (ply:OnGround() or ply:GetWallrun() ~= 0 or ply:GetMantle() ~= 0) then
BodyAnim:SetSequence(BodyAnim:LookupSequence("runfwd"))
BodyAnimCycle = 0
end
local ang = ply:EyeAngles()
ang[1] = 0
animtr.start = ply:GetPos()
local angold = ang
local lerpspeed = 10
local vel = LocalPlayer():GetVelocity()
local vel_l = vel:Length()
local moving = ply:KeyDown(IN_FORWARD) or ply:KeyDown(IN_MOVELEFT) or ply:KeyDown(IN_MOVERIGHT)
local back = ply:KeyDown(IN_BACK)
if runanims[BodyAnimString] then
if lastBAString == "stand" and vel_l > 0 then
BodyAnimCycle = ply:GetStepRight() and 0.5 or 0
end
lockang = false
CamIgnoreAng = true
BodyLimitX = 90
BodyLimitY = 180
vel.z = 0
if back and vel_l > 10 then
ang = vel:Angle()
if ang:Forward():Dot(angold:Forward()) < 0 then
ang:RotateAroundAxis(Vector(0, 0, 1), 180)
end
BodyAnimSpeed = math.Clamp(vel_l / 150, 0.1, 0.8)
lerpspeed = 300
moveback = true
if not ply:Crouching() then
BodyAnim:SetSequence(BodyAnim:LookupSequence("runbwd"))
else
BodyAnim:SetSequence(BodyAnim:LookupSequence("crouchbwd"))
end
elseif vel_l > 0 and moving then
ang = vel:Angle()
if moveback then
ang:RotateAroundAxis(Vector(0, 0, 1), -180)
if ply:KeyDown(IN_FORWARD) then
moveback = false
else
BodyAnim:SetSequence(BodyAnim:LookupSequence("runbwd"))
end
end
if ply:InOverdrive() then
BodyAnimSpeed = math.Clamp(vel_l / 320, 0.85, 1.5)
else
local dot = ang:Forward():Dot(angold:Forward())
if dot < 0 then
ang:RotateAroundAxis(Vector(0, 0, 1), 180 * math.abs(dot))
end
if vel_l > 295 then
BodyAnimSpeed = math.Clamp(vel_l / 300, 0.85, 1)
elseif moveback then
BodyAnimSpeed = math.Clamp(vel_l / 150, 0.1, 0.8)
else
BodyAnimSpeed = math.Clamp(vel_l / 255, 0.85, 1.15)
end
end
lerpspeed = 30
if vel:Length() > 300 and ply:OnGround() then
if ply:InOverdrive() and BodyAnimString ~= "sprintfwd" and vel:Length() < 300 then
ply:EmitSound("CyborgRun")
end
BodyAnim:SetSequence(BodyAnim:LookupSequence("sprintfwd"))
elseif ply:OnGround() and not moveback then
if not ply:Crouching() then
if ply:KeyDown(IN_WALK) or vel:Length() < 150 then
BodyAnim:SetSequence(BodyAnim:LookupSequence("walkfwd"))
else
BodyAnim:SetSequence(BodyAnim:LookupSequence("runfwd"))
end
else
BodyAnim:SetSequence(BodyAnim:LookupSequence("crouchfwd"))
end
end
else
if not ply:Crouching() and BodyAnimString:Left(6) == "crouch" or BodyAnimString == "walkfwd" or BodyAnimString == "runfwd" or BodyAnimString == "sprintfwd" or BodyAnimString == "runbwd" then
BodyAnimCycle = 0
BodyAnim:SetSequence(BodyAnim:LookupSequence("walktostandleft"))
end
if (BodyAnimString == "stand" or BodyAnimString == "walktostandleft" or BodyAnimString == "jumpcoilend") and ply:Crouching() or BodyAnimString == "crouchfwd" or BodyAnimString == "crouchbwd" then
BodyAnimCycle = 0
BodyAnim:SetSequence(BodyAnim:LookupSequence("crouchstill"))
end
end
if vel_l < 64 then
ang = angold
end
else
lerpspeed = 10
BodyAnimSpeed = customspeed[BodyAnimString] or animtable.BodyAnimSpeed
end
if jumpanims2[BodyAnimString] and vel.z < -5 then
local pos = ply:GetPos()
local groundcheck = Vector(0, 0, -35)
groundcheck:Add(pos)
animtr.start = pos
animtr.endpos = groundcheck
animtr.filter = ply
util.TraceLine(animtr)
if animtr_result.Hit then
BodyAnim:SetSequence("jumpidle")
end
end
if ply:GetWallrun() >= 2 and ply:GetWallrun() < 4 and ply:GetMelee() == 0 then
vel.z = 0
ang = vel:Angle()
CamIgnoreAng = false
local bs = ply:GetWallrun() == 2 and "wallrunrightstart" or "wallrunleftstart"
local bl = ply:GetWallrun() == 2 and "wallrunright" or "wallrunleft"
if BodyAnimString == bs and BodyAnimCycle >= 1 then
BodyAnim:SetSequence(BodyAnim:LookupSequence(bl))
BodyAnimSpeed = 1.5
elseif BodyAnimString ~= bl then
BodyAnim:SetSequence(BodyAnim:LookupSequence(bs))
end
elseif BodyAnimString == "wallrunright" or BodyAnimString == "wallrunleft" or BodyAnimString == "wallrunrightstart" or BodyAnimString == "wallrunleftstart" then
BodyAnimCycle = 0
BodyAnim:SetSequence(BodyAnim:LookupSequence("jumpair"))
end
if BodyAnimString == "jumpturnfly" or BodyAnimString == "jumpturnflyidle" then
if ply:GetQuickturn() then
BodyAnim:SetAngles(ang + Angle(0, 6.5, 0))
ply.OrigEyeAng = ang
end
if ply:OnGround() then
BodyAnimCycle = 0
BodyAnim:SetSequence("jumpturnland")
ply:EmitSound("Cloth.FallShortHard")
ply:FaithVO("Faith.Impact")
DoImpactBlur(6)
end
elseif (BodyAnimString == "jumpturnland" or BodyAnimString == "jumpturnlandidle" or BodyAnimString == "jumpturnlandstand" or BodyAnimString == "jumpturnlandstandgun") and not ply:OnGround() and ply:GetMoveType() ~= MOVETYPE_NOCLIP and ply:WaterLevel() < 3 then
BodyAnimCycle = 0
BodyAnim:SetSequence("jumpturnflyidle")
end
if ply:GetSliding() then
ang = vel:Angle()
end
local check = transitionchecks[BodyAnimString]
if check and check(ply) or not check and BodyAnimCycle >= 0.9 and transitionanims[BodyAnimString] then
BodyAnim:SetSequence(transitionanims[BodyAnimString])
end
if BodyAnimString == "wallrunverticalstart" or BodyAnimString == "wallrunvertical" then
ang = ply.WallrunOrigAng or ang
BodyAnimSpeed = 1.2 * math.Clamp((LocalPlayer():GetWallrunTime() - CurTime()) / 1.2, 0.5, 1)
end
if BodyAnimString == "vaultover" or BodyAnimString == "vaultkong" or BodyAnimString == "stepuprightleg" or BodyAnimString == "vaultonto" then
if BodyAnimCycle < 0.65 then
local target = ply:GetMantleEndPos() - ply:GetMantleStartPos()
target.z = 0
target = target:Angle()
ang = target or ang
if BodyAnimString == "vaultover" or BodyAnimString == "vaultkong" or BodyAnimString == "vaultonto" then
BodyLimitX = 15
BodyLimitY = 70
if BodyAnimString == "vaultkong" then
BodyLimitX = 25
end
end
else
BodyLimitX = 90
BodyLimitY = 180
end
end
if BodyAnimString == "wallrunverticalturn" then
BodyAnimSpeed = 1.5
ang = ply:EyeAngles()
ang.x = 0
ang.z = 0
BodyAnim:SetAngles(ang)
ply.OrigEyeAng = ang
return
end
if BodyAnimString:Left(6) == "ladder" and BodyAnimString ~= "ladderclimbdownfast" then
BodyLimitX = 25
BodyLimitY = 90
ang = ply.OrigEyeAng
BodyAnim:SetAngles(ang)
CamIgnoreAng = false
lockang = false
return
end
local func = fbfunctions[BodyAnimString]
func = func and func(ply)
if func == true then return end
if ply:GetMantle() == 4 then
BodyAnim:SetSequence("vaultoverhigh")
return
end
if ply:GetMantle() == 5 then
BodyAnim:SetSequence("vaultontohigh")
return
end
if not stillanims[BodyAnimString] then
local speed = vel_l > 5 and math.min(vel_l / 200, 1) or 1
local newang = LerpAngle(math.min(lerpspeed * FrameTime() * speed, 1), BodyAnim:GetAngles(), ang)
local ang = ply:EyeAngles()
ang[1] = 0
ang[3] = 0
if vel_l > 0 or BodyAnimString == "walktostandleft" or ply:Crouching() or IsValid(ply:GetBalanceEntity()) then
if newang:Forward():Dot(ang:Forward()) > -0.25 then
ply.OrigEyeAng = newang
BodyAnim:SetAngles(newang)
oldnewang:Set(BodyAnim:GetAngles())
else
oldnewang:Set(LerpAngle(FrameTime() * 8, oldnewang, ang))
ply.OrigEyeAng = Angle(oldnewang)
BodyAnim:SetAngles(oldnewang)
end
elseif newang:Forward():Dot(ang:Forward()) < 0.25 then
local stepmat = ply.LastStepMat or game.SinglePlayer() and ply:GetNW2String("LastStepMat", "Concrete") or "Concrete"
BodyAnimCycle = 0
BodyAnim:SetSequence(BodyAnim:LookupSequence("walktostandleft"))
ply:EmitSound("Release." .. stepmat)
timer.Simple(0.15, function()
ply:EmitSound("Footsteps." .. stepmat)
end)
end
end
end
end
end
hook.Add("Think", "JumpThink", JumpThink)