summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/network/networkprotocol.h5
-rw-r--r--src/nodedef.cpp34
-rw-r--r--src/nodedef.h2
3 files changed, 31 insertions, 10 deletions
diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h
index 674c68104..dc15326d9 100644
--- a/src/network/networkprotocol.h
+++ b/src/network/networkprotocol.h
@@ -132,9 +132,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
Rename GENERIC_CMD_SET_ATTACHMENT to GENERIC_CMD_ATTACH_TO
PROTOCOL_VERSION 26:
Add TileDef tileable_horizontal, tileable_vertical flags
+ PROTOCOL_VERSION 27:
+ backface_culling: backwards compatibility for playing with
+ newer client on pre-27 servers.
*/
-#define LATEST_PROTOCOL_VERSION 26
+#define LATEST_PROTOCOL_VERSION 27
// Server's supported network protocol range
#define SERVER_PROTOCOL_VERSION_MIN 13
diff --git a/src/nodedef.cpp b/src/nodedef.cpp
index 0bcc00e47..e30cf6f12 100644
--- a/src/nodedef.cpp
+++ b/src/nodedef.cpp
@@ -139,7 +139,7 @@ void TileDef::serialize(std::ostream &os, u16 protocol_version) const
}
}
-void TileDef::deSerialize(std::istream &is)
+void TileDef::deSerialize(std::istream &is, bool culling_ignore)
{
int version = readU8(is);
name = deSerializeString(is);
@@ -153,6 +153,11 @@ void TileDef::deSerialize(std::istream &is)
tileable_horizontal = readU8(is);
tileable_vertical = readU8(is);
}
+ // when connecting to old servers - do not use
+ // provided values here since culling needs to be
+ // disabled by default for these drawtypes
+ if (culling_ignore)
+ backface_culling = false;
}
@@ -339,15 +344,22 @@ void ContentFeatures::deSerialize(std::istream &is)
groups[name] = value;
}
drawtype = (enum NodeDrawType)readU8(is);
+
+ bool ignore_culling = ((version <= 26) &&
+ ((drawtype == NDT_MESH) ||
+ (drawtype == NDT_PLANTLIKE) ||
+ (drawtype == NDT_FIRELIKE) ||
+ (drawtype == NDT_LIQUID)));
+
visual_scale = readF1000(is);
if(readU8(is) != 6)
throw SerializationError("unsupported tile count");
for(u32 i = 0; i < 6; i++)
- tiledef[i].deSerialize(is);
+ tiledef[i].deSerialize(is, ignore_culling);
if(readU8(is) != CF_SPECIAL_COUNT)
throw SerializationError("unsupported CF_SPECIAL_COUNT");
for(u32 i = 0; i < CF_SPECIAL_COUNT; i++)
- tiledef_special[i].deSerialize(is);
+ tiledef_special[i].deSerialize(is, ignore_culling);
alpha = readU8(is);
post_effect_color.setAlpha(readU8(is));
post_effect_color.setRed(readU8(is));
@@ -1258,7 +1270,6 @@ void ContentFeatures::serializeOld(std::ostream &os, u16 protocol_version) const
"Unsupported version requested");
}
-
void ContentFeatures::deSerializeOld(std::istream &is, int version)
{
if (version == 5) // In PROTOCOL_VERSION 13
@@ -1272,15 +1283,22 @@ void ContentFeatures::deSerializeOld(std::istream &is, int version)
groups[name] = value;
}
drawtype = (enum NodeDrawType)readU8(is);
+
+ bool ignore_culling = ((version <= 26) &&
+ ((drawtype == NDT_MESH) ||
+ (drawtype == NDT_PLANTLIKE) ||
+ (drawtype == NDT_FIRELIKE) ||
+ (drawtype == NDT_LIQUID)));
+
visual_scale = readF1000(is);
if (readU8(is) != 6)
throw SerializationError("unsupported tile count");
for (u32 i = 0; i < 6; i++)
- tiledef[i].deSerialize(is);
+ tiledef[i].deSerialize(is, ignore_culling);
if (readU8(is) != CF_SPECIAL_COUNT)
throw SerializationError("unsupported CF_SPECIAL_COUNT");
for (u32 i = 0; i < CF_SPECIAL_COUNT; i++)
- tiledef_special[i].deSerialize(is);
+ tiledef_special[i].deSerialize(is, ignore_culling);
alpha = readU8(is);
post_effect_color.setAlpha(readU8(is));
post_effect_color.setRed(readU8(is));
@@ -1324,12 +1342,12 @@ void ContentFeatures::deSerializeOld(std::istream &is, int version)
if (readU8(is) != 6)
throw SerializationError("unsupported tile count");
for (u32 i = 0; i < 6; i++)
- tiledef[i].deSerialize(is);
+ tiledef[i].deSerialize(is, drawtype);
// CF_SPECIAL_COUNT in version 6 = 2
if (readU8(is) != 2)
throw SerializationError("unsupported CF_SPECIAL_COUNT");
for (u32 i = 0; i < 2; i++)
- tiledef_special[i].deSerialize(is);
+ tiledef_special[i].deSerialize(is, drawtype);
alpha = readU8(is);
post_effect_color.setAlpha(readU8(is));
post_effect_color.setRed(readU8(is));
diff --git a/src/nodedef.h b/src/nodedef.h
index 8f4942c04..182bd09b2 100644
--- a/src/nodedef.h
+++ b/src/nodedef.h
@@ -137,7 +137,7 @@ struct TileDef
}
void serialize(std::ostream &os, u16 protocol_version) const;
- void deSerialize(std::istream &is);
+ void deSerialize(std::istream &is, bool culling_ignore);
};
enum NodeDrawType