mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 01:56:44 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			83 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			83 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
 |