package com.ww1battle.ww1battle.network; import com.ww1battle.ww1battle.WW1BattleMod; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import java.util.ArrayList; import java.util.List; public record SyncBattleDataPacket(int redScore, int blueScore, int maxScore, List points) implements CustomPacketPayload { public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(WW1BattleMod.MODID, "sync_battle_data")); public static final StreamCodec STREAM_CODEC = StreamCodec.ofMember( SyncBattleDataPacket::write, SyncBattleDataPacket::new ); public SyncBattleDataPacket(FriendlyByteBuf buf) { this(buf.readInt(), buf.readInt(), buf.readInt(), readPoints(buf)); } private static List readPoints(FriendlyByteBuf buf) { int size = buf.readInt(); List list = new ArrayList<>(); for (int i = 0; i < size; i++) { list.add(new SyncPointData(buf.readUtf(), buf.readBlockPos(), buf.readInt(), buf.readInt(), buf.readUtf(), buf.readUtf())); } return list; } public void write(FriendlyByteBuf buf) { buf.writeInt(redScore); buf.writeInt(blueScore); buf.writeInt(maxScore); buf.writeInt(points.size()); for (SyncPointData point : points) { buf.writeUtf(point.name()); buf.writeBlockPos(point.pos()); buf.writeInt(point.radius()); buf.writeInt(point.captureProgress()); buf.writeUtf(point.owningTeam()); buf.writeUtf(point.capturingTeam()); } } @Override public Type type() { return TYPE; } public record SyncPointData(String name, BlockPos pos, int radius, int captureProgress, String owningTeam, String capturingTeam) {} }