diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/types/version/PaletteType1_18.java b/api/src/main/java/com/viaversion/viaversion/api/type/types/version/PaletteType1_18.java index 66c35e939..fa809b7c0 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/types/version/PaletteType1_18.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/types/version/PaletteType1_18.java @@ -27,6 +27,7 @@ import com.viaversion.viaversion.api.minecraft.chunks.DataPaletteImpl; import com.viaversion.viaversion.api.minecraft.chunks.PaletteType; import com.viaversion.viaversion.api.type.Type; import com.viaversion.viaversion.util.CompactArrayUtil; +import com.viaversion.viaversion.util.MathUtil; import io.netty.buffer.ByteBuf; public final class PaletteType1_18 extends Type { @@ -88,29 +89,21 @@ public final class PaletteType1_18 extends Type { @Override public void write(final ByteBuf buffer, final DataPalette palette) throws Exception { - int bitsPerValue; - if (palette.size() > 1) { - // 1, 2, and 3 bit linear palettes can't be read by the client - bitsPerValue = type == PaletteType.BLOCKS ? 4 : 1; - while (palette.size() > 1 << bitsPerValue) { - bitsPerValue += 1; - } - - if (bitsPerValue > type.highestBitsPerValue()) { - bitsPerValue = globalPaletteBits; - } - } else { - bitsPerValue = 0; - } - - buffer.writeByte(bitsPerValue); - - if (bitsPerValue == 0) { - // Write single value + final int bitsPerValue; + if (palette.size() == 1) { + // Single value palette + buffer.writeByte(0); // 0 bit storage Type.VAR_INT.writePrimitive(buffer, palette.idByIndex(0)); Type.VAR_INT.writePrimitive(buffer, 0); // Empty values length return; - } + }/* else if (palette.size() == 0) { + Via.getPlatform().getLogger().warning("Palette size is 0!"); + }*/ + + // 1, 2, and 3 bit linear block palettes can't be read by the client + final int min = type == PaletteType.BLOCKS ? 4 : 1; + bitsPerValue = MathUtil.clamp(MathUtil.ceilLog2(palette.size()), min, type.highestBitsPerValue()); + buffer.writeByte(bitsPerValue); if (bitsPerValue != globalPaletteBits) { // Write pallete diff --git a/api/src/main/java/com/viaversion/viaversion/util/MathUtil.java b/api/src/main/java/com/viaversion/viaversion/util/MathUtil.java new file mode 100644 index 000000000..708ce0964 --- /dev/null +++ b/api/src/main/java/com/viaversion/viaversion/util/MathUtil.java @@ -0,0 +1,51 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2021 ViaVersion and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.viaversion.viaversion.util; + +public final class MathUtil { + + /** + * Returns the ceiled log to the base of 2 for the given number. + * + * @param i positive number to ceillog + * @return ceiled log2 of the given number + */ + public static int ceilLog2(final int i) { + return i > 0 ? 32 - Integer.numberOfLeadingZeros(i - 1) : 0; + } + + /** + * Returns the clamped number within the given range. + * + * @param i number to clamp + * @param min minimum value + * @param max maximum value + * @return clamped number + */ + public static int clamp(final int i, final int min, final int max) { + if (i < min) { + return min; + } + return i > max ? max : i; + } +} diff --git a/common/src/main/java/com/viaversion/viaversion/util/MathUtil.java b/common/src/main/java/com/viaversion/viaversion/util/MathUtil.java deleted file mode 100644 index 06ba802c4..000000000 --- a/common/src/main/java/com/viaversion/viaversion/util/MathUtil.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion - * Copyright (C) 2016-2021 ViaVersion and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.viaversion.viaversion.util; - -public final class MathUtil { - - /** - * Returns the ceiled log to the base of 2 for the given number. - * - * @param i positive number to ceillog - * @return ceiled log2 of the given number - */ - public static int ceilLog2(final int i) { - return i > 0 ? 32 - Integer.numberOfLeadingZeros(i - 1) : 0; - } -}