2024-08-25 17:10:57 -04:00
|
|
|
local spectate = {}
|
|
|
|
|
|
|
|
local camera_player = -1
|
|
|
|
|
|
|
|
local camera_target
|
|
|
|
|
|
|
|
local inventory_target
|
|
|
|
|
|
|
|
local function set_camera_pos()
|
|
|
|
if camera_player < 1 and camera_player ~= -1 then
|
|
|
|
camera_player = 1000
|
|
|
|
end
|
|
|
|
local i = 0
|
|
|
|
local cam_target
|
|
|
|
for peer_id, potential_target in pairs(ctx.players) do
|
|
|
|
i = i + 1
|
2024-08-26 09:56:42 -04:00
|
|
|
if i == camera_player or (camera_player == -1 and peer_id == ctx.my_id) then
|
|
|
|
cam_target = potential_target.entity
|
2024-08-25 17:10:57 -04:00
|
|
|
camera_player = i
|
2024-08-26 09:56:42 -04:00
|
|
|
break
|
2024-08-25 17:10:57 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
if camera_player == 1000 then
|
|
|
|
camera_player = i
|
|
|
|
set_camera_pos()
|
2024-08-26 09:56:42 -04:00
|
|
|
elseif cam_target == nil then
|
2024-08-25 17:10:57 -04:00
|
|
|
camera_player = 1
|
|
|
|
set_camera_pos()
|
2024-08-26 09:56:42 -04:00
|
|
|
else
|
2024-08-25 17:10:57 -04:00
|
|
|
if cam_target == ctx.my_player.entity and not EntityHasTag(ctx.my_player.entity, "ew_notplayer") then
|
|
|
|
GameSetCameraFree(false)
|
|
|
|
if camera_target == nil then
|
|
|
|
camera_target = ctx.my_player.entity
|
|
|
|
elseif camera_target ~= ctx.my_player.entity then
|
|
|
|
EntityAddComponent2(cam_target, "AudioListenerComponent")
|
|
|
|
local audio = EntityGetFirstComponent(camera_target, "AudioListenerComponent")
|
|
|
|
local keep_alive = EntityGetFirstComponent(camera_target, "StreamingKeepAliveComponent")
|
|
|
|
EntityRemoveComponent(camera_target, audio)
|
|
|
|
EntityRemoveComponent(camera_target, keep_alive)
|
|
|
|
EntityRemoveComponent(camera_target, inventory_target)
|
|
|
|
camera_target = cam_target
|
|
|
|
end
|
|
|
|
return
|
|
|
|
end
|
|
|
|
GameSetCameraFree(true)
|
|
|
|
local t_x, t_y = EntityGetFirstHitboxCenter(cam_target)
|
|
|
|
if t_x == nil then
|
|
|
|
t_x, t_y = EntityGetTransform(cam_target)
|
|
|
|
end
|
|
|
|
GameSetCameraPos(t_x, t_y)
|
|
|
|
if camera_target == nil then
|
|
|
|
camera_target = ctx.my_player.entity
|
|
|
|
end
|
|
|
|
if camera_target ~= cam_target then
|
|
|
|
if ctx.my_player.entity ~= camera_target and inventory_target ~= nil then
|
|
|
|
EntityRemoveComponent(camera_target, inventory_target)
|
|
|
|
end
|
|
|
|
|
|
|
|
inventory_target = nil
|
|
|
|
if ctx.my_player.entity ~= cam_target then
|
|
|
|
inventory_target = EntityAddComponent2(cam_target, "InventoryGuiComponent")
|
|
|
|
end
|
|
|
|
local audio = EntityGetFirstComponent(camera_target, "AudioListenerComponent")
|
|
|
|
local keep_alive = EntityGetFirstComponent(camera_target, "StreamingKeepAliveComponent")
|
|
|
|
if audio ~= nil then
|
|
|
|
EntityRemoveComponent(camera_target, audio)
|
|
|
|
if camera_target ~= ctx.my_player.entity then
|
|
|
|
EntityRemoveComponent(camera_target, keep_alive)
|
|
|
|
end
|
|
|
|
EntityAddComponent2(cam_target, "AudioListenerComponent")
|
|
|
|
if cam_target ~= ctx.my_player.entity then
|
|
|
|
EntityAddComponent2(cam_target, "StreamingKeepAliveComponent")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
camera_target = cam_target
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local left_held = false
|
|
|
|
|
|
|
|
local right_held = false
|
|
|
|
|
|
|
|
function spectate.on_world_update()
|
|
|
|
if InputIsKeyDown(54) then
|
|
|
|
if not left_held then
|
|
|
|
if camera_player == -1 then
|
|
|
|
camera_player = 1001
|
|
|
|
end
|
|
|
|
camera_player = camera_player - 1
|
|
|
|
left_held = true
|
|
|
|
end
|
|
|
|
elseif InputIsKeyDown(55) then
|
|
|
|
if not right_held then
|
|
|
|
if camera_player == -1 then
|
|
|
|
camera_player = 0
|
|
|
|
end
|
|
|
|
camera_player = camera_player + 1
|
|
|
|
right_held = true
|
|
|
|
end
|
|
|
|
else
|
|
|
|
left_held = false
|
|
|
|
right_held = false
|
|
|
|
end
|
|
|
|
set_camera_pos()
|
|
|
|
end
|
|
|
|
|
|
|
|
return spectate
|