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
|
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
|
* 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.
|
* 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);
|
void write(ByteBuf buf, T value);
|
||||||
|
|
||||||
|
String getKey();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
*
|
||||||
* Reads this variable's value from the given {@link ByteBuf}.
|
* Reads this variable's value from the given {@link ByteBuf}.
|
||||||
*/
|
*/
|
||||||
T read(ByteBuf buf);
|
T read(ByteBuf buf);
|
||||||
@@ -110,6 +113,11 @@ public interface IVariable<T> {
|
|||||||
// NYI
|
// NYI
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getKey() {
|
||||||
|
return "none"; // we don't mind as these are never synced (electroblob.wizardry.data.IVariable.Variable.isSynced)
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public T read(ByteBuf buf){
|
public T read(ByteBuf buf){
|
||||||
return null; // NYI
|
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 a set containing the registered {@link IStoredVariable} objects for which {@link IVariable#isSynced()}
|
||||||
* returns true. Used internally for packet reading. */
|
* returns true, ordered by their keys obtained from {@link IVariable#getKey()}. Used internally for packets. */
|
||||||
public static Set<IVariable> getSyncedVariables(){
|
public static Set<IVariable> getSyncedVariablesOrderedByKey(){
|
||||||
return storedVariables.stream().filter(IVariable::isSynced).collect(Collectors.toSet());
|
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.IMessageHandler;
|
||||||
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
|
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
|
* <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.seed = buf.readLong();
|
||||||
this.selectedMinionID = buf.readInt();
|
this.selectedMinionID = buf.readInt();
|
||||||
|
|
||||||
this.spellData = new HashMap<>();
|
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
|
// Have to send empty tags to guarantee correct ByteBuf size/order, but no point keeping the resulting nulls
|
||||||
spellData.values().removeIf(Objects::isNull);
|
spellData.values().removeIf(Objects::isNull);
|
||||||
|
|
||||||
@@ -73,7 +76,7 @@ public class PacketPlayerSync implements IMessageHandler<Message, IMessage> {
|
|||||||
buf.writeLong(seed);
|
buf.writeLong(seed);
|
||||||
buf.writeInt(selectedMinionID);
|
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;
|
if(this.spellsDiscovered == null) return;
|
||||||
for(Spell spell : this.spellsDiscovered){
|
for(Spell spell : this.spellsDiscovered){
|
||||||
|
|||||||
Reference in New Issue
Block a user