mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 09:15:29 +01:00 
			
		
		
		
	
							
								
								
									
										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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user