Fix registry data loading

This commit is contained in:
basaigh 2024-04-21 00:12:19 +01:00
parent d82870b420
commit fac983cb97
3 changed files with 20 additions and 23 deletions

View File

@ -28,9 +28,9 @@ package org.geysermc.geyser.level;
import com.github.steveice10.mc.protocol.data.game.RegistryEntry;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
import com.github.steveice10.opennbt.tag.builtin.IntTag;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import java.util.List;
import java.util.Map;
/**
* Represents the information we store from the current Java dimension
@ -39,20 +39,20 @@ import java.util.Map;
*/
public record JavaDimension(int minY, int maxY, boolean piglinSafe, double worldCoordinateScale) {
public static void load(List<RegistryEntry> entries, Map<String, JavaDimension> map) {
for (RegistryEntry entry : entries) {
public static void load(List<RegistryEntry> entries, Int2ObjectMap<JavaDimension> map) {
for (int i = 0; i < entries.size(); i++) {
RegistryEntry entry = entries.get(i);
CompoundTag dimension = entry.getData();
CompoundTag elements = dimension.get("element");
int minY = ((IntTag) elements.get("min_y")).getValue();
int maxY = ((IntTag) elements.get("height")).getValue();
int minY = ((IntTag) dimension.get("min_y")).getValue();
int maxY = ((IntTag) dimension.get("height")).getValue();
// Logical height can be ignored probably - seems to be for artificial limits like the Nether.
// Set if piglins/hoglins should shake
boolean piglinSafe = ((Number) elements.get("piglin_safe").getValue()).byteValue() != (byte) 0;
boolean piglinSafe = ((Number) dimension.get("piglin_safe").getValue()).byteValue() != (byte) 0;
// Load world coordinate scale for the world border
double coordinateScale = ((Number) elements.get("coordinate_scale").getValue()).doubleValue();
double coordinateScale = ((Number) dimension.get("coordinate_scale").getValue()).doubleValue();
map.put((String) dimension.get("name").getValue(), new JavaDimension(minY, maxY, piglinSafe, coordinateScale));
map.put(i, new JavaDimension(minY, maxY, piglinSafe, coordinateScale));
}
}
}

View File

@ -32,8 +32,6 @@ import com.github.steveice10.mc.protocol.data.game.chunk.palette.GlobalPalette;
import com.github.steveice10.mc.protocol.data.game.chunk.palette.Palette;
import com.github.steveice10.mc.protocol.data.game.chunk.palette.SingletonPalette;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
import com.github.steveice10.opennbt.tag.builtin.IntTag;
import com.github.steveice10.opennbt.tag.builtin.StringTag;
import it.unimi.dsi.fastutil.ints.*;
import org.geysermc.geyser.level.chunk.BlockStorage;
import org.geysermc.geyser.level.chunk.bitarray.BitArray;
@ -54,11 +52,11 @@ public class BiomeTranslator {
session.setBiomeGlobalPalette(MathUtils.getGlobalPaletteForSize(entries.size()));
int greatestBiomeId = 0;
for (RegistryEntry entry : entries) {
CompoundTag biomeTag = entry.getData();
String javaIdentifier = ((StringTag) biomeTag.get("name")).getValue();
for (int i = 0; i < entries.size(); i++) {
RegistryEntry entry = entries.get(i);
String javaIdentifier = entry.getId();
int bedrockId = Registries.BIOME_IDENTIFIERS.get().getOrDefault(javaIdentifier, 0);
int javaId = ((IntTag) biomeTag.get("id")).getValue();
int javaId = i;
if (javaId > greatestBiomeId) {
greatestBiomeId = javaId;
}

View File

@ -28,7 +28,6 @@ package org.geysermc.geyser.translator.protocol.java;
import com.github.steveice10.mc.protocol.data.game.RegistryEntry;
import com.github.steveice10.mc.protocol.packet.configuration.clientbound.ClientboundRegistryDataPacket;
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
import com.github.steveice10.opennbt.tag.builtin.IntTag;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import org.geysermc.geyser.level.JavaDimension;
import org.geysermc.geyser.session.GeyserSession;
@ -37,7 +36,7 @@ import org.geysermc.geyser.translator.level.BiomeTranslator;
import org.geysermc.geyser.translator.protocol.PacketTranslator;
import org.geysermc.geyser.translator.protocol.Translator;
import java.util.Map;
import java.util.List;
@Translator(packet = ClientboundRegistryDataPacket.class)
public class JavaRegistryDataTranslator extends PacketTranslator<ClientboundRegistryDataPacket> {
@ -45,7 +44,7 @@ public class JavaRegistryDataTranslator extends PacketTranslator<ClientboundRegi
@Override
public void translate(GeyserSession session, ClientboundRegistryDataPacket packet) {
if (packet.getRegistry().equals("minecraft:dimension_type")) {
Map<String, JavaDimension> dimensions = session.getDimensions();
Int2ObjectMap<JavaDimension> dimensions = session.getDimensions();
dimensions.clear();
JavaDimension.load(packet.getEntries(), dimensions);
}
@ -53,17 +52,17 @@ public class JavaRegistryDataTranslator extends PacketTranslator<ClientboundRegi
if (packet.getRegistry().equals("minecraft:chat_type")) {
Int2ObjectMap<TextDecoration> chatTypes = session.getChatTypes();
chatTypes.clear();
for (RegistryEntry entry : packet.getEntries()) {
List<RegistryEntry> entries = packet.getEntries();
for (int i = 0; i < entries.size(); i++) {
// The ID is NOT ALWAYS THE SAME! ViaVersion as of 1.19 adds two registry entries that do NOT match vanilla.
RegistryEntry entry = entries.get(i);
CompoundTag tag = entry.getData();
int id = ((IntTag) tag.get("id")).getValue();
CompoundTag element = tag.get("element");
CompoundTag chat = element.get("chat");
CompoundTag chat = tag.get("chat");
TextDecoration textDecoration = null;
if (chat != null) {
textDecoration = new TextDecoration(chat);
}
chatTypes.put(id, textDecoration);
chatTypes.put(i, textDecoration);
}
}