Handle undefined objects better
authorPerttu Ahola <celeron55@gmail.com>
Sat, 12 Nov 2011 16:34:04 +0000 (18:34 +0200)
committerPerttu Ahola <celeron55@gmail.com>
Tue, 29 Nov 2011 17:13:40 +0000 (19:13 +0200)
data/scripts/default.lua
data/textures/unknown_object.png [new file with mode: 0644]
src/content_sao.cpp
src/luaentity_common.cpp
src/scriptapi.cpp
src/scriptapi.h

index 4197cd788dcfed4b49da4e18e6658e9cb79c27ec..0b9f8b913f3cb030730f5b1c2e49e736e11cbd7b 100644 (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)
diff --git a/data/textures/unknown_object.png b/data/textures/unknown_object.png
new file mode 100644 (file)
index 0000000..4d6a98d
Binary files /dev/null and b/data/textures/unknown_object.png differ
index eeb17bd3090975e5ced882359c144dad7f768275..1096ac116ecbc410a5d3bf5e5c7f709f932ac0ac 100644 (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,
index 26cfce1c2e6735bad6281b88ecd68aa550a12a92..138e72dcbba67993696bdf3f94c12dc61f0060c0 100644 (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()
index 381664489587741e72b0d8a36b4c6598c7852366..6d0522000f47e756b642213901cd5620d80012f8 100644 (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)
index c63977fc6b476a68c0b2e98939651e170c32155e..de8eb6abef3de042b0b50724486b39361eda583c 100644 (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);