Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -115,6 +116,11 @@ public void onLoad() {}

public void onUnload() {}

@Override
public Level getLevel() {
return coverHolder.getLevel();
}

//////////////////////////////////////
// ********** Misc ***********//
//////////////////////////////////////
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -195,4 +196,9 @@ public void markAsChanged() {
public void scheduleRenderUpdate() {
container.scheduleRenderUpdate();
}

@Override
public Level getLevel() {
return container.getLevel();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -449,10 +449,6 @@ public void notifyBlockUpdate() {
}
}

public @UnknownNullability Level getLevel() {
return super.getLevel();
}

public void setOwnerUUID(UUID uuid) {
ownerUUID = uuid;
syncDataHolder.markClientSyncFieldDirty("ownerUUID");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand Down Expand Up @@ -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();
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand Down Expand Up @@ -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.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ private static Tag serializeField(ISyncManaged holder, FieldSyncData field,

if (field.transformer != null) {
return ((ValueTransformer<Object>) 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);
Expand Down Expand Up @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@
public class ResourceLocationReferenceTransformer<T> implements ValueTransformer<T> {

private final Function<T, ResourceLocation> getResourceLocation;
private final Function<ResourceLocation, T> loadFromLocation;
private final Function<ResourceLocation, @Nullable T> loadFromLocation;

public ResourceLocationReferenceTransformer(Function<T, ResourceLocation> getResourceLocation,
Function<ResourceLocation, T> loadFromLocation) {
Function<ResourceLocation, @Nullable T> loadFromLocation) {
this.getResourceLocation = getResourceLocation;
this.loadFromLocation = loadFromLocation;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<T, TagType extends Tag> implements ValueTransformer<T> {

private final Function<T, TagType> write;
private final Function<TagType, T> read;
private final BiFunction<T, ValueTransformer.TransformerContext<T>, TagType> write;
private final BiFunction<TagType, ValueTransformer.TransformerContext<T>, T> read;
private final Class<TagType> tagClass;

public SimpleClassTransformer(Function<T, TagType> write,
Function<TagType, T> read,
Class<TagType> tagClass) {
this.write = (t, c) -> write.apply(t);
this.read = (t, c) -> read.apply(t);
this.tagClass = tagClass;
}

public SimpleClassTransformer(BiFunction<T, ValueTransformer.TransformerContext<T>, TagType> write,
BiFunction<TagType, ValueTransformer.TransformerContext<T>, T> read,
Class<TagType> tagClass) {
this.write = write;
this.read = read;
this.tagClass = tagClass;
}

@Override
public @NotNull Tag serializeNBT(T value, ValueTransformer.TransformerContext<T> context) {
return write.apply(value);
public Tag serializeNBT(T value, ValueTransformer.TransformerContext<T> context) {
return write.apply(value, context);
}

@Override
public T deserializeNBT(Tag tag, ValueTransformer.TransformerContext<T> context) {
TagType t = ValueTransformer.assertTagType(tagClass, tag, context);
return read.apply(t);
return read.apply(t, context);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand All @@ -28,8 +28,8 @@ public interface ValueTransformer<T> {
* being
* written to the server save.
*/
record TransformerContext<U>(@NotNull ISyncManaged holder, @NotNull TypeDeclaration type,
@Nullable U currentValue, @Nullable String fieldName, boolean isClientSync) {}
record TransformerContext<U>(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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,32 +29,33 @@ private ValueTransformer<T> getElemTransformer(ValueTransformer.TransformerConte
return elementTransformer;
}

private ValueTransformer.TransformerContext<T> getInnerElemContext(@Nullable T elem,
private ValueTransformer.TransformerContext<?> getInnerElemContext(@Nullable T elem,
ValueTransformer.TransformerContext<List<T>> 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<T> value, ValueTransformer.TransformerContext<List<T>> 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<T>)getInnerElemContext(obj, context)));
}
return list;
}

@Override
@SuppressWarnings("unchecked")
public @Nullable List<T> deserializeNBT(Tag tag, ValueTransformer.TransformerContext<List<T>> context) {
var current = context.currentValue();
ListTag listTag = ValueTransformer.assertTagType(ListTag.class, tag, context);
if (current != null) current.clear();
else current = new ArrayList<>();
List<T> 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<T>) getInnerElemContext(null, context));
if (val != null) finalCurrent.add(val);
}
return current;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,38 +44,41 @@ private ValueTransformer<V> getValueTransformer(ValueTransformer.TransformerCont
return valueTransformer;
}

private ValueTransformer.TransformerContext<K> getInnerKeyContext(@Nullable K key,

private ValueTransformer.TransformerContext<?> getInnerKeyContext(@Nullable K key,
ValueTransformer.TransformerContext<Map<K, V>> 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<V> getInnerValueContext(@Nullable V value,
private ValueTransformer.TransformerContext<?> getInnerValueContext(@Nullable V value,
ValueTransformer.TransformerContext<Map<K, V>> 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<K, V> value, ValueTransformer.TransformerContext<Map<K, V>> 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<K>) getInnerKeyContext(entry.getKey(), context)));
compound.put("v",
getValueTransformer(context).serializeNBT(entry.getValue(),
getInnerValueContext(entry.getValue(), context)));
(TransformerContext<V>)getInnerValueContext(entry.getValue(), context)));
entries.add(compound);
}
return entries;
}

@Override
@SuppressWarnings("unchecked")
public Map<K, V> deserializeNBT(Tag tag, ValueTransformer.TransformerContext<Map<K, V>> context) {
var current = context.currentValue();
ListTag listTag = ValueTransformer.assertTagType(ListTag.class, tag, context);
Expand All @@ -88,8 +91,8 @@ public Map<K, V> deserializeNBT(Tag tag, ValueTransformer.TransformerContext<Map
Tag valueTag = compound.get("v");
if (keyTag == null || valueTag == null) continue;

K key = getKeyTransformer(context).deserializeNBT(keyTag, getInnerKeyContext(null, context));
V value = getValueTransformer(context).deserializeNBT(valueTag, getInnerValueContext(null, context));
K key = getKeyTransformer(context).deserializeNBT(keyTag, (TransformerContext<K>)getInnerKeyContext(null, context));
V value = getValueTransformer(context).deserializeNBT(valueTag, (TransformerContext<V>)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: {}]",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,19 @@ public ObjectArrayTransformer(ValueTransformer<T> elementTransformer) {
this.elementTransformer = elementTransformer;
}

private ValueTransformer.TransformerContext<T> getInnerElemContext(@Nullable T elem,
private ValueTransformer.TransformerContext<?> getInnerElemContext(@Nullable T elem,
ValueTransformer.TransformerContext<T[]> 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<T[]> context) {
ListTag listTag = new ListTag();
for (T element : value) {
listTag.add(elementTransformer.serializeNBT(element, getInnerElemContext(element, context)));
listTag.add(elementTransformer.serializeNBT(element, (TransformerContext<T>)getInnerElemContext(element, context)));
}
return listTag;
}
Expand All @@ -51,7 +52,7 @@ public Tag serializeNBT(T[] value, ValueTransformer.TransformerContext<T[]> cont
}
for (int i = 0; i < listTag.size(); i++) {
T result = elementTransformer.deserializeNBT(TagCompatibilityFixer.stripLDLibPayloadWrapper(listTag.get(i)),
getInnerElemContext(current[i], context));
(TransformerContext<T>)getInnerElemContext(current[i], context));
if (result == null) return current;
current[i] = result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,30 +29,32 @@ private ValueTransformer<T> getElemTransformer(ValueTransformer.TransformerConte
return elementTransformer;
}

private ValueTransformer.TransformerContext<T> getInnerElemContext(@Nullable T elem,
private ValueTransformer.TransformerContext<?> getInnerElemContext(@Nullable T elem,
ValueTransformer.TransformerContext<Set<T>> 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<T> value, ValueTransformer.TransformerContext<Set<T>> 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<T>)getInnerElemContext(element, context)));
}
return tag;
}

@Override
@SuppressWarnings("unchecked")
public Set<T> deserializeNBT(Tag tag, ValueTransformer.TransformerContext<Set<T>> 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<T>)getInnerElemContext(null, context));
if (value != null) current.add(value);
}
return current;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -758,5 +758,10 @@ public void markAsChanged() {
public void scheduleRenderUpdate() {
controller.scheduleRenderUpdate();
}

@Override
public Level getLevel() {
return controller.getLevel();
}
}
}
Loading