summaryrefslogtreecommitdiff
path: root/src/main/java/lv/enes/mc/eris_alchemy/utils/SyncedValue.java
diff options
context:
space:
mode:
authorGravatar Uko Kokņevičs2024-01-10 17:41:07 +0100
committerGravatar Uko Kokņevičs2024-01-10 17:41:07 +0100
commit000b84e87eaedb94fb87ccb11e376c51f99a1d07 (patch)
treedd9519e7dadf613a71e01b04cac7be9c121a9f18 /src/main/java/lv/enes/mc/eris_alchemy/utils/SyncedValue.java
parentMove out common chest logic to separate files also in client code (diff)
downloadmc-eris-alchemy-000b84e87eaedb94fb87ccb11e376c51f99a1d07.tar.gz
mc-eris-alchemy-000b84e87eaedb94fb87ccb11e376c51f99a1d07.tar.xz
mc-eris-alchemy-000b84e87eaedb94fb87ccb11e376c51f99a1d07.zip
Added Energy Condenser
Diffstat (limited to 'src/main/java/lv/enes/mc/eris_alchemy/utils/SyncedValue.java')
-rw-r--r--src/main/java/lv/enes/mc/eris_alchemy/utils/SyncedValue.java115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/main/java/lv/enes/mc/eris_alchemy/utils/SyncedValue.java b/src/main/java/lv/enes/mc/eris_alchemy/utils/SyncedValue.java
new file mode 100644
index 0000000..c7e52bf
--- /dev/null
+++ b/src/main/java/lv/enes/mc/eris_alchemy/utils/SyncedValue.java
@@ -0,0 +1,115 @@
1package lv.enes.mc.eris_alchemy.utils;
2
3import jakarta.annotation.Nonnull;
4import lv.enes.mc.eris_alchemy.ErisAlchemyRegistry;
5import net.fabricmc.api.EnvType;
6import net.minecraft.network.FriendlyByteBuf;
7import net.minecraft.server.level.ServerPlayer;
8import org.quiltmc.loader.api.minecraft.MinecraftQuiltLoader;
9import org.quiltmc.qsl.networking.api.PacketByteBufs;
10import org.quiltmc.qsl.networking.api.ServerPlayNetworking;
11import org.quiltmc.qsl.networking.api.client.ClientPlayNetworking;
12
13import java.lang.ref.WeakReference;
14import java.util.Collection;
15import java.util.HashMap;
16import java.util.Map;
17
18public sealed abstract class SyncedValue<E> {
19 private final static Map<Long, WeakReference<SyncedValue<?>>> values = new HashMap<>();
20
21 private final long id;
22 private boolean changed = true;
23 private E value;
24
25 public SyncedValue(E value) {
26 this(genId(), value);
27 }
28
29 public SyncedValue(long id, E value) {
30 this.id = id;
31 this.value = value;
32
33 values.put(this.id, new WeakReference<>(this));
34 }
35
36 protected abstract @Nonnull E read(FriendlyByteBuf buf);
37 protected abstract void write(FriendlyByteBuf buf, @Nonnull E value);
38
39 public void serialize(FriendlyByteBuf buf) {
40 buf.writeLongLE(id);
41 write(buf, value);
42 }
43
44 public E getValue() {
45 return value;
46 }
47
48 public void setValue(E value) {
49 this.value = value;
50 this.changed = true;
51 }
52
53 public void syncIfChanged(Collection<ServerPlayer> players) {
54 if (!changed) {
55 return;
56 }
57 var buf = PacketByteBufs.create();
58 serialize(buf);
59 ServerPlayNetworking.send(players, ErisAlchemyRegistry.NetworkingConstants.UPDATE_SYNCED_VALUE, buf);
60 changed = false;
61 }
62
63 private void readData(FriendlyByteBuf buf) {
64 this.changed = false;
65 this.value = read(buf);
66 }
67
68 private static long nextId = 0;
69 private static long genId() {
70 return nextId++;
71 }
72
73 static {
74 if (MinecraftQuiltLoader.getEnvironmentType() == EnvType.CLIENT) {
75 ClientPlayNetworking.registerGlobalReceiver(
76 ErisAlchemyRegistry.NetworkingConstants.UPDATE_SYNCED_VALUE,
77 (client, handler, buf, responseSender) -> {
78 var id = buf.readLongLE();
79 var ref = values.get(id);
80 var holder = ref == null ? null : ref.get();
81 if (holder != null) {
82 holder.readData(buf);
83 }
84 }
85 );
86 }
87 }
88
89 public static final class SyncedDouble extends SyncedValue<Double> {
90 public SyncedDouble(double value) {
91 super(value);
92 }
93
94 public SyncedDouble(long id, double value) {
95 super(id, value);
96 }
97
98 public static SyncedDouble deserialize(FriendlyByteBuf buf) {
99 var id = buf.readLongLE();
100 var value = buf.readDoubleLE();
101 return new SyncedDouble(id, value);
102 }
103
104 @Nonnull
105 @Override
106 protected Double read(FriendlyByteBuf buf) {
107 return buf.readDoubleLE();
108 }
109
110 @Override
111 protected void write(FriendlyByteBuf buf, @Nonnull Double value) {
112 buf.writeDoubleLE(value);
113 }
114 }
115}