fix: Fixed all synchronized WizardData stored variables on dedicated servers. This issue was causing e.g. the Ancient Compass to not display its targets on servers. Fixes #857
This commit is contained in:
@@ -64,6 +64,11 @@ public interface IStoredVariable<T> extends IVariable<T> {
|
||||
this.ticker = (p, t) -> t; // Initialise this with a do-nothing function, can be overwritten later
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getKey() {
|
||||
return key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces this variable's update method with the given update function. <i>Beware of auto-unboxing of
|
||||
* primitive types! For lambda expressions, check the second parameter isn't null before operating on it.
|
||||
|
||||
@@ -47,7 +47,10 @@ public interface IVariable<T> {
|
||||
*/
|
||||
void write(ByteBuf buf, T value);
|
||||
|
||||
String getKey();
|
||||
|
||||
/**
|
||||
*
|
||||
* Reads this variable's value from the given {@link ByteBuf}.
|
||||
*/
|
||||
T read(ByteBuf buf);
|
||||
@@ -110,6 +113,11 @@ public interface IVariable<T> {
|
||||
// NYI
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getKey() {
|
||||
return "none"; // we don't mind as these are never synced (electroblob.wizardry.data.IVariable.Variable.isSynced)
|
||||
}
|
||||
|
||||
@Override
|
||||
public T read(ByteBuf buf){
|
||||
return null; // NYI
|
||||
|
||||
@@ -199,9 +199,14 @@ public class WizardData implements INBTSerializable<NBTTagCompound> {
|
||||
}
|
||||
|
||||
/** Returns a set containing the registered {@link IStoredVariable} objects for which {@link IVariable#isSynced()}
|
||||
* returns true. Used internally for packet reading. */
|
||||
public static Set<IVariable> getSyncedVariables(){
|
||||
return storedVariables.stream().filter(IVariable::isSynced).collect(Collectors.toSet());
|
||||
* returns true, ordered by their keys obtained from {@link IVariable#getKey()}. Used internally for packets. */
|
||||
public static Set<IVariable> getSyncedVariablesOrderedByKey(){
|
||||
Comparator<IVariable> keyComparator = Comparator.comparing(IVariable::getKey);
|
||||
|
||||
return storedVariables.stream()
|
||||
.filter(IVariable::isSynced)
|
||||
.sorted(keyComparator)
|
||||
.collect(Collectors.toCollection(LinkedHashSet::new));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -10,7 +10,11 @@ import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
|
||||
import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
|
||||
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* <b>[Server -> Client]</b> This packet is sent to synchronise any fields that need synchronising in
|
||||
@@ -54,9 +58,8 @@ public class PacketPlayerSync implements IMessageHandler<Message, IMessage> {
|
||||
|
||||
this.seed = buf.readLong();
|
||||
this.selectedMinionID = buf.readInt();
|
||||
|
||||
this.spellData = new HashMap<>();
|
||||
WizardData.getSyncedVariables().forEach(v -> spellData.put(v, v.read(buf)));
|
||||
WizardData.getSyncedVariablesOrderedByKey().forEach(v -> spellData.put(v, v.read(buf)));
|
||||
// Have to send empty tags to guarantee correct ByteBuf size/order, but no point keeping the resulting nulls
|
||||
spellData.values().removeIf(Objects::isNull);
|
||||
|
||||
@@ -73,7 +76,7 @@ public class PacketPlayerSync implements IMessageHandler<Message, IMessage> {
|
||||
buf.writeLong(seed);
|
||||
buf.writeInt(selectedMinionID);
|
||||
|
||||
WizardData.getSyncedVariables().forEach(v -> v.write(buf, spellData.get(v)));
|
||||
WizardData.getSyncedVariablesOrderedByKey().forEach(v -> v.write(buf, spellData.get(v)));
|
||||
|
||||
if(this.spellsDiscovered == null) return;
|
||||
for(Spell spell : this.spellsDiscovered){
|
||||
|
||||
Reference in New Issue
Block a user