|
1 | 1 | package com.robotgryphon.compactmachines.network; |
2 | 2 |
|
3 | 3 | import com.google.common.collect.ImmutableSet; |
| 4 | +import com.mojang.serialization.Codec; |
| 5 | +import com.mojang.serialization.codecs.RecordCodecBuilder; |
4 | 6 | import com.robotgryphon.compactmachines.CompactMachines; |
5 | 7 | import com.robotgryphon.compactmachines.client.machine.MachinePlayerEventHandler; |
6 | | -import com.robotgryphon.compactmachines.data.legacy.CompactMachineServerData; |
7 | | -import com.robotgryphon.compactmachines.data.legacy.SavedMachineData; |
8 | | -import com.robotgryphon.compactmachines.data.legacy.CompactMachineRegistrationData; |
| 8 | +import com.robotgryphon.compactmachines.data.codec.CodecExtensions; |
| 9 | +import com.robotgryphon.compactmachines.data.world.ExternalMachineData; |
9 | 10 | import com.robotgryphon.compactmachines.teleportation.DimensionalPosition; |
| 11 | +import net.minecraft.entity.player.ServerPlayerEntity; |
10 | 12 | import net.minecraft.network.PacketBuffer; |
11 | 13 | import net.minecraft.server.MinecraftServer; |
| 14 | +import net.minecraft.util.math.ChunkPos; |
12 | 15 | import net.minecraftforge.fml.network.NetworkEvent; |
13 | 16 |
|
14 | 17 | import javax.annotation.Nullable; |
15 | | -import java.util.Optional; |
16 | | -import java.util.UUID; |
| 18 | +import java.io.IOException; |
| 19 | +import java.util.*; |
17 | 20 | import java.util.function.Supplier; |
18 | 21 |
|
19 | 22 | public class MachinePlayersChangedPacket { |
20 | 23 |
|
21 | | - private MinecraftServer server; |
22 | | - public int machineID; |
| 24 | + public ChunkPos machine; |
| 25 | + public UUID playerID; |
23 | 26 | public ImmutableSet<DimensionalPosition> machinePositions; |
24 | 27 | public EnumPlayerChangeType type; |
25 | | - public UUID playerID; |
26 | 28 |
|
27 | | - public MachinePlayersChangedPacket(@Nullable MinecraftServer server, int machineID, UUID id, EnumPlayerChangeType type) { |
28 | | - this.server = server; |
29 | | - this.machineID = machineID; |
30 | | - this.machinePositions = ImmutableSet.of(); |
31 | | - this.playerID = id; |
32 | | - this.type = type; |
| 29 | + public static final Codec<MachinePlayersChangedPacket> CODEC = RecordCodecBuilder.create(i -> i.group( |
| 30 | + CodecExtensions.CHUNKPOS_CODEC.fieldOf("machine").forGetter(MachinePlayersChangedPacket::getChunkPos), |
| 31 | + CodecExtensions.UUID_CODEC.fieldOf("player").forGetter(MachinePlayersChangedPacket::getPlayer), |
| 32 | + Codec.STRING.fieldOf("type").forGetter((p) -> p.type.name()), |
| 33 | + DimensionalPosition.CODEC.listOf().fieldOf("positions").forGetter(p -> p.machinePositions.asList()) |
| 34 | + ).apply(i, MachinePlayersChangedPacket::new)); |
| 35 | + |
| 36 | + public MachinePlayersChangedPacket(PacketBuffer buf) { |
| 37 | + try { |
| 38 | + MachinePlayersChangedPacket pkt = buf.readWithCodec(MachinePlayersChangedPacket.CODEC); |
| 39 | + |
| 40 | + machine = pkt.machine; |
| 41 | + playerID = pkt.playerID; |
| 42 | + machinePositions = pkt.machinePositions; |
| 43 | + type = pkt.type; |
| 44 | + } catch (IOException e) { |
| 45 | + CompactMachines.LOGGER.error(e); |
| 46 | + } |
| 47 | + } |
| 48 | + |
| 49 | + private MachinePlayersChangedPacket(ChunkPos chunkPos, UUID player, String type, Collection<DimensionalPosition> positions) { |
| 50 | + this.machine = chunkPos; |
| 51 | + this.playerID = player; |
| 52 | + this.type = EnumPlayerChangeType.valueOf(type); |
| 53 | + this.machinePositions = ImmutableSet.copyOf(positions); |
33 | 54 | } |
34 | 55 |
|
35 | 56 | public static void handle(MachinePlayersChangedPacket message, Supplier<NetworkEvent.Context> context) { |
36 | 57 | NetworkEvent.Context ctx = context.get(); |
37 | 58 |
|
38 | 59 | message.machinePositions.forEach(machinePos -> { |
39 | | - CompactMachines.LOGGER.debug("Player changed machine {}; outer position {}", message.machineID, machinePos); |
| 60 | + CompactMachines.LOGGER.debug("Player changed inside {}; outer position {}", message.machine, machinePos); |
40 | 61 | MachinePlayerEventHandler.handlePlayerMachineChanged(message.playerID, message.type, machinePos); |
41 | 62 | }); |
42 | 63 |
|
43 | 64 | ctx.setPacketHandled(true); |
44 | 65 | } |
45 | 66 |
|
46 | 67 | public static void encode(MachinePlayersChangedPacket pkt, PacketBuffer buf) { |
47 | | - buf.writeInt(pkt.machineID); |
48 | | - buf.writeUUID(pkt.playerID); |
49 | | - buf.writeUtf(pkt.type.toString()); |
50 | | - |
51 | | - SavedMachineData md = SavedMachineData.getInstance(pkt.server); |
52 | | - CompactMachineServerData data = md.getData(); |
53 | | - |
54 | | - Optional<CompactMachineRegistrationData> machineData = data.getMachineData(pkt.machineID); |
55 | | - buf.writeBoolean(machineData.isPresent()); |
56 | | - machineData.ifPresent(mData -> { |
57 | | - DimensionalPosition out = mData.getOutsidePosition(pkt.server); |
58 | | - buf.writeNbt(out.serializeNBT()); |
59 | | - }); |
| 68 | + try { |
| 69 | + buf.writeWithCodec(CODEC, pkt); |
| 70 | + } catch (IOException e) { |
| 71 | + CompactMachines.LOGGER.error(e); |
| 72 | + } |
60 | 73 | } |
61 | 74 |
|
62 | | - public static MachinePlayersChangedPacket decode(PacketBuffer buf) { |
63 | | - int machine = buf.readInt(); |
64 | | - UUID id = buf.readUUID(); |
65 | | - EnumPlayerChangeType changeType = EnumPlayerChangeType.valueOf(buf.readUtf()); |
66 | | - |
67 | | - MachinePlayersChangedPacket pkt = new MachinePlayersChangedPacket(null, machine, id, changeType); |
68 | | - if(buf.readBoolean()) { |
69 | | - DimensionalPosition tilePos = DimensionalPosition.fromNBT(buf.readNbt()); |
70 | | - pkt.machinePositions = ImmutableSet.of(tilePos); |
71 | | - } |
| 75 | + private UUID getPlayer() { |
| 76 | + return playerID; |
| 77 | + } |
72 | 78 |
|
73 | | - return pkt; |
| 79 | + private ChunkPos getChunkPos() { |
| 80 | + return machine; |
74 | 81 | } |
75 | 82 |
|
76 | 83 | public enum EnumPlayerChangeType { |
77 | 84 | ENTERED, |
78 | 85 | EXITED |
79 | 86 | } |
| 87 | + |
| 88 | + public static class Builder { |
| 89 | + |
| 90 | + private final MinecraftServer server; |
| 91 | + private EnumPlayerChangeType change; |
| 92 | + private ChunkPos chunk; |
| 93 | + private UUID player; |
| 94 | + private int entryPoint; |
| 95 | + |
| 96 | + private Builder(MinecraftServer server) { |
| 97 | + this.server = server; |
| 98 | + this.change = EnumPlayerChangeType.EXITED; |
| 99 | + } |
| 100 | + |
| 101 | + public static Builder create(MinecraftServer server) { |
| 102 | + return new Builder(server); |
| 103 | + } |
| 104 | + |
| 105 | + @Nullable |
| 106 | + public MachinePlayersChangedPacket build() { |
| 107 | + ExternalMachineData extern = ExternalMachineData.get(server); |
| 108 | + if(extern == null) |
| 109 | + { |
| 110 | + CompactMachines.LOGGER.fatal("Could not load external machine data from server."); |
| 111 | + return null; |
| 112 | + } |
| 113 | + |
| 114 | + Set<DimensionalPosition> externalMachineIDs = extern.getExternalMachineLocations(chunk); |
| 115 | + |
| 116 | + return new MachinePlayersChangedPacket(chunk, player, change.name(), externalMachineIDs); |
| 117 | + } |
| 118 | + |
| 119 | + public Builder forMachine(ChunkPos insideChunk) { |
| 120 | + this.chunk = insideChunk; |
| 121 | + return this; |
| 122 | + } |
| 123 | + |
| 124 | + public Builder forPlayer(ServerPlayerEntity player) { |
| 125 | + this.player = player.getUUID(); |
| 126 | + return this; |
| 127 | + } |
| 128 | + |
| 129 | + public Builder forPlayer(UUID player) { |
| 130 | + this.player = player; |
| 131 | + return this; |
| 132 | + } |
| 133 | + |
| 134 | + public Builder enteredFrom(int machineId) { |
| 135 | + this.entryPoint = machineId; |
| 136 | + this.change = EnumPlayerChangeType.ENTERED; |
| 137 | + return this; |
| 138 | + } |
| 139 | + |
| 140 | + public Builder exited() { |
| 141 | + this.change = EnumPlayerChangeType.EXITED; |
| 142 | + return this; |
| 143 | + } |
| 144 | + } |
80 | 145 | } |
0 commit comments