From 37526c981fdfedb20acc9466686c9dda55568552 Mon Sep 17 00:00:00 2001 From: aromaa Date: Thu, 7 Dec 2023 22:00:05 +0200 Subject: [PATCH 1/2] Allow querying block entity data from archetype --- .../common/block/SpongeBlockSnapshot.java | 18 +++++++++++++++++- .../entity/SpongeBlockEntityArchetype.java | 16 ++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/spongepowered/common/block/SpongeBlockSnapshot.java b/src/main/java/org/spongepowered/common/block/SpongeBlockSnapshot.java index 00f16fc5998..c5ba4b572a8 100644 --- a/src/main/java/org/spongepowered/common/block/SpongeBlockSnapshot.java +++ b/src/main/java/org/spongepowered/common/block/SpongeBlockSnapshot.java @@ -25,7 +25,9 @@ package org.spongepowered.common.block; import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; @@ -39,6 +41,7 @@ import org.spongepowered.api.block.BlockSnapshot; import org.spongepowered.api.block.BlockState; import org.spongepowered.api.block.entity.BlockEntityArchetype; +import org.spongepowered.api.block.entity.BlockEntityType; import org.spongepowered.api.data.DataHolder; import org.spongepowered.api.data.DataManipulator; import org.spongepowered.api.data.Key; @@ -54,6 +57,7 @@ import org.spongepowered.api.world.server.ServerWorld; import org.spongepowered.api.world.server.storage.ServerWorldProperties; import org.spongepowered.common.SpongeCommon; +import org.spongepowered.common.block.entity.SpongeBlockEntityArchetypeBuilder; import org.spongepowered.common.bridge.data.DataCompoundHolder; import org.spongepowered.common.bridge.data.DataContainerHolder; import org.spongepowered.common.data.holder.SpongeImmutableDataHolder; @@ -257,7 +261,19 @@ public Optional notifier() { @Override public Optional createArchetype() { - throw new UnsupportedOperationException("Not implemented yet, please fix when this is called"); + final String blockEntityId = compound.getString(Constants.Item.BLOCK_ENTITY_ID); + + final CompoundTag compound = this.compound.copy(); + compound.remove(Constants.Sponge.BlockSnapshot.TILE_ENTITY_POSITION_X); + compound.remove(Constants.Sponge.BlockSnapshot.TILE_ENTITY_POSITION_Y); + compound.remove(Constants.Sponge.BlockSnapshot.TILE_ENTITY_POSITION_Z); + compound.remove(Constants.Item.BLOCK_ENTITY_ID); + + return Optional.of(SpongeBlockEntityArchetypeBuilder.pooled() + .state(this.state()) + .blockEntity((BlockEntityType) SpongeCommon.vanillaRegistry(Registries.BLOCK_ENTITY_TYPE).get(ResourceLocation.tryParse(blockEntityId))) + .blockEntityData(NBTTranslator.INSTANCE.translate(compound)) + .build()); } @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..69db251f152 100644 --- a/src/main/java/org/spongepowered/common/block/entity/SpongeBlockEntityArchetype.java +++ b/src/main/java/org/spongepowered/common/block/entity/SpongeBlockEntityArchetype.java @@ -27,6 +27,7 @@ import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableList; import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -35,11 +36,13 @@ import org.spongepowered.api.block.BlockState; import org.spongepowered.api.block.entity.BlockEntity; import org.spongepowered.api.block.entity.BlockEntityType; +import org.spongepowered.api.data.DataHolder; import org.spongepowered.api.data.persistence.DataContainer; import org.spongepowered.api.data.persistence.DataView; import org.spongepowered.api.data.persistence.Queries; import org.spongepowered.api.world.BlockChangeFlags; import org.spongepowered.api.world.server.ServerLocation; +import org.spongepowered.common.SpongeCommon; import org.spongepowered.common.block.SpongeBlockSnapshot; import org.spongepowered.common.data.AbstractArchetype; import org.spongepowered.common.data.SpongeDataManager; @@ -51,6 +54,8 @@ import org.spongepowered.common.util.Constants; import org.spongepowered.common.util.VecHelper; +import java.util.Arrays; +import java.util.List; import java.util.Objects; import java.util.Optional; @@ -64,6 +69,8 @@ public final class SpongeBlockEntityArchetype extends AbstractArchetype impl$delegateDataHolder() { + if (this.cachedBlockEntity == null) { + final CompoundTag compound = this.compound.copy(); + compound.putString(Constants.Item.BLOCK_ENTITY_ID, SpongeCommon.vanillaRegistry(Registries.BLOCK_ENTITY_TYPE).getKey((net.minecraft.world.level.block.entity.BlockEntityType) this.type).toString()); + this.cachedBlockEntity = net.minecraft.world.level.block.entity.BlockEntity.loadStatic(new BlockPos(0, 0, 0), (net.minecraft.world.level.block.state.BlockState) this.blockState, compound); + } + return Arrays.asList(this, (DataHolder) this.cachedBlockEntity); + } } From 178b4e04c7b1fa75cfc89d4f8e9e936f9ac9f431 Mon Sep 17 00:00:00 2001 From: aromaa Date: Mon, 6 May 2024 02:15:06 +0300 Subject: [PATCH 2/2] Add test plugin --- .../common/block/SpongeBlockSnapshot.java | 6 +++- .../test/archetype/ArchetypeTest.java | 33 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/spongepowered/common/block/SpongeBlockSnapshot.java b/src/main/java/org/spongepowered/common/block/SpongeBlockSnapshot.java index c5ba4b572a8..96dbcf3e0d9 100644 --- a/src/main/java/org/spongepowered/common/block/SpongeBlockSnapshot.java +++ b/src/main/java/org/spongepowered/common/block/SpongeBlockSnapshot.java @@ -261,7 +261,11 @@ public Optional notifier() { @Override public Optional createArchetype() { - final String blockEntityId = compound.getString(Constants.Item.BLOCK_ENTITY_ID); + if (this.compound == null) { + return Optional.empty(); + } + + final String blockEntityId = this.compound.getString(Constants.Item.BLOCK_ENTITY_ID); final CompoundTag compound = this.compound.copy(); compound.remove(Constants.Sponge.BlockSnapshot.TILE_ENTITY_POSITION_X); diff --git a/testplugins/src/main/java/org/spongepowered/test/archetype/ArchetypeTest.java b/testplugins/src/main/java/org/spongepowered/test/archetype/ArchetypeTest.java index 043fbd6ced8..b3b4670b36c 100644 --- a/testplugins/src/main/java/org/spongepowered/test/archetype/ArchetypeTest.java +++ b/testplugins/src/main/java/org/spongepowered/test/archetype/ArchetypeTest.java @@ -25,10 +25,14 @@ package org.spongepowered.test.archetype; import com.google.inject.Inject; +import net.kyori.adventure.text.Component; +import org.spongepowered.api.ResourceKey; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.Command; import org.spongepowered.api.command.CommandResult; import org.spongepowered.api.command.parameter.CommandContext; +import org.spongepowered.api.command.parameter.Parameter; +import org.spongepowered.api.data.Key; import org.spongepowered.api.entity.Entity; import org.spongepowered.api.entity.EntityArchetype; import org.spongepowered.api.entity.EntitySnapshot; @@ -40,11 +44,13 @@ import org.spongepowered.api.event.cause.entity.SpawnTypes; import org.spongepowered.api.event.entity.InteractEntityEvent; import org.spongepowered.api.event.lifecycle.RegisterCommandEvent; +import org.spongepowered.api.world.server.ServerLocation; import org.spongepowered.plugin.PluginContainer; import org.spongepowered.plugin.builtin.jvm.Plugin; import org.spongepowered.test.LoadableModule; // TODO other Archetypes +@SuppressWarnings({"unchecked", "rawtypes"}) @Plugin("archetypetest") public final class ArchetypeTest implements LoadableModule { @@ -60,6 +66,10 @@ private void registerCommands(final RegisterCommandEvent event.register(this.plugin, Command.builder() .addChild(Command.builder().executor(this::testEntityArchetype).build(), "entity") .build(), "testarchetypes"); + + event.register(this.plugin, Command.builder() + .addChild(this.queryBlockArchetype(), "block") + .build(), "queryArchetype"); } private CommandResult testEntityArchetype(CommandContext context) { @@ -70,6 +80,29 @@ private CommandResult testEntityArchetype(CommandContext context) { return CommandResult.success(); } + private Command.Parameterized queryBlockArchetype() { + final Parameter.Value serverLocationParameter = Parameter.location().key("location").build(); + final Parameter.Value resourceKeyValue = Parameter.resourceKey().key("resourceKey").build(); + + return Command.builder() + .addParameter(serverLocationParameter) + .addParameter(resourceKeyValue) + .executor(context -> { + final ServerLocation location = context.requireOne(serverLocationParameter); + final ResourceKey resourceKey = context.requireOne(resourceKeyValue); + location.createSnapshot().createArchetype().ifPresentOrElse(a -> + a.getKeys() + .stream() + .filter(k -> k.key().equals(resourceKey)) + .findFirst() + .ifPresentOrElse(k -> context.sendMessage(Component.text("Value: " + a.get((Key) k).orElse(null))), + () -> context.sendMessage(Component.text("Not valid key"))), + () -> context.sendMessage(Component.text("No valid archetype could be created"))); + return CommandResult.success(); + }) + .build(); + } + @Override public void enable(CommandContext ctx) { Sponge.eventManager().registerListeners(this.plugin, new ArchetypeTestListener());