mirror of
https://github.com/Sollace/Unicopia.git
synced 2024-11-23 21:38:00 +01:00
Fixed crash when synchronizing spells
This commit is contained in:
parent
3ec2dd9b21
commit
8c7bb8c700
1 changed files with 14 additions and 9 deletions
|
@ -4,6 +4,7 @@ import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
@ -34,18 +35,19 @@ public class NetworkedReferenceSet<T> {
|
||||||
this.factory = factory;
|
this.factory = factory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean containsReference(UUID id) {
|
public synchronized boolean containsReference(UUID id) {
|
||||||
return ids.contains(id);
|
return ids.contains(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Stream<T> getReferences() {
|
public synchronized Stream<T> getReferences() {
|
||||||
return ids.stream().map(id -> values.get(id))
|
return ids.stream().map(id -> values.get(id))
|
||||||
|
.filter(Objects::nonNull)
|
||||||
.map(a -> a.getReference())
|
.map(a -> a.getReference())
|
||||||
.filter(Optional::isPresent)
|
.filter(Optional::isPresent)
|
||||||
.map(Optional::get);
|
.map(Optional::get);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean clear() {
|
public synchronized boolean clear() {
|
||||||
dirty |= !ids.isEmpty() || !values.isEmpty();
|
dirty |= !ids.isEmpty() || !values.isEmpty();
|
||||||
ids.clear();
|
ids.clear();
|
||||||
try {
|
try {
|
||||||
|
@ -66,7 +68,7 @@ public class NetworkedReferenceSet<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private NetworkedReference<T> addReference(UUID newValue) {
|
private synchronized NetworkedReference<T> addReference(UUID newValue) {
|
||||||
return values.computeIfAbsent(newValue, id -> {
|
return values.computeIfAbsent(newValue, id -> {
|
||||||
dirty = true;
|
dirty = true;
|
||||||
ids.remove(id);
|
ids.remove(id);
|
||||||
|
@ -81,7 +83,7 @@ public class NetworkedReferenceSet<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void removeReference(UUID id) {
|
private synchronized void removeReference(UUID id) {
|
||||||
dirty |= ids.remove(id);
|
dirty |= ids.remove(id);
|
||||||
NetworkedReference<T> i = values.remove(id);
|
NetworkedReference<T> i = values.remove(id);
|
||||||
if (i != null) {
|
if (i != null) {
|
||||||
|
@ -123,20 +125,23 @@ public class NetworkedReferenceSet<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public NbtCompound toNbt() {
|
public synchronized NbtCompound toNbt() {
|
||||||
NbtCompound tag = new NbtCompound();
|
NbtCompound tag = new NbtCompound();
|
||||||
NbtList ids = new NbtList();
|
NbtList ids = new NbtList();
|
||||||
this.ids.forEach(id -> {
|
this.ids.forEach(id -> {
|
||||||
String sid = id.toString();
|
String sid = id.toString();
|
||||||
ids.add(NbtString.of(sid));
|
NetworkedReference<?> ref = values.get(id);
|
||||||
tag.put(sid, values.get(id).toNbt());
|
if (ref != null) {
|
||||||
|
ids.add(NbtString.of(sid));
|
||||||
|
tag.put(sid, values.get(id).toNbt());
|
||||||
|
}
|
||||||
});
|
});
|
||||||
tag.put("keys", ids);
|
tag.put("keys", ids);
|
||||||
dirty = false;
|
dirty = false;
|
||||||
return tag;
|
return tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isDirty() {
|
public synchronized boolean isDirty() {
|
||||||
return dirty || values.values().stream().anyMatch(NetworkedReference::isDirty);
|
return dirty || values.values().stream().anyMatch(NetworkedReference::isDirty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue