Skip to content

Commit

Permalink
Fix some textures not being sent correctly to older clients
Browse files Browse the repository at this point in the history
Since b2eb44a, 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.)
  • Loading branch information
Oblomov authored and sfan5 committed Apr 24, 2022
1 parent 48d1bca commit 23f981c
Showing 1 changed file with 15 additions and 3 deletions.
18 changes: 15 additions & 3 deletions src/nodedef.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 23f981c

Please sign in to comment.