forked from Simnation/Main
146 lines
3.7 KiB
Lua
146 lines
3.7 KiB
Lua
local floor = math.floor
|
|
local vector3 = vector3
|
|
local SetCamRot = SetCamRot
|
|
local IsCamActive = IsCamActive
|
|
local SetCamCoord = SetCamCoord
|
|
-- local PinInteriorInMemory = PinInteriorInMemory
|
|
local SetFocusPosAndVel = SetFocusPosAndVel
|
|
local LockMinimapAngle = LockMinimapAngle
|
|
-- local GetInteriorAtCoords = GetInteriorAtCoords
|
|
local LockMinimapPosition = LockMinimapPosition
|
|
|
|
local _internal_camera = nil
|
|
local _internal_isFrozen = false
|
|
|
|
local _internal_pos = nil
|
|
local _internal_rot = nil
|
|
local _internal_vecX = nil
|
|
local _internal_vecY = nil
|
|
local _internal_vecZ = nil
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
local function GetInitialCameraPosition()
|
|
if _G.CAMERA_SETTINGS.KEEP_POSITION and _internal_pos then
|
|
return _internal_pos
|
|
end
|
|
|
|
return GetGameplayCamCoord()
|
|
end
|
|
|
|
local function GetInitialCameraRotation()
|
|
if _G.CAMERA_SETTINGS.KEEP_ROTATION and _internal_rot then
|
|
return _internal_rot
|
|
end
|
|
|
|
local rot = GetGameplayCamRot(0)
|
|
return vector3(rot.x, 0.0, rot.z)
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
function IsFreecamFrozen()
|
|
return _internal_isFrozen
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
function GetFreecamPosition()
|
|
return _internal_pos
|
|
end
|
|
|
|
function SetFreecamPosition(pos)
|
|
-- local int = GetInteriorAtCoords(pos.x, pos.y, pos.z)
|
|
|
|
-- if int ~= 0 then
|
|
-- PinInteriorInMemory(int)
|
|
-- end
|
|
|
|
SetFocusPosAndVel(pos.x, pos.y, pos.z, 0.0, 0.0, 0.0)
|
|
LockMinimapPosition(pos.x, pos.y)
|
|
SetCamCoord(_internal_camera, pos.x, pos.y, pos.z)
|
|
|
|
_internal_pos = pos
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
function GetFreecamRotation()
|
|
return _internal_rot
|
|
end
|
|
|
|
function SetFreecamRotation(rot)
|
|
rot = vector3(Clamp(rot.x, -90.0, 90.0), rot.y % 360, rot.z % 360)
|
|
|
|
if _internal_rot ~= rot then
|
|
local vecX, vecY, vecZ = EulerToMatrix(rot.x, rot.y, rot.z)
|
|
|
|
LockMinimapAngle(floor(rot.z))
|
|
SetCamRot(_internal_camera, rot.x, rot.y, rot.z, 2)
|
|
|
|
_internal_rot = rot
|
|
_internal_vecX = vecX
|
|
_internal_vecY = vecY
|
|
_internal_vecZ = vecZ
|
|
end
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
local function SetFreecamFov(fov)
|
|
fov = Clamp(fov, 0.0, 90.0)
|
|
SetCamFov(_internal_camera, fov)
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
function GetFreecamMatrix()
|
|
return _internal_vecX,
|
|
_internal_vecY,
|
|
_internal_vecZ,
|
|
_internal_pos
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
function IsFreecamActive()
|
|
return IsCamActive(_internal_camera)
|
|
end
|
|
|
|
function SetFreecamActive(active)
|
|
if active == IsFreecamActive() then
|
|
return
|
|
end
|
|
|
|
local ped = cache.ped
|
|
|
|
SetEntityVisible(ped, not active, false)
|
|
SetEntityCollision(ped, not active, not active)
|
|
SetEntityInvincible(ped, active)
|
|
|
|
local enableEasing = _G.CAMERA_SETTINGS.ENABLE_EASING
|
|
local easingDuration = _G.CAMERA_SETTINGS.EASING_DURATION
|
|
|
|
if active then
|
|
if cache.vehicle then
|
|
TaskLeaveVehicle(ped, cache.vehicle, 16)
|
|
end
|
|
|
|
_internal_camera = CreateCam('DEFAULT_SCRIPTED_CAMERA', true)
|
|
|
|
SetFreecamFov(_G.CAMERA_SETTINGS.FOV)
|
|
SetFreecamPosition(GetInitialCameraPosition())
|
|
SetFreecamRotation(GetInitialCameraRotation())
|
|
TriggerEvent('freecam:onEnter')
|
|
StartFreecamThread()
|
|
else
|
|
DestroyCam(_internal_camera, false)
|
|
ClearFocus()
|
|
UnlockMinimapPosition()
|
|
UnlockMinimapAngle()
|
|
TriggerEvent('freecam:onExit')
|
|
SetGameplayCamRelativeHeading(0)
|
|
end
|
|
|
|
RenderScriptCams(active, enableEasing, easingDuration, true, true)
|
|
end
|