From d020e5dfd2647749ff4c566b7dd75b1ca78ba595 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 2 Dec 2025 02:09:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E5=AE=9E=E4=BD=93=E6=9E=84=E9=80=A0=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/core/entity/CustomEntity.java | 2 +- .../core/entity/InactiveCustomEntity.java | 4 +- .../core/entity/furniture/Furniture.java | 51 ++++++++++++++++--- .../furniture/FurnitureDataAccessor.java | 2 +- 4 files changed, 48 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/CustomEntity.java b/core/src/main/java/net/momirealms/craftengine/core/entity/CustomEntity.java index 2ea1439a4..424174dd5 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/CustomEntity.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/CustomEntity.java @@ -13,7 +13,7 @@ public abstract class CustomEntity implements Cullable { protected WorldPosition position; protected boolean valid = true; - protected CustomEntity(CustomEntityType type, WorldPosition position, UUID uuid) { + protected CustomEntity(CustomEntityType type, UUID uuid, WorldPosition position) { this.position = position; this.type = type; this.uuid = uuid; diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/InactiveCustomEntity.java b/core/src/main/java/net/momirealms/craftengine/core/entity/InactiveCustomEntity.java index 1c870110a..9a4633d37 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/InactiveCustomEntity.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/InactiveCustomEntity.java @@ -15,12 +15,12 @@ public class InactiveCustomEntity extends CustomEntity { private final CompoundTag data; public InactiveCustomEntity(UUID uuid, WorldPosition position) { - super(CustomEntityTypes.INACTIVE, position, uuid); + super(CustomEntityTypes.INACTIVE, uuid, position); this.data = INVALID_TAG; } public InactiveCustomEntity(UUID uuid, WorldPosition position, CompoundTag data) { - super(CustomEntityTypes.INACTIVE, position, uuid); + super(CustomEntityTypes.INACTIVE, uuid, position); this.data = data; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Furniture.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Furniture.java index 1b4661ba1..236a014b8 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Furniture.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Furniture.java @@ -2,18 +2,51 @@ package net.momirealms.craftengine.core.entity.furniture; import net.momirealms.craftengine.core.entity.CustomEntity; import net.momirealms.craftengine.core.entity.CustomEntityType; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.world.WorldPosition; import net.momirealms.sparrow.nbt.CompoundTag; import org.jetbrains.annotations.NotNull; -public abstract class Furniture extends CustomEntity { - protected final FurnitureConfig config; - protected final FurnitureDataAccessor dataAccessor; +import java.util.Optional; +import java.util.UUID; - public Furniture(CustomEntityType type, WorldPosition position, FurnitureConfig config, CompoundTag data) { - super(type, position); - this.dataAccessor = new FurnitureDataAccessor(data); - this.config = config; +public abstract class Furniture extends CustomEntity { + protected FurnitureConfig config; + protected FurnitureDataAccessor dataAccessor; + + protected Key furnitureId; + protected CompoundTag inactiveFurnitureData; + + protected Furniture(CustomEntityType type, UUID uuid, WorldPosition position) { + super(type, uuid, position); + } + + @Override + protected void saveCustomData(CompoundTag tag) { + tag.putString("id", this.config.id().asMinimalString()); + + } + + @Override + public void loadCustomData(CompoundTag tag) { + this.furnitureId = readFurnitureId(tag); + this.dataAccessor = new FurnitureDataAccessor(tag.getCompound("data")); + Optional furnitureConfig = CraftEngine.instance().furnitureManager().furnitureById(this.furnitureId); + if (furnitureConfig.isPresent()) { + this.config = furnitureConfig.get(); + } else { + this.inactiveFurnitureData = tag; + } + } + + @Override + public CompoundTag saveAsTag() { + // 如果家具数据只是不活跃,则返回不活跃家具数据 + if (this.inactiveFurnitureData != null) { + return this.inactiveFurnitureData; + } + return super.saveAsTag(); } @NotNull @@ -25,4 +58,8 @@ public abstract class Furniture extends CustomEntity { public FurnitureDataAccessor dataAccessor() { return this.dataAccessor; } + + protected final Key readFurnitureId(CompoundTag tag) { + return Key.of(tag.getString("id")); + } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureDataAccessor.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureDataAccessor.java index 07a6ccbb5..34f862f4f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureDataAccessor.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureDataAccessor.java @@ -24,7 +24,7 @@ public class FurnitureDataAccessor { private final CompoundTag data; public FurnitureDataAccessor(CompoundTag data) { - this.data = data; + this.data = data == null ? new CompoundTag() : data; } public static FurnitureDataAccessor of(CompoundTag data) {