Skip to content

Commit 5f6cce2

Browse files
committed
copy values in GenericSyncValue
1 parent c093d30 commit 5f6cce2

File tree

2 files changed

+74
-6
lines changed

2 files changed

+74
-6
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.cleanroommc.modularui.utils;
2+
3+
import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter;
4+
import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer;
5+
import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer;
6+
7+
import io.netty.buffer.Unpooled;
8+
9+
import net.minecraft.network.PacketBuffer;
10+
11+
import java.io.IOException;
12+
13+
public interface ICopy<T> {
14+
15+
static <T> ICopy<T> immutable() {
16+
return t -> t;
17+
}
18+
19+
static <T> ICopy<T> ofSerializer(IByteBufSerializer<T> serializer, IByteBufDeserializer<T> deserializer) {
20+
return t -> {
21+
PacketBuffer buffer = new PacketBuffer(Unpooled.buffer());
22+
try {
23+
serializer.serialize(buffer, t);
24+
return deserializer.deserialize(buffer);
25+
} catch (IOException e) {
26+
throw new RuntimeException(e);
27+
}
28+
};
29+
}
30+
31+
static <T> ICopy<T> ofSerializer(IByteBufAdapter<T> adapter) {
32+
return ofSerializer(adapter, adapter);
33+
}
34+
35+
T createDeepCopy(T t);
36+
}

src/main/java/com/cleanroommc/modularui/value/sync/GenericSyncValue.java

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.cleanroommc.modularui.value.sync;
22

3+
import com.cleanroommc.modularui.utils.ICopy;
34
import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter;
45
import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer;
56
import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer;
@@ -22,43 +23,74 @@ public class GenericSyncValue<T> extends ValueSyncHandler<T> {
2223
private final IByteBufDeserializer<T> deserializer;
2324
private final IByteBufSerializer<T> serializer;
2425
private final IEquals<T> equals;
26+
private final ICopy<T> copy;
2527
private T cache;
2628

2729
public GenericSyncValue(@NotNull Supplier<T> getter,
2830
@Nullable Consumer<T> setter,
2931
@NotNull IByteBufAdapter<T> adapter) {
30-
this(getter, setter, adapter, adapter, adapter);
32+
this(getter, setter, adapter, adapter, adapter, null);
33+
}
34+
35+
public GenericSyncValue(@NotNull Supplier<T> getter,
36+
@Nullable Consumer<T> setter,
37+
@NotNull IByteBufAdapter<T> adapter,
38+
@Nullable ICopy<T> copy) {
39+
this(getter, setter, adapter, adapter, adapter, copy);
3140
}
3241

3342
public GenericSyncValue(@NotNull Supplier<T> getter,
3443
@Nullable Consumer<T> setter,
3544
@NotNull IByteBufDeserializer<T> deserializer,
3645
@NotNull IByteBufSerializer<T> serializer) {
37-
this(getter, setter, deserializer, serializer, null);
46+
this(getter, setter, deserializer, serializer, null, null);
47+
}
48+
49+
public GenericSyncValue(@NotNull Supplier<T> getter,
50+
@Nullable Consumer<T> setter,
51+
@NotNull IByteBufDeserializer<T> deserializer,
52+
@NotNull IByteBufSerializer<T> serializer,
53+
@Nullable ICopy<T> copy) {
54+
this(getter, setter, deserializer, serializer, null, copy);
3855
}
3956

4057
public GenericSyncValue(@NotNull Supplier<T> getter,
4158
@NotNull IByteBufAdapter<T> adapter) {
42-
this(getter, null, adapter, adapter, adapter);
59+
this(getter, null, adapter, adapter, adapter, null);
60+
}
61+
62+
public GenericSyncValue(@NotNull Supplier<T> getter,
63+
@NotNull IByteBufAdapter<T> adapter,
64+
@Nullable ICopy<T> copy) {
65+
this(getter, null, adapter, adapter, adapter, copy);
4366
}
4467

4568
public GenericSyncValue(@NotNull Supplier<T> getter,
4669
@NotNull IByteBufDeserializer<T> deserializer,
4770
@NotNull IByteBufSerializer<T> serializer) {
48-
this(getter, null, deserializer, serializer, null);
71+
this(getter, null, deserializer, serializer, null, null);
72+
}
73+
74+
public GenericSyncValue(@NotNull Supplier<T> getter,
75+
@NotNull IByteBufDeserializer<T> deserializer,
76+
@NotNull IByteBufSerializer<T> serializer,
77+
@Nullable ICopy<T> copy) {
78+
this(getter, null, deserializer, serializer, null, copy);
4979
}
5080

5181
public GenericSyncValue(@NotNull Supplier<T> getter,
5282
@Nullable Consumer<T> setter,
5383
@NotNull IByteBufDeserializer<T> deserializer,
5484
@NotNull IByteBufSerializer<T> serializer,
55-
@Nullable IEquals<T> equals) {
85+
@Nullable IEquals<T> equals,
86+
@Nullable ICopy<T> copy) {
5687
this.getter = Objects.requireNonNull(getter);
5788
this.cache = getter.get();
5889
this.setter = setter;
5990
this.deserializer = Objects.requireNonNull(deserializer);
6091
this.serializer = Objects.requireNonNull(serializer);
6192
this.equals = equals == null ? Objects::equals : IEquals.wrapNullSafe(equals);
93+
this.copy = copy == null ? ICopy.ofSerializer(serializer, deserializer) : copy;
6294
}
6395

6496
@Override
@@ -68,7 +100,7 @@ public T getValue() {
68100

69101
@Override
70102
public void setValue(T value, boolean setSource, boolean sync) {
71-
this.cache = value;
103+
this.cache = this.copy.createDeepCopy(value);
72104
if (setSource && this.setter != null) {
73105
this.setter.accept(value);
74106
}

0 commit comments

Comments
 (0)