107 lines
3.0 KiB
Lua
107 lines
3.0 KiB
Lua
-- luacheck: globals Hook Keys LuaUserData PlayerInput Character Descriptors CLIENT
|
|
-- luacheck: max line length 420
|
|
if not CLIENT then return end
|
|
|
|
local isToggle = true -- toggle or hold behaviour
|
|
local smoothZoom = false -- smooth or step
|
|
|
|
local zStep = 0.5 -- step size for when smoothZoom=false
|
|
local zSpeed = 0.02 -- speed for when smoothZoom=true
|
|
local zMin = 0.35 -- minimum zoom modifier
|
|
local zMax = 2.5 -- maximum zoom modifier
|
|
local zStart = 0.35 -- default zoom level
|
|
|
|
local zKey = Keys.P -- zoom key
|
|
local dKey = Keys.NumPad1 -- decrease zoom key
|
|
local iKey = Keys.NumPad2 -- increase zoom key
|
|
local rKey = Keys.Back -- reset zoom key
|
|
-- customization end
|
|
--end
|
|
|
|
local zoomOn = false -- default zoom state
|
|
local gzsDefault = false
|
|
zStart = math.max(math.min(zMax, zStart), zMin)
|
|
local gzsNew = zStart
|
|
local gzsMin = zMin
|
|
local gzsMax = zMax
|
|
local gzsUpd = false
|
|
|
|
local dHeld = false
|
|
local iHeld = false
|
|
local zHeld = false
|
|
|
|
LuaUserData.MakeFieldAccessible(Descriptors["Barotrauma.Camera"], "globalZoomScale")
|
|
LuaUserData.MakeMethodAccessible(Descriptors["Barotrauma.Camera"], "CreateMatrices")
|
|
|
|
Hook.HookMethod("Barotrauma.Camera", "CreateMatrices", function(instance, _)
|
|
gzsDefault = instance.globalZoomScale
|
|
gzsMin = math.max(zMin, gzsDefault * zMin)
|
|
gzsMax = math.min(zMax, gzsDefault * zMax)
|
|
gzsNew = math.max(math.min(gzsMax, gzsDefault * zStart), gzsMin)
|
|
gzsUpd = true
|
|
instance.MinZoom = math.min(gzsMin / 2, instance.MinZoom)
|
|
instance.MaxZoom = math.max(gzsMax * 2, instance.MaxZoom)
|
|
end, Hook.HookMethodType.After)
|
|
|
|
Hook.HookMethod("Barotrauma.Character", "ControlLocalPlayer", function(_, ptable)
|
|
gzsUpd = false
|
|
if not gzsDefault then
|
|
ptable.cam.CreateMatrices()
|
|
else
|
|
if not Character.DisableControls and Character.Controlled then
|
|
if zoomOn then
|
|
if PlayerInput.KeyDown(dKey) then
|
|
if smoothZoom then
|
|
gzsNew = math.max(gzsMin, gzsNew * (1 - zSpeed))
|
|
gzsUpd = true
|
|
elseif not dHeld then
|
|
gzsNew = math.max(gzsMin, gzsNew - zStep)
|
|
dHeld = true
|
|
gzsUpd = true
|
|
end
|
|
else
|
|
dHeld = false
|
|
end
|
|
if PlayerInput.KeyDown(iKey) then
|
|
if smoothZoom then
|
|
gzsNew = math.min(gzsMax, gzsNew * (1 + zSpeed))
|
|
gzsUpd = true
|
|
elseif not iHeld then
|
|
gzsNew = math.min(gzsMax, gzsNew + zStep)
|
|
iHeld = true
|
|
gzsUpd = true
|
|
end
|
|
else
|
|
iHeld = false
|
|
end
|
|
if PlayerInput.KeyDown(rKey) then
|
|
gzsNew = gzsDefault * zStart
|
|
gzsUpd = true
|
|
end
|
|
end
|
|
if PlayerInput.KeyDown(zKey) or PlayerInput.Mouse5ButtonClicked() then
|
|
if isToggle then
|
|
if not zHeld then
|
|
zoomOn = not zoomOn
|
|
zHeld = true
|
|
gzsUpd = true
|
|
end
|
|
else
|
|
zoomOn = true
|
|
gzsUpd = true
|
|
end
|
|
elseif isToggle then
|
|
zHeld = false
|
|
elseif zoomOn then
|
|
zoomOn = false
|
|
gzsUpd = true
|
|
end
|
|
else
|
|
zoomOn = false
|
|
end
|
|
if gzsUpd then
|
|
ptable.cam.globalZoomScale = zoomOn and gzsNew or gzsDefault
|
|
end
|
|
end
|
|
end, Hook.HookMethodType.After)
|