mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-25 17:56:37 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			100 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			100 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 },
 | |
| }
 |