You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openmw/files/data/scripts/omw/camera/move360.lua

84 lines
2.8 KiB
Lua

local core = require('openmw.core')
local camera = require('openmw.camera')
local input = require('openmw.input')
local self = require('openmw.self')
local util = require('openmw.util')
local I = require('openmw.interfaces')
local Actor = require('openmw.types').Actor
local Player = require('openmw.types').Player
local MODE = camera.MODE
local active = false
local M = {
enabled = false,
turnSpeed = 5,
}
local function turnOn()
I.Camera.disableStandingPreview()
active = true
end
local function turnOff()
I.Camera.enableStandingPreview()
active = false
if camera.getMode() == MODE.Preview then
camera.setMode(MODE.ThirdPerson)
end
end
local function processZoom3rdPerson()
if
not Player.getControlSwitch(self, Player.CONTROL_SWITCH.ViewMode) or
not Player.getControlSwitch(self, Player.CONTROL_SWITCH.Controls) or
input.getBooleanActionValue('TogglePOV') or
not I.Camera.isModeControlEnabled()
then
return
end
local Zoom3rdPerson = input.getNumberActionValue('Zoom3rdPerson')
if Zoom3rdPerson > 0 and camera.getMode() == MODE.Preview
and I.Camera.getBaseThirdPersonDistance() == 30 then
self.controls.yawChange = camera.getYaw() - self.rotation:getYaw()
camera.setMode(MODE.FirstPerson)
elseif Zoom3rdPerson < 0 and camera.getMode() == MODE.FirstPerson then
camera.setMode(MODE.Preview)
I.Camera.setBaseThirdPersonDistance(30)
end
end
function M.onFrame(dt)
if core.isWorldPaused() then return end
local newActive = M.enabled and Actor.getStance(self) == Actor.STANCE.Nothing
if newActive and not active then
turnOn()
elseif not newActive and active then
turnOff()
end
if not active then return end
processZoom3rdPerson()
if camera.getMode() == MODE.Static then return end
if camera.getMode() == MODE.ThirdPerson then camera.setMode(MODE.Preview) end
if camera.getMode() == MODE.Preview and not input.getBooleanActionValue('TogglePOV') then
camera.showCrosshair(camera.getFocalPreferredOffset():length() > 5)
local move = util.vector2(self.controls.sideMovement, self.controls.movement)
local yawDelta = camera.getYaw() - self.rotation:getYaw()
move = move:rotate(-yawDelta)
self.controls.sideMovement = move.x
self.controls.movement = move.y
self.controls.pitchChange = camera.getPitch() * math.cos(yawDelta) - self.rotation:getPitch()
if move:length() > 0.05 then
local delta = math.atan2(move.x, move.y)
local maxDelta = math.max(delta, 1) * M.turnSpeed * dt
self.controls.yawChange = util.clamp(delta, -maxDelta, maxDelta)
else
self.controls.yawChange = 0
end
end
end
return M