105 lines
3.8 KiB
Lua
105 lines
3.8 KiB
Lua
--[[
|
|
`/shdmmmmmmmmmd-`ymmmddyo:` // sm- /h/ --
|
|
`yNMMMMMMMMMMMMm-.dMMMMMMMMMN+ `MN `-:::.` .-:-hM- -o- .-::. .::-. `.:::` MN--. `-::-.
|
|
yMMMMMMMMMMMMMd.:NMMMMMMMMMMMM+ `MN yMs+oNh oNy++mM- +Mo -Mm++:`hmo+yN+ .dmo++- MNoo/ `o+odN:
|
|
yMMMMMMMMMMMMy`+NMMMMMMMMMMMMM+ `MN yM: dM. MN yM- +Mo -Mh /Mmss sM+ MN +h ohMo
|
|
`yNMMMMMMMMMo`sMMMMMMMMMMMMMNo `MN yM: dM. oNy//dM- +Mo -Mh `dNs++o. -mm+//- dM+/+ mN+/sMo
|
|
`/shddddd/ odddddddddddho:` :: .:` -: `:///-` .:. `:- .://:` `-///. `-//: `-///:.
|
|
|
|
Licensed under GNU General Public License v3.0
|
|
]]
|
|
-- Monitor Focus/Zoom Engine, bundled with Xinu & other monitor accessories
|
|
-- Used to zoom precisely into a monitor's screen (and sometimes allowing for use of near click/dragdetectors.
|
|
-- Made with <3 love by @SloppyBelloMigliore1 & Indirecta
|
|
-- Multi-Face and FOV Adjustment added by @chrischrome
|
|
-- Last Edit: 17/09/2024 dd/mm/yyyy
|
|
|
|
-- !! PLACE IN game>StarterPlayer>StarterPlayerScripts !!
|
|
|
|
local configuration = {
|
|
["ORIGINAL_FOV"] = 70; -- The FOV with which the player will be reverted after clicking again on a monitor
|
|
["MAX_ACTIVATION_DISTANCE"] = 10; -- The max activation distance the click detectors on the monitors should use
|
|
["MONITOR_TAG"] = "Monitor"; -- CollectionService Tag that this script should use to look for interactable monitors
|
|
["INIT_DELAY"] = 5; -- Delay before looking for devices, useful if game takes a while to load
|
|
};
|
|
|
|
local faces = {
|
|
["Front"] = {
|
|
move = {0, 0, -10},
|
|
rotate = {0, math.rad(180), 0}
|
|
},
|
|
["Back"] = {
|
|
move = {0, 0, 10},
|
|
rotate = {0, 0, 0}
|
|
},
|
|
["Left"] = {
|
|
move = {-10, 0, 0},
|
|
rotate = {0, math.rad(-90), 0}
|
|
},
|
|
["Right"] = {
|
|
move = {10, 0, 0},
|
|
rotate = {0, math.rad(90), 0}
|
|
},
|
|
["Top"] = {
|
|
move = {0, 10, 0},
|
|
rotate = {math.rad(-90), 0, 0}
|
|
},
|
|
["Bottom"] = {
|
|
move = {0, -10, 0},
|
|
rotate = {math.rad(90), 0, 0}
|
|
}
|
|
}
|
|
|
|
local TweenService = game:GetService("TweenService")
|
|
local CollectionService = game:GetService("CollectionService")
|
|
|
|
local TweenI = TweenInfo.new(0.8, Enum.EasingStyle.Sine, Enum.EasingDirection.InOut)
|
|
|
|
local latch = false;
|
|
local function zoomInto(screen, face, adj)
|
|
local CurrentCamera = workspace.CurrentCamera
|
|
if latch then
|
|
CurrentCamera.CameraType = Enum.CameraType.Scriptable
|
|
TweenService:Create(CurrentCamera, TweenI, {
|
|
FieldOfView = configuration.ORIGINAL_FOV,
|
|
}):Play();
|
|
latch = false
|
|
CurrentCamera.CameraType = Enum.CameraType.Custom
|
|
return
|
|
end
|
|
latch = true
|
|
CurrentCamera.CameraType = Enum.CameraType.Scriptable
|
|
-- Field of View is computed based on GUI Width
|
|
TweenService:Create(CurrentCamera, TweenI, {
|
|
FieldOfView = ((screen.Size.X * 10) / 2) + adj,
|
|
CFrame = screen.CFrame * CFrame.new(unpack(faces[face].move)) * CFrame.Angles(unpack(faces[face].rotate))
|
|
}):Play();
|
|
end
|
|
|
|
local function init()
|
|
for _, obj in CollectionService:GetTagged(configuration.MONITOR_TAG) do
|
|
if obj:FindFirstChild("ZoomClickDetector") then return end;
|
|
if not obj:GetAttribute("ZoomFace") then obj:SetAttribute("ZoomFace", "Front") end
|
|
if not obj:GetAttribute("ZoomAdjust") then obj:SetAttribute("ZoomAdjust", 0) end
|
|
local face = obj:GetAttribute("ZoomFace")
|
|
local adj = obj:GetAttribute("ZoomAdjust")
|
|
if not faces[face] then
|
|
obj:SetAttribute("ZoomFace", "Front")
|
|
error("Zoom Script: " .. obj:GetFullName() .. " has an invalid ZoomFace \"" .. face .. "\" and will not function, Please fix this!", 1)
|
|
else
|
|
|
|
local CD = Instance.new("ClickDetector")
|
|
CD.Parent = obj
|
|
CD.Name = "ZoomClickDetector"
|
|
CD.MaxActivationDistance = configuration.MAX_ACTIVATION_DISTANCE;
|
|
|
|
CD.MouseClick:Connect(function()
|
|
zoomInto(obj, face, adj)
|
|
end)
|
|
end
|
|
end
|
|
end
|
|
|
|
task.wait(configuration.INIT_DELAY)
|
|
CollectionService:GetInstanceAddedSignal(configuration.MONITOR_TAG):Connect(init);
|
|
init(); |