It is possible. I assume entitySpawn returns a table created for a C ++ object. I also assume that you can expose a function from C ++ that takes an entity table and returns the current state of health, and similarly for customization. (To implement this, you can use the easy userdata pointer for a C ++ object as a member of this table.)
So the ugly way would look like this:
local myOrc = entitySpawn(orc) local curHealth = getEntityHealth(myOrc) setEntityHealth(myOrc, curHealth + 10)
To make it more beautiful, we can have fun with metatables. First, we will place accessors for all the properties we care about.
entityGetters = { health = getEntityHealth, -- ... } entitySetters = { health = setEntityHealth, -- ... }
Then we will create a metatable that uses these functions to handle property assignments.
entityMetatable = {} function entityMetatable:__index(key) local getter = entityGetters[key] if getter then return getter(self) else return nil end end function entityMetable:__newindex(key, value) local setter = entitySetters[key] if setter then return setter(self, value) end end
Now you need to make entitySpawn assign a metatable. You would do this with the lua_setmetatable function.
int entitySpawn(lua_State* L) { // ... // assuming that the returned table is on top of the stack lua_getglobal(L, "entityMetatable"); lua_setmetatable(L, -2); return 1; }
Now you can write it beautifully:
local myOrc = entitySpawn(orc) myOrc.health = myOrc.health + 10
Note that this requires that the table returned by entitySpawn does not have a set of health properties. If so, then metatable will never consult on this property.
You can create entityGetters , entitySetters and entityMetatable , as well as __index and __newindex in C ++ instead of Lua, if that seems cleaner to you, but the general idea is the same.