From 81cf2055e40394dea1bf76b59bdd1c26fdd74aa7 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Fri, 9 May 2025 02:34:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BA=E5=AE=B6=E5=85=B7=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E6=8E=89=E8=90=BD=E7=89=A9=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/default/configuration/furniture.yml | 3 +++ .../bukkit/api/CraftEngineFurniture.java | 2 +- .../entity/furniture/BukkitFurnitureManager.java | 8 ++++++-- .../bukkit/entity/furniture/LoadedFurniture.java | 15 +++++++++++++-- .../core/entity/furniture/CustomFurniture.java | 4 +++- 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/furniture.yml b/bukkit/loader/src/main/resources/resources/default/configuration/furniture.yml index 05578bdbc..e8eb30a91 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/furniture.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/furniture.yml @@ -17,6 +17,7 @@ items: place: minecraft:block.bamboo_wood.place placement: ground: + loot-spawn-offset: 0.5,0.5,0 rules: # ANY / FOUR / EIGHT / SIXTEEN / NORTH / EAST / WEST / SOUTH rotation: FOUR @@ -61,6 +62,7 @@ items: place: minecraft:block.lantern.place placement: ground: + loot-spawn-offset: 0,0.2,0 rules: rotation: ANY alignment: QUARTER @@ -111,6 +113,7 @@ items: place: minecraft:block.bamboo_wood.place placement: ground: + loot-spawn-offset: 0,0.4,0 rules: rotation: ANY alignment: ANY diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java index 134fda9a6..d611eec59 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java @@ -263,7 +263,7 @@ public final class CraftEngineFurniture { @Nullable net.momirealms.craftengine.core.entity.player.Player player, boolean dropLoot, boolean playSound) { - Location location = loadedFurniture.location(); + Location location = loadedFurniture.dropLocation(); loadedFurniture.destroy(); LootTable lootTable = (LootTable) loadedFurniture.config().lootTable(); Vec3d vec3d = LocationUtils.toVec3d(location); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java index faad973b1..120430faa 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java @@ -124,6 +124,8 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager { AnchorType anchorType = AnchorType.valueOf(entry.getKey().toUpperCase(Locale.ENGLISH)); Map placementArguments = MiscUtils.castToMap(entry.getValue(), true); + Optional optionalLootSpawnOffset = Optional.ofNullable(placementArguments.get("loot-spawn-offset")).map(it -> MiscUtils.getAsVector3f(it, "loot-spawn-offset")); + // furniture display elements List elements = new ArrayList<>(); List> elementConfigs = (List>) placementArguments.getOrDefault("elements", List.of()); @@ -178,7 +180,8 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager { hitboxes.toArray(new HitBox[0]), rotationRule, alignmentRule, - externalModel + externalModel, + optionalLootSpawnOffset )); } else { placements.put(anchorType, new CustomFurniture.Placement( @@ -186,7 +189,8 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager { hitboxes.toArray(new HitBox[0]), RotationRule.ANY, AlignmentRule.CENTER, - externalModel + externalModel, + optionalLootSpawnOffset )); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java index 40505ab8d..ac8ba908a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java @@ -75,9 +75,9 @@ public class LoadedFurniture implements Furniture { } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to load external model for furniture " + id, e); } - hasExternalModel = true; + this.hasExternalModel = true; } else { - hasExternalModel = false; + this.hasExternalModel = false; } float yaw = this.location.getYaw(); @@ -176,6 +176,17 @@ public class LoadedFurniture implements Furniture { return baseEntity().isValid(); } + @NotNull + public Location dropLocation() { + Optional dropOffset = config().getPlacement(this.anchorType).dropOffset(); + if (dropOffset.isEmpty()) { + return location(); + } + Quaternionf conjugated = QuaternionUtils.toQuaternionf(0, Math.toRadians(180 - this.location.getYaw()), 0).conjugate(); + Vector3f offset = conjugated.transform(new Vector3f(dropOffset.get())); + return new Location(this.location.getWorld(), this.location.getX() + offset.x, this.location.getY() + offset.y, this.location.getZ() - offset.z); + } + @Override public void destroy() { if (!isValid()) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/CustomFurniture.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/CustomFurniture.java index 1b8679ae6..cbf5f12c9 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/CustomFurniture.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/CustomFurniture.java @@ -4,6 +4,7 @@ import net.momirealms.craftengine.core.loot.LootTable; import net.momirealms.craftengine.core.util.Key; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3f; import java.util.EnumMap; import java.util.Optional; @@ -60,6 +61,7 @@ public class CustomFurniture { HitBox[] hitBoxes, RotationRule rotationRule, AlignmentRule alignmentRule, - Optional externalModel) { + Optional externalModel, + Optional dropOffset) { } }