Handle undefined objects better
parent
73bb3bc595
commit
7b802c547d
|
@ -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)
|
function basic_dump2(o)
|
||||||
if type(o) == "number" then
|
if type(o) == "number" then
|
||||||
return tostring(o)
|
return tostring(o)
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 489 B |
|
@ -1568,12 +1568,13 @@ void LuaEntitySAO::addedToEnvironment(u16 id)
|
||||||
ServerActiveObject::addedToEnvironment(id);
|
ServerActiveObject::addedToEnvironment(id);
|
||||||
|
|
||||||
// Create entity from name and state
|
// Create entity from name and state
|
||||||
m_registered = true;
|
|
||||||
lua_State *L = m_env->getLua();
|
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
|
if(m_registered){
|
||||||
scriptapi_luaentity_get_properties(L, m_id, m_prop);
|
// Get properties
|
||||||
|
scriptapi_luaentity_get_properties(L, m_id, m_prop);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ServerActiveObject* LuaEntitySAO::create(ServerEnvironment *env, v3f pos,
|
ServerActiveObject* LuaEntitySAO::create(ServerEnvironment *env, v3f pos,
|
||||||
|
|
|
@ -29,7 +29,7 @@ LuaEntityProperties::LuaEntityProperties():
|
||||||
collisionbox(-0.5,-0.5,-0.5, 0.5,0.5,0.5),
|
collisionbox(-0.5,-0.5,-0.5, 0.5,0.5,0.5),
|
||||||
visual("single_sprite")
|
visual("single_sprite")
|
||||||
{
|
{
|
||||||
textures.push_back("unknown_block.png");
|
textures.push_back("unknown_object.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string LuaEntityProperties::dump()
|
std::string LuaEntityProperties::dump()
|
||||||
|
|
|
@ -38,12 +38,12 @@ extern "C" {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
TODO:
|
TODO:
|
||||||
- Global environment step function
|
- Node type definition
|
||||||
- Random node triggers
|
- Random node triggers
|
||||||
- Object visual client-side stuff
|
- Object visual client-side stuff
|
||||||
- Blink effect
|
- Blink effect
|
||||||
- Spritesheets and animation
|
- Spritesheets and animation
|
||||||
- Named node types and dynamic id allocation
|
- Named node types and dynamic id allocation per MapBlock
|
||||||
- LuaNodeMetadata
|
- LuaNodeMetadata
|
||||||
blockdef.has_metadata = true/false
|
blockdef.has_metadata = true/false
|
||||||
- Stores an inventory and stuff in a Settings object
|
- 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
|
// Get the main minetest table
|
||||||
lua_getglobal(L, "minetest");
|
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_newtable(L);
|
||||||
lua_setfield(L, -2, "registered_entities");
|
lua_setfield(L, -2, "registered_entities");
|
||||||
|
|
||||||
// Add object_refs table in minetest
|
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
lua_setfield(L, -2, "object_refs");
|
lua_setfield(L, -2, "object_refs");
|
||||||
|
|
||||||
// Add luaentities table in minetest
|
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
lua_setfield(L, -2, "luaentities");
|
lua_setfield(L, -2, "luaentities");
|
||||||
|
|
||||||
|
@ -694,7 +696,7 @@ void scriptapi_environment_step(lua_State *L, float dtime)
|
||||||
luaentity
|
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)
|
const char *init_state)
|
||||||
{
|
{
|
||||||
realitycheck(L);
|
realitycheck(L);
|
||||||
|
@ -712,7 +714,11 @@ void scriptapi_luaentity_add(lua_State *L, u16 id, const char *name,
|
||||||
lua_pushstring(L, name);
|
lua_pushstring(L, name);
|
||||||
lua_gettable(L, -2);
|
lua_gettable(L, -2);
|
||||||
// Should be a table, which we will use as a prototype
|
// 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);
|
int prototype_table = lua_gettop(L);
|
||||||
//dump2(L, "prototype_table");
|
//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))
|
if(lua_pcall(L, 1, 0, 0))
|
||||||
script_error(L, "error running function %s:on_activate: %s\n",
|
script_error(L, "error running function %s:on_activate: %s\n",
|
||||||
name, lua_tostring(L, -1));*/
|
name, lua_tostring(L, -1));*/
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void scriptapi_luaentity_rm(lua_State *L, u16 id)
|
void scriptapi_luaentity_rm(lua_State *L, u16 id)
|
||||||
|
|
|
@ -39,7 +39,8 @@ void scriptapi_rm_object_reference(lua_State *L, ServerActiveObject *cobj);
|
||||||
void scriptapi_environment_step(lua_State *L, float dtime);
|
void scriptapi_environment_step(lua_State *L, float dtime);
|
||||||
|
|
||||||
/* luaentity */
|
/* 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);
|
const char *init_state);
|
||||||
void scriptapi_luaentity_rm(lua_State *L, u16 id);
|
void scriptapi_luaentity_rm(lua_State *L, u16 id);
|
||||||
std::string scriptapi_luaentity_get_state(lua_State *L, u16 id);
|
std::string scriptapi_luaentity_get_state(lua_State *L, u16 id);
|
||||||
|
|
Loading…
Reference in New Issue