Skip to content

Commit 7e17eae

Browse files
Rogier-5est31
authored andcommittedNov 10, 2016
Fix mob deserialization errors in the client (#4743)
The problem was seen while using the mobf mod package. The problem happens when the server serializes entity attachments. Sometimes, such attachments no longer exist. The serialization code skips those. However, the total number of attachments was serialized earlier. Therefore the client expects more than it gets, and logs a serialization error.
1 parent c05aac3 commit 7e17eae

File tree

1 file changed

+32
-16
lines changed

1 file changed

+32
-16
lines changed
 

‎src/content_sao.cpp

+32-16
Original file line numberDiff line numberDiff line change
@@ -383,23 +383,30 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version)
383383
writeF1000(os, m_yaw);
384384
writeS16(os, m_hp);
385385

386-
writeU8(os, 4 + m_bone_position.size() + m_attachment_child_ids.size()); // number of messages stuffed in here
387-
os<<serializeLongString(getPropertyPacket()); // message 1
388-
os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
389-
os<<serializeLongString(gob_cmd_update_animation(
386+
std::ostringstream msg_os(std::ios::binary);
387+
msg_os << serializeLongString(getPropertyPacket()); // message 1
388+
msg_os << serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
389+
msg_os << serializeLongString(gob_cmd_update_animation(
390390
m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop)); // 3
391391
for (UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator
392392
ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii) {
393-
os << serializeLongString(gob_cmd_update_bone_position((*ii).first,
393+
msg_os << serializeLongString(gob_cmd_update_bone_position((*ii).first,
394394
(*ii).second.X, (*ii).second.Y)); // m_bone_position.size
395395
}
396-
os<<serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id, m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4
396+
msg_os << serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id,
397+
m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4
398+
int message_count = 4 + m_bone_position.size();
397399
for (UNORDERED_SET<int>::const_iterator ii = m_attachment_child_ids.begin();
398400
(ii != m_attachment_child_ids.end()); ++ii) {
399401
if (ServerActiveObject *obj = m_env->getActiveObject(*ii)) {
400-
os << serializeLongString(gob_cmd_update_infant(*ii, obj->getSendType(), obj->getClientInitializationData(protocol_version)));
402+
message_count++;
403+
msg_os << serializeLongString(gob_cmd_update_infant(*ii, obj->getSendType(),
404+
obj->getClientInitializationData(protocol_version)));
401405
}
402406
}
407+
408+
writeU8(os, message_count);
409+
os.write(msg_os.str().c_str(), msg_os.str().size());
403410
}
404411
else
405412
{
@@ -865,26 +872,35 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version)
865872
writeF1000(os, m_yaw);
866873
writeS16(os, getHP());
867874

868-
writeU8(os, 6 + m_bone_position.size() + m_attachment_child_ids.size()); // number of messages stuffed in here
869-
os<<serializeLongString(getPropertyPacket()); // message 1
870-
os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
871-
os<<serializeLongString(gob_cmd_update_animation(
875+
std::ostringstream msg_os(std::ios::binary);
876+
msg_os << serializeLongString(getPropertyPacket()); // message 1
877+
msg_os << serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
878+
msg_os << serializeLongString(gob_cmd_update_animation(
872879
m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop)); // 3
873880
for (UNORDERED_MAP<std::string, core::vector2d<v3f> >::const_iterator
874881
ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii) {
875-
os<<serializeLongString(gob_cmd_update_bone_position((*ii).first, (*ii).second.X, (*ii).second.Y)); // m_bone_position.size
882+
msg_os << serializeLongString(gob_cmd_update_bone_position((*ii).first,
883+
(*ii).second.X, (*ii).second.Y)); // m_bone_position.size
876884
}
877-
os<<serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id, m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4
878-
os<<serializeLongString(gob_cmd_update_physics_override(m_physics_override_speed,
885+
msg_os << serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id,
886+
m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4
887+
msg_os << serializeLongString(gob_cmd_update_physics_override(m_physics_override_speed,
879888
m_physics_override_jump, m_physics_override_gravity, m_physics_override_sneak,
880889
m_physics_override_sneak_glitch)); // 5
881-
os << serializeLongString(gob_cmd_update_nametag_attributes(m_prop.nametag_color)); // 6 (GENERIC_CMD_UPDATE_NAMETAG_ATTRIBUTES) : Deprecated, for backwards compatibility only.
890+
// (GENERIC_CMD_UPDATE_NAMETAG_ATTRIBUTES) : Deprecated, for backwards compatibility only.
891+
msg_os << serializeLongString(gob_cmd_update_nametag_attributes(m_prop.nametag_color)); // 6
892+
int message_count = 6 + m_bone_position.size();
882893
for (UNORDERED_SET<int>::const_iterator ii = m_attachment_child_ids.begin();
883894
ii != m_attachment_child_ids.end(); ++ii) {
884895
if (ServerActiveObject *obj = m_env->getActiveObject(*ii)) {
885-
os << serializeLongString(gob_cmd_update_infant(*ii, obj->getSendType(), obj->getClientInitializationData(protocol_version)));
896+
message_count++;
897+
msg_os << serializeLongString(gob_cmd_update_infant(*ii, obj->getSendType(),
898+
obj->getClientInitializationData(protocol_version)));
886899
}
887900
}
901+
902+
writeU8(os, message_count);
903+
os.write(msg_os.str().c_str(), msg_os.str().size());
888904
}
889905
else
890906
{

0 commit comments

Comments
 (0)
Please sign in to comment.