diff --git a/SpongeAPI b/SpongeAPI index c87ae50ed18..2cf008bf3df 160000 --- a/SpongeAPI +++ b/SpongeAPI @@ -1 +1 @@ -Subproject commit c87ae50ed18c565ffab2d63dabad3860a419d12d +Subproject commit 2cf008bf3df8abab6ab431bc8fb37070cc84ce2c diff --git a/src/main/java/org/spongepowered/common/block/SpongeBlockSnapshot.java b/src/main/java/org/spongepowered/common/block/SpongeBlockSnapshot.java index ce24bf32344..6fcd31d2492 100644 --- a/src/main/java/org/spongepowered/common/block/SpongeBlockSnapshot.java +++ b/src/main/java/org/spongepowered/common/block/SpongeBlockSnapshot.java @@ -24,6 +24,8 @@ */ package org.spongepowered.common.block; +import static com.google.common.base.Preconditions.checkNotNull; + import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; @@ -260,14 +262,26 @@ public Optional createArchetype() { throw new UnsupportedOperationException("Not implemented yet, please fix when this is called"); } + @Override + public DataContainer rawData() { + if (this.compound == null) { + return DataContainer.createNew(DataView.SafetyMode.NO_DATA_CLONED); + } + return NBTTranslator.INSTANCE.translate(this.compound); + } + @Override public BlockSnapshot withRawData(final DataView container) throws InvalidDataException { - return BuilderImpl.pooled().buildContent(container).orElseThrow(InvalidDataException::new); + checkNotNull(container, "Raw data cannot be null!"); + final BuilderImpl builder = this.createBuilder(); + builder.addUnsafeCompound(NBTTranslator.INSTANCE.translate(container)); + return builder.build(); } @Override public boolean validateRawData(final DataView container) { - return BuilderImpl.pooled().buildContent(container).isPresent(); + checkNotNull(container, "Raw data cannot be null!"); + return true; } @Override diff --git a/src/main/java/org/spongepowered/common/block/entity/SpongeBlockEntityArchetype.java b/src/main/java/org/spongepowered/common/block/entity/SpongeBlockEntityArchetype.java index 1ab52c00460..e4929098ae6 100644 --- a/src/main/java/org/spongepowered/common/block/entity/SpongeBlockEntityArchetype.java +++ b/src/main/java/org/spongepowered/common/block/entity/SpongeBlockEntityArchetype.java @@ -79,11 +79,6 @@ public BlockEntityType blockEntityType() { return this.type; } - @Override - public DataContainer blockEntityData() { - return NBTTranslator.INSTANCE.translateFrom(this.compound); - } - @Override public Optional apply(final ServerLocation location) { final BlockState currentState = location.block(); @@ -131,7 +126,7 @@ public DataContainer toContainer() { .set(Queries.CONTENT_VERSION, this.contentVersion()) .set(Constants.Sponge.BlockEntityArchetype.BLOCK_ENTITY_TYPE, this.type) .set(Constants.Sponge.BlockEntityArchetype.BLOCK_STATE, this.blockState) - .set(Constants.Sponge.BlockEntityArchetype.BLOCK_ENTITY_DATA, this.blockEntityData()) + .set(Constants.Sponge.BlockEntityArchetype.BLOCK_ENTITY_DATA, this.rawData()) ; } diff --git a/src/main/java/org/spongepowered/common/block/entity/SpongeBlockEntityArchetypeBuilder.java b/src/main/java/org/spongepowered/common/block/entity/SpongeBlockEntityArchetypeBuilder.java index a7fa56540ff..f5e1d2fc148 100644 --- a/src/main/java/org/spongepowered/common/block/entity/SpongeBlockEntityArchetypeBuilder.java +++ b/src/main/java/org/spongepowered/common/block/entity/SpongeBlockEntityArchetypeBuilder.java @@ -94,7 +94,7 @@ public BlockEntityArchetype.Builder add(final Key> key, f public BlockEntityArchetype.Builder from(final BlockEntityArchetype value) { this.type = value.blockEntityType(); this.blockState = value.state(); - this.data = value.blockEntityData(); + this.data = value.rawData(); return this; } diff --git a/src/main/java/org/spongepowered/common/data/AbstractArchetype.java b/src/main/java/org/spongepowered/common/data/AbstractArchetype.java index f039abca726..3b33ea8e681 100644 --- a/src/main/java/org/spongepowered/common/data/AbstractArchetype.java +++ b/src/main/java/org/spongepowered/common/data/AbstractArchetype.java @@ -29,6 +29,7 @@ import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableList; import net.minecraft.nbt.CompoundTag; +import org.spongepowered.api.data.persistence.DataContainer; import org.spongepowered.api.data.persistence.DataView; import org.spongepowered.api.data.persistence.InvalidDataException; import org.spongepowered.api.world.Archetype; @@ -70,13 +71,17 @@ public boolean equals(final Object o) { this.compound.equals(that.compound); } + @Override + public DataContainer rawData() { + return NBTTranslator.INSTANCE.translate(this.compound); + } + @Override public void setRawData(final DataView container) throws InvalidDataException { checkNotNull(container, "Raw data cannot be null!"); - final CompoundTag copy = NBTTranslator.INSTANCE.translate(container); - final boolean valid = this.getValidator().validate(copy); - if (valid) { - this.compound = copy; + final CompoundTag compoundTag = NBTTranslator.INSTANCE.translate(container); + if (this.getValidator().validate(compoundTag)) { + this.compound = compoundTag; } else { throw new InvalidDataException("Invalid data for " + this.getValidationType()); } @@ -84,6 +89,7 @@ public void setRawData(final DataView container) throws InvalidDataException { @Override public boolean validateRawData(final DataView container) { + checkNotNull(container, "Raw data cannot be null!"); return this.getValidator().validate(container); } diff --git a/src/main/java/org/spongepowered/common/data/provider/block/entity/MobSpawnerData.java b/src/main/java/org/spongepowered/common/data/provider/block/entity/MobSpawnerData.java index 3e35e5f342a..fd905d61caf 100644 --- a/src/main/java/org/spongepowered/common/data/provider/block/entity/MobSpawnerData.java +++ b/src/main/java/org/spongepowered/common/data/provider/block/entity/MobSpawnerData.java @@ -116,7 +116,7 @@ private static WeightedSerializableObject getNextEntity(final B } private static void setNextEntity(final SpawnerBlockEntity entity, final WeightedSerializableObject value) { - final CompoundTag compound = NBTTranslator.INSTANCE.translate(value.get().entityData()); + final CompoundTag compound = NBTTranslator.INSTANCE.translate(value.get().rawData()); if (!compound.contains(Constants.Entity.ENTITY_TYPE_ID)) { final ResourceKey key = (ResourceKey) (Object) net.minecraft.world.entity.EntityType.getKey((net.minecraft.world.entity.EntityType) value.get() .type()); @@ -155,7 +155,7 @@ private static void setEntities(final BaseSpawnerAccessor logic, final WeightedT } final WeightedObject object = (WeightedObject) entry; - final CompoundTag compound = NBTTranslator.INSTANCE.translate(object.get().entityData()); + final CompoundTag compound = NBTTranslator.INSTANCE.translate(object.get().rawData()); if (!compound.contains(Constants.Entity.ENTITY_TYPE_ID)) { final ResourceKey key = (ResourceKey) (Object) net.minecraft.world.entity.EntityType.getKey((net.minecraft.world.entity.EntityType) object .get().type()); diff --git a/src/main/java/org/spongepowered/common/entity/SpongeEntityArchetype.java b/src/main/java/org/spongepowered/common/entity/SpongeEntityArchetype.java index 3a9a10c82cc..cc041db54cf 100644 --- a/src/main/java/org/spongepowered/common/entity/SpongeEntityArchetype.java +++ b/src/main/java/org/spongepowered/common/entity/SpongeEntityArchetype.java @@ -112,7 +112,7 @@ public Optional getPosition() { @Override public DataContainer data$getDataContainer() { - return this.entityData(); + return this.rawData(); } @Override @@ -120,11 +120,6 @@ public Optional getPosition() { this.compound = NBTTranslator.INSTANCE.translate(Objects.requireNonNull(container, "DataContainer cannot be null!")); } - @Override - public DataContainer entityData() { - return NBTTranslator.INSTANCE.translateFrom(this.compound); - } - @Override public Optional apply(final ServerLocation location) { if (!PlatformHooks.INSTANCE.getGeneralHooks().onServerThread()) { @@ -210,7 +205,7 @@ public DataContainer toContainer() { return DataContainer.createNew(DataView.SafetyMode.NO_DATA_CLONED) .set(Queries.CONTENT_VERSION, this.contentVersion()) .set(Constants.Sponge.EntityArchetype.ENTITY_TYPE, this.type) - .set(Constants.Sponge.EntityArchetype.ENTITY_DATA, this.entityData()); + .set(Constants.Sponge.EntityArchetype.ENTITY_DATA, this.rawData()); } @Override diff --git a/src/main/java/org/spongepowered/common/entity/SpongeEntityArchetypeBuilder.java b/src/main/java/org/spongepowered/common/entity/SpongeEntityArchetypeBuilder.java index 8059ad6b420..6c1dafbc9ba 100644 --- a/src/main/java/org/spongepowered/common/entity/SpongeEntityArchetypeBuilder.java +++ b/src/main/java/org/spongepowered/common/entity/SpongeEntityArchetypeBuilder.java @@ -91,7 +91,7 @@ public SpongeEntityArchetypeBuilder reset() { @Override public EntityArchetype.Builder from(final EntityArchetype value) { this.entityType = value.type(); - this.compound = NBTTranslator.INSTANCE.translate(value.entityData()); + this.compound = NBTTranslator.INSTANCE.translate(value.rawData()); SpongeEntityArchetypeBuilder.stripCompound(this.compound); // TODO Copy over the pending manipulator data? this.manipulator = null; diff --git a/src/main/java/org/spongepowered/common/entity/SpongeEntitySnapshot.java b/src/main/java/org/spongepowered/common/entity/SpongeEntitySnapshot.java index 99e1f9959b5..325986ac047 100644 --- a/src/main/java/org/spongepowered/common/entity/SpongeEntitySnapshot.java +++ b/src/main/java/org/spongepowered/common/entity/SpongeEntitySnapshot.java @@ -24,6 +24,8 @@ */ package org.spongepowered.common.entity; +import static com.google.common.base.Preconditions.checkNotNull; + import com.google.common.base.MoreObjects; import net.minecraft.nbt.CompoundTag; import org.checkerframework.checker.nullness.qual.Nullable; @@ -155,15 +157,26 @@ public DataContainer toContainer() { return container; } + @Override + public DataContainer rawData() { + if (this.compound == null) { + return DataContainer.createNew(DataView.SafetyMode.NO_DATA_CLONED); + } + return NBTTranslator.INSTANCE.translate(this.compound); + } + @Override public boolean validateRawData(final DataView container) { - return new SpongeEntitySnapshotBuilder().buildContent(container).isPresent(); + checkNotNull(container, "Raw data cannot be null!"); + return true; } @Override public EntitySnapshot withRawData(final DataView container) throws InvalidDataException { - final Optional snap = new SpongeEntitySnapshotBuilder().buildContent(container); - return snap.orElseThrow(InvalidDataException::new); + checkNotNull(container, "Raw data cannot be null!"); + final SpongeEntitySnapshotBuilder builder = this.createBuilder(); + builder.unsafeCompound(NBTTranslator.INSTANCE.translate(container)); + return builder.build(); } @Override diff --git a/src/main/java/org/spongepowered/common/fluid/SpongeFluidStack.java b/src/main/java/org/spongepowered/common/fluid/SpongeFluidStack.java index 859105d766f..34d2d9ca506 100644 --- a/src/main/java/org/spongepowered/common/fluid/SpongeFluidStack.java +++ b/src/main/java/org/spongepowered/common/fluid/SpongeFluidStack.java @@ -24,6 +24,8 @@ */ package org.spongepowered.common.fluid; +import static com.google.common.base.Preconditions.checkNotNull; + import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.ResourceKey; @@ -40,9 +42,6 @@ import org.spongepowered.common.data.holder.SpongeMutableDataHolder; import org.spongepowered.common.util.Constants; -import java.util.Optional; - - public class SpongeFluidStack implements FluidStack, SpongeMutableDataHolder { private FluidType fluidType; @@ -89,32 +88,24 @@ public int volume() { return new SpongeFluidStackSnapshotBuilder().from(this).build(); } + @Override + public DataContainer rawData() { + if (this.extraData == null) { + return DataContainer.createNew(DataView.SafetyMode.NO_DATA_CLONED); + } + return extraData.copy(DataView.SafetyMode.NO_DATA_CLONED); + } + @Override public boolean validateRawData(final DataView container) { - return container.contains(Queries.CONTENT_VERSION, Constants.Fluids.FLUID_TYPE, Constants.Fluids.FLUID_VOLUME); + checkNotNull(container, "Raw data cannot be null!"); + return true; } @Override public void setRawData(final @NonNull DataView container) throws InvalidDataException { - try { - final int contentVersion = container.getInt(Queries.CONTENT_VERSION).get(); - if (contentVersion != this.contentVersion()) { - throw new InvalidDataException("Older content found! Cannot set raw data of older content!"); - } - final String rawFluid = container.getString(Constants.Fluids.FLUID_TYPE).get(); - final int volume = container.getInt(Constants.Fluids.FLUID_VOLUME).get(); - final Optional fluidType = Sponge.game().registry(RegistryTypes.FLUID_TYPE).findValue(ResourceKey.resolve(rawFluid)); - if (!fluidType.isPresent()) { - throw new InvalidDataException("Unknown FluidType found! Requested: " + rawFluid + "but got none."); - } - this.fluidType = fluidType.get(); - this.volume = volume; - if (container.contains(Constants.Sponge.UNSAFE_NBT)) { - this.extraData = container.getView(Constants.Sponge.UNSAFE_NBT).get().copy(); - } - } catch (final Exception e) { - throw new InvalidDataException("DataContainer contained invalid data!", e); - } + checkNotNull(container, "Raw data cannot be null!"); + extraData = container.copy(DataView.SafetyMode.ALL_DATA_CLONED); } @Override diff --git a/src/main/java/org/spongepowered/common/fluid/SpongeFluidStackSnapshot.java b/src/main/java/org/spongepowered/common/fluid/SpongeFluidStackSnapshot.java index 6758fc7f0f1..20d2c159be3 100644 --- a/src/main/java/org/spongepowered/common/fluid/SpongeFluidStackSnapshot.java +++ b/src/main/java/org/spongepowered/common/fluid/SpongeFluidStackSnapshot.java @@ -24,6 +24,8 @@ */ package org.spongepowered.common.fluid; +import static com.google.common.base.Preconditions.checkNotNull; + import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.spongepowered.api.ResourceKey; @@ -121,13 +123,23 @@ public boolean equals(final Object obj) { return new SpongeFluidStackSnapshot(this.fluidType, this.volume, this.extraData); } + @Override + public DataContainer rawData() { + if (this.extraData == null) { + return DataContainer.createNew(DataView.SafetyMode.NO_DATA_CLONED); + } + return extraData.copy(DataView.SafetyMode.NO_DATA_CLONED); + } + @Override public boolean validateRawData(final DataView container) { - return container.contains(Queries.CONTENT_VERSION, Constants.Fluids.FLUID_TYPE, Constants.Fluids.FLUID_VOLUME); + checkNotNull(container, "Raw data cannot be null!"); + return this.createStack().validateRawData(container); } @Override public @NonNull FluidStackSnapshot withRawData(final @NonNull DataView container) throws InvalidDataException { + checkNotNull(container, "Raw data cannot be null!"); final FluidStack stack = this.createStack(); stack.setRawData(container); return stack.createSnapshot(); diff --git a/src/main/java/org/spongepowered/common/item/SpongeItemStackSnapshot.java b/src/main/java/org/spongepowered/common/item/SpongeItemStackSnapshot.java index 02d2cb7720e..285e793e027 100644 --- a/src/main/java/org/spongepowered/common/item/SpongeItemStackSnapshot.java +++ b/src/main/java/org/spongepowered/common/item/SpongeItemStackSnapshot.java @@ -290,8 +290,17 @@ public void setCreator(final @Nullable UUID uuid) { } } + @Override + public DataContainer rawData() { + if (this.compound == null) { + return DataContainer.createNew(DataView.SafetyMode.NO_DATA_CLONED); + } + return NBTTranslator.INSTANCE.translate(this.compound); + } + @Override public ItemStackSnapshot withRawData(DataView container) throws InvalidDataException { + checkNotNull(container, "Raw data cannot be null!"); final ItemStack copy = this.privateStack.copy(); copy.setRawData(container); return copy.createSnapshot(); @@ -316,8 +325,8 @@ public ItemStackSnapshot mergeWith(ItemStackSnapshot that, MergeFunction functio @Override public boolean validateRawData(DataView container) { - final ItemStack copy = this.privateStack.copy(); - return copy.validateRawData(container); + checkNotNull(container, "Raw data cannot be null!"); + return this.privateStack.validateRawData(container); } @Override diff --git a/src/main/java/org/spongepowered/common/world/schematic/SchematicTranslator.java b/src/main/java/org/spongepowered/common/world/schematic/SchematicTranslator.java index 955aa82df9a..b1d4bfc0461 100644 --- a/src/main/java/org/spongepowered/common/world/schematic/SchematicTranslator.java +++ b/src/main/java/org/spongepowered/common/world/schematic/SchematicTranslator.java @@ -466,7 +466,7 @@ public DataView addTo(final Schematic schematic, final DataView data) { final DataContainer container = DataContainer.createNew(DataView.SafetyMode.NO_DATA_CLONED); final Vector3i pos = entry.getKey(); final BlockEntityArchetype archetype = entry.getValue(); - final DataContainer entityData = archetype.blockEntityData(); + final DataContainer entityData = archetype.rawData(); final int[] apos = new int[]{pos.x() - xMin, pos.y() - yMin, pos.z() - zMin}; container.set(Constants.Sponge.Schematic.BLOCKENTITY_POS, apos); container.set(Constants.Sponge.Schematic.BLOCKENTITY_DATA, entityData); @@ -528,7 +528,7 @@ public DataView addTo(final Schematic schematic, final DataView data) { requiredMods.add(key.namespace()); } container.set(Constants.Sponge.Schematic.ENTITIES_ID, key.toString()); - final DataContainer entityData = entry.archetype().entityData(); + final DataContainer entityData = entry.archetype().rawData(); container.set(Constants.Sponge.Schematic.BLOCKENTITY_DATA, entityData); return container; }).collect(Collectors.toList()); diff --git a/src/main/java/org/spongepowered/common/world/server/SpongeLocatableBlock.java b/src/main/java/org/spongepowered/common/world/server/SpongeLocatableBlock.java index 11511fc7940..bc629be19ed 100644 --- a/src/main/java/org/spongepowered/common/world/server/SpongeLocatableBlock.java +++ b/src/main/java/org/spongepowered/common/world/server/SpongeLocatableBlock.java @@ -156,8 +156,14 @@ public Optional without(final Key key) { return this.blockState.without(key).map(state -> LocatableBlock.builder().from(this).state(state).build()); } + @Override + public DataContainer rawData() { + return this.blockState.rawData(); + } + @Override public LocatableBlock withRawData(final DataView container) throws InvalidDataException { + checkNotNull(container, "Raw data cannot be null!"); return LocatableBlock.builder().from(this).state(this.blockState.withRawData(container)).build(); } @@ -168,6 +174,7 @@ public LocatableBlock mergeWith(final LocatableBlock that, final MergeFunction f @Override public boolean validateRawData(final DataView container) { + checkNotNull(container, "Raw data cannot be null!"); return this.blockState.validateRawData(container); } diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/EntityMixin_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/EntityMixin_API.java index 6e39f2f50d1..189df0d5f95 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/EntityMixin_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/entity/EntityMixin_API.java @@ -24,6 +24,8 @@ */ package org.spongepowered.common.mixin.api.minecraft.world.entity; +import static com.google.common.base.Preconditions.checkNotNull; + import net.kyori.adventure.key.Key; import net.kyori.adventure.text.event.HoverEvent; import net.minecraft.commands.arguments.EntityAnchorArgument; @@ -42,6 +44,8 @@ import net.minecraft.world.phys.Vec3; import org.spongepowered.api.data.Keys; import org.spongepowered.api.data.persistence.DataContainer; +import org.spongepowered.api.data.persistence.DataView; +import org.spongepowered.api.data.persistence.InvalidDataException; import org.spongepowered.api.data.persistence.Queries; import org.spongepowered.api.data.value.Value; import org.spongepowered.api.entity.EntityArchetype; @@ -108,6 +112,7 @@ public abstract class EntityMixin_API implements org.spongepowered.api.entity.En @Shadow protected abstract void shadow$setRot(float yaw, float pitch); @Shadow public abstract net.minecraft.world.phys.AABB shadow$getBoundingBox(); @Shadow public abstract boolean shadow$saveAsPassenger(CompoundTag compound); + @Shadow public abstract void shadow$load(CompoundTag compound); @Shadow @Nullable public abstract Component shadow$getCustomName(); @Shadow public abstract Component shadow$getDisplayName(); @Shadow public abstract void shadow$setRemoved(Entity.RemovalReason var1); @@ -299,6 +304,29 @@ public DataContainer toContainer() { return container; } + @Override + public DataContainer rawData() { + final CompoundTag compoundTag = new CompoundTag(); + this.shadow$saveAsPassenger(compoundTag); + return NBTTranslator.INSTANCE.translate(compoundTag); + } + + @Override + public boolean validateRawData(final DataView container) { + checkNotNull(container, "Raw data cannot be null!"); + return true; + } + + @Override + public void setRawData(final DataView container) throws InvalidDataException { + checkNotNull(container, "Raw data cannot be null!"); + try { + this.shadow$load(NBTTranslator.INSTANCE.translate(container)); + } catch (RuntimeException exception) { + throw new InvalidDataException(exception); + } + } + @Override public org.spongepowered.api.entity.Entity copy() { if ((Object) this instanceof Player) { diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/item/ItemStackMixin_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/item/ItemStackMixin_API.java index c391855af6a..29a302c9d07 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/item/ItemStackMixin_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/item/ItemStackMixin_API.java @@ -24,6 +24,8 @@ */ package org.spongepowered.common.mixin.api.minecraft.world.item; +import static com.google.common.base.Preconditions.checkNotNull; + import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; @@ -84,7 +86,7 @@ public abstract class ItemStackMixin_API implements SerializableDataHolder.Mutab @Shadow public abstract int shadow$getMaxStackSize(); @Shadow public abstract boolean shadow$hasTag(); @Shadow public abstract boolean shadow$isEmpty(); - @Shadow public abstract CompoundTag shadow$getTag(); + @Shadow public abstract @Nullable CompoundTag shadow$getTag(); @Shadow public abstract net.minecraft.world.item.ItemStack shadow$copy(); @Shadow public abstract Item shadow$getItem(); @Shadow public abstract Multimap shadow$getAttributeModifiers(EquipmentSlot equipmentSlot); @@ -111,29 +113,29 @@ public abstract class ItemStackMixin_API implements SerializableDataHolder.Mutab @Override public boolean validateRawData(final DataView container) { - Preconditions.checkNotNull(container); - return false; + checkNotNull(container, "Raw data cannot be null!"); + return true; } @Override public void setRawData(final DataView container) throws InvalidDataException { - Preconditions.checkNotNull(container); - - if (this.shadow$isEmpty()) { - throw new IllegalArgumentException("Cannot set data on empty item stacks!"); + checkNotNull(container, "Raw data cannot be null!"); + if (container.isEmpty()) { + return; // Avoid to initialize internal TagCompound } - if (!container.contains(Constants.Sponge.UNSAFE_NBT)) { - throw new InvalidDataException("There's no NBT Data set in the provided container"); - } - final DataView nbtData = container.getView(Constants.Sponge.UNSAFE_NBT).get(); try { - final int integer = container.getInt(Constants.ItemStack.DAMAGE_VALUE).orElse(this.shadow$getDamageValue()); - this.shadow$setDamageValue(integer); - final CompoundTag stackCompound = NBTTranslator.INSTANCE.translate(nbtData); - this.shadow$setTag(stackCompound); - } catch (final Exception e) { - throw new InvalidDataException("Unable to set raw data or translate raw data for ItemStack setting", e); + this.shadow$setTag(NBTTranslator.INSTANCE.translate(container)); + } catch (RuntimeException exception) { + throw new InvalidDataException(exception); + } + } + + @Override + public DataContainer rawData() { + if (!this.shadow$hasTag()) { + return DataContainer.createNew(DataView.SafetyMode.NO_DATA_CLONED); } + return NBTTranslator.INSTANCE.translate(this.shadow$getTag()); } @Override diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/block/entity/BlockEntityMixin_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/block/entity/BlockEntityMixin_API.java index cbb126d8436..49fded3bedc 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/block/entity/BlockEntityMixin_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/block/entity/BlockEntityMixin_API.java @@ -24,6 +24,8 @@ */ package org.spongepowered.common.mixin.api.minecraft.world.level.block.entity; +import static com.google.common.base.Preconditions.checkNotNull; + import net.minecraft.core.BlockPos; import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; @@ -34,6 +36,7 @@ import org.spongepowered.api.block.entity.BlockEntityType; import org.spongepowered.api.data.persistence.DataContainer; import org.spongepowered.api.data.persistence.DataView; +import org.spongepowered.api.data.persistence.InvalidDataException; import org.spongepowered.api.data.persistence.Queries; import org.spongepowered.api.data.value.Value; import org.spongepowered.api.world.LocatableBlock; @@ -66,6 +69,7 @@ public abstract class BlockEntityMixin_API implements BlockEntity { @Shadow public abstract BlockPos shadow$getBlockPos(); @Shadow public abstract CompoundTag shadow$saveWithFullMetadata(); + @Shadow public abstract void shadow$load(CompoundTag compoundTag); //@formatter:on @Shadow @Final protected BlockPos worldPosition; @@ -121,14 +125,25 @@ public DataContainer toContainer() { return container; } + @Override + public DataContainer rawData() { + return NBTTranslator.INSTANCE.translate(this.shadow$saveWithFullMetadata()); + } + @Override public boolean validateRawData(final DataView container) { - return container.contains(Queries.WORLD_KEY) - && container.contains(Queries.POSITION_X) - && container.contains(Queries.POSITION_Y) - && container.contains(Queries.POSITION_Z) - && container.contains(Constants.TileEntity.TILE_TYPE) - && container.contains(Constants.Sponge.UNSAFE_NBT); + checkNotNull(container, "Raw data cannot be null!"); + return true; + } + + @Override + public void setRawData(final DataView container) throws InvalidDataException { + checkNotNull(container, "Raw data cannot be null!"); + try { + this.shadow$load(NBTTranslator.INSTANCE.translate(container)); + } catch (RuntimeException exception) { + throw new InvalidDataException(exception); + } } @Override diff --git a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/block/state/BlockStateMixin_API.java b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/block/state/BlockStateMixin_API.java index 128459013fd..7643d7f1feb 100644 --- a/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/block/state/BlockStateMixin_API.java +++ b/src/mixins/java/org/spongepowered/common/mixin/api/minecraft/world/level/block/state/BlockStateMixin_API.java @@ -24,6 +24,8 @@ */ package org.spongepowered.common.mixin.api.minecraft.world.level.block.state; +import static com.google.common.base.Preconditions.checkNotNull; + import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; import org.spongepowered.api.block.BlockSnapshot; @@ -81,9 +83,15 @@ public BlockSnapshot snapshotFor(final ServerLocation location) { return builder.build(); } + @Override + public DataContainer rawData() { + return DataContainer.createNew(DataView.SafetyMode.NO_DATA_CLONED); // BlockState has no extra data + } + @Override public boolean validateRawData(final DataView container) { - return container.contains(Constants.Block.BLOCK_STATE); + checkNotNull(container, "Raw data cannot be null!"); + return true; } @Override @@ -93,7 +101,8 @@ public Optional get(final Direction direction, final Key Optional get( return Optional.empty(); } + @Override + public DataContainer rawData() { + return null; + } + @Override public boolean validateRawData(final DataView container) { return false;