mirror of
https://github.com/Sollace/Unicopia.git
synced 2024-11-24 05:47:59 +01:00
Fixed dead spells not being removed correctly
This commit is contained in:
parent
f2a6bf36d4
commit
eca5ab3e2b
4 changed files with 28 additions and 22 deletions
|
@ -97,7 +97,7 @@ public class EffectSync implements SpellContainer {
|
|||
|
||||
private Stream<Spell> read(boolean synchronize, boolean sendUpdate) {
|
||||
if (synchronize && spells.fromNbt(owner.getEntity().getDataTracker().get(param)) && sendUpdate) {
|
||||
write();
|
||||
owner.getEntity().getDataTracker().set(param, spells.toNbt());
|
||||
}
|
||||
|
||||
return spells.getReferences();
|
||||
|
|
|
@ -9,7 +9,7 @@ import net.minecraft.nbt.NbtCompound;
|
|||
public interface NetworkedReference<T> {
|
||||
Optional<T> getReference();
|
||||
|
||||
Optional<T> updateReference(@Nullable T newValue);
|
||||
void updateReference(@Nullable T newValue);
|
||||
|
||||
boolean fromNbt(NbtCompound comp);
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@ public class NetworkedReferenceSet<T> {
|
|||
private final Supplier<NetworkedReference<T>> factory;
|
||||
|
||||
private boolean dirty;
|
||||
private boolean reading;
|
||||
|
||||
public NetworkedReferenceSet(Function<T, UUID> uuidConverter, Supplier<NetworkedReference<T>> factory) {
|
||||
this.uuidConverter = uuidConverter;
|
||||
|
@ -78,24 +79,31 @@ public class NetworkedReferenceSet<T> {
|
|||
}
|
||||
|
||||
public boolean fromNbt(NbtCompound comp) {
|
||||
if (reading) {
|
||||
return false;
|
||||
}
|
||||
reading = true;
|
||||
try {
|
||||
List<UUID> incoming = new ArrayList<>();
|
||||
comp.getList("keys", NbtElement.STRING_TYPE).forEach(key -> {
|
||||
incoming.add(UUID.fromString(key.asString()));
|
||||
});
|
||||
|
||||
List<UUID> incoming = new ArrayList<>();
|
||||
comp.getList("keys", NbtElement.STRING_TYPE).forEach(key -> {
|
||||
incoming.add(UUID.fromString(key.asString()));
|
||||
});
|
||||
ids.stream().filter(id -> !incoming.contains(id)).toList().forEach(this::removeReference);
|
||||
|
||||
ids.stream().filter(id -> !incoming.contains(id)).toList().forEach(this::removeReference);
|
||||
|
||||
boolean[] send = new boolean[1];
|
||||
incoming.forEach(kept -> {
|
||||
NetworkedReference<T> i = addReference(kept);
|
||||
send[0] |= i.fromNbt(comp.getCompound(kept.toString()));
|
||||
if (i.getReference().isEmpty()) {
|
||||
removeReference(kept);
|
||||
}
|
||||
});
|
||||
dirty = false;
|
||||
return send[0];
|
||||
boolean[] send = new boolean[1];
|
||||
incoming.forEach(key -> {
|
||||
NetworkedReference<T> i = addReference(key);
|
||||
send[0] |= i.fromNbt(comp.getCompound(key.toString()));
|
||||
if (i.getReference().isEmpty()) {
|
||||
removeReference(key);
|
||||
}
|
||||
});
|
||||
dirty = send[0];
|
||||
return send[0];
|
||||
} finally {
|
||||
reading = false;
|
||||
}
|
||||
}
|
||||
|
||||
public NbtCompound toNbt() {
|
||||
|
|
|
@ -31,7 +31,7 @@ public class SpellNetworkedReference<T extends Spell> implements NetworkedRefere
|
|||
}
|
||||
|
||||
private boolean mustDelete(@Nullable NbtCompound comp) {
|
||||
return (comp == null || !comp.contains("effect_id") || !comp.contains("uuid")) && currentValue.isPresent();
|
||||
return comp == null || !comp.contains("effect_id") || !comp.contains("uuid");
|
||||
}
|
||||
|
||||
private boolean mustReplace(NbtCompound comp) {
|
||||
|
@ -51,7 +51,7 @@ public class SpellNetworkedReference<T extends Spell> implements NetworkedRefere
|
|||
}
|
||||
|
||||
@Override
|
||||
public Optional<T> updateReference(@Nullable T newValue) {
|
||||
public void updateReference(@Nullable T newValue) {
|
||||
newValue = newValue == null || newValue.isDead() ? null : newValue;
|
||||
|
||||
@Nullable
|
||||
|
@ -65,8 +65,6 @@ public class SpellNetworkedReference<T extends Spell> implements NetworkedRefere
|
|||
oldValue.onDestroyed(owner);
|
||||
}
|
||||
}
|
||||
|
||||
return currentValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
Loading…
Reference in a new issue