/* Minetest Copyright (C) 2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify 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 Lesser General Public License for more details. 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 "tool.h" #include "itemgroup.h" #include "log.h" #include "inventory.h" #include "exceptions.h" #include "util/serialize.h" #include "util/numeric.h" void ToolCapabilities::serialize(std::ostream &os, u16 protocol_version) const { writeU8(os, 2); // version (protocol >= 18) writeF1000(os, full_punch_interval); writeS16(os, max_drop_level); writeU32(os, groupcaps.size()); for (ToolGCMap::const_iterator i = groupcaps.begin(); i != groupcaps.end(); ++i) { const std::string *name = &i->first; const ToolGroupCap *cap = &i->second; os << serializeString(*name); writeS16(os, cap->uses); writeS16(os, cap->maxlevel); writeU32(os, cap->times.size()); for (UNORDERED_MAP::const_iterator j = cap->times.begin(); j != cap->times.end(); ++j) { writeS16(os, j->first); writeF1000(os, j->second); } } writeU32(os, damageGroups.size()); for (DamageGroup::const_iterator i = damageGroups.begin(); i != damageGroups.end(); ++i) { os << serializeString(i->first); writeS16(os, i->second); } } void ToolCapabilities::deSerialize(std::istream &is) { int version = readU8(is); if(version != 1 && version != 2) throw SerializationError( "unsupported ToolCapabilities version"); full_punch_interval = readF1000(is); max_drop_level = readS16(is); groupcaps.clear(); u32 groupcaps_size = readU32(is); for(u32 i=0; iname == "")) do_hit = false; } if(do_hit){ if(itemgroup_get(armor_groups, "immortal")) do_hit = false; } } PunchDamageResult result; if(do_hit) { HitParams hitparams = getHitParams(armor_groups, toolcap, time_from_last_punch); result.did_punch = true; result.wear = hitparams.wear; result.damage = hitparams.hp; } return result; }