diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java index e182820827..b4cdcd49fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/MetaMachineBlockEntity.java @@ -87,6 +87,9 @@ public boolean triggerEvent(int id, int para) { @Override public void setRenderState(MachineRenderState state) { this.renderState = state; + if (level != null && !level.isClientSide) { + syncDataHolder.markClientSyncFieldDirty("renderState"); + } scheduleRenderUpdate(); } diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java index 36868ba9ad..ac3b7cbd55 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/SyncDataHolder.java @@ -193,23 +193,25 @@ private static void deserialiseField(ISyncManaged holder, ClassSyncData.FieldSyn try { if (field.transformer != null) { IValueTransformer transformer = (IValueTransformer) field.transformer; - if (transformer.mustProvideObject()) { - if (readingClientFields) { - transformer.deserializeClientNBT(savedValue, holder, field.handle.get(holder)); + try { + if (transformer.mustProvideObject()) { + if (readingClientFields) { + transformer.deserializeClientNBT(savedValue, holder, field.handle.get(holder)); + } else { + transformer.deserializeNBT(savedValue, holder, field.handle.get(holder)); + } } else { - transformer.deserializeNBT(savedValue, holder, field.handle.get(holder)); - } - } else { - try { + if (readingClientFields) { field.handle.set(holder, transformer.deserializeClientNBT(savedValue, holder, null)); } else { field.handle.set(holder, transformer.deserializeNBT(savedValue, holder, null)); } - } catch (UnsupportedOperationException e) { - GTCEu.LOGGER.error("Sync: failed to perform VarHandle set: unsupported op {} {}", - field.fieldName, field.handle.toString()); + } + } catch (UnsupportedOperationException e) { + GTCEu.LOGGER.error("Sync: failed to perform VarHandle set: unsupported op {} {}", + field.fieldName, field.handle.toString()); } } else if (field.isComplex && savedValue instanceof CompoundTag compound) { if (currentVal == null) { diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java index 1e34dfa20b..b9514a80ac 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ListTransformer.java @@ -21,7 +21,6 @@ public ListTransformer(IValueTransformer elementTransformer) { @Override public Tag serializeNBT(List value, ISyncManaged holder) { ListTag list = new ListTag(); - if (elementTransformer == null) return list; for (var obj : value) { list.add(elementTransformer.serializeNBT(obj, null)); } @@ -30,17 +29,15 @@ public Tag serializeNBT(List value, ISyncManaged holder) { @Override public List deserializeNBT(Tag tag, ISyncManaged holder, List current) { - if (!(tag instanceof ListTag listTag) || elementTransformer == null) return List.of(); - - try { - if (current != null) current.clear(); - else current = new ArrayList<>(); - List finalCurrent = current; - listTag.forEach(t -> finalCurrent - .add(elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(t), null, null))); - } catch (UnsupportedOperationException e) { - GTCEu.LOGGER.error("Sync: Cannot sync an immutable list: {} {}", holder, e); + if (!(tag instanceof ListTag listTag)) { + GTCEu.LOGGER.error("Tag is of type {}, not ListTag", tag.getType()); + return current; } + if (current != null) current.clear(); + else current = new ArrayList<>(); + List finalCurrent = current; + listTag.forEach(t -> finalCurrent + .add(elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(t), null, null))); return current; } diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java index 1c82c008c7..762e20f8b8 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/MapTransformer.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.syncsystem.ISyncManaged; import com.gregtechceu.gtceu.syncsystem.IValueTransformer; @@ -39,7 +40,10 @@ public Tag serializeNBT(Map value, ISyncManaged holder) { @Override public Map deserializeNBT(Tag tag, ISyncManaged holder, Map current) { - if (!(tag instanceof ListTag listTag)) return current; + if (!(tag instanceof ListTag listTag)) { + GTCEu.LOGGER.error("Tag is of type {}, not ListTag", tag.getType()); + return current; + } if (current != null) current.clear(); else current = new HashMap<>(); for (Tag entryTag : listTag) { diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java index a7d5e6f21e..6d85bf696a 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/ObjectArrayTransformer.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.syncsystem.ISyncManaged; import com.gregtechceu.gtceu.syncsystem.IValueTransformer; @@ -31,20 +32,24 @@ public Tag serializeNBT(T[] value, ISyncManaged holder) { } @Override - public T[] deserializeNBT(Tag tag, ISyncManaged holder, T[] currentVal) { - if (!(tag instanceof ListTag listTag)) throw new IllegalArgumentException("Expected ListTag"); - - if (listTag.size() != currentVal.length) { - currentVal = Arrays.copyOf(currentVal, listTag.size()); + public T[] deserializeNBT(Tag tag, ISyncManaged holder, T[] current) { + if (!(tag instanceof ListTag listTag)) { + GTCEu.LOGGER.error("Tag is of type {}, not ListTag", tag.getType()); + return current; } + if (listTag.size() != current.length) { + current = Arrays.copyOf(current, listTag.size()); + } for (int i = 0; i < listTag.size(); i++) { - if (elementTransformer.mustProvideObject()) + if (elementTransformer.mustProvideObject()) { elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(listTag.get(i)), null, - currentVal[i]); - else currentVal[i] = elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(listTag.get(i)), - null, null); + current[i]); + } else { + current[i] = elementTransformer.deserializeNBT(IValueTransformer.stripLdlibWrapper(listTag.get(i)), + null, null); + } } - return currentVal; + return current; } } diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java index 67a29d6bf8..edbacfb529 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/data_transformers/collections/SetTransformer.java @@ -1,5 +1,6 @@ package com.gregtechceu.gtceu.syncsystem.data_transformers.collections; +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.syncsystem.ISyncManaged; import com.gregtechceu.gtceu.syncsystem.IValueTransformer; @@ -32,12 +33,16 @@ public Tag serializeNBT(Set value, ISyncManaged holder) { } @Override - public Set deserializeNBT(Tag tag, ISyncManaged holder, Set currentVal) { - if (!(tag instanceof ListTag listTag)) return Set.of(); - Set set = new HashSet<>(); + public Set deserializeNBT(Tag tag, ISyncManaged holder, Set current) { + if (!(tag instanceof ListTag listTag)) { + GTCEu.LOGGER.error("Tag is of type {}, not ListTag", tag.getType()); + return current; + } + if (current != null) current.clear(); + else current = new HashSet<>(); for (Tag elementTag : listTag) { - set.add(elementTransformer.deserializeNBT(elementTag, null, null)); + current.add(elementTransformer.deserializeNBT(elementTag, null, null)); } - return set; + return current; } }