1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-06 00:55:50 +00:00
OpenMW/files/data/scripts/omw/music/actor.lua

64 lines
1.5 KiB
Lua
Executable File

local AI = require("openmw.interfaces").AI
local self = require("openmw.self")
local types = require("openmw.types")
local nearby = require("openmw.nearby")
local targets = {}
local function emitTargetsChanged()
for _, actor in ipairs(nearby.players) do
actor:sendEvent("OMWMusicCombatTargetsChanged", { actor = self, targets = targets })
end
end
local function onUpdate()
if types.Actor.isDeathFinished(self) or not types.Actor.isInActorsProcessingRange(self) then
if next(targets) ~= nil then
targets = {}
emitTargetsChanged()
end
return
end
-- Early-out for actors without targets and without combat state
-- TODO: use events or engine handlers to detect when targets change
local isStanceNothing = types.Actor.getStance(self) == types.Actor.STANCE.Nothing
if isStanceNothing and next(targets) == nil and not AI.isFleeing() then
return
end
local newTargets = AI.getTargets("Combat")
local changed = false
if #newTargets ~= #targets then
changed = true
else
for i, target in ipairs(targets) do
if target ~= newTargets[i] then
changed = true
break
end
end
end
targets = newTargets
if changed then
emitTargetsChanged()
end
end
local function onInactive()
if next(targets) ~= nil then
targets = {}
emitTargetsChanged()
end
end
return {
engineHandlers = {
onUpdate = onUpdate,
onInactive = onInactive,
},
}