139 lines
3.3 KiB
Lua
139 lines
3.3 KiB
Lua
|
local _internal_camera = nil
|
||
|
local _internal_isFrozen = false
|
||
|
|
||
|
local _internal_pos = nil
|
||
|
local _internal_rot = nil
|
||
|
local _internal_fov = nil
|
||
|
local _internal_vecX = nil
|
||
|
local _internal_vecY = nil
|
||
|
local _internal_vecZ = nil
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
function GetInitialCameraPosition()
|
||
|
if _G.CAMERA_SETTINGS.KEEP_POSITION and _internal_pos then
|
||
|
return _internal_pos
|
||
|
end
|
||
|
|
||
|
return GetGameplayCamCoord()
|
||
|
end
|
||
|
|
||
|
function GetInitialCameraRotation()
|
||
|
if _G.CAMERA_SETTINGS.KEEP_ROTATION and _internal_rot then
|
||
|
return _internal_rot
|
||
|
end
|
||
|
|
||
|
local rot = GetGameplayCamRot()
|
||
|
return vector3(rot.x, 0.0, rot.z)
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
function IsFreecamFrozen()
|
||
|
return _internal_isFrozen
|
||
|
end
|
||
|
|
||
|
function SetFreecamFrozen(frozen)
|
||
|
local frozen = frozen == true
|
||
|
_internal_isFrozen = frozen
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
function GetFreecamPosition()
|
||
|
return _internal_pos
|
||
|
end
|
||
|
|
||
|
function SetFreecamPosition(x, y, z)
|
||
|
local pos = vector3(x, y, z)
|
||
|
local int = GetInteriorAtCoords(pos)
|
||
|
|
||
|
LoadInterior(int)
|
||
|
SetFocusArea(pos)
|
||
|
LockMinimapPosition(x, y)
|
||
|
SetCamCoord(_internal_camera, pos)
|
||
|
|
||
|
_internal_pos = pos
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
function GetFreecamRotation()
|
||
|
return _internal_rot
|
||
|
end
|
||
|
|
||
|
function SetFreecamRotation(x, y, z)
|
||
|
local rotX, rotY, rotZ = ClampCameraRotation(x, y, z)
|
||
|
local vecX, vecY, vecZ = EulerToMatrix(rotX, rotY, rotZ)
|
||
|
local rot = vector3(rotX, rotY, rotZ)
|
||
|
|
||
|
LockMinimapAngle(math.floor(rotZ))
|
||
|
SetCamRot(_internal_camera, rot)
|
||
|
|
||
|
_internal_rot = rot
|
||
|
_internal_vecX = vecX
|
||
|
_internal_vecY = vecY
|
||
|
_internal_vecZ = vecZ
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
function GetFreecamFov()
|
||
|
return _internal_fov
|
||
|
end
|
||
|
|
||
|
function SetFreecamFov(fov)
|
||
|
local fov = Clamp(fov, 0.0, 90.0)
|
||
|
SetCamFov(_internal_camera, fov)
|
||
|
_internal_fov = fov
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
function GetFreecamMatrix()
|
||
|
return _internal_vecX,
|
||
|
_internal_vecY,
|
||
|
_internal_vecZ,
|
||
|
_internal_pos
|
||
|
end
|
||
|
|
||
|
function GetFreecamTarget(distance)
|
||
|
local target = _internal_pos + (_internal_vecY * distance)
|
||
|
return target
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
|
||
|
function IsFreecamActive()
|
||
|
return IsCamActive(_internal_camera) == 1
|
||
|
end
|
||
|
|
||
|
function SetFreecamActive(active)
|
||
|
if active == IsFreecamActive() then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
local enableEasing = _G.CAMERA_SETTINGS.ENABLE_EASING
|
||
|
local easingDuration = _G.CAMERA_SETTINGS.EASING_DURATION
|
||
|
|
||
|
if active then
|
||
|
local pos = GetInitialCameraPosition()
|
||
|
local rot = GetInitialCameraRotation()
|
||
|
|
||
|
_internal_camera = CreateCam('DEFAULT_SCRIPTED_CAMERA', true)
|
||
|
|
||
|
SetFreecamFov(_G.CAMERA_SETTINGS.FOV)
|
||
|
SetFreecamPosition(pos.x, pos.y, pos.z)
|
||
|
SetFreecamRotation(rot.x, rot.y, rot.z)
|
||
|
TriggerEvent('freecam:onEnter')
|
||
|
else
|
||
|
DestroyCam(_internal_camera)
|
||
|
ClearFocus()
|
||
|
UnlockMinimapPosition()
|
||
|
UnlockMinimapAngle()
|
||
|
TriggerEvent('freecam:onExit')
|
||
|
end
|
||
|
|
||
|
SetPlayerControl(PlayerId(), not active)
|
||
|
RenderScriptCams(active, enableEasing, easingDuration)
|
||
|
end
|