Skip to content

Commit c6b287b

Browse files
Always rewrite map color ids in 1.17->1.16.4 (#956)
Co-authored-by: FlorianMichael <[email protected]>
1 parent 0f59bf9 commit c6b287b

File tree

3 files changed

+44
-31
lines changed

3 files changed

+44
-31
lines changed

common/src/main/java/com/viaversion/viabackwards/api/rewriters/MapColorRewriter.java

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,44 +17,54 @@
1717
*/
1818
package com.viaversion.viabackwards.api.rewriters;
1919

20+
import com.viaversion.viaversion.api.protocol.packet.PacketWrapper;
2021
import com.viaversion.viaversion.api.protocol.remapper.PacketHandler;
21-
import com.viaversion.viaversion.api.type.Type;
2222
import com.viaversion.viaversion.api.type.Types;
2323
import com.viaversion.viaversion.rewriter.IdRewriteFunction;
2424

2525
public final class MapColorRewriter {
2626

27+
/**
28+
* Rewrite map colors using the provided id rewriter.
29+
*
30+
* @param wrapper packet wrapper
31+
* @param rewriter id rewriter returning mapped colors, or -1 if unmapped
32+
* @param iconCount number of icons to read
33+
*/
34+
public static void rewriteMapColors(PacketWrapper wrapper, IdRewriteFunction rewriter, int iconCount) {
35+
for (int i = 0; i < iconCount; i++) {
36+
wrapper.passthrough(Types.VAR_INT); // Type
37+
wrapper.passthrough(Types.BYTE); // X
38+
wrapper.passthrough(Types.BYTE); // Z
39+
wrapper.passthrough(Types.BYTE); // Direction
40+
wrapper.passthrough(Types.OPTIONAL_COMPONENT); // Display Name
41+
}
42+
43+
short columns = wrapper.passthrough(Types.UNSIGNED_BYTE);
44+
if (columns < 1) {
45+
return;
46+
}
47+
48+
wrapper.passthrough(Types.UNSIGNED_BYTE); // Rows
49+
wrapper.passthrough(Types.UNSIGNED_BYTE); // X
50+
wrapper.passthrough(Types.UNSIGNED_BYTE); // Z
51+
byte[] data = wrapper.passthrough(Types.BYTE_ARRAY_PRIMITIVE);
52+
for (int i = 0; i < data.length; i++) {
53+
int color = data[i] & 0xFF;
54+
int mappedColor = rewriter.rewrite(color);
55+
if (mappedColor != -1) {
56+
data[i] = (byte) mappedColor;
57+
}
58+
}
59+
}
60+
2761
/**
2862
* Returns a packethandler to rewrite map data color ids. Reading starts from the icon count.
2963
*
3064
* @param rewriter id rewriter returning mapped colors, or -1 if unmapped
3165
* @return packethandler to rewrite map data color ids
3266
*/
3367
public static PacketHandler getRewriteHandler(IdRewriteFunction rewriter) {
34-
return wrapper -> {
35-
int iconCount = wrapper.passthrough(Types.VAR_INT);
36-
for (int i = 0; i < iconCount; i++) {
37-
wrapper.passthrough(Types.VAR_INT); // Type
38-
wrapper.passthrough(Types.BYTE); // X
39-
wrapper.passthrough(Types.BYTE); // Z
40-
wrapper.passthrough(Types.BYTE); // Direction
41-
wrapper.passthrough(Types.OPTIONAL_COMPONENT); // Display Name
42-
}
43-
44-
short columns = wrapper.passthrough(Types.UNSIGNED_BYTE);
45-
if (columns < 1) return;
46-
47-
wrapper.passthrough(Types.UNSIGNED_BYTE); // Rows
48-
wrapper.passthrough(Types.UNSIGNED_BYTE); // X
49-
wrapper.passthrough(Types.UNSIGNED_BYTE); // Z
50-
byte[] data = wrapper.passthrough(Types.BYTE_ARRAY_PRIMITIVE);
51-
for (int i = 0; i < data.length; i++) {
52-
int color = data[i] & 0xFF;
53-
int mappedColor = rewriter.rewrite(color);
54-
if (mappedColor != -1) {
55-
data[i] = (byte) mappedColor;
56-
}
57-
}
58-
};
68+
return wrapper -> rewriteMapColors(wrapper, rewriter, wrapper.passthrough(Types.VAR_INT));
5969
}
6070
}

common/src/main/java/com/viaversion/viabackwards/protocol/v1_16to1_15_2/rewriter/BlockItemPacketRewriter1_16.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ public void register() {
206206
map(Types.BYTE); // Scale
207207
map(Types.BOOLEAN); // Tracking Position
208208
map(Types.BOOLEAN); // Locked
209-
handler(MapColorRewriter.getRewriteHandler(MapColorMappings1_15_2::getMappedColor));
209+
handler(MapColorRewriter.getRewriteHandler(MapColorMappings1_15_2::getMappedColor, true));
210210
}
211211
});
212212

common/src/main/java/com/viaversion/viabackwards/protocol/v1_17to1_16_4/rewriter/BlockItemPacketRewriter1_17.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -422,12 +422,15 @@ public void register() {
422422
handler(wrapper -> wrapper.write(Types.BOOLEAN, true)); // Tracking position
423423
map(Types.BOOLEAN); // Locked
424424
handler(wrapper -> {
425-
boolean hasMarkers = wrapper.read(Types.BOOLEAN);
426-
if (!hasMarkers) {
427-
wrapper.write(Types.VAR_INT, 0); // Array size
425+
final int iconCount;
426+
final boolean hasMarkers = wrapper.read(Types.BOOLEAN);
427+
if (hasMarkers) {
428+
iconCount = wrapper.passthrough(Types.VAR_INT);
428429
} else {
429-
MapColorRewriter.getRewriteHandler(MapColorMappings1_16_4::getMappedColor).handle(wrapper);
430+
wrapper.write(Types.VAR_INT, 0); // Add icon count
431+
iconCount = 0;
430432
}
433+
MapColorRewriter.rewriteMapColors(wrapper, MapColorMappings1_16_4::getMappedColor, iconCount);
431434
});
432435
}
433436
});

0 commit comments

Comments
 (0)