Starbound/attic/scripts/entityProxy.lua
2025-03-21 22:23:30 +11:00

41 lines
1.2 KiB
Lua

-- Provides a proxy to call entity.* functions on an entity id.
--
-- E.g. (from the script for a monster or object):
--
-- local npcIds = world.entityQuery(mcontroller.position(), 100, {includedTypes = {"npc"}})
-- for _, npcId in pairs(npcIds) do
-- local npc = entityProxy.create(npcId)
-- local species = npc.species()
-- world.logInfo("got %s", species)
-- npc.say("I'm a %s", species)
-- end
--
-- Note that functions are called as if they were called from the target
-- entity's lua on the entity table, so this can not call global functions
-- defined in the the entity's lua (only functions that are "entity.*").
--
entityProxy = {}
function entityProxy.create(entityId)
local wrappers = {}
local proxyMetatable = {
__index = function(t, functionName)
local wrapper = wrappers[functionName]
if wrapper == nil then
wrapper = function(...)
return world.callScriptedEntity(entityId, "entity." .. functionName, ...)
end
wrappers[functionName] = wrapper
end
return wrapper
end,
__newindex = function(t, key, val) end
}
local proxy = {}
setmetatable(proxy, proxyMetatable)
return proxy
end