X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fcontent_nodemeta.cpp;h=fc2859d27ac0d891a8134c4a04f56925d7094a91;hb=01c319d7784c3db614a53745e5af62c43cf45c90;hp=e79ff6d54c14762772542612f403f8588cdea34b;hpb=582e450bad08006dff141216351b81d3eb9270b7;p=dragonfireclient.git diff --git a/src/content_nodemeta.cpp b/src/content_nodemeta.cpp index e79ff6d54..fc2859d27 100644 --- a/src/content_nodemeta.cpp +++ b/src/content_nodemeta.cpp @@ -1,475 +1,191 @@ /* -Minetest-c55 -Copyright (C) 2010-2011 celeron55, Perttu Ahola +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola 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. */ #include "content_nodemeta.h" +#include "nodemetadata.h" +#include "nodetimer.h" #include "inventory.h" -#include "content_mapnode.h" - -/* - SignNodeMetadata -*/ - -// Prototype -SignNodeMetadata proto_SignNodeMetadata(""); - -SignNodeMetadata::SignNodeMetadata(std::string text): - m_text(text) -{ - NodeMetadata::registerType(typeId(), create); -} -u16 SignNodeMetadata::typeId() const -{ - return CONTENT_SIGN_WALL; -} -NodeMetadata* SignNodeMetadata::create(std::istream &is) -{ - std::string text = deSerializeString(is); - return new SignNodeMetadata(text); -} -NodeMetadata* SignNodeMetadata::clone() -{ - return new SignNodeMetadata(m_text); -} -void SignNodeMetadata::serializeBody(std::ostream &os) -{ - os<addList("0", 8*4); -} -ChestNodeMetadata::~ChestNodeMetadata() -{ - delete m_inventory; -} -u16 ChestNodeMetadata::typeId() const -{ - return CONTENT_CHEST; -} -NodeMetadata* ChestNodeMetadata::create(std::istream &is) -{ - ChestNodeMetadata *d = new ChestNodeMetadata(); - d->m_inventory->deSerialize(is); - return d; -} -NodeMetadata* ChestNodeMetadata::clone() -{ - ChestNodeMetadata *d = new ChestNodeMetadata(); - *d->m_inventory = *m_inventory; - return d; -} -void ChestNodeMetadata::serializeBody(std::ostream &os) -{ - m_inventory->serialize(os); -} -std::string ChestNodeMetadata::infoText() -{ - return "Chest"; -} -bool ChestNodeMetadata::nodeRemovalDisabled() -{ - /* - Disable removal if chest contains something - */ - InventoryList *list = m_inventory->getList("0"); - if(list == NULL) +#include "log.h" +#include "serialization.h" +#include "util/serialize.h" +#include "util/string.h" +#include "constants.h" // MAP_BLOCKSIZE +#include + +#define NODEMETA_GENERIC 1 +#define NODEMETA_SIGN 14 +#define NODEMETA_CHEST 15 +#define NODEMETA_FURNACE 16 +#define NODEMETA_LOCKABLE_CHEST 17 + +// Returns true if node timer must be set +static bool content_nodemeta_deserialize_legacy_body( + std::istream &is, s16 id, NodeMetadata *meta) +{ + meta->clear(); + + if(id == NODEMETA_GENERIC) // GenericNodeMetadata (0.4-dev) + { + meta->getInventory()->deSerialize(is); + deSerializeLongString(is); // m_text + deSerializeString(is); // m_owner + + meta->setString("infotext",deSerializeString(is)); + meta->setString("formspec",deSerializeString(is)); + readU8(is); // m_allow_text_input + readU8(is); // m_allow_removal + readU8(is); // m_enforce_owner + + int num_vars = readU32(is); + for(int i=0; isetString(name, var); + } return false; - if(list->getUsedSlots() == 0) + } + else if(id == NODEMETA_SIGN) // SignNodeMetadata + { + meta->setString("text", deSerializeString(is)); + //meta->setString("infotext","\"${text}\""); + meta->setString("infotext", + std::string("\"") + meta->getString("text") + "\""); + meta->setString("formspec","field[text;;${text}]"); return false; - return true; -} -std::string ChestNodeMetadata::getInventoryDrawSpecString() -{ - return - "invsize[8,9;]" - "list[current_name;0;0,0;8,4;]" - "list[current_player;main;0,5;8,4;]"; -} + } + else if(id == NODEMETA_CHEST) // ChestNodeMetadata + { + meta->getInventory()->deSerialize(is); -/* - LockingChestNodeMetadata -*/ + // Rename inventory list "0" to "main" + Inventory *inv = meta->getInventory(); + if(!inv->getList("main") && inv->getList("0")){ + inv->getList("0")->setName("main"); + } + assert(inv->getList("main") && !inv->getList("0")); -// Prototype -LockingChestNodeMetadata proto_LockingChestNodeMetadata; + meta->setString("formspec","size[8,9]" + "list[current_name;main;0,0;8,4;]" + "list[current_player;main;0,5;8,4;]"); + return false; + } + else if(id == NODEMETA_LOCKABLE_CHEST) // LockingChestNodeMetadata + { + meta->setString("owner", deSerializeString(is)); + meta->getInventory()->deSerialize(is); -LockingChestNodeMetadata::LockingChestNodeMetadata() -{ - NodeMetadata::registerType(typeId(), create); + // Rename inventory list "0" to "main" + Inventory *inv = meta->getInventory(); + if(!inv->getList("main") && inv->getList("0")){ + inv->getList("0")->setName("main"); + } + assert(inv->getList("main") && !inv->getList("0")); - m_inventory = new Inventory(); - m_inventory->addList("0", 8*4); -} -LockingChestNodeMetadata::~LockingChestNodeMetadata() -{ - delete m_inventory; -} -u16 LockingChestNodeMetadata::typeId() const -{ - return CONTENT_LOCKABLE_CHEST; -} -NodeMetadata* LockingChestNodeMetadata::create(std::istream &is) -{ - LockingChestNodeMetadata *d = new LockingChestNodeMetadata(); - d->setOwner(deSerializeString(is)); - d->m_inventory->deSerialize(is); - return d; -} -NodeMetadata* LockingChestNodeMetadata::clone() -{ - LockingChestNodeMetadata *d = new LockingChestNodeMetadata(); - *d->m_inventory = *m_inventory; - return d; -} -void LockingChestNodeMetadata::serializeBody(std::ostream &os) -{ - os<serialize(os); -} -std::string LockingChestNodeMetadata::infoText() -{ - return "Locking Chest"; -} -bool LockingChestNodeMetadata::nodeRemovalDisabled() -{ - /* - Disable removal if chest contains something - */ - InventoryList *list = m_inventory->getList("0"); - if(list == NULL) + meta->setString("formspec","size[8,9]" + "list[current_name;main;0,0;8,4;]" + "list[current_player;main;0,5;8,4;]"); return false; - if(list->getUsedSlots() == 0) - return false; - return true; -} -std::string LockingChestNodeMetadata::getInventoryDrawSpecString() -{ - return - "invsize[8,9;]" - "list[current_name;0;0,0;8,4;]" - "list[current_player;main;0,5;8,4;]"; + } + else if(id == NODEMETA_FURNACE) // FurnaceNodeMetadata + { + meta->getInventory()->deSerialize(is); + int temp = 0; + is>>temp; + meta->setString("fuel_totaltime", ftos((float)temp/10)); + temp = 0; + is>>temp; + meta->setString("fuel_time", ftos((float)temp/10)); + temp = 0; + is>>temp; + //meta->setString("src_totaltime", ftos((float)temp/10)); + temp = 0; + is>>temp; + meta->setString("src_time", ftos((float)temp/10)); + + meta->setString("formspec","size[8,9]" + "list[current_name;fuel;2,3;1,1;]" + "list[current_name;src;2,1;1,1;]" + "list[current_name;dst;5,1;2,2;]" + "list[current_player;main;0,5;8,4;]"); + return true; + } + else + { + throw SerializationError("Unknown legacy node metadata"); + } } -/* - FurnaceNodeMetadata -*/ - -// Prototype -FurnaceNodeMetadata proto_FurnaceNodeMetadata; - -FurnaceNodeMetadata::FurnaceNodeMetadata() +static bool content_nodemeta_deserialize_legacy_meta( + std::istream &is, NodeMetadata *meta) { - NodeMetadata::registerType(typeId(), create); - - m_inventory = new Inventory(); - m_inventory->addList("fuel", 1); - m_inventory->addList("src", 1); - m_inventory->addList("dst", 4); + // Read id + s16 id = readS16(is); - m_step_accumulator = 0; - m_fuel_totaltime = 0; - m_fuel_time = 0; - m_src_totaltime = 0; - m_src_time = 0; -} -FurnaceNodeMetadata::~FurnaceNodeMetadata() -{ - delete m_inventory; + // Read data + std::string data = deSerializeString(is); + std::istringstream tmp_is(data, std::ios::binary); + return content_nodemeta_deserialize_legacy_body(tmp_is, id, meta); } -u16 FurnaceNodeMetadata::typeId() const -{ - return CONTENT_FURNACE; -} -NodeMetadata* FurnaceNodeMetadata::clone() -{ - FurnaceNodeMetadata *d = new FurnaceNodeMetadata(); - *d->m_inventory = *m_inventory; - return d; -} -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) +void content_nodemeta_deserialize_legacy(std::istream &is, + NodeMetadataList *meta, NodeTimerList *timers, + IItemDefManager *item_def_mgr) { - m_inventory->serialize(os); - os<= m_fuel_totaltime) - { - const InventoryList *src_list = m_inventory->getList("src"); - assert(src_list); - const InventoryItem *src_item = src_list->getItem(0); + meta->clear(); + timers->clear(); - if(src_item && src_item->isCookable()) { - InventoryList *dst_list = m_inventory->getList("dst"); - if(!dst_list->roomForCookedItem(src_item)) - return "Furnace is overloaded"; - return "Furnace is out of fuel"; - } - else - return "Furnace is inactive"; - } - else + u16 version = readU16(is); + + if(version > 1) { - std::string s = "Furnace is active"; - // Do this so it doesn't always show (0%) for weak fuel - if(m_fuel_totaltime > 3) { - s += " ("; - s += itos(m_fuel_time/m_fuel_totaltime*100); - s += "%)"; - } - return s; - } -} -bool FurnaceNodeMetadata::nodeRemovalDisabled() -{ - /* - Disable removal if furnace is not empty - */ - InventoryList *list[3] = {m_inventory->getList("src"), - m_inventory->getList("dst"), m_inventory->getList("fuel")}; - - for(int i = 0; i < 3; i++) { - if(list[i] == NULL) - continue; - if(list[i]->getUsedSlots() == 0) - continue; - return true; + infostream< 60.0) - dstream<<"Furnace stepping a long time ("< interval) + + u16 count = readU16(is); + + for(u16 i=0; igetList("src"); - assert(src_list); - InventoryItem *src_item = src_list->getItem(0); - - bool room_available = false; - - if(src_item && src_item->isCookable()) - room_available = dst_list->roomForCookedItem(src_item); - - // Start only if there are free slots in dst, so that it can - // accomodate any result item - if(room_available) - { - m_src_totaltime = 3; - } - else - { - m_src_time = 0; - m_src_totaltime = 0; - } - - /* - If fuel is burning, increment the burn counters. - If item finishes cooking, move it to result. - */ - if(m_fuel_time < m_fuel_totaltime) + if(meta->get(p) != NULL) { - //dstream<<"Furnace is active"<= m_src_totaltime && m_src_totaltime > 0.001 - && src_item) - { - InventoryItem *cookresult = src_item->createCookResult(); - dst_list->addItem(cookresult); - src_list->decrementMaterials(1); - m_src_time = 0; - m_src_totaltime = 0; - } - changed = true; - - // If the fuel was not used up this step, just keep burning it - if(m_fuel_time < m_fuel_totaltime) - continue; - } - - /* - Get the source again in case it has all burned - */ - src_item = src_list->getItem(0); - - /* - If there is no source item, or the source item is not cookable, - or the furnace is still cooking, or the furnace became overloaded, stop loop. - */ - if(src_item == NULL || !room_available || m_fuel_time < m_fuel_totaltime || - dst_list->roomForCookedItem(src_item) == false) - { - m_step_accumulator = 0; - break; + warningstream<getList("fuel"); - assert(fuel_list); - const InventoryItem *fuel_item = fuel_list->getItem(0); + NodeMetadata *data = new NodeMetadata(item_def_mgr); + bool need_timer = content_nodemeta_deserialize_legacy_meta(is, data); + meta->set(p, data); - if(ItemSpec(ITEM_MATERIAL, CONTENT_TREE).checkItem(fuel_item)) - { - m_fuel_totaltime = 30; - m_fuel_time = 0; - fuel_list->decrementMaterials(1); - changed = true; - } - else if(ItemSpec(ITEM_MATERIAL, CONTENT_JUNGLETREE).checkItem(fuel_item)) - { - m_fuel_totaltime = 30; - m_fuel_time = 0; - fuel_list->decrementMaterials(1); - changed = true; - } - else if(ItemSpec(ITEM_MATERIAL, CONTENT_FENCE).checkItem(fuel_item)) - { - m_fuel_totaltime = 30/2; - m_fuel_time = 0; - fuel_list->decrementMaterials(1); - changed = true; - } - else if(ItemSpec(ITEM_MATERIAL, CONTENT_WOOD).checkItem(fuel_item)) - { - m_fuel_totaltime = 30/4; - m_fuel_time = 0; - fuel_list->decrementMaterials(1); - changed = true; - } - else if(ItemSpec(ITEM_MATERIAL, CONTENT_BOOKSHELF).checkItem(fuel_item)) - { - m_fuel_totaltime = 30/4; - m_fuel_time = 0; - fuel_list->decrementMaterials(1); - changed = true; - } - else if(ItemSpec(ITEM_MATERIAL, CONTENT_LEAVES).checkItem(fuel_item)) - { - m_fuel_totaltime = 30/16; - m_fuel_time = 0; - fuel_list->decrementMaterials(1); - changed = true; - } - else if(ItemSpec(ITEM_MATERIAL, CONTENT_PAPYRUS).checkItem(fuel_item)) - { - m_fuel_totaltime = 30/32; - m_fuel_time = 0; - fuel_list->decrementMaterials(1); - changed = true; - } - else if(ItemSpec(ITEM_MATERIAL, CONTENT_JUNGLEGRASS).checkItem(fuel_item)) - { - m_fuel_totaltime = 30/32; - m_fuel_time = 0; - fuel_list->decrementMaterials(1); - changed = true; - } - else if(ItemSpec(ITEM_MATERIAL, CONTENT_CACTUS).checkItem(fuel_item)) - { - m_fuel_totaltime = 30/4; - m_fuel_time = 0; - fuel_list->decrementMaterials(1); - changed = true; - } - else if(ItemSpec(ITEM_CRAFT, "Stick").checkItem(fuel_item)) - { - m_fuel_totaltime = 30/4/4; - m_fuel_time = 0; - fuel_list->decrementMaterials(1); - changed = true; - } - else if(ItemSpec(ITEM_CRAFT, "lump_of_coal").checkItem(fuel_item)) - { - m_fuel_totaltime = 40; - m_fuel_time = 0; - fuel_list->decrementMaterials(1); - changed = true; - } - else - { - //dstream<<"No fuel found"<set(NodeTimer(1., 0., p)); } - return changed; } -std::string FurnaceNodeMetadata::getInventoryDrawSpecString() -{ - return - "invsize[8,9;]" - "list[current_name;fuel;2,3;1,1;]" - "list[current_name;src;2,1;1,1;]" - "list[current_name;dst;5,1;2,2;]" - "list[current_player;main;0,5;8,4;]"; -} - -