Mirror von
https://github.com/ViaVersion/ViaVersion.git
synchronisiert 2024-11-03 14:50:30 +01:00
Cleanup palette type
Dieser Commit ist enthalten in:
Ursprung
02f9e87233
Commit
a9c848e32e
@ -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.minecraft.chunks.PaletteType;
|
||||||
import com.viaversion.viaversion.api.type.Type;
|
import com.viaversion.viaversion.api.type.Type;
|
||||||
import com.viaversion.viaversion.util.CompactArrayUtil;
|
import com.viaversion.viaversion.util.CompactArrayUtil;
|
||||||
|
import com.viaversion.viaversion.util.MathUtil;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
|
|
||||||
public final class PaletteType1_18 extends Type<DataPalette> {
|
public final class PaletteType1_18 extends Type<DataPalette> {
|
||||||
@ -88,29 +89,21 @@ public final class PaletteType1_18 extends Type<DataPalette> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(final ByteBuf buffer, final DataPalette palette) throws Exception {
|
public void write(final ByteBuf buffer, final DataPalette palette) throws Exception {
|
||||||
int bitsPerValue;
|
final int bitsPerValue;
|
||||||
if (palette.size() > 1) {
|
if (palette.size() == 1) {
|
||||||
// 1, 2, and 3 bit linear palettes can't be read by the client
|
// Single value palette
|
||||||
bitsPerValue = type == PaletteType.BLOCKS ? 4 : 1;
|
buffer.writeByte(0); // 0 bit storage
|
||||||
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
|
|
||||||
Type.VAR_INT.writePrimitive(buffer, palette.idByIndex(0));
|
Type.VAR_INT.writePrimitive(buffer, palette.idByIndex(0));
|
||||||
Type.VAR_INT.writePrimitive(buffer, 0); // Empty values length
|
Type.VAR_INT.writePrimitive(buffer, 0); // Empty values length
|
||||||
return;
|
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) {
|
if (bitsPerValue != globalPaletteBits) {
|
||||||
// Write pallete
|
// Write pallete
|
||||||
|
51
api/src/main/java/com/viaversion/viaversion/util/MathUtil.java
Normale Datei
51
api/src/main/java/com/viaversion/viaversion/util/MathUtil.java
Normale Datei
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren