diff --git a/src/main/java/ru/nanit/limbo/NanoLimbo.java b/src/main/java/ru/nanit/limbo/NanoLimbo.java index e811d95..16ab4a8 100644 --- a/src/main/java/ru/nanit/limbo/NanoLimbo.java +++ b/src/main/java/ru/nanit/limbo/NanoLimbo.java @@ -2,7 +2,9 @@ package ru.nanit.limbo; import ru.nanit.limbo.server.LimboServer; import ru.nanit.limbo.util.Logger; +import ru.nanit.limbo.world.DefaultDimension; +import java.io.InputStream; import java.nio.file.Paths; public final class NanoLimbo { @@ -11,6 +13,7 @@ public final class NanoLimbo { public void start() throws Exception { LimboConfig.load(Paths.get("./settings.properties")); + DefaultDimension.init(); server = new LimboServer(); server.start(); @@ -23,4 +26,8 @@ public final class NanoLimbo { Logger.error("Cannot start server: ", e); } } + + public static InputStream getResource(String path){ + return NanoLimbo.class.getResourceAsStream(path); + } } diff --git a/src/main/java/ru/nanit/limbo/connection/ClientConnection.java b/src/main/java/ru/nanit/limbo/connection/ClientConnection.java index 169202d..c158d5c 100644 --- a/src/main/java/ru/nanit/limbo/connection/ClientConnection.java +++ b/src/main/java/ru/nanit/limbo/connection/ClientConnection.java @@ -4,7 +4,11 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; +import ru.nanit.limbo.LimboConfig; import ru.nanit.limbo.protocol.packets.login.*; +import ru.nanit.limbo.protocol.packets.play.PacketJoinGame; +import ru.nanit.limbo.protocol.packets.play.PacketPlayerPositionAndLook; +import ru.nanit.limbo.protocol.packets.play.PacketUpdateViewPos; import ru.nanit.limbo.protocol.registry.Version; import ru.nanit.limbo.protocol.pipeline.PacketDecoder; import ru.nanit.limbo.protocol.pipeline.PacketEncoder; @@ -14,13 +18,18 @@ import ru.nanit.limbo.protocol.packets.status.PacketStatusRequest; import ru.nanit.limbo.protocol.packets.status.PacketStatusResponse; import ru.nanit.limbo.protocol.registry.State; import ru.nanit.limbo.server.LimboServer; +import ru.nanit.limbo.util.Logger; import ru.nanit.limbo.util.UuidUtil; +import ru.nanit.limbo.world.DefaultDimension; + +import java.util.concurrent.ThreadLocalRandom; public class ClientConnection extends ChannelInboundHandlerAdapter { private final LimboServer server; private final Channel channel; + private State state; private String username; public ClientConnection(Channel channel, LimboServer server){ @@ -28,6 +37,19 @@ public class ClientConnection extends ChannelInboundHandlerAdapter { this.server = server; } + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + if (state.equals(State.PLAY)){ + Logger.info("Player %s disconnected", this.username); + } + super.channelInactive(ctx); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + Logger.error("Unhandled exception: %s", cause.getMessage()); + } + @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { handlePacket(msg); @@ -51,7 +73,6 @@ public class ClientConnection extends ChannelInboundHandlerAdapter { if (packet instanceof PacketLoginStart){ this.username = ((PacketLoginStart) packet).getUsername(); - // Limbo always in offline mode. Online mode set on proxy side PacketLoginSuccess loginSuccess = new PacketLoginSuccess(); loginSuccess.setUuid(UuidUtil.getOfflineModeUuid(this.username)); @@ -59,9 +80,49 @@ public class ClientConnection extends ChannelInboundHandlerAdapter { sendPacket(loginSuccess); updateState(State.PLAY); + Logger.info("Player %s connected", this.username); + startJoinProcess(); } } + private void startJoinProcess(){ + PacketJoinGame joinGame = new PacketJoinGame(); + + joinGame.setEntityId(0); + joinGame.setEnableRespawnScreen(true); + joinGame.setFlat(false); + joinGame.setGameMode(2); + joinGame.setHardcore(false); + joinGame.setMaxPlayers(LimboConfig.getMaxPlayers()); + joinGame.setPreviousGameMode(-1); + joinGame.setReducedDebugInfo(false); + joinGame.setDebug(false); + joinGame.setViewDistance(2); + joinGame.setWorldName("minecraft:world"); + joinGame.setWorldNames("minecraft:world"); + joinGame.setHashedSeed(0); + joinGame.setDimensionCodec(DefaultDimension.getCodec()); + joinGame.setDimension(DefaultDimension.getDimension()); + + PacketPlayerPositionAndLook positionAndLook = new PacketPlayerPositionAndLook(); + + positionAndLook.setX(0.0); + positionAndLook.setY(2.0); + positionAndLook.setZ(0.0); + positionAndLook.setYaw(90.0F); + positionAndLook.setPitch(0.0F); + positionAndLook.setTeleportId(ThreadLocalRandom.current().nextInt()); + + PacketUpdateViewPos updateViewPos = new PacketUpdateViewPos(); + + updateViewPos.setChunkX(0); + updateViewPos.setChunkY(0); + + sendPacket(joinGame); + sendPacket(positionAndLook); + sendPacket(updateViewPos); + } + public void sendPacket(Object packet){ if (isConnected()) channel.writeAndFlush(packet, channel.voidPromise()); @@ -89,6 +150,8 @@ public class ClientConnection extends ChannelInboundHandlerAdapter { } public void updateState(State state){ + this.state = state; + channel.pipeline().get(PacketDecoder.class).updateState(state); channel.pipeline().get(PacketEncoder.class).updateState(state); } @@ -101,5 +164,7 @@ public class ClientConnection extends ChannelInboundHandlerAdapter { decoder.updateState(state); encoder.updateVersion(version); encoder.updateState(state); + + this.state = state; } } diff --git a/src/main/java/ru/nanit/limbo/protocol/Packet.java b/src/main/java/ru/nanit/limbo/protocol/Packet.java index 7acb523..6ec59a7 100644 --- a/src/main/java/ru/nanit/limbo/protocol/Packet.java +++ b/src/main/java/ru/nanit/limbo/protocol/Packet.java @@ -4,8 +4,8 @@ import ru.nanit.limbo.protocol.registry.Version; public interface Packet { - void encode(ByteMessage msg, Direction direction, Version version); + void encode(ByteMessage msg, Version version); - void decode(ByteMessage msg, Direction direction, Version version); + void decode(ByteMessage msg, Version version); } diff --git a/src/main/java/ru/nanit/limbo/protocol/PacketIn.java b/src/main/java/ru/nanit/limbo/protocol/PacketIn.java index 13a3589..639d0c2 100644 --- a/src/main/java/ru/nanit/limbo/protocol/PacketIn.java +++ b/src/main/java/ru/nanit/limbo/protocol/PacketIn.java @@ -5,7 +5,7 @@ import ru.nanit.limbo.protocol.registry.Version; public interface PacketIn extends Packet { @Override - default void encode(ByteMessage msg, Direction direction, Version version) { + default void encode(ByteMessage msg, Version version) { // Can be ignored for incoming packets } diff --git a/src/main/java/ru/nanit/limbo/protocol/PacketOut.java b/src/main/java/ru/nanit/limbo/protocol/PacketOut.java index d3e24c7..78a4a4d 100644 --- a/src/main/java/ru/nanit/limbo/protocol/PacketOut.java +++ b/src/main/java/ru/nanit/limbo/protocol/PacketOut.java @@ -5,7 +5,7 @@ import ru.nanit.limbo.protocol.registry.Version; public interface PacketOut extends Packet { @Override - default void decode(ByteMessage msg, Direction direction, Version version) { + default void decode(ByteMessage msg, Version version) { // Can be ignored for outgoing packets } diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/PacketHandshake.java b/src/main/java/ru/nanit/limbo/protocol/packets/PacketHandshake.java index 7fc626f..44a4585 100644 --- a/src/main/java/ru/nanit/limbo/protocol/packets/PacketHandshake.java +++ b/src/main/java/ru/nanit/limbo/protocol/packets/PacketHandshake.java @@ -2,7 +2,6 @@ package ru.nanit.limbo.protocol.packets; import ru.nanit.limbo.protocol.ByteMessage; import ru.nanit.limbo.protocol.Packet; -import ru.nanit.limbo.protocol.Direction; import ru.nanit.limbo.protocol.registry.Version; public class PacketHandshake implements Packet { @@ -45,7 +44,7 @@ public class PacketHandshake implements Packet { } @Override - public void encode(ByteMessage msg, Direction direction, Version version) { + public void encode(ByteMessage msg, Version version) { msg.writeVarInt(this.version.getProtocolNumber()); msg.writeString(host); msg.writeShort(port); @@ -53,7 +52,7 @@ public class PacketHandshake implements Packet { } @Override - public void decode(ByteMessage msg, Direction direction, Version version) { + public void decode(ByteMessage msg, Version version) { this.version = Version.of(msg.readVarInt()); this.host = msg.readString(); this.port = msg.readUnsignedShort(); diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/login/PacketDisconnect.java b/src/main/java/ru/nanit/limbo/protocol/packets/login/PacketDisconnect.java index 4be6429..f9fbbc4 100644 --- a/src/main/java/ru/nanit/limbo/protocol/packets/login/PacketDisconnect.java +++ b/src/main/java/ru/nanit/limbo/protocol/packets/login/PacketDisconnect.java @@ -1,7 +1,6 @@ package ru.nanit.limbo.protocol.packets.login; import ru.nanit.limbo.protocol.ByteMessage; -import ru.nanit.limbo.protocol.Direction; import ru.nanit.limbo.protocol.PacketOut; import ru.nanit.limbo.protocol.registry.Version; @@ -14,7 +13,7 @@ public class PacketDisconnect implements PacketOut { } @Override - public void encode(ByteMessage msg, Direction direction, Version version) { + public void encode(ByteMessage msg, Version version) { msg.writeString(String.format("{\"text\": \"%s\"}", reason)); } diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/login/PacketLoginStart.java b/src/main/java/ru/nanit/limbo/protocol/packets/login/PacketLoginStart.java index b148325..a7eaa26 100644 --- a/src/main/java/ru/nanit/limbo/protocol/packets/login/PacketLoginStart.java +++ b/src/main/java/ru/nanit/limbo/protocol/packets/login/PacketLoginStart.java @@ -12,7 +12,7 @@ public class PacketLoginStart implements PacketIn { } @Override - public void decode(ByteMessage msg, Direction direction, Version version) { + public void decode(ByteMessage msg, Version version) { this.username = msg.readString(); } diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/login/PacketLoginSuccess.java b/src/main/java/ru/nanit/limbo/protocol/packets/login/PacketLoginSuccess.java index 27c1c9d..d2984d3 100644 --- a/src/main/java/ru/nanit/limbo/protocol/packets/login/PacketLoginSuccess.java +++ b/src/main/java/ru/nanit/limbo/protocol/packets/login/PacketLoginSuccess.java @@ -1,7 +1,6 @@ package ru.nanit.limbo.protocol.packets.login; import ru.nanit.limbo.protocol.ByteMessage; -import ru.nanit.limbo.protocol.Direction; import ru.nanit.limbo.protocol.PacketOut; import ru.nanit.limbo.protocol.registry.Version; @@ -21,7 +20,7 @@ public class PacketLoginSuccess implements PacketOut { } @Override - public void encode(ByteMessage msg, Direction direction, Version version) { + public void encode(ByteMessage msg, Version version) { msg.writeUuid(uuid); msg.writeString(username); } diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketJoinGame.java b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketJoinGame.java index 698b70e..2b0e605 100644 --- a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketJoinGame.java +++ b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketJoinGame.java @@ -2,20 +2,16 @@ package ru.nanit.limbo.protocol.packets.play; import net.kyori.adventure.nbt.CompoundBinaryTag; import ru.nanit.limbo.protocol.ByteMessage; -import ru.nanit.limbo.protocol.Direction; import ru.nanit.limbo.protocol.PacketOut; import ru.nanit.limbo.protocol.registry.Version; -import java.util.List; - public class PacketJoinGame implements PacketOut { private int entityId; private boolean isHardcore = false; private int gameMode = 2; private int previousGameMode = -1; - private int worldCount = 1; - private List worldNames; + private String[] worldNames; private CompoundBinaryTag dimensionCodec; private CompoundBinaryTag dimension; private String worldName; @@ -43,11 +39,7 @@ public class PacketJoinGame implements PacketOut { this.previousGameMode = previousGameMode; } - public void setWorldCount(int worldCount) { - this.worldCount = worldCount; - } - - public void setWorldNames(List worldNames) { + public void setWorldNames(String... worldNames) { this.worldNames = worldNames; } @@ -92,8 +84,22 @@ public class PacketJoinGame implements PacketOut { } @Override - public void encode(ByteMessage msg, Direction direction, Version version) { - + public void encode(ByteMessage msg, Version version) { + msg.writeInt(entityId); + msg.writeBoolean(isHardcore); + msg.writeByte(gameMode); + msg.writeByte(previousGameMode); + msg.writeStringsArray(worldNames); + msg.writeCompoundTag(dimensionCodec); + msg.writeCompoundTag(dimension); + msg.writeString(worldName); + msg.writeLong(hashedSeed); + msg.writeVarInt(maxPlayers); + msg.writeVarInt(viewDistance); + msg.writeBoolean(reducedDebugInfo); + msg.writeBoolean(enableRespawnScreen); + msg.writeBoolean(isDebug); + msg.writeBoolean(isFlat); } } diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerPositionAndLook.java b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerPositionAndLook.java new file mode 100644 index 0000000..905dc70 --- /dev/null +++ b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerPositionAndLook.java @@ -0,0 +1,56 @@ +package ru.nanit.limbo.protocol.packets.play; + +import ru.nanit.limbo.protocol.ByteMessage; +import ru.nanit.limbo.protocol.PacketOut; +import ru.nanit.limbo.protocol.registry.Version; + +public class PacketPlayerPositionAndLook implements PacketOut { + + private double x; + private double y; + private double z; + private float yaw; + private float pitch; + private byte flags = 0x01; + private int teleportId; + + public void setX(double x) { + this.x = x; + } + + public void setY(double y) { + this.y = y; + } + + public void setZ(double z) { + this.z = z; + } + + public void setYaw(float yaw) { + this.yaw = yaw; + } + + public void setPitch(float pitch) { + this.pitch = pitch; + } + + public void setFlags(byte flags) { + this.flags = flags; + } + + public void setTeleportId(int teleportId) { + this.teleportId = teleportId; + } + + @Override + public void encode(ByteMessage msg, Version version) { + msg.writeDouble(x); + msg.writeDouble(y); + msg.writeDouble(z); + msg.writeFloat(yaw); + msg.writeFloat(pitch); + msg.writeByte(flags); + msg.writeVarInt(teleportId); + } + +} diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketUpdateViewPos.java b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketUpdateViewPos.java new file mode 100644 index 0000000..736eed9 --- /dev/null +++ b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketUpdateViewPos.java @@ -0,0 +1,26 @@ +package ru.nanit.limbo.protocol.packets.play; + +import ru.nanit.limbo.protocol.ByteMessage; +import ru.nanit.limbo.protocol.PacketOut; +import ru.nanit.limbo.protocol.registry.Version; + +public class PacketUpdateViewPos implements PacketOut { + + private int chunkX; + private int chunkY; + + public void setChunkX(int chunkX) { + this.chunkX = chunkX; + } + + public void setChunkY(int chunkY) { + this.chunkY = chunkY; + } + + @Override + public void encode(ByteMessage msg, Version version) { + msg.writeVarInt(chunkX); + msg.writeVarInt(chunkY); + } + +} diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/status/PacketStatusPing.java b/src/main/java/ru/nanit/limbo/protocol/packets/status/PacketStatusPing.java index 4ede3af..43e0c78 100644 --- a/src/main/java/ru/nanit/limbo/protocol/packets/status/PacketStatusPing.java +++ b/src/main/java/ru/nanit/limbo/protocol/packets/status/PacketStatusPing.java @@ -2,7 +2,6 @@ package ru.nanit.limbo.protocol.packets.status; import ru.nanit.limbo.protocol.ByteMessage; import ru.nanit.limbo.protocol.Packet; -import ru.nanit.limbo.protocol.Direction; import ru.nanit.limbo.protocol.registry.Version; public class PacketStatusPing implements Packet { @@ -10,12 +9,12 @@ public class PacketStatusPing implements Packet { private long randomId; @Override - public void encode(ByteMessage msg, Direction direction, Version version) { + public void encode(ByteMessage msg, Version version) { msg.writeLong(randomId); } @Override - public void decode(ByteMessage msg, Direction direction, Version version) { + public void decode(ByteMessage msg, Version version) { this.randomId = msg.readLong(); } diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/status/PacketStatusRequest.java b/src/main/java/ru/nanit/limbo/protocol/packets/status/PacketStatusRequest.java index ad224e4..6613c63 100644 --- a/src/main/java/ru/nanit/limbo/protocol/packets/status/PacketStatusRequest.java +++ b/src/main/java/ru/nanit/limbo/protocol/packets/status/PacketStatusRequest.java @@ -6,7 +6,7 @@ import ru.nanit.limbo.protocol.registry.Version; public class PacketStatusRequest implements PacketIn { @Override - public void decode(ByteMessage msg, Direction direction, Version version) { + public void decode(ByteMessage msg, Version version) { } diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/status/PacketStatusResponse.java b/src/main/java/ru/nanit/limbo/protocol/packets/status/PacketStatusResponse.java index 7e1bbea..befa882 100644 --- a/src/main/java/ru/nanit/limbo/protocol/packets/status/PacketStatusResponse.java +++ b/src/main/java/ru/nanit/limbo/protocol/packets/status/PacketStatusResponse.java @@ -9,7 +9,7 @@ public class PacketStatusResponse implements PacketOut { private static final String TEMPLATE = "{ \"version\": { \"name\": \"%s\", \"protocol\": %d }, \"players\": { \"max\": %d, \"online\": %d, \"sample\": [] }, \"description\": %s }"; @Override - public void encode(ByteMessage msg, Direction direction, Version version) { + public void encode(ByteMessage msg, Version version) { String ver = LimboConfig.getPingData().getVersion(); String desc = LimboConfig.getPingData().getDescription(); String json = getResponseJson(ver, version.getProtocolNumber(), LimboConfig.getMaxPlayers(), 0, desc); diff --git a/src/main/java/ru/nanit/limbo/protocol/pipeline/PacketDecoder.java b/src/main/java/ru/nanit/limbo/protocol/pipeline/PacketDecoder.java index b7bc147..27d38fe 100644 --- a/src/main/java/ru/nanit/limbo/protocol/pipeline/PacketDecoder.java +++ b/src/main/java/ru/nanit/limbo/protocol/pipeline/PacketDecoder.java @@ -30,7 +30,7 @@ public class PacketDecoder extends MessageToMessageDecoder { if (packet != null){ try { - packet.decode(msg, Direction.SERVER, mappings.getVersion()); + packet.decode(msg, mappings.getVersion()); } catch (Exception e){ Logger.warning("Cannot decode packet 0x%s: %s", Integer.toHexString(packetId), e.getMessage()); } diff --git a/src/main/java/ru/nanit/limbo/protocol/pipeline/PacketEncoder.java b/src/main/java/ru/nanit/limbo/protocol/pipeline/PacketEncoder.java index cc23bcc..1964b81 100644 --- a/src/main/java/ru/nanit/limbo/protocol/pipeline/PacketEncoder.java +++ b/src/main/java/ru/nanit/limbo/protocol/pipeline/PacketEncoder.java @@ -5,7 +5,6 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; import ru.nanit.limbo.protocol.ByteMessage; import ru.nanit.limbo.protocol.Packet; -import ru.nanit.limbo.protocol.Direction; import ru.nanit.limbo.protocol.registry.Version; import ru.nanit.limbo.protocol.registry.State; import ru.nanit.limbo.util.Logger; @@ -35,7 +34,7 @@ public class PacketEncoder extends MessageToByteEncoder { msg.writeVarInt(packetId); try { - packet.encode(msg, Direction.CLIENT, version); + packet.encode(msg, version); } catch (Exception e){ Logger.warning("Cannot encode packet 0x%s: %s", Integer.toHexString(packetId), e.getMessage()); } diff --git a/src/main/java/ru/nanit/limbo/protocol/registry/State.java b/src/main/java/ru/nanit/limbo/protocol/registry/State.java index 52f1651..8d0bb11 100644 --- a/src/main/java/ru/nanit/limbo/protocol/registry/State.java +++ b/src/main/java/ru/nanit/limbo/protocol/registry/State.java @@ -4,6 +4,8 @@ import ru.nanit.limbo.protocol.Packet; import ru.nanit.limbo.protocol.packets.*; import ru.nanit.limbo.protocol.packets.login.*; import ru.nanit.limbo.protocol.packets.play.PacketJoinGame; +import ru.nanit.limbo.protocol.packets.play.PacketPlayerPositionAndLook; +import ru.nanit.limbo.protocol.packets.play.PacketUpdateViewPos; import ru.nanit.limbo.protocol.packets.status.PacketStatusPing; import ru.nanit.limbo.protocol.packets.status.PacketStatusRequest; import ru.nanit.limbo.protocol.packets.status.PacketStatusResponse; @@ -37,6 +39,8 @@ public enum State { PLAY(3){ { clientBound.register(Version.V1_16_4, 0x24, PacketJoinGame::new); + clientBound.register(Version.V1_16_4, 0x34, PacketPlayerPositionAndLook::new); + clientBound.register(Version.V1_16_4, 0x40, PacketUpdateViewPos::new); } }; diff --git a/src/main/java/ru/nanit/limbo/world/DefaultDimension.java b/src/main/java/ru/nanit/limbo/world/DefaultDimension.java new file mode 100644 index 0000000..135a6f2 --- /dev/null +++ b/src/main/java/ru/nanit/limbo/world/DefaultDimension.java @@ -0,0 +1,85 @@ +package ru.nanit.limbo.world; + +import net.kyori.adventure.nbt.CompoundBinaryTag; +import net.kyori.adventure.nbt.ListBinaryTag; + +public final class DefaultDimension { + + private static CompoundBinaryTag CODEC; + private static CompoundBinaryTag DIMENSION; + + public static void init(){ + DIMENSION = CompoundBinaryTag.builder() + .putString("name", "minecraft:the_end") + .putByte("piglin_safe", (byte) 0) + .putByte("natural", (byte) 0) + .putFloat("ambient_light", 0.0F) + .putString("infiniburn", "minecraft:infiniburn_end") + .putByte("respawn_anchor_works", (byte) 0) + .putByte("has_skylight", (byte) 0) + .putByte("bed_works", (byte) 0) + .putString("effects", "minecraft:the_end") + .putLong("fixed_time", 6000L) + .putByte("has_raids", (byte) 1) + .putInt("logical_height", 256) + .putDouble("coordinate_scale", 1.0) + .putByte("ultrawarm", (byte) 0) + .putByte("has_ceiling", (byte) 0) + .build(); + + CompoundBinaryTag dimensionData = CompoundBinaryTag.builder() + .putString("name", "minecraft:the_end") + .putInt("id", 2) + .put("element", DIMENSION) + .build(); + + CompoundBinaryTag plains = CompoundBinaryTag.builder() + .putString("name", "minecraft:plains") + .putInt("id", 1) + .put("element", CompoundBinaryTag.builder() + .putString("precipitation", "rain") + .putFloat("depth", 0.125F) + .putFloat("temperature", 0.8F) + .putFloat("scale", 0.05F) + .putFloat("downfall", 0.4F) + .putString("category", "plains") + .put("effects", CompoundBinaryTag.builder() + .putInt("sky_color", 7907327) + .putInt("water_fog_color", 329011) + .putInt("fog_color", 12638463) + .putInt("water_color", 4159204) + .put("mood_sound", CompoundBinaryTag.builder() + .putInt("tick_delay", 6000) + .putFloat("offset", 2.0F) + .putString("sound", "minecraft:ambient.cave") + .putInt("block_search_extent", 8) + .build()) + .build()) + .build()) + .build(); + + CODEC = CompoundBinaryTag.builder() + .put("minecraft:dimension_type", CompoundBinaryTag.builder() + .putString("type", "minecraft:dimension_type") + .put("value", ListBinaryTag.builder() + .add(dimensionData) + .build()) + .build()) + .put("minecraft:worldgen/biome", CompoundBinaryTag.builder() + .putString("type", "minecraft:worldgen/biome") + .put("value", ListBinaryTag.builder() + .add(plains) + .build()) + .build()) + .build(); + } + + public static CompoundBinaryTag getCodec(){ + return CODEC; + } + + public static CompoundBinaryTag getDimension(){ + return DIMENSION; + } + +}