Files

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)