aboutsummaryrefslogtreecommitdiff
path: root/src/nodedef.cpp
diff options
context:
space:
mode:
authorGiuseppe Bilotta <giuseppe.bilotta@gmail.com>2022-04-23 18:04:38 +0200
committersfan5 <sfan5@live.de>2022-05-14 18:33:42 +0200
commit0d0f1a2fb25fbfef8e0a1d42028257736fd80146 (patch)
tree6b35de8a64a0d106e9c18b6d83f00ceab16caa96 /src/nodedef.cpp
parent439701ed7a55fe5ddfe996c8f397e88d54af2b36 (diff)
downloadminetest-0d0f1a2fb25fbfef8e0a1d42028257736fd80146.tar.gz
minetest-0d0f1a2fb25fbfef8e0a1d42028257736fd80146.tar.bz2
minetest-0d0f1a2fb25fbfef8e0a1d42028257736fd80146.zip
Fix some textures not being sent correctly to older clients
Since b2eb44afc50976dc0954c868977b5829f3ff8a19, a texture defined as `[combine:16x512:0,0=some_file.png;etc` will not be sent correctly from a 5.5 server to a 5.4 client due to the overeager detection of unsupported base modifier `[` introducing a spurious `blank.png^` before the modifier. Fix this by whitelisting which base modifiers can be passed through unchanged to the client, and prefix `blank.png` for the others (which at the moment is just [png:, but the list may grow larger as new base modifiers are added.)
Diffstat (limited to 'src/nodedef.cpp')
-rw-r--r--src/nodedef.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/nodedef.cpp b/src/nodedef.cpp
index 4bbc90845..c3fa5a35c 100644
--- a/src/nodedef.cpp
+++ b/src/nodedef.cpp
@@ -33,6 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "nameidmapping.h"
#include "util/numeric.h"
#include "util/serialize.h"
+#include "util/string.h"
#include "exceptions.h"
#include "debug.h"
#include "gamedef.h"
@@ -213,10 +214,21 @@ void TileDef::serialize(std::ostream &os, u16 protocol_version) const
// Before f018737, TextureSource::getTextureAverageColor did not handle
// missing textures. "[png" can be used as base texture, but is not known
// on older clients. Hence use "blank.png" to avoid this problem.
- if (!name.empty() && name[0] == '[')
- os << serializeString16("blank.png^" + name);
- else
+ // To be forward-compatible with future base textures/modifiers,
+ // we apply the same prefix to any texture beginning with [,
+ // except for the ones that are supported on older clients.
+ bool pass_through = true;
+
+ if (!name.empty() && name[0] == '[') {
+ pass_through = str_starts_with(name, "[combine:") ||
+ str_starts_with(name, "[inventorycube{") ||
+ str_starts_with(name, "[lowpart:");
+ }
+
+ if (pass_through)
os << serializeString16(name);
+ else
+ os << serializeString16("blank.png^" + name);
}
animation.serialize(os, version);
bool has_scale = scale > 0;