]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/common/messages/PayloadBuilder.java
Switch to using DimensionId object
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / common / messages / PayloadBuilder.java
1 package com.irtimaled.bbor.common.messages;
2
3 import com.irtimaled.bbor.common.models.Coords;
4 import com.irtimaled.bbor.common.models.DimensionId;
5 import io.netty.buffer.Unpooled;
6 import net.minecraft.network.IPacket;
7 import net.minecraft.network.PacketBuffer;
8 import net.minecraft.network.play.client.CCustomPayloadPacket;
9 import net.minecraft.network.play.server.SCustomPayloadPlayPacket;
10 import net.minecraft.util.ResourceLocation;
11
12 import java.util.HashMap;
13 import java.util.Map;
14 import java.util.function.BiFunction;
15
16 public class PayloadBuilder {
17     private static final Map<String, ResourceLocation> packetNames = new HashMap<>();
18
19     static PayloadBuilder clientBound(String name) {
20         return new PayloadBuilder(packetNames.computeIfAbsent(name, ResourceLocation::new), SCustomPayloadPlayPacket::new);
21     }
22
23     static PayloadBuilder serverBound(String name) {
24         return new PayloadBuilder(packetNames.computeIfAbsent(name, ResourceLocation::new), CCustomPayloadPacket::new);
25     }
26
27     private final ResourceLocation name;
28     private final BiFunction<ResourceLocation, PacketBuffer, IPacket<?>> packetBuilder;
29     private final PacketBuffer buffer;
30
31     private PayloadBuilder(ResourceLocation name, BiFunction<ResourceLocation, PacketBuffer, IPacket<?>> packetBuilder) {
32         this.name = name;
33         this.buffer = new PacketBuffer(Unpooled.buffer());
34         this.packetBuilder = packetBuilder;
35     }
36
37     private IPacket<?> packet;
38
39     public IPacket<?> build() {
40         if (packet == null)
41             packet = packetBuilder.apply(name, buffer);
42         return packet;
43     }
44
45     PayloadBuilder writeLong(long value) {
46         buffer.writeLong(value);
47         packet = null;
48         return this;
49     }
50
51     PayloadBuilder writeInt(int value) {
52         buffer.writeInt(value);
53         packet = null;
54         return this;
55     }
56
57     PayloadBuilder writeVarInt(int value) {
58         buffer.writeVarInt(value);
59         packet = null;
60         return this;
61     }
62
63     PayloadBuilder writeChar(char value) {
64         buffer.writeChar(value);
65         packet = null;
66         return this;
67     }
68
69     PayloadBuilder writeCoords(Coords coords) {
70         return writeVarInt(coords.getX())
71                 .writeVarInt(coords.getY())
72                 .writeVarInt(coords.getZ());
73     }
74
75     public PayloadBuilder writeDimensionId(DimensionId dimensionId) {
76         buffer.writeResourceLocation(dimensionId.getValue());
77         packet = null;
78         return this;
79     }
80 }