Indeed.
I got to work on a forgotten, half-baked, Lua-capable build of CIP sources with copy-pasted fragments from TFS, from the time me and Mark first knew each other. But it's a pain because the entire API has to be implemented by hand and we didn't have the time to do it. It also involved getting CIP's architecture to emulate TFS which would result into a malformed monster. I was also (very) unfamiliar with Lua's C API at the time.
This is an example of me trying to emulate TFS' Container with CIP's Containers:
C++:
int LuaScriptInterface::luaContainerGetItem(lua_State* L)
{
// container:getItem(index)
Object container = lua::getObject(L, 1);
if (container == NONE || !container.exists() || !container.getFlag(CONTAINER)) {
lua_pushnil(L);
return 1;
}
uint32_t index = lua::getNumber<uint32_t>(L, 2);
Object item = GetContainerObject(container, index);
if (item != NONE && item.exists()) {
lua::pushObject(L, item);
} else {
lua_pushnil(L);
}
return 1;
}
So instead I embraced CIP's limitations and went hardcore on the C++ path

.
I think this depends a lot on what you consider easy. Turns out that because of CIP's
Object API, messing up objects or creatures will hardly create a critical failure, unless you mess up the delicate linked lists, at most you will get actions failing, NPCs not reacting, or the sort. It's not the same in TFS where poor heap management will result directly in a segment violation. CIP's is a bit more painful because everything has to be done by hand