mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2024-12-28 18:18:52 +00:00
101 lines
3.4 KiB
Lua
101 lines
3.4 KiB
Lua
local async = require('openmw.async')
|
|
local types = require('openmw.types')
|
|
local world = require('openmw.world')
|
|
|
|
local EnableObject = async:registerTimerCallback('EnableObject', function(obj) obj.enabled = true end)
|
|
|
|
local function ESM4DoorActivation(door, actor)
|
|
-- TODO: Implement lockpicking minigame
|
|
-- TODO: Play door opening animation and sound
|
|
local Door4 = types.ESM4Door
|
|
if Door4.isTeleport(door) then
|
|
actor:teleport(Door4.destCell(door), Door4.destPosition(door), Door4.destRotation(door))
|
|
else
|
|
door.enabled = false
|
|
async:newSimulationTimer(5, EnableObject, door)
|
|
end
|
|
return false -- disable activation handling in C++ mwmechanics code
|
|
end
|
|
|
|
local function ESM4BookActivation(book, actor)
|
|
if actor.type == types.Player then
|
|
actor:sendEvent('AddUiMode', { mode = 'Book', target = book })
|
|
end
|
|
end
|
|
|
|
local handlersPerObject = {}
|
|
local handlersPerType = {}
|
|
|
|
handlersPerType[types.ESM4Book] = { ESM4BookActivation }
|
|
handlersPerType[types.ESM4Door] = { ESM4DoorActivation }
|
|
|
|
local function onActivate(obj, actor)
|
|
if world.isWorldPaused() then
|
|
return
|
|
end
|
|
if obj.parentContainer then
|
|
return
|
|
end
|
|
local handlers = handlersPerObject[obj.id]
|
|
if handlers then
|
|
for i = #handlers, 1, -1 do
|
|
if handlers[i](obj, actor) == false then
|
|
return -- skip other handlers
|
|
end
|
|
end
|
|
end
|
|
handlers = handlersPerType[obj.type]
|
|
if handlers then
|
|
for i = #handlers, 1, -1 do
|
|
if handlers[i](obj, actor) == false then
|
|
return -- skip other handlers
|
|
end
|
|
end
|
|
end
|
|
types.Actor.activeEffects(actor):remove('invisibility')
|
|
world._runStandardActivationAction(obj, actor)
|
|
end
|
|
|
|
return {
|
|
interfaceName = 'Activation',
|
|
---
|
|
-- @module Activation
|
|
-- @usage require('openmw.interfaces').Activation
|
|
interface = {
|
|
--- Interface version
|
|
-- @field [parent=#Activation] #number version
|
|
version = 0,
|
|
|
|
--- Add new activation handler for a specific object.
|
|
-- If `handler(object, actor)` returns false, other handlers for
|
|
-- the same object (including type handlers) will be skipped.
|
|
-- @function [parent=#Activation] addHandlerForObject
|
|
-- @param openmw.core#GameObject obj The object.
|
|
-- @param #function handler The handler.
|
|
addHandlerForObject = function(obj, handler)
|
|
local handlers = handlersPerObject[obj.id]
|
|
if handlers == nil then
|
|
handlers = {}
|
|
handlersPerObject[obj.id] = handlers
|
|
end
|
|
handlers[#handlers + 1] = handler
|
|
end,
|
|
|
|
--- Add new activation handler for a type of objects.
|
|
-- If `handler(object, actor)` returns false, other handlers for
|
|
-- the same object (including type handlers) will be skipped.
|
|
-- @function [parent=#Activation] addHandlerForType
|
|
-- @param #any type A type from the `openmw.types` package.
|
|
-- @param #function handler The handler.
|
|
addHandlerForType = function(type, handler)
|
|
local handlers = handlersPerType[type]
|
|
if handlers == nil then
|
|
handlers = {}
|
|
handlersPerType[type] = handlers
|
|
end
|
|
handlers[#handlers + 1] = handler
|
|
end,
|
|
},
|
|
engineHandlers = { onActivate = onActivate },
|
|
}
|