Ver Fonte

Merge pull request #64843 from Faless/mp/4.x_encode_fix

[MP] Fix variant serialization after variant size change.
Rémi Verschelde há 3 anos atrás
pai
commit
bb6d771397
1 ficheiros alterados com 11 adições e 11 exclusões
  1. 11 11
      scene/main/multiplayer_api.cpp

+ 11 - 11
scene/main/multiplayer_api.cpp

@@ -59,18 +59,18 @@ Ref<MultiplayerAPI> MultiplayerAPI::create_default_interface() {
 
 // The variant is compressed and encoded; The first byte contains all the meta
 // information and the format is:
-// - The first LSB 5 bits are used for the variant type.
+// - The first LSB 6 bits are used for the variant type.
 // - The next two bits are used to store the encoding mode.
-// - The most significant is used to store the boolean value.
-#define VARIANT_META_TYPE_MASK 0x1F
-#define VARIANT_META_EMODE_MASK 0x60
+// - Boolean values uses the encoding mode to store the value.
+#define VARIANT_META_TYPE_MASK 0x3F
+#define VARIANT_META_EMODE_MASK 0xC0
 #define VARIANT_META_BOOL_MASK 0x80
-#define ENCODE_8 0 << 5
-#define ENCODE_16 1 << 5
-#define ENCODE_32 2 << 5
-#define ENCODE_64 3 << 5
+#define ENCODE_8 0 << 6
+#define ENCODE_16 1 << 6
+#define ENCODE_32 2 << 6
+#define ENCODE_64 3 << 6
 Error MultiplayerAPI::encode_and_compress_variant(const Variant &p_variant, uint8_t *r_buffer, int &r_len, bool p_allow_object_decoding) {
-	// Unreachable because `VARIANT_MAX` == 27 and `ENCODE_VARIANT_MASK` == 31
+	// Unreachable because `VARIANT_MAX` == 38 and `ENCODE_VARIANT_MASK` == 77
 	CRASH_COND(p_variant.get_type() > VARIANT_META_TYPE_MASK);
 
 	uint8_t *buf = r_buffer;
@@ -80,9 +80,9 @@ Error MultiplayerAPI::encode_and_compress_variant(const Variant &p_variant, uint
 	switch (p_variant.get_type()) {
 		case Variant::BOOL: {
 			if (buf) {
-				// We still have 1 free bit in the meta, so let's use it.
+				// We don't use encode_mode for booleans, so we can use it to store the value.
 				buf[0] = (p_variant.operator bool()) ? (1 << 7) : 0;
-				buf[0] |= encode_mode | p_variant.get_type();
+				buf[0] |= p_variant.get_type();
 			}
 			r_len += 1;
 		} break;