140 lines
3.0 KiB
Lua
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)
|