Handle undefined objects better

This commit is contained in:
Perttu Ahola 2011-11-12 18:34:04 +02:00
parent 73bb3bc595
commit 7b802c547d
6 changed files with 23 additions and 76 deletions

View File

@ -1,66 +1,3 @@
--[[function basicSerialize(o)
if type(o) == "number" then
return tostring(o)
else -- assume it is a string
return string.format("%q", o)
end
end
function dump2(name, value, saved)
saved = saved or {} -- initial value
io.write(name, " = ")
if type(value) == "number" or type(value) == "string" then
io.write(basicSerialize(value), "\n")
elseif type(value) == "table" then
if saved[value] then -- value already saved?
io.write(saved[value], "\n") -- use its previous name
else
saved[value] = name -- save name for next time
io.write("{}\n") -- create a new table
for k,v in pairs(value) do -- save its fields
local fieldname = string.format("%s[%s]", name,
basicSerialize(k))
save(fieldname, v, saved)
end
end
else
error("cannot save a " .. type(value))
end
end]]
--[[function dump(o, name, dumped, s)
name = name or "_"
dumped = dumped or {}
s = s or ""
s = s .. name .. " = "
if type(o) == "number" then
s = s .. tostring(o)
elseif type(o) == "string" then
s = s .. string.format("%q", o)
elseif type(o) == "boolean" then
s = s .. tostring(o)
elseif type(o) == "function" then
s = s .. "<function>"
elseif type(o) == "nil" then
s = s .. "nil"
elseif type(o) == "table" then
if dumped[o] then
s = s .. dumped[o]
else
dumped[o] = name
local t = {}
for k,v in pairs(o) do
t[#t+1] = dump(v, k, dumped)
end
s = s .. "{" .. table.concat(t, ", ") .. "}"
end
else
error("cannot dump a " .. type(o))
return nil
end
return s
end]]
function basic_dump2(o)
if type(o) == "number" then
return tostring(o)

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

View File

@ -1568,12 +1568,13 @@ void LuaEntitySAO::addedToEnvironment(u16 id)
ServerActiveObject::addedToEnvironment(id);
// Create entity from name and state
m_registered = true;
lua_State *L = m_env->getLua();
scriptapi_luaentity_add(L, id, m_init_name.c_str(), m_init_state.c_str());
m_registered = scriptapi_luaentity_add(L, id, m_init_name.c_str(), m_init_state.c_str());
// Get properties
scriptapi_luaentity_get_properties(L, m_id, m_prop);
if(m_registered){
// Get properties
scriptapi_luaentity_get_properties(L, m_id, m_prop);
}
}
ServerActiveObject* LuaEntitySAO::create(ServerEnvironment *env, v3f pos,

View File

@ -29,7 +29,7 @@ LuaEntityProperties::LuaEntityProperties():
collisionbox(-0.5,-0.5,-0.5, 0.5,0.5,0.5),
visual("single_sprite")
{
textures.push_back("unknown_block.png");
textures.push_back("unknown_object.png");
}
std::string LuaEntityProperties::dump()

View File

@ -38,12 +38,12 @@ extern "C" {
/*
TODO:
- Global environment step function
- Node type definition
- Random node triggers
- Object visual client-side stuff
- Blink effect
- Spritesheets and animation
- Named node types and dynamic id allocation
- Named node types and dynamic id allocation per MapBlock
- LuaNodeMetadata
blockdef.has_metadata = true/false
- Stores an inventory and stuff in a Settings object
@ -558,15 +558,17 @@ void scriptapi_export(lua_State *L, Server *server)
// Get the main minetest table
lua_getglobal(L, "minetest");
// Add registered_entities table in minetest
// Add tables to minetest
/*lua_newtable(L);
lua_setfield(L, -2, "registered_blocks");*/
lua_newtable(L);
lua_setfield(L, -2, "registered_entities");
// Add object_refs table in minetest
lua_newtable(L);
lua_setfield(L, -2, "object_refs");
// Add luaentities table in minetest
lua_newtable(L);
lua_setfield(L, -2, "luaentities");
@ -694,7 +696,7 @@ void scriptapi_environment_step(lua_State *L, float dtime)
luaentity
*/
void scriptapi_luaentity_add(lua_State *L, u16 id, const char *name,
bool scriptapi_luaentity_add(lua_State *L, u16 id, const char *name,
const char *init_state)
{
realitycheck(L);
@ -712,7 +714,11 @@ void scriptapi_luaentity_add(lua_State *L, u16 id, const char *name,
lua_pushstring(L, name);
lua_gettable(L, -2);
// Should be a table, which we will use as a prototype
luaL_checktype(L, -1, LUA_TTABLE);
//luaL_checktype(L, -1, LUA_TTABLE);
if(lua_type(L, -1) != LUA_TTABLE){
errorstream<<"LuaEntity name \""<<name<<"\" not defined"<<std::endl;
return false;
}
int prototype_table = lua_gettop(L);
//dump2(L, "prototype_table");
@ -750,6 +756,8 @@ void scriptapi_luaentity_add(lua_State *L, u16 id, const char *name,
if(lua_pcall(L, 1, 0, 0))
script_error(L, "error running function %s:on_activate: %s\n",
name, lua_tostring(L, -1));*/
return true;
}
void scriptapi_luaentity_rm(lua_State *L, u16 id)

View File

@ -39,7 +39,8 @@ void scriptapi_rm_object_reference(lua_State *L, ServerActiveObject *cobj);
void scriptapi_environment_step(lua_State *L, float dtime);
/* luaentity */
void scriptapi_luaentity_add(lua_State *L, u16 id, const char *name,
// Returns true if succesfully added into Lua; false otherwise.
bool scriptapi_luaentity_add(lua_State *L, u16 id, const char *name,
const char *init_state);
void scriptapi_luaentity_rm(lua_State *L, u16 id);
std::string scriptapi_luaentity_get_state(lua_State *L, u16 id);