@@ -56,7 +56,10 @@ void ToolGroupCap::fromJson(const Json::Value &json)
56
56
57
57
void ToolCapabilities::serialize (std::ostream &os, u16 protocol_version) const
58
58
{
59
- writeU8 (os, 4 ); // protocol_version >= 37
59
+ if (protocol_version >= 38 )
60
+ writeU8 (os, 5 );
61
+ else
62
+ writeU8 (os, 4 ); // proto == 37
60
63
writeF32 (os, full_punch_interval);
61
64
writeS16 (os, max_drop_level);
62
65
writeU32 (os, groupcaps.size ());
@@ -79,6 +82,9 @@ void ToolCapabilities::serialize(std::ostream &os, u16 protocol_version) const
79
82
os << serializeString (damageGroup.first );
80
83
writeS16 (os, damageGroup.second );
81
84
}
85
+
86
+ if (protocol_version >= 38 )
87
+ writeU16 (os, rangelim (punch_attack_uses, 0 , U16_MAX));
82
88
}
83
89
84
90
void ToolCapabilities::deSerialize (std::istream &is)
@@ -111,13 +117,17 @@ void ToolCapabilities::deSerialize(std::istream &is)
111
117
s16 rating = readS16 (is);
112
118
damageGroups[name] = rating;
113
119
}
120
+
121
+ if (version >= 5 )
122
+ punch_attack_uses = readU16 (is);
114
123
}
115
124
116
125
void ToolCapabilities::serializeJson (std::ostream &os) const
117
126
{
118
127
Json::Value root;
119
128
root[" full_punch_interval" ] = full_punch_interval;
120
129
root[" max_drop_level" ] = max_drop_level;
130
+ root[" punch_attack_uses" ] = punch_attack_uses;
121
131
122
132
Json::Value groupcaps_object;
123
133
for (auto groupcap : groupcaps) {
@@ -144,6 +154,8 @@ void ToolCapabilities::deserializeJson(std::istream &is)
144
154
full_punch_interval = root[" full_punch_interval" ].asFloat ();
145
155
if (root[" max_drop_level" ].isInt ())
146
156
max_drop_level = root[" max_drop_level" ].asInt ();
157
+ if (root[" punch_attack_uses" ].isInt ())
158
+ punch_attack_uses = root[" punch_attack_uses" ].asInt ();
147
159
148
160
Json::Value &groupcaps_object = root[" groupcaps" ];
149
161
if (groupcaps_object.isObject ()) {
@@ -227,16 +239,20 @@ HitParams getHitParams(const ItemGroupList &armor_groups,
227
239
const ToolCapabilities *tp, float time_from_last_punch)
228
240
{
229
241
s16 damage = 0 ;
230
- float full_punch_interval = tp->full_punch_interval ;
242
+ float result_wear = 0 .0f ;
243
+ float punch_interval_multiplier =
244
+ rangelim (time_from_last_punch / tp->full_punch_interval , 0 .0f , 1 .0f );
231
245
232
246
for (const auto &damageGroup : tp->damageGroups ) {
233
247
s16 armor = itemgroup_get (armor_groups, damageGroup.first );
234
- damage += damageGroup.second
235
- * rangelim (time_from_last_punch / full_punch_interval, 0.0 , 1.0 )
236
- * armor / 100.0 ;
248
+ damage += damageGroup.second * punch_interval_multiplier * armor / 100.0 ;
237
249
}
238
250
239
- return {damage, 0 };
251
+ if (tp->punch_attack_uses > 0 )
252
+ result_wear = 1 .0f / tp->punch_attack_uses * punch_interval_multiplier;
253
+
254
+ u16 wear_i = U16_MAX * result_wear;
255
+ return {damage, wear_i};
240
256
}
241
257
242
258
HitParams getHitParams (const ItemGroupList &armor_groups,
0 commit comments