package carpet.network; import carpet.CarpetServer; import carpet.CarpetSettings; import carpet.helpers.TickSpeed; import carpet.settings.ParsedRule; import io.netty.buffer.Unpooled; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.nbt.AbstractNumberTag; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.network.packet.c2s.play.CustomPayloadC2SPacket; import net.minecraft.util.PacketByteBuf; import net.minecraft.world.dimension.DimensionType; import java.util.HashMap; import java.util.Map; import java.util.function.BiConsumer; public class ClientNetworkHandler { private static Map> dataHandlers = new HashMap>(){{ put("Rules", (p, t) -> { CompoundTag ruleset = (CompoundTag)t; for (String ruleName: ruleset.getKeys()) { ParsedRule rule = CarpetServer.settingsManager.getRule(ruleName); if (rule == null) CarpetSettings.LOG.error("Received unknown rule: "+ruleName); else { CompoundTag ruleNBT = (CompoundTag) ruleset.get(ruleName); String value = ruleNBT.getString("Value"); rule.set(null, value); } } }); put("TickRate", (p, t) -> TickSpeed.tickrate(((AbstractNumberTag)t).getFloat(), false)); put("renderShape", (p, t) -> { if (CarpetClient.shapes != null) { CompoundTag boxData = (CompoundTag)t; CarpetClient.shapes.addShape( boxData.getString("type"), DimensionType.byRawId(boxData.getInt("dim")), boxData ); } }); }}; public static void handleData(PacketByteBuf data, ClientPlayerEntity player) { if (data != null) { int id = data.readVarInt(); if (id == CarpetClient.HI) onHi(data); if (id == CarpetClient.DATA) onSyncData(data, player); } } private static void onHi(PacketByteBuf data) { synchronized (CarpetClient.sync) { CarpetClient.setCarpet(); CarpetClient.serverCarpetVersion = data.readString(64); if (CarpetSettings.carpetVersion.equals(CarpetClient.serverCarpetVersion)) { CarpetSettings.LOG.info("Joined carpet server with matching carpet version"); } else { CarpetSettings.LOG.warn("Joined carpet server with another carpet version: "+CarpetClient.serverCarpetVersion); } if (CarpetClient.getPlayer() != null) respondHello(); } } public static void respondHello() { CarpetClient.getPlayer().networkHandler.sendPacket(new CustomPayloadC2SPacket( CarpetClient.CARPET_CHANNEL, (new PacketByteBuf(Unpooled.buffer())).writeVarInt(CarpetClient.HELLO).writeString(CarpetSettings.carpetVersion) )); } private static void onSyncData(PacketByteBuf data, ClientPlayerEntity player) { CompoundTag compound = data.readCompoundTag(); if (compound == null) return; for (String key: compound.getKeys()) { if (dataHandlers.containsKey(key)) dataHandlers.get(key).accept(player, compound.get(key)); else CarpetSettings.LOG.error("Unknown carpet data: "+key); } } }