mirror of
https://github.com/sky-systems/sky_phone.git
synced 2026-09-04 08:13:23 +00:00
FIX - restore camera input and configurator warning (#30)
* FIX - honor configured camera look control Camera focus was owned by hard-coded Space DOM handlers, bypassing Config.Phone.HoldToLook. Move focus input to the FiveM client and add a bounded scripted-camera orbit so selfie mode can rotate while the configured control is held. * FIX - preserve camera movement passthrough * FIX - restore Phone Configurator startup warning * FIX - keep camera modifier input readable
This commit is contained in:
@@ -9,9 +9,13 @@ local front_camera_fov = 32.0
|
||||
local front_camera_distance = 1.05
|
||||
local front_camera_height = 0.05
|
||||
local front_camera_target_height = 0.03
|
||||
local front_camera_horizontal_limit = 75.0
|
||||
local front_camera_vertical_limit = 35.0
|
||||
local front_camera_rotate_speed = 5.0
|
||||
local camera_passthrough_control = 22 -- INPUT_JUMP (Space by default)
|
||||
local blocked_camera_controls = {
|
||||
0, -- INPUT_NEXT_CAMERA
|
||||
22, -- INPUT_JUMP
|
||||
camera_passthrough_control,
|
||||
24, -- INPUT_ATTACK
|
||||
25, -- INPUT_AIM
|
||||
37, -- INPUT_SELECT_WEAPON
|
||||
@@ -45,6 +49,8 @@ local camera_state = {
|
||||
focus_watcher = false,
|
||||
front_camera = false,
|
||||
front_camera_handle = nil,
|
||||
front_camera_pitch = 0.0,
|
||||
front_camera_yaw = 0.0,
|
||||
game_input = false,
|
||||
landscape = false,
|
||||
locked = false,
|
||||
@@ -89,20 +95,39 @@ end
|
||||
local function get_front_camera_transform(ped)
|
||||
local head_position = GetPedBoneCoords(ped, 31086, 0.0, 0.0, 0.0)
|
||||
local forward = GetEntityForwardVector(ped)
|
||||
local forward_vector = vector3(forward.x, forward.y, forward.z)
|
||||
local camera_offset = forward_vector * front_camera_distance
|
||||
local camera_position = head_position + camera_offset + vector3(0.0, 0.0, front_camera_height)
|
||||
local to_camera = camera_position - head_position
|
||||
local dot = (to_camera.x * forward_vector.x)
|
||||
+ (to_camera.y * forward_vector.y)
|
||||
+ (to_camera.z * forward_vector.z)
|
||||
if dot < 0.0 then
|
||||
camera_position = head_position - camera_offset + vector3(0.0, 0.0, front_camera_height)
|
||||
end
|
||||
local yaw = math.rad(camera_state.front_camera_yaw)
|
||||
local pitch = math.rad(camera_state.front_camera_pitch)
|
||||
local orbit_direction = vector3(
|
||||
(forward.x * math.cos(yaw)) - (forward.y * math.sin(yaw)),
|
||||
(forward.x * math.sin(yaw)) + (forward.y * math.cos(yaw)),
|
||||
0.0
|
||||
)
|
||||
local camera_position = head_position
|
||||
+ (orbit_direction * (math.cos(pitch) * front_camera_distance))
|
||||
+ vector3(0.0, 0.0, front_camera_height + (math.sin(pitch) * front_camera_distance))
|
||||
local target_position = head_position + vector3(0.0, 0.0, front_camera_target_height)
|
||||
return camera_position, target_position
|
||||
end
|
||||
|
||||
local function update_front_camera_orbit()
|
||||
local horizontal_input = GetDisabledControlNormal(0, 1)
|
||||
local vertical_input = GetDisabledControlNormal(0, 2)
|
||||
camera_state.front_camera_yaw = math.max(
|
||||
-front_camera_horizontal_limit,
|
||||
math.min(
|
||||
front_camera_horizontal_limit,
|
||||
camera_state.front_camera_yaw - (horizontal_input * front_camera_rotate_speed)
|
||||
)
|
||||
)
|
||||
camera_state.front_camera_pitch = math.max(
|
||||
-front_camera_vertical_limit,
|
||||
math.min(
|
||||
front_camera_vertical_limit,
|
||||
camera_state.front_camera_pitch - (vertical_input * front_camera_rotate_speed)
|
||||
)
|
||||
)
|
||||
end
|
||||
|
||||
local function apply_front_camera(ped)
|
||||
if not camera_state.front_camera_handle or not DoesCamExist(camera_state.front_camera_handle) then
|
||||
camera_state.front_camera_handle = CreateCam("DEFAULT_SCRIPTED_CAMERA", true)
|
||||
@@ -198,7 +223,18 @@ local function watch_camera_controls()
|
||||
CreateThread(function()
|
||||
while camera_state.active do
|
||||
apply_camera_controls()
|
||||
if not camera_state.walkable then
|
||||
local passthrough_pressed = SkyPhoneFocus.IsHoldToLookPressed()
|
||||
or IsDisabledControlPressed(0, camera_passthrough_control)
|
||||
local should_focus = camera_state.locked or not passthrough_pressed
|
||||
if camera_state.nui_focused ~= should_focus then
|
||||
set_camera_focus(should_focus)
|
||||
end
|
||||
end
|
||||
if camera_state.game_input then
|
||||
if camera_state.front_camera and not camera_state.locked then
|
||||
update_front_camera_orbit()
|
||||
end
|
||||
if
|
||||
IsDisabledControlJustPressed(0, 241)
|
||||
or IsDisabledControlJustPressed(0, 261)
|
||||
@@ -214,9 +250,6 @@ local function watch_camera_controls()
|
||||
math.max(minimum_zoom, camera_state.zoom - mouse_wheel_zoom_step)
|
||||
)
|
||||
end
|
||||
if IsDisabledControlJustReleased(0, 22) then
|
||||
set_camera_focus(true)
|
||||
end
|
||||
end
|
||||
Wait(0)
|
||||
end
|
||||
@@ -243,7 +276,7 @@ AddEventHandler("sky_phone:client:cameraFocusApplied", function(data)
|
||||
camera_state.applied_nui_focus = data.focused
|
||||
SendNUIMessage({ type = "camera:focus", data = { focused = data.focused } })
|
||||
end
|
||||
if data.active and data.gameInput then
|
||||
if data.active then
|
||||
watch_camera_controls()
|
||||
end
|
||||
end)
|
||||
@@ -256,6 +289,8 @@ local function set_camera_active(active)
|
||||
TriggerEvent("sky_phone:client:cameraActiveChanged", active)
|
||||
if active then
|
||||
camera_state.front_camera = false
|
||||
camera_state.front_camera_pitch = 0.0
|
||||
camera_state.front_camera_yaw = 0.0
|
||||
camera_state.landscape = false
|
||||
camera_state.locked = false
|
||||
camera_state.zoom = 1.0
|
||||
@@ -290,6 +325,8 @@ local function set_camera_active(active)
|
||||
end
|
||||
set_flash_enabled(false)
|
||||
camera_state.front_camera = false
|
||||
camera_state.front_camera_pitch = 0.0
|
||||
camera_state.front_camera_yaw = 0.0
|
||||
camera_state.game_input = false
|
||||
camera_state.landscape = false
|
||||
camera_state.locked = false
|
||||
@@ -314,6 +351,8 @@ local function set_front_camera(active)
|
||||
return
|
||||
end
|
||||
if active then
|
||||
camera_state.front_camera_pitch = 0.0
|
||||
camera_state.front_camera_yaw = 0.0
|
||||
apply_front_camera(PlayerPedId())
|
||||
else
|
||||
clear_front_camera()
|
||||
@@ -405,6 +444,9 @@ RegisterNUICallback("camera:setLocked", function(data, cb)
|
||||
return
|
||||
end
|
||||
camera_state.locked = data.locked == true
|
||||
if camera_state.locked and not camera_state.walkable then
|
||||
set_camera_focus(true)
|
||||
end
|
||||
cb({ success = true })
|
||||
end)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user