Files
2026-03-31 10:27:04 +03:00

140 lines
3.0 KiB
Lua

local animationTime = 2
local PLUGIN = PLUGIN
PLUGIN.cameraFraction = 0
local function GetHeadBone(client)
local head
for i = 1, client:GetBoneCount() do
local name = client:GetBoneName(i)
if (string.find(name:lower(), "head")) then
head = i
break
end
end
return head
end
function PLUGIN:PlayerBindPress(client, bind, bPressed)
if (!client:GetNetVar("actEnterAngle")) then
return
end
if (bind:find("+jump") and bPressed) then
ix.command.Send("ExitAct")
return true
end
end
function PLUGIN:ShouldDrawLocalPlayer(client)
if (client:GetNetVar("actEnterAngle") and self.cameraFraction > 0.25) then
return true
elseif (self.cameraFraction > 0.25) then
return true
end
end
local forwardOffset = 16
local backwardOffset = -32
local heightOffset = Vector(0, 0, 20)
local idleHeightOffset = Vector(0, 0, 6)
local traceMin = Vector(-4, -4, -4)
local traceMax = Vector(4, 4, 4)
function PLUGIN:CalcView(client, origin)
local enterAngle = client:GetNetVar("actEnterAngle")
local fraction = self.cameraFraction
local offset = self.bIdle and forwardOffset or backwardOffset
local height = self.bIdle and idleHeightOffset or heightOffset
if (!enterAngle) then
if (fraction > 0) then
local view = {
origin = LerpVector(fraction, origin, origin + self.forward * offset + height)
}
if (self.cameraTween) then
self.cameraTween:update(FrameTime())
end
return view
end
return
end
local view = {}
local forward = enterAngle:Forward()
local head = GetHeadBone(client)
local bFirstPerson = true
if (ix.option.Get("thirdpersonEnabled", false)) then
local originPosition = head and client:GetBonePosition(head) or client:GetPos()
-- check if the camera will hit something
local data = util.TraceHull({
start = originPosition,
endpos = originPosition - client:EyeAngles():Forward() * 48,
mins = traceMin * 0.75,
maxs = traceMax * 0.75,
filter = client
})
bFirstPerson = data.Hit
if (!bFirstPerson) then
view.origin = data.HitPos
end
end
if (bFirstPerson) then
if (head) then
local position = client:GetBonePosition(head) + forward * offset + height
local data = {
start = (client:GetBonePosition(head) or Vector(0, 0, 64)) + forward * 8,
endpos = position + forward * offset,
mins = traceMin,
maxs = traceMax,
filter = client
}
data = util.TraceHull(data)
if (data.Hit) then
view.origin = data.HitPos
else
view.origin = position
end
else
view.origin = origin + forward * forwardOffset + height
end
end
view.origin = LerpVector(fraction, origin, view.origin)
if (self.cameraTween) then
self.cameraTween:update(FrameTime())
end
return view
end
net.Receive("ixActEnter", function()
PLUGIN.bIdle = net.ReadBool()
PLUGIN.forward = LocalPlayer():GetNetVar("actEnterAngle"):Forward()
PLUGIN.cameraTween = ix.tween.new(animationTime, PLUGIN, {
cameraFraction = 1
}, "outQuint")
end)
net.Receive("ixActLeave", function()
PLUGIN.cameraTween = ix.tween.new(animationTime * 0.5, PLUGIN, {
cameraFraction = 0
}, "outQuint")
end)