mirror of
https://github.com/minetest/minetest.git
synced 2024-12-22 14:12:24 +01:00
parent
f2c66b9ceb
commit
1bccb4e48c
107
src/tool.cpp
107
src/tool.cpp
@ -44,18 +44,25 @@ void ToolGroupCap::toJson(Json::Value &object) const
|
||||
|
||||
void ToolGroupCap::fromJson(const Json::Value &json)
|
||||
{
|
||||
if (json.isObject()) {
|
||||
if (json["maxlevel"].isInt())
|
||||
maxlevel = json["maxlevel"].asInt();
|
||||
if (json["uses"].isInt())
|
||||
uses = json["uses"].asInt();
|
||||
const Json::Value ×_object = json["times"];
|
||||
if (times_object.isArray()) {
|
||||
Json::ArrayIndex size = times_object.size();
|
||||
for (Json::ArrayIndex i = 0; i < size; ++i)
|
||||
if (times_object[i].isDouble())
|
||||
times[i] = times_object[i].asFloat();
|
||||
}
|
||||
if (!json.isObject())
|
||||
return;
|
||||
|
||||
if (json["maxlevel"].isInt())
|
||||
maxlevel = json["maxlevel"].asInt();
|
||||
|
||||
if (json["uses"].isInt())
|
||||
uses = json["uses"].asInt();
|
||||
|
||||
const Json::Value ×_object = json["times"];
|
||||
|
||||
if (!times_object.isArray())
|
||||
return;
|
||||
|
||||
Json::ArrayIndex size = times_object.size();
|
||||
|
||||
for (Json::ArrayIndex i = 0; i < size; ++i) {
|
||||
if (times_object[i].isDouble())
|
||||
times[i] = times_object[i].asFloat();
|
||||
}
|
||||
}
|
||||
|
||||
@ -65,9 +72,11 @@ void ToolCapabilities::serialize(std::ostream &os, u16 protocol_version) const
|
||||
writeU8(os, 5);
|
||||
else
|
||||
writeU8(os, 4); // proto == 37
|
||||
|
||||
writeF32(os, full_punch_interval);
|
||||
writeS16(os, max_drop_level);
|
||||
writeU32(os, groupcaps.size());
|
||||
|
||||
for (const auto &groupcap : groupcaps) {
|
||||
const std::string *name = &groupcap.first;
|
||||
const ToolGroupCap *cap = &groupcap.second;
|
||||
@ -102,6 +111,7 @@ void ToolCapabilities::deSerialize(std::istream &is)
|
||||
max_drop_level = readS16(is);
|
||||
groupcaps.clear();
|
||||
u32 groupcaps_size = readU32(is);
|
||||
|
||||
for (u32 i = 0; i < groupcaps_size; i++) {
|
||||
std::string name = deSerializeString16(is);
|
||||
ToolGroupCap cap;
|
||||
@ -135,15 +145,19 @@ void ToolCapabilities::serializeJson(std::ostream &os) const
|
||||
root["punch_attack_uses"] = punch_attack_uses;
|
||||
|
||||
Json::Value groupcaps_object;
|
||||
|
||||
for (const auto &groupcap : groupcaps) {
|
||||
groupcap.second.toJson(groupcaps_object[groupcap.first]);
|
||||
}
|
||||
|
||||
root["groupcaps"] = std::move(groupcaps_object);
|
||||
|
||||
Json::Value damage_groups_object;
|
||||
|
||||
for (const auto &damagegroup : damageGroups) {
|
||||
damage_groups_object[damagegroup.first] = damagegroup.second;
|
||||
}
|
||||
|
||||
root["damage_groups"] = std::move(damage_groups_object);
|
||||
|
||||
fastWriteJson(root, os);
|
||||
@ -153,36 +167,44 @@ void ToolCapabilities::deserializeJson(std::istream &is)
|
||||
{
|
||||
Json::Value root;
|
||||
is >> root;
|
||||
if (root.isObject()) {
|
||||
if (root["full_punch_interval"].isDouble())
|
||||
full_punch_interval = root["full_punch_interval"].asFloat();
|
||||
if (root["max_drop_level"].isInt())
|
||||
max_drop_level = root["max_drop_level"].asInt();
|
||||
if (root["punch_attack_uses"].isInt())
|
||||
punch_attack_uses = root["punch_attack_uses"].asInt();
|
||||
|
||||
Json::Value &groupcaps_object = root["groupcaps"];
|
||||
if (groupcaps_object.isObject()) {
|
||||
Json::ValueIterator gciter;
|
||||
for (gciter = groupcaps_object.begin();
|
||||
gciter != groupcaps_object.end(); ++gciter) {
|
||||
ToolGroupCap groupcap;
|
||||
groupcap.fromJson(*gciter);
|
||||
groupcaps[gciter.key().asString()] = groupcap;
|
||||
}
|
||||
}
|
||||
if (!root.isObject())
|
||||
return;
|
||||
|
||||
Json::Value &damage_groups_object = root["damage_groups"];
|
||||
if (damage_groups_object.isObject()) {
|
||||
Json::ValueIterator dgiter;
|
||||
for (dgiter = damage_groups_object.begin();
|
||||
dgiter != damage_groups_object.end(); ++dgiter) {
|
||||
Json::Value &value = *dgiter;
|
||||
if (value.isInt())
|
||||
damageGroups[dgiter.key().asString()] =
|
||||
value.asInt();
|
||||
}
|
||||
}
|
||||
if (root["full_punch_interval"].isDouble())
|
||||
full_punch_interval = root["full_punch_interval"].asFloat();
|
||||
|
||||
if (root["max_drop_level"].isInt())
|
||||
max_drop_level = root["max_drop_level"].asInt();
|
||||
|
||||
if (root["punch_attack_uses"].isInt())
|
||||
punch_attack_uses = root["punch_attack_uses"].asInt();
|
||||
|
||||
deserializeJsonGroupcaps(root["groupcaps"]);
|
||||
deserializeJsonDamageGroups(root["damage_groups"]);
|
||||
}
|
||||
|
||||
void ToolCapabilities::deserializeJsonGroupcaps(Json::Value &json)
|
||||
{
|
||||
if (!json.isObject())
|
||||
return;
|
||||
|
||||
for (Json::ValueIterator iter = json.begin(); iter != json.end(); ++iter) {
|
||||
ToolGroupCap value;
|
||||
value.fromJson(*iter);
|
||||
groupcaps[iter.key().asString()] = value;
|
||||
}
|
||||
}
|
||||
|
||||
void ToolCapabilities::deserializeJsonDamageGroups(Json::Value &json)
|
||||
{
|
||||
if (!json.isObject())
|
||||
return;
|
||||
|
||||
for (Json::ValueIterator iter = json.begin(); iter != json.end(); ++iter) {
|
||||
Json::Value &value = *iter;
|
||||
if (value.isInt())
|
||||
damageGroups[iter.key().asString()] = value.asInt();
|
||||
}
|
||||
}
|
||||
|
||||
@ -362,9 +384,8 @@ u32 calculateResultWear(const u32 uses, const u16 initial_wear)
|
||||
player.
|
||||
*/
|
||||
u16 wear_extra_at = blocks_normal * wear_normal;
|
||||
if (initial_wear >= wear_extra_at) {
|
||||
if (initial_wear >= wear_extra_at)
|
||||
wear_extra = 1;
|
||||
}
|
||||
}
|
||||
result_wear = wear_normal + wear_extra;
|
||||
return result_wear;
|
||||
@ -410,6 +431,7 @@ DigParams getDigParams(const ItemGroupList &groups,
|
||||
|
||||
if (leveldiff > 1)
|
||||
time /= leveldiff;
|
||||
|
||||
if (!result_diggable || time < result_time) {
|
||||
result_time = time;
|
||||
result_diggable = true;
|
||||
@ -509,4 +531,3 @@ f32 getToolRange(const ItemStack &wielded_item, const ItemStack &hand_item,
|
||||
|
||||
return max_d;
|
||||
}
|
||||
|
||||
|
@ -83,6 +83,10 @@ struct ToolCapabilities
|
||||
void deSerialize(std::istream &is);
|
||||
void serializeJson(std::ostream &os) const;
|
||||
void deserializeJson(std::istream &is);
|
||||
|
||||
private:
|
||||
void deserializeJsonGroupcaps(Json::Value &json);
|
||||
void deserializeJsonDamageGroups(Json::Value &json);
|
||||
};
|
||||
|
||||
struct WearBarParams
|
||||
|
Loading…
Reference in New Issue
Block a user