A more robust format for node metadata
authorPerttu Ahola <celeron55@gmail.com>
Tue, 5 Apr 2011 07:59:48 +0000 (10:59 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Tue, 5 Apr 2011 07:59:48 +0000 (10:59 +0300)
src/inventory.cpp
src/inventory.h
src/nodemetadata.cpp

index 86e00877c96054eb1e9001599d5da0bfb660192a..ccd55a79f244c30795a7e995a35ec495db1fd893 100644 (file)
@@ -90,6 +90,19 @@ InventoryItem* InventoryItem::deSerialize(std::istream &is)
        }
 }
 
+/*
+       MaterialItem
+*/
+
+InventoryItem *MaterialItem::createCookResult()
+{
+       if(m_content == CONTENT_TREE)
+       {
+               return new CraftItem("lump_of_coal", 1);
+       }
+       return NULL;
+}
+
 /*
        MapBlockObjectItem
 */
@@ -313,6 +326,11 @@ u32 InventoryList::getUsedSlots()
        return num;
 }
 
+u32 InventoryList::getFreeSlots()
+{
+       return getSize() - getUsedSlots();
+}
+
 InventoryItem * InventoryList::getItem(u32 i)
 {
        if(i > m_items.size() - 1)
index 0cbd97abc3dc70bdcc050523316bfd1cde9a2267..d110f92c0a55864d31d15893541f1df9097c54f1 100644 (file)
@@ -72,6 +72,7 @@ public:
        {
                m_count = count;
        }
+       // This should return something else for stackable items
        virtual u16 freeSpace()
        {
                return 0;
@@ -87,6 +88,14 @@ public:
                m_count -= count;
        }
 
+       /*
+               Other properties
+       */
+       // Time of cooking
+       virtual float getCookTime(){return 3.0;}
+       // Result of cooking
+       virtual InventoryItem *createCookResult(){return NULL;}
+
 protected:
        u16 m_count;
 };
@@ -148,6 +157,10 @@ public:
                        return 0;
                return QUANTITY_ITEM_MAX_COUNT - m_count;
        }
+       /*
+               Other properties
+       */
+       InventoryItem *createCookResult();
        /*
                Special methods
        */
@@ -428,6 +441,7 @@ public:
        u32 getSize();
        // Count used slots
        u32 getUsedSlots();
+       u32 getFreeSlots();
        
        // Get pointer to item
        InventoryItem * getItem(u32 i);
index 21f55a0ca463706477bbd60a8032f137ba71c857..21b4ed01d527042217e93f674ca2ba5ba7ba8f3b 100644 (file)
@@ -177,7 +177,7 @@ FurnaceNodeMetadata::FurnaceNodeMetadata()
        m_inventory = new Inventory();
        m_inventory->addList("fuel", 1);
        m_inventory->addList("src", 1);
-       m_inventory->addList("dst", 1);
+       m_inventory->addList("dst", 4);
 
        m_step_accumulator = 0;
        m_fuel_totaltime = 0;
@@ -202,12 +202,15 @@ NodeMetadata* FurnaceNodeMetadata::clone()
 NodeMetadata* FurnaceNodeMetadata::create(std::istream &is)
 {
        FurnaceNodeMetadata *d = new FurnaceNodeMetadata();
+
        d->m_inventory->deSerialize(is);
+
        int temp;
        is>>temp;
        d->m_fuel_totaltime = (float)temp/10;
        is>>temp;
        d->m_fuel_time = (float)temp/10;
+
        return d;
 }
 void FurnaceNodeMetadata::serializeBody(std::ostream &os)
@@ -260,9 +263,10 @@ bool FurnaceNodeMetadata::step(float dtime)
        InventoryList *src_list = m_inventory->getList("src");
        assert(src_list);
        InventoryItem *src_item = src_list->getItem(0);
-
-       if(ItemSpec(ITEM_MATERIAL, CONTENT_TREE).checkItem(src_item)
-                       && dst_list->itemFits(0, new CraftItem("lump_of_coal", 1)))
+       
+       // Start only if there are free slots in dst, so that it can
+       // accomodate any result item
+       if(dst_list->getFreeSlots() > 0)
        {
                m_src_totaltime = 3;
        }
@@ -279,13 +283,11 @@ bool FurnaceNodeMetadata::step(float dtime)
                m_src_time += dtime;
                if(m_src_time >= m_src_totaltime && m_src_totaltime > 0.001)
                {
-                       if(ItemSpec(ITEM_MATERIAL, CONTENT_TREE).checkItem(src_item))
-                       {
-                               src_list->decrementMaterials(1);
-                               dst_list->addItem(0, new CraftItem("lump_of_coal", 1));
-                               m_src_time = 0;
-                               m_src_totaltime = 0;
-                       }
+                       src_list->decrementMaterials(1);
+                       InventoryItem *cookresult = src_item->createCookResult();
+                       dst_list->addItem(cookresult);
+                       m_src_time = 0;
+                       m_src_totaltime = 0;
                }
                return true;
        }
@@ -340,6 +342,10 @@ void NodeMetadataList::serialize(std::ostream &os)
 {
        u8 buf[6];
        
+       u16 version = 1;
+       writeU16(buf, version);
+       os.write((char*)buf, 2);
+
        u16 count = m_data.size();
        writeU16(buf, count);
        os.write((char*)buf, 2);
@@ -365,6 +371,16 @@ void NodeMetadataList::deSerialize(std::istream &is)
 
        u8 buf[6];
        
+       is.read((char*)buf, 2);
+       u16 version = readU16(buf);
+
+       if(version > 1)
+       {
+               dstream<<__FUNCTION_NAME<<": version "<<version<<" not supported"
+                               <<std::endl;
+               throw SerializationError("NodeMetadataList::deSerialize");
+       }
+       
        is.read((char*)buf, 2);
        u16 count = readU16(buf);