From a3c6e44b68c4493d0c366bee0dcc6aeec4873dd4 Mon Sep 17 00:00:00 2001 From: dalizi2333 Date: Wed, 17 Jun 2026 05:04:49 +0800 Subject: [PATCH] Fixed cover removal not syncing render state to clients - SyncDataHolder.serializeField: removed the !isSyncManaged condition from null check so that nullable ISyncManaged fields (e.g. CoverBehavior) are properly serialized as null instead of being silently skipped, causing client-side render desync when a cover is removed. - CoverBehaviorTransformer: serializeNBT now returns null tag for null values instead of an empty tag; deserializeNBT now handles null tag as a defensive measure. --- .../gregtechceu/gtceu/api/sync_system/SyncDataHolder.java | 2 +- .../data_transformers/gtceu/CoverBehaviorTransformer.java | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java index eb9ff723d36..6d97b08ac94 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java @@ -105,7 +105,7 @@ private static Tag serializeField(HolderLookup.Provider registries, ISyncManaged boolean writeClientFields, boolean fullSync) { Object currentValue = field.handle.get(holder); - if (!field.isSyncManaged && currentValue == null) { + if (currentValue == null) { var nullCompound = new CompoundTag(); nullCompound.putBoolean("null", true); return nullCompound; diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/CoverBehaviorTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/CoverBehaviorTransformer.java index f3fcc94e200..78a4c2c6e90 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/CoverBehaviorTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/gtceu/CoverBehaviorTransformer.java @@ -23,13 +23,18 @@ public Tag serializeNBT(@Nullable CoverBehavior value, if (value != null) { return serialize(value, context.isClientSync(), context.lookup()); } - return new CompoundTag(); + var nullTag = new CompoundTag(); + nullTag.putBoolean("null", true); + return nullTag; } @Override public @Nullable CoverBehavior deserializeNBT(Tag tag, CoverBehaviorTransformer.TransformerContext context) { var compoundTag = ValueTransformer.assertTagType(CompoundTag.class, tag, context); + if (compoundTag.getBoolean("null")) { + return null; + } if (context.holder() instanceof ICoverable coverable) { return deserialize(compoundTag, coverable, context.currentValue(), context.isClientSync(), context.lookup());