]> git.lizzy.rs Git - minetest.git/blobdiff - src/itemdef.cpp
Add shutdown hook interface to Lua API
[minetest.git] / src / itemdef.cpp
index 98232c6d522368bd61d796d0997d9cd0beff054c..da33fd32295daae5fceb2c4e6c6f3d1159337ddd 100644 (file)
@@ -4,16 +4,16 @@ Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
 Copyright (C) 2011 Kahrl <kahrl@gmx.net>
 
 This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
 (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License along
+You should have received a copy of the GNU Lesser General Public License along
 with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
@@ -30,7 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "tile.h"
 #endif
 #include "log.h"
-#include "utility.h"
+#include "util/serialize.h"
 #include <map>
 #include <set>
 
@@ -70,6 +70,7 @@ ItemDefinition& ItemDefinition::operator=(const ItemDefinition &def)
                                *def.tool_capabilities);
        }
        groups = def.groups;
+       node_placement_prediction = def.node_placement_prediction;
 #ifndef SERVER
        inventory_texture = def.inventory_texture;
        if(def.wield_mesh)
@@ -115,6 +116,8 @@ void ItemDefinition::reset()
        }
        groups.clear();
 
+       node_placement_prediction = "";
+       
 #ifndef SERVER
        inventory_texture = NULL;
        if(wield_mesh)
@@ -150,6 +153,7 @@ void ItemDefinition::serialize(std::ostream &os) const
                os<<serializeString(i->first);
                writeS16(os, i->second);
        }
+       os<<serializeString(node_placement_prediction);
 }
 
 void ItemDefinition::deSerialize(std::istream &is)
@@ -184,6 +188,11 @@ void ItemDefinition::deSerialize(std::istream &is)
                int value = readS16(is);
                groups[name] = value;
        }
+       // If you add anything here, insert it primarily inside the try-catch
+       // block to not need to increase the version.
+       try{
+               node_placement_prediction = deSerializeString(is);
+       }catch(SerializationError &e) {};
 }
 
 /*
@@ -286,12 +295,15 @@ class CItemDefManager: public IWritableItemDefManager
        }
        virtual void registerItem(const ItemDefinition &def)
        {
-               infostream<<"ItemDefManager: registering \""<<def.name<<"\""<<std::endl;
+               verbosestream<<"ItemDefManager: registering \""<<def.name<<"\""<<std::endl;
                // Ensure that the "" item (the hand) always has ToolCapabilities
                if(def.name == "")
                        assert(def.tool_capabilities != NULL);
-
-               m_item_definitions[def.name] = new ItemDefinition(def);
+               
+               if(m_item_definitions.count(def.name) == 0)
+                       m_item_definitions[def.name] = new ItemDefinition(def);
+               else
+                       *(m_item_definitions[def.name]) = def;
 
                // Remove conflicting alias if it exists
                bool alias_removed = (m_aliases.erase(def.name) != 0);
@@ -304,7 +316,7 @@ class CItemDefManager: public IWritableItemDefManager
        {
                if(m_item_definitions.find(name) == m_item_definitions.end())
                {
-                       infostream<<"ItemDefManager: setting alias "<<name
+                       verbosestream<<"ItemDefManager: setting alias "<<name
                                <<" -> "<<convert_to<<std::endl;
                        m_aliases[name] = convert_to;
                }
@@ -381,17 +393,20 @@ class CItemDefManager: public IWritableItemDefManager
                                content_t id = nodedef->getId(def->name);
                                const ContentFeatures &f = nodedef->get(id);
 
+                               u8 param1 = 0;
+                               if(f.param_type == CPT_LIGHT)
+                                       param1 = 0xee;
+
                                /*
                                        Make a mesh from the node
                                */
-                               MeshMakeData mesh_make_data;
-                               MapNode mesh_make_node(
-                                       id,
-                                       (f.param_type == CPT_LIGHT) ? 0xee : 0,
-                                       0);
-                               mesh_make_data.fillSingleNode(1000, &mesh_make_node);
-                               scene::IMesh *node_mesh =
-                                       makeMapBlockMesh(&mesh_make_data, gamedef);
+                               MeshMakeData mesh_make_data(gamedef);
+                               MapNode mesh_make_node(id, param1, 0);
+                               mesh_make_data.fillSingleNode(&mesh_make_node);
+                               MapBlockMesh mapblock_mesh(&mesh_make_data);
+
+                               scene::IMesh *node_mesh = mapblock_mesh.getMesh();
+                               assert(node_mesh);
                                setMeshColor(node_mesh, video::SColor(255, 255, 255, 255));
 
                                /*
@@ -404,7 +419,7 @@ class CItemDefManager: public IWritableItemDefManager
                                /*
                                        Draw node mesh into a render target texture
                                */
-                               if(def->inventory_texture == NULL && node_mesh != NULL)
+                               if(def->inventory_texture == NULL)
                                {
                                        core::dimension2d<u32> dim(64,64);
                                        std::string rtt_texture_name = "INVENTORY_"
@@ -436,14 +451,14 @@ class CItemDefManager: public IWritableItemDefManager
                                        if(def->inventory_texture == NULL)
                                        {
                                                def->inventory_texture =
-                                                       tsrc->getTextureRaw(f.tname_tiles[0]);
+                                                       tsrc->getTextureRaw(f.tiledef[0].name);
                                        }
                                }
 
                                /*
                                        Use the node mesh as the wield mesh
                                */
-                               if(def->wield_mesh == NULL && node_mesh != NULL)
+                               if(def->wield_mesh == NULL)
                                {
                                        // Scale to proper wield mesh proportions
                                        scaleMesh(node_mesh, v3f(30.0, 30.0, 30.0)
@@ -452,9 +467,7 @@ class CItemDefManager: public IWritableItemDefManager
                                        def->wield_mesh->grab();
                                }
 
-
-                               if(node_mesh != NULL)
-                                       node_mesh->drop();
+                               // falling outside of here deletes node_mesh
                        }
                }
 #endif