Something went wrong. Try again.
OpenMW is an open implementation of the Morrowind engine
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293local async = require('openmw.async')local core = require('openmw.core')local types = require('openmw.types')local world = require('openmw.world')local auxUtil = require('openmw_aux.util')
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 local Door4 = types.ESM4Door core.sound.playSound3d(Door4.record(door).openSound, actor) 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 codeend
local function ESM4BookActivation(book, actor) if actor.type == types.Player then actor:sendEvent('AddUiMode', { mode = 'Book', target = book }) endend
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 handled = auxUtil.callMultipleEventHandlers({ handlersPerObject[obj.id], handlersPerType[obj.type] }, obj, actor) if handled then return end types.Actor.activeEffects(actor):remove('invisibility') world._runStandardActivationAction(obj, actor)end
return { interfaceName = 'Activation', --- -- @module Activation -- @context global -- @usage require('openmw.interfaces').Activation interface = { --- Interface version -- @field [parent=#Activation] #number version version = 0,
--- Add a 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 a new activation handler for a type of object. -- 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 },}