diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java index 7da44721bec..12a161dd87d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java @@ -27,6 +27,7 @@ import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; @@ -115,6 +116,11 @@ public void onLoad() {} public void onUnload() {} + @Override + public Level getLevel() { + return coverHolder.getLevel(); + } + ////////////////////////////////////// // ********** Misc ***********// ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java index ea051ee971f..5e63504fc89 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/filter/FilterHandler.java @@ -20,6 +20,7 @@ import net.minecraft.world.item.ItemStack; import lombok.Getter; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -195,4 +196,9 @@ public void markAsChanged() { public void scheduleRenderUpdate() { container.scheduleRenderUpdate(); } + + @Override + public Level getLevel() { + return container.getLevel(); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index 7609d198079..edbf0bc5119 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -449,10 +449,6 @@ public void notifyBlockUpdate() { } } - public @UnknownNullability Level getLevel() { - return super.getLevel(); - } - public void setOwnerUUID(UUID uuid) { ownerUUID = uuid; syncDataHolder.markClientSyncFieldDirty("ownerUUID"); diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/ISyncManaged.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ISyncManaged.java index ec48892047d..cf97432c2ef 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/ISyncManaged.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ISyncManaged.java @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; import net.minecraft.nbt.Tag; +import net.minecraft.world.level.Level; import net.minecraftforge.common.util.INBTSerializable; /** @@ -31,4 +32,6 @@ public interface ISyncManaged { * Function called to notify the server that this object has been updated and must be synced to clients */ void markAsChanged(); + + Level getLevel(); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/ManagedSyncBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ManagedSyncBlockEntity.java index c6bab08d64c..29da882700f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/ManagedSyncBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ManagedSyncBlockEntity.java @@ -8,6 +8,7 @@ import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -17,6 +18,7 @@ import lombok.Setter; import org.jetbrains.annotations.MustBeInvokedByOverriders; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnknownNullability; import java.util.Objects; @@ -74,6 +76,11 @@ public CompoundTag getUpdateTag() { return tag; } + @Override + public @UnknownNullability Level getLevel() { + return super.getLevel(); + } + /** * Called to get an update packet which is sent to clients to notify them when a loaded BE's data changes. */ 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 c16d2630b29..b54473d69e4 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 @@ -114,7 +114,7 @@ private static Tag serializeField(ISyncManaged holder, FieldSyncData field, if (field.transformer != null) { return ((ValueTransformer) field.transformer).serializeNBT(currentValue, - new ValueTransformer.TransformerContext<>(holder, field.type, currentValue, field.fieldName, + new ValueTransformer.TransformerContext<>(holder, field.type, currentValue, field.fieldName, holder.getLevel(), writeClientFields)); } else if (currentValue instanceof ISyncManaged syncObj) { return syncObj.getSyncDataHolder().serializeNBT(writeClientFields); @@ -150,7 +150,7 @@ private static void deserializeField(ISyncManaged holder, FieldSyncData field, try { var current = field.handle.get(holder); Object result = transformer.deserializeNBT(savedValue, new ValueTransformer.TransformerContext<>( - holder, field.type, current, field.fieldName, readingClientFields)); + holder, field.type, current, field.fieldName, holder.getLevel(), readingClientFields)); if (result != current) { field.handle.set(holder, result); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ResourceLocationReferenceTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ResourceLocationReferenceTransformer.java index 4f6f6e97057..e40b5cb766e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ResourceLocationReferenceTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ResourceLocationReferenceTransformer.java @@ -11,10 +11,10 @@ public class ResourceLocationReferenceTransformer implements ValueTransformer { private final Function getResourceLocation; - private final Function loadFromLocation; + private final Function loadFromLocation; public ResourceLocationReferenceTransformer(Function getResourceLocation, - Function loadFromLocation) { + Function loadFromLocation) { this.getResourceLocation = getResourceLocation; this.loadFromLocation = loadFromLocation; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/SimpleClassTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/SimpleClassTransformer.java index 83c85f14989..3057f474898 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/SimpleClassTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/SimpleClassTransformer.java @@ -2,32 +2,39 @@ import net.minecraft.nbt.Tag; -import org.jetbrains.annotations.NotNull; - +import java.util.function.BiFunction; import java.util.function.Function; public class SimpleClassTransformer implements ValueTransformer { - private final Function write; - private final Function read; + private final BiFunction, TagType> write; + private final BiFunction, T> read; private final Class tagClass; public SimpleClassTransformer(Function write, Function read, Class tagClass) { + this.write = (t, c) -> write.apply(t); + this.read = (t, c) -> read.apply(t); + this.tagClass = tagClass; + } + + public SimpleClassTransformer(BiFunction, TagType> write, + BiFunction, T> read, + Class tagClass) { this.write = write; this.read = read; this.tagClass = tagClass; } @Override - public @NotNull Tag serializeNBT(T value, ValueTransformer.TransformerContext context) { - return write.apply(value); + public Tag serializeNBT(T value, ValueTransformer.TransformerContext context) { + return write.apply(value, context); } @Override public T deserializeNBT(Tag tag, ValueTransformer.TransformerContext context) { TagType t = ValueTransformer.assertTagType(tagClass, tag, context); - return read.apply(t); + return read.apply(t, context); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java index 22a83bc1f86..3050c4a29b6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java @@ -5,7 +5,7 @@ import net.minecraft.nbt.Tag; -import org.jetbrains.annotations.NotNull; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; /** @@ -28,8 +28,8 @@ public interface ValueTransformer { * being * written to the server save. */ - record TransformerContext(@NotNull ISyncManaged holder, @NotNull TypeDeclaration type, - @Nullable U currentValue, @Nullable String fieldName, boolean isClientSync) {} + record TransformerContext(ISyncManaged holder, TypeDeclaration type, + @Nullable U currentValue, @Nullable String fieldName, Level levelContext, boolean isClientSync) {} /** * Casts a given NBT tag to a specific tag type, throwing an error if the tag cannot be casted. diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java index aa217e318dd..2d970342b98 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java @@ -29,23 +29,25 @@ private ValueTransformer getElemTransformer(ValueTransformer.TransformerConte return elementTransformer; } - private ValueTransformer.TransformerContext getInnerElemContext(@Nullable T elem, + private ValueTransformer.TransformerContext getInnerElemContext(@Nullable T elem, ValueTransformer.TransformerContext> parentContext) { return new TransformerContext<>(parentContext.holder(), - parentContext.type().getGenericTypeArgs()[0], elem, parentContext.fieldName() + "[element]", + parentContext.type().getGenericTypeArgs()[0], elem, parentContext.fieldName() + "[element]", parentContext.levelContext(), parentContext.isClientSync()); } @Override + @SuppressWarnings("unchecked") public Tag serializeNBT(List value, ValueTransformer.TransformerContext> context) { ListTag list = new ListTag(); for (var obj : value) { - list.add(getElemTransformer(context).serializeNBT(obj, getInnerElemContext(obj, context))); + list.add(getElemTransformer(context).serializeNBT(obj, (TransformerContext)getInnerElemContext(obj, context))); } return list; } @Override + @SuppressWarnings("unchecked") public @Nullable List deserializeNBT(Tag tag, ValueTransformer.TransformerContext> context) { var current = context.currentValue(); ListTag listTag = ValueTransformer.assertTagType(ListTag.class, tag, context); @@ -53,8 +55,7 @@ public Tag serializeNBT(List value, ValueTransformer.TransformerContext(); List finalCurrent = current; for (var t : listTag) { - T val = getElemTransformer(context).deserializeNBT(TagCompatibilityFixer.stripLDLibPayloadWrapper(t), - getInnerElemContext(null, context)); + T val = getElemTransformer(context).deserializeNBT(TagCompatibilityFixer.stripLDLibPayloadWrapper(t), (TransformerContext) getInnerElemContext(null, context)); if (val != null) finalCurrent.add(val); } return current; diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/MapTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/MapTransformer.java index b66985a169e..4e965afe7ee 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/MapTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/MapTransformer.java @@ -44,38 +44,41 @@ private ValueTransformer getValueTransformer(ValueTransformer.TransformerCont return valueTransformer; } - private ValueTransformer.TransformerContext getInnerKeyContext(@Nullable K key, + + private ValueTransformer.TransformerContext getInnerKeyContext(@Nullable K key, ValueTransformer.TransformerContext> parentContext) { return new TransformerContext<>(parentContext.holder(), - parentContext.type().getGenericTypeArgs()[0], key, parentContext.fieldName() + "[key]", + parentContext.type().getGenericTypeArgs()[0], key, parentContext.fieldName() + "[key]", parentContext.levelContext(), parentContext.isClientSync()); } - private ValueTransformer.TransformerContext getInnerValueContext(@Nullable V value, + private ValueTransformer.TransformerContext getInnerValueContext(@Nullable V value, ValueTransformer.TransformerContext> parentContext) { return new TransformerContext<>(parentContext.holder(), parentContext.type().getGenericTypeArgs()[1], value, - parentContext.fieldName() + "[value]", + parentContext.fieldName() + "[value]", parentContext.levelContext(), parentContext.isClientSync()); } @Override + @SuppressWarnings("unchecked") public Tag serializeNBT(Map value, ValueTransformer.TransformerContext> context) { ListTag entries = new ListTag(); for (var entry : value.entrySet()) { CompoundTag compound = new CompoundTag(); compound.put("k", getKeyTransformer(context).serializeNBT(entry.getKey(), - getInnerKeyContext(entry.getKey(), context))); + (TransformerContext) getInnerKeyContext(entry.getKey(), context))); compound.put("v", getValueTransformer(context).serializeNBT(entry.getValue(), - getInnerValueContext(entry.getValue(), context))); + (TransformerContext)getInnerValueContext(entry.getValue(), context))); entries.add(compound); } return entries; } @Override + @SuppressWarnings("unchecked") public Map deserializeNBT(Tag tag, ValueTransformer.TransformerContext> context) { var current = context.currentValue(); ListTag listTag = ValueTransformer.assertTagType(ListTag.class, tag, context); @@ -88,8 +91,8 @@ public Map deserializeNBT(Tag tag, ValueTransformer.TransformerContext)getInnerKeyContext(null, context)); + V value = getValueTransformer(context).deserializeNBT(valueTag, (TransformerContext)getInnerValueContext(null, context)); if (key == null || value == null) { GTCEu.LOGGER.warn( "Sync: Skipping null key or field while deserializing map: [key: {}, value: {}] [nbt key: {}, nbt value: {}]", diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java index 1f665105fe0..24bf88414e5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java @@ -19,18 +19,19 @@ public ObjectArrayTransformer(ValueTransformer elementTransformer) { this.elementTransformer = elementTransformer; } - private ValueTransformer.TransformerContext getInnerElemContext(@Nullable T elem, + private ValueTransformer.TransformerContext getInnerElemContext(@Nullable T elem, ValueTransformer.TransformerContext parentContext) { return new TransformerContext<>(parentContext.holder(), - parentContext.type().getArrayComponentType(), elem, parentContext.fieldName() + "[element]", + parentContext.type().getArrayComponentType(), elem, parentContext.fieldName() + "[element]", parentContext.levelContext(), parentContext.isClientSync()); } @Override + @SuppressWarnings("unchecked") public Tag serializeNBT(T[] value, ValueTransformer.TransformerContext context) { ListTag listTag = new ListTag(); for (T element : value) { - listTag.add(elementTransformer.serializeNBT(element, getInnerElemContext(element, context))); + listTag.add(elementTransformer.serializeNBT(element, (TransformerContext)getInnerElemContext(element, context))); } return listTag; } @@ -51,7 +52,7 @@ public Tag serializeNBT(T[] value, ValueTransformer.TransformerContext cont } for (int i = 0; i < listTag.size(); i++) { T result = elementTransformer.deserializeNBT(TagCompatibilityFixer.stripLDLibPayloadWrapper(listTag.get(i)), - getInnerElemContext(current[i], context)); + (TransformerContext)getInnerElemContext(current[i], context)); if (result == null) return current; current[i] = result; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/SetTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/SetTransformer.java index 94c03417653..520b5191b0d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/SetTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/SetTransformer.java @@ -29,30 +29,32 @@ private ValueTransformer getElemTransformer(ValueTransformer.TransformerConte return elementTransformer; } - private ValueTransformer.TransformerContext getInnerElemContext(@Nullable T elem, + private ValueTransformer.TransformerContext getInnerElemContext(@Nullable T elem, ValueTransformer.TransformerContext> parentContext) { return new TransformerContext<>(parentContext.holder(), - parentContext.type().getGenericTypeArgs()[0], elem, parentContext.fieldName() + "[element]", + parentContext.type().getGenericTypeArgs()[0], elem, parentContext.fieldName() + "[element]", parentContext.levelContext(), parentContext.isClientSync()); } @Override + @SuppressWarnings("unchecked") public Tag serializeNBT(Set value, ValueTransformer.TransformerContext> context) { ListTag tag = new ListTag(); for (T element : value) { - tag.add(getElemTransformer(context).serializeNBT(element, getInnerElemContext(element, context))); + tag.add(getElemTransformer(context).serializeNBT(element, (TransformerContext)getInnerElemContext(element, context))); } return tag; } @Override + @SuppressWarnings("unchecked") public Set deserializeNBT(Tag tag, ValueTransformer.TransformerContext> context) { ListTag listTag = ValueTransformer.assertTagType(ListTag.class, tag, context); var current = context.currentValue(); if (current != null) current.clear(); else current = new ObjectOpenHashSet<>(); for (Tag elementTag : listTag) { - T value = getElemTransformer(context).deserializeNBT(elementTag, getInnerElemContext(null, context)); + T value = getElemTransformer(context).deserializeNBT(elementTag, (TransformerContext)getInnerElemContext(null, context)); if (value != null) current.add(value); } return current; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java index 7718f9ab4a0..507a59d9269 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java @@ -758,5 +758,10 @@ public void markAsChanged() { public void scheduleRenderUpdate() { controller.scheduleRenderUpdate(); } + + @Override + public Level getLevel() { + return controller.getLevel(); + } } }