From 6537a4cea9661058b50f02c2d74e84e9ab51583d Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Fri, 5 Dec 2025 01:48:50 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=85=89=E7=BA=BF?= =?UTF-8?q?=E8=BF=BD=E8=B8=AA=E9=83=A8=E5=88=86=E5=AE=B6=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/entity/furniture/BukkitFurniture.java | 6 +----- .../furniture/hitbox/CustomFurnitureHitboxConfig.java | 4 ++-- .../furniture/hitbox/HappyGhastFurnitureHitboxConfig.java | 4 ++-- .../furniture/hitbox/InteractionFurnitureHitboxConfig.java | 4 ++-- .../furniture/hitbox/ShulkerFurnitureHitboxConfig.java | 4 ++-- .../bukkit/item/behavior/FurnitureItemBehavior.java | 2 +- .../craftengine/bukkit/plugin/user/BukkitServerPlayer.java | 2 +- .../craftengine/core/entity/furniture/Furniture.java | 2 +- .../core/entity/furniture/hitbox/FurnitureHitBoxConfig.java | 2 +- .../core/plugin/entityculling/EntityCulling.java | 1 + 10 files changed, 14 insertions(+), 17 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java index e7fe83ce7..c8030e0d8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java @@ -9,11 +9,7 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MEntityType import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.core.entity.furniture.*; import net.momirealms.craftengine.core.entity.furniture.hitbox.FurnitureHitBoxConfig; -import net.momirealms.craftengine.core.entity.player.InteractionResult; -import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.QuaternionUtils; -import net.momirealms.craftengine.core.util.VersionHelper; -import net.momirealms.craftengine.core.world.Vec3d; import net.momirealms.craftengine.core.world.WorldPosition; import net.momirealms.craftengine.core.world.collision.AABB; import org.bukkit.Location; @@ -75,7 +71,7 @@ public class BukkitFurniture extends Furniture { // 检查新位置是否可用 List aabbs = new ArrayList<>(); for (FurnitureHitBoxConfig hitBoxConfig : getCurrentVariant().hitBoxConfigs()) { - hitBoxConfig.prepareForPlacement(position, aabbs::add); + hitBoxConfig.prepareBoundingBox(position, aabbs::add, false); } if (!aabbs.isEmpty()) { if (!FastNMS.INSTANCE.checkEntityCollision(position.world.serverWorld(), aabbs.stream().map(it -> FastNMS.INSTANCE.constructor$AABB(it.minX, it.minY, it.minZ, it.maxX, it.maxY, it.maxZ)).toList())) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/CustomFurnitureHitboxConfig.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/CustomFurnitureHitboxConfig.java index d7147708c..bd53f0015 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/CustomFurnitureHitboxConfig.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/CustomFurnitureHitboxConfig.java @@ -71,8 +71,8 @@ public class CustomFurnitureHitboxConfig extends AbstractFurnitureHitBoxConfig aabbConsumer) { - if (this.blocksBuilding) { + public void prepareBoundingBox(WorldPosition targetPos, Consumer aabbConsumer, boolean ignoreBlocksBuilding) { + if (this.blocksBuilding || ignoreBlocksBuilding) { Vec3d relativePosition = Furniture.getRelativePosition(targetPos, this.position); aabbConsumer.accept(AABB.makeBoundingBox(relativePosition, this.width, this.height)); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/HappyGhastFurnitureHitboxConfig.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/HappyGhastFurnitureHitboxConfig.java index 6264b3a5f..3ee687d59 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/HappyGhastFurnitureHitboxConfig.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/HappyGhastFurnitureHitboxConfig.java @@ -56,8 +56,8 @@ public class HappyGhastFurnitureHitboxConfig extends AbstractFurnitureHitBoxConf } @Override - public void prepareForPlacement(WorldPosition targetPos, Consumer aabbConsumer) { - if (this.blocksBuilding) { + public void prepareBoundingBox(WorldPosition targetPos, Consumer aabbConsumer, boolean ignoreBlocksBuilding) { + if (this.blocksBuilding || ignoreBlocksBuilding) { Vec3d relativePosition = Furniture.getRelativePosition(targetPos, this.position); aabbConsumer.accept(AABB.makeBoundingBox(relativePosition, 4 * this.scale, 4 * this.scale)); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/InteractionFurnitureHitboxConfig.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/InteractionFurnitureHitboxConfig.java index 909335b0a..40caaf1ee 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/InteractionFurnitureHitboxConfig.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/InteractionFurnitureHitboxConfig.java @@ -70,8 +70,8 @@ public class InteractionFurnitureHitboxConfig extends AbstractFurnitureHitBoxCon } @Override - public void prepareForPlacement(WorldPosition targetPos, Consumer aabbConsumer) { - if (this.blocksBuilding) { + public void prepareBoundingBox(WorldPosition targetPos, Consumer aabbConsumer, boolean ignoreBlocksBuilding) { + if (this.blocksBuilding || ignoreBlocksBuilding) { Vec3d relativePosition = Furniture.getRelativePosition(targetPos, this.position); aabbConsumer.accept(AABB.makeBoundingBox(relativePosition, size.x, size.y)); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerFurnitureHitboxConfig.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerFurnitureHitboxConfig.java index 2b309b806..6756948bb 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerFurnitureHitboxConfig.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerFurnitureHitboxConfig.java @@ -145,8 +145,8 @@ public class ShulkerFurnitureHitboxConfig extends AbstractFurnitureHitBoxConfig< } @Override - public void prepareForPlacement(WorldPosition targetPos, Consumer aabbConsumer) { - if (this.blocksBuilding) { + public void prepareBoundingBox(WorldPosition targetPos, Consumer aabbConsumer, boolean ignoreBlocksBuilding) { + if (this.blocksBuilding || ignoreBlocksBuilding) { Quaternionf conjugated = QuaternionUtils.toQuaternionf(0f, (float) Math.toRadians(180 - targetPos.yRot()), 0f).conjugate(); Vector3f offset = conjugated.transform(new Vector3f(position())); aabbConsumer.accept(this.aabbCreator.create(targetPos.x, targetPos.y, targetPos.z, targetPos.yRot, offset)); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java index 3c3d34027..28493cd5f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java @@ -114,7 +114,7 @@ public class FurnitureItemBehavior extends ItemBehavior { List aabbs = new ArrayList<>(); // 收集阻挡的碰撞箱 for (FurnitureHitBoxConfig hitBoxConfig : variant.hitBoxConfigs()) { - hitBoxConfig.prepareForPlacement(furniturePos, aabbs::add); + hitBoxConfig.prepareBoundingBox(furniturePos, aabbs::add, false); } // 检查方块、实体阻挡 if (!aabbs.isEmpty()) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 2bc3a8635..06653a9f4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -566,7 +566,7 @@ public class BukkitServerPlayer extends Player { FurnitureVariant currentVariant = furniture.getCurrentVariant(); List aabbs = new ArrayList<>(); for (FurnitureHitBoxConfig config : currentVariant.hitBoxConfigs()) { - config.prepareForPlacement(furniture.position(), aabbs::add); + config.prepareBoundingBox(furniture.position(), aabbs::add, true); } Key endRod = Key.of("soul_fire_flame"); for (AABB aabb : aabbs) { 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 d5d51596e..ec865cdff 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 @@ -130,7 +130,7 @@ public abstract class Furniture implements Cullable { if (aabb == null) { List aabbs = new ArrayList<>(); for (FurnitureHitBoxConfig hitBoxConfig : this.currentVariant.hitBoxConfigs()) { - hitBoxConfig.prepareForPlacement(position, aabbs::add); + hitBoxConfig.prepareBoundingBox(position, aabbs::add, true); } return new CullingData(getMaxAABB(aabbs), parent.maxDistance, parent.aabbExpansion, parent.rayTracing); } else { diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/hitbox/FurnitureHitBoxConfig.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/hitbox/FurnitureHitBoxConfig.java index 7c8325e00..319a0f6a1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/hitbox/FurnitureHitBoxConfig.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/hitbox/FurnitureHitBoxConfig.java @@ -22,6 +22,6 @@ public interface FurnitureHitBoxConfig { boolean canUseItemOn(); - void prepareForPlacement(WorldPosition targetPos, Consumer aabbConsumer); + void prepareBoundingBox(WorldPosition targetPos, Consumer aabbConsumer, boolean ignoreBlocksBuilding); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/entityculling/EntityCulling.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/entityculling/EntityCulling.java index 79dac8655..183558688 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/entityculling/EntityCulling.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/entityculling/EntityCulling.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.plugin.entityculling; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.plugin.config.Config; +import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.world.ChunkPos; import net.momirealms.craftengine.core.world.MutableVec3d; From 94bc0e84824b10fbf0d94d7cdf81eba2c21cf684 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Fri, 5 Dec 2025 01:51:43 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E7=89=A9=E5=93=81=E6=A0=8F=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/context/event/EventFunctions.java | 1 + .../function/CloseInventoryFunction.java | 50 +++++++++++++++++++ .../context/function/CommonFunctions.java | 1 + 3 files changed, 52 insertions(+) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CloseInventoryFunction.java diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java index fbc8a4e69..4ddd76b8e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java @@ -58,6 +58,7 @@ public class EventFunctions { register(CommonFunctions.SET_EXP, new SetExpFunction.FactoryImpl<>(EventConditions::fromMap)); register(CommonFunctions.SET_LEVEL, new SetLevelFunction.FactoryImpl<>(EventConditions::fromMap)); register(CommonFunctions.PLAY_TOTEM_ANIMATION, new PlayTotemAnimationFunction.FactoryImpl<>(EventConditions::fromMap)); + register(CommonFunctions.CLOSE_INVENTORY, new CloseInventoryFunction.FactoryImpl<>(EventConditions::fromMap)); } public static void register(Key key, FunctionFactory factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CloseInventoryFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CloseInventoryFunction.java new file mode 100644 index 000000000..2b052af0f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CloseInventoryFunction.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.core.plugin.context.function; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; +import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelector; +import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelectors; +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Map; + +public class CloseInventoryFunction extends AbstractConditionalFunction { + private final PlayerSelector selector; + + public CloseInventoryFunction(List> predicates, @Nullable PlayerSelector selector) { + super(predicates); + this.selector = selector; + } + + @Override + public void runInternal(CTX ctx) { + if (this.selector == null) { + ctx.getOptionalParameter(DirectContextParameters.PLAYER).ifPresent(Player::closeInventory); + } else { + for (Player viewer : this.selector.get(ctx)) { + viewer.closeInventory(); + } + } + } + + @Override + public Key type() { + return CommonFunctions.TITLE; + } + + public static class FactoryImpl extends AbstractFactory { + + public FactoryImpl(java.util.function.Function, Condition> factory) { + super(factory); + } + + @Override + public Function create(Map arguments) { + return new CloseInventoryFunction<>(getPredicates(arguments), PlayerSelectors.fromObject(arguments.get("target"), conditionFactory())); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java index 937534105..128799962 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java @@ -49,4 +49,5 @@ public final class CommonFunctions { public static final Key SET_EXP = Key.of("craftengine:set_exp"); public static final Key SET_LEVEL = Key.of("craftengine:set_level"); public static final Key PLAY_TOTEM_ANIMATION = Key.of("craftengine:play_totem_animation"); + public static final Key CLOSE_INVENTORY = Key.of("craftengine:close_inventory"); } From 77bc8f8ae40f821c2a2e7b590de9e52af02e90c3 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Fri, 5 Dec 2025 01:53:32 +0800 Subject: [PATCH 3/7] Update CloseInventoryFunction.java --- .../core/plugin/context/function/CloseInventoryFunction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CloseInventoryFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CloseInventoryFunction.java index 2b052af0f..4b99be7dd 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CloseInventoryFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CloseInventoryFunction.java @@ -33,7 +33,7 @@ public class CloseInventoryFunction extends AbstractConditi @Override public Key type() { - return CommonFunctions.TITLE; + return CommonFunctions.CLOSE_INVENTORY; } public static class FactoryImpl extends AbstractFactory { From f85aa51f9d18c88b2250a7c8005cafba12621b0b Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Fri, 5 Dec 2025 02:31:46 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=93=AD=E7=89=8C?= =?UTF-8?q?=E5=B8=BD=E5=AD=90=E9=AB=98=E5=BA=A6=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BukkitCompatibilityManager.java | 2 + .../tag/CustomNameplateHatSettings.java | 84 +++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/CustomNameplateHatSettings.java diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java index 28d614af0..c56a998aa 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java @@ -19,6 +19,7 @@ import net.momirealms.craftengine.bukkit.compatibility.quickshop.QuickShopItemEx import net.momirealms.craftengine.bukkit.compatibility.region.WorldGuardRegionCondition; import net.momirealms.craftengine.bukkit.compatibility.skript.SkriptHook; import net.momirealms.craftengine.bukkit.compatibility.slimeworld.SlimeFormatStorageAdaptor; +import net.momirealms.craftengine.bukkit.compatibility.tag.CustomNameplateHatSettings; import net.momirealms.craftengine.bukkit.compatibility.tag.CustomNameplateProviders; import net.momirealms.craftengine.bukkit.compatibility.viaversion.ViaVersionUtils; import net.momirealms.craftengine.bukkit.compatibility.worldedit.WorldEditBlockRegister; @@ -97,6 +98,7 @@ public class BukkitCompatibilityManager implements CompatibilityManager { registerTagResolverProvider(new CustomNameplateProviders.Background()); registerTagResolverProvider(new CustomNameplateProviders.Nameplate()); registerTagResolverProvider(new CustomNameplateProviders.Bubble()); + new CustomNameplateHatSettings().register(); logHook("CustomNameplates"); } Key worldGuardRegion = Key.of("worldguard:region"); diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/CustomNameplateHatSettings.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/CustomNameplateHatSettings.java new file mode 100644 index 000000000..232161645 --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/tag/CustomNameplateHatSettings.java @@ -0,0 +1,84 @@ +package net.momirealms.craftengine.bukkit.compatibility.tag; + +import io.papermc.paper.event.entity.EntityEquipmentChangedEvent; +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.core.item.CustomItem; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemSettings; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.CustomDataType; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.customnameplates.api.CNPlayer; +import net.momirealms.customnameplates.api.CustomNameplates; +import net.momirealms.customnameplates.api.CustomNameplatesAPI; +import net.momirealms.customnameplates.api.feature.tag.TagRenderer; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; + +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +public final class CustomNameplateHatSettings implements Listener { + public static final CustomDataType HAT_HEIGHT = new CustomDataType<>(); + + public void register() { + ItemSettings.Modifiers.registerFactory("hat-height", height -> { + double heightD = ResourceConfigUtils.getAsDouble(height, "hat-height"); + return settings -> settings.addCustomData(HAT_HEIGHT, heightD); + }); + Bukkit.getPluginManager().registerEvents(this, BukkitCraftEngine.instance().javaPlugin()); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onEquipmentChange(EntityEquipmentChangedEvent event) { + if (!(event.getEntity() instanceof Player player)) return; + Map equipmentChanges = event.getEquipmentChanges(); + EntityEquipmentChangedEvent.EquipmentChange equipmentChange = equipmentChanges.get(EquipmentSlot.HEAD); + if (equipmentChange == null) return; + ItemStack newItem = equipmentChange.newItem(); + updateHatHeight(player, newItem); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + // 稍微延迟一下,可以等待背包同步插件的处理 + if (VersionHelper.isFolia()) { + player.getScheduler().runDelayed(BukkitCraftEngine.instance().javaPlugin(), t1 -> { + if (player.isOnline()) { + updateHatHeight(player, player.getInventory().getItem(EquipmentSlot.HEAD)); + } + }, null, 10); + } else { + CraftEngine.instance().scheduler().sync().runLater(() -> { + if (player.isOnline()) { + updateHatHeight(player, player.getInventory().getItem(EquipmentSlot.HEAD)); + } + }, 10); + } + } + + public void updateHatHeight(Player player, ItemStack newItem) { + CNPlayer cnPlayer = CustomNameplatesAPI.getInstance().getPlayer(player.getUniqueId()); + if (cnPlayer == null) return; + TagRenderer tagRender = CustomNameplates.getInstance().getUnlimitedTagManager().getTagRender(cnPlayer); + if (tagRender == null) return; + Item wrapped = BukkitItemManager.instance().wrap(newItem); + Optional> optionalCustomItem = wrapped.getCustomItem(); + if (optionalCustomItem.isEmpty()) { + tagRender.hatOffset(0d); + return; + } + Double customHeight = optionalCustomItem.get().settings().getCustomData(HAT_HEIGHT); + tagRender.hatOffset(Objects.requireNonNullElse(customHeight, 0d)); + } +} From 5902d3c95544c689dc3d93655b59abeab23bbe9d Mon Sep 17 00:00:00 2001 From: jhqwqmc Date: Fri, 5 Dec 2025 02:46:10 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B8=85=E7=90=86?= =?UTF-8?q?=E7=89=A9=E5=93=81=E5=87=BD=E6=95=B0=E5=92=8C=E7=89=A9=E5=93=81?= =?UTF-8?q?=E6=A0=8F=E5=AD=98=E5=9C=A8=E7=89=A9=E5=93=81=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../papi/CheckItemExpansion.java | 7 +-- .../plugin/user/BukkitServerPlayer.java | 10 ++++ .../core/entity/player/Player.java | 2 + .../context/condition/CommonConditions.java | 1 + .../condition/InventoryHasItemCondition.java | 51 ++++++++++++++++++ .../plugin/context/event/EventConditions.java | 1 + .../plugin/context/event/EventFunctions.java | 1 + .../context/function/ClearItemFunction.java | 54 +++++++++++++++++++ .../context/function/CommonFunctions.java | 1 + 9 files changed, 122 insertions(+), 6 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InventoryHasItemCondition.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ClearItemFunction.java diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/CheckItemExpansion.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/CheckItemExpansion.java index a208e2901..f86fc0dbd 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/CheckItemExpansion.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/papi/CheckItemExpansion.java @@ -108,11 +108,6 @@ public class CheckItemExpansion extends PlaceholderExpansion { } private int getItemCount(BukkitServerPlayer player, String[] param) { - Key itemId = Key.of(param[0], param[1]); - Predicate predicate = nmsStack -> this.plugin.itemManager().wrap(ItemStackUtils.asCraftMirror(nmsStack)).id().equals(itemId); - Object inventory = FastNMS.INSTANCE.method$Player$getInventory(player.serverPlayer()); - Object inventoryMenu = FastNMS.INSTANCE.field$Player$inventoryMenu(player.serverPlayer()); - Object craftSlots = FastNMS.INSTANCE.method$InventoryMenu$getCraftSlots(inventoryMenu); - return FastNMS.INSTANCE.method$Inventory$clearOrCountMatchingItems(inventory, predicate, 0, craftSlots); + return player.clearOrCountMatchingInventoryItems(Key.of(param[0], param[1]), 0); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 2bc3a8635..0358696d1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -75,6 +75,7 @@ import java.lang.ref.Reference; import java.lang.ref.WeakReference; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Predicate; public class BukkitServerPlayer extends Player { public static final Key SELECTED_LOCALE_KEY = Key.of("craftengine:locale"); @@ -1492,6 +1493,15 @@ public class BukkitServerPlayer extends Player { this.trackedBlockEntityRenderers.clear(); } + @Override + public int clearOrCountMatchingInventoryItems(Key itemId, int count) { + Predicate predicate = nmsStack -> this.plugin.itemManager().wrap(ItemStackUtils.asCraftMirror(nmsStack)).id().equals(itemId); + Object inventory = FastNMS.INSTANCE.method$Player$getInventory(serverPlayer()); + Object inventoryMenu = FastNMS.INSTANCE.field$Player$inventoryMenu(serverPlayer()); + Object craftSlots = FastNMS.INSTANCE.method$InventoryMenu$getCraftSlots(inventoryMenu); + return FastNMS.INSTANCE.method$Inventory$clearOrCountMatchingItems(inventory, predicate, count, craftSlots); + } + @Override public void addTrackedFurniture(int entityId, Furniture furniture) { this.trackedFurniture.put(entityId, new VirtualCullableObject(furniture)); diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java index 6fd240dbb..b8792bde0 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java @@ -226,6 +226,8 @@ public abstract class Player extends AbstractEntity implements NetWorkUser { public abstract void clearTrackedBlockEntities(); + public abstract int clearOrCountMatchingInventoryItems(Key itemId, int count); + @Override public void remove() { } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java index 991ea9e0a..16c0c5d22 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/CommonConditions.java @@ -31,4 +31,5 @@ public final class CommonConditions { public static final Key IS_NULL = Key.from("craftengine:is_null"); public static final Key HAND = Key.from("craftengine:hand"); public static final Key HAS_PLAYER = Key.from("craftengine:has_player"); + public static final Key INVENTORY_HAS_ITEM = Key.from("craftengine:inventory_has_item"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InventoryHasItemCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InventoryHasItemCondition.java new file mode 100644 index 000000000..3498ccd7f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InventoryHasItemCondition.java @@ -0,0 +1,51 @@ +package net.momirealms.craftengine.core.plugin.context.condition; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; +import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; +import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; +import net.momirealms.craftengine.core.util.ItemUtils; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; +import java.util.Optional; + +public class InventoryHasItemCondition implements Condition { + private final Key itemId; + private final NumberProvider count; + + public InventoryHasItemCondition(Key itemId, NumberProvider count) { + this.itemId = itemId; + this.count = count; + } + + @Override + public Key type() { + return CommonConditions.INVENTORY_HAS_ITEM; + } + + @Override + public boolean test(CTX ctx) { + Optional optionalPlayer = ctx.getOptionalParameter(DirectContextParameters.PLAYER); + if (optionalPlayer.isEmpty()) { + return false; + } + Player player = optionalPlayer.get(); + return player.clearOrCountMatchingInventoryItems(this.itemId, 0) >= this.count.getInt(ctx); + } + + public static class FactoryImpl implements ConditionFactory { + + @Override + public Condition create(Map arguments) { + Key itemId = Key.of(ResourceConfigUtils.requireNonEmptyStringOrThrow(ResourceConfigUtils.get(arguments, "id", "item"), "warning.config.condition.inventory_has_item.missing_item_id")); + NumberProvider count = NumberProviders.fromObject(arguments.getOrDefault("count", 1)); + return new InventoryHasItemCondition<>(itemId, count); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventConditions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventConditions.java index b17921ed4..6d2aa4996 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventConditions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventConditions.java @@ -40,6 +40,7 @@ public class EventConditions { register(CommonConditions.IS_NULL, new IsNullCondition.FactoryImpl<>()); register(CommonConditions.HAND, new HandCondition.FactoryImpl<>()); register(CommonConditions.ON_COOLDOWN, new OnCooldownCondition.FactoryImpl<>()); + register(CommonConditions.INVENTORY_HAS_ITEM, new InventoryHasItemCondition.FactoryImpl<>()); } public static void register(Key key, ConditionFactory factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java index fbc8a4e69..19bb76b41 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java @@ -58,6 +58,7 @@ public class EventFunctions { register(CommonFunctions.SET_EXP, new SetExpFunction.FactoryImpl<>(EventConditions::fromMap)); register(CommonFunctions.SET_LEVEL, new SetLevelFunction.FactoryImpl<>(EventConditions::fromMap)); register(CommonFunctions.PLAY_TOTEM_ANIMATION, new PlayTotemAnimationFunction.FactoryImpl<>(EventConditions::fromMap)); + register(CommonFunctions.CLEAR_ITEM, new ClearItemFunction.FactoryImpl<>(EventConditions::fromMap)); } public static void register(Key key, FunctionFactory factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ClearItemFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ClearItemFunction.java new file mode 100644 index 000000000..0be7887b5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ClearItemFunction.java @@ -0,0 +1,54 @@ +package net.momirealms.craftengine.core.plugin.context.function; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; +import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; +import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class ClearItemFunction extends AbstractConditionalFunction { + private final Key itemId; + private final NumberProvider count; + + public ClearItemFunction(List> predicates, Key itemId, NumberProvider count) { + super(predicates); + this.itemId = itemId; + this.count = count; + } + + @Override + protected void runInternal(CTX ctx) { + Optional optionalPlayer = ctx.getOptionalParameter(DirectContextParameters.PLAYER); + if (optionalPlayer.isEmpty()) { + return; + } + Player player = optionalPlayer.get(); + player.clearOrCountMatchingInventoryItems(itemId, count.getInt(ctx)); + } + + @Override + public Key type() { + return CommonFunctions.CLEAR_ITEM; + } + + public static class FactoryImpl extends AbstractFactory { + + public FactoryImpl(java.util.function.Function, Condition> factory) { + super(factory); + } + + @Override + public Function create(Map arguments) { + Key itemId = Key.of(ResourceConfigUtils.requireNonEmptyStringOrThrow(ResourceConfigUtils.get(arguments, "id", "item"), "warning.config.function.clear_item.missing_item_id")); + NumberProvider count = NumberProviders.fromObject(arguments.getOrDefault("count", 1)); + return new ClearItemFunction<>(getPredicates(arguments), itemId, count); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java index 937534105..ccb288010 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java @@ -49,4 +49,5 @@ public final class CommonFunctions { public static final Key SET_EXP = Key.of("craftengine:set_exp"); public static final Key SET_LEVEL = Key.of("craftengine:set_level"); public static final Key PLAY_TOTEM_ANIMATION = Key.of("craftengine:play_totem_animation"); + public static final Key CLEAR_ITEM = Key.of("craftengine:clear_item"); } From e04d5c5572836a714b83f52992385039cc48c61a Mon Sep 17 00:00:00 2001 From: jhqwqmc Date: Fri, 5 Dec 2025 02:52:05 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E8=AF=AD=E8=A8=80=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common-files/src/main/resources/translations/en.yml | 2 ++ common-files/src/main/resources/translations/zh_cn.yml | 2 ++ .../plugin/context/condition/InventoryHasItemCondition.java | 2 +- .../core/plugin/context/function/ClearItemFunction.java | 2 +- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/common-files/src/main/resources/translations/en.yml b/common-files/src/main/resources/translations/en.yml index b4b992ed4..5089cdfb1 100644 --- a/common-files/src/main/resources/translations/en.yml +++ b/common-files/src/main/resources/translations/en.yml @@ -170,6 +170,7 @@ warning.config.condition.is_null.missing_argument: "Issue found in file warning.config.condition.hand.missing_hand: "Issue found in file - The config '' is missing the required 'hand' argument for 'hand' condition." warning.config.condition.hand.invalid_hand: "Issue found in file - The config '' is using an invalid 'hand' argument '' for 'hand' condition. Allowed hand types: []" warning.config.condition.on_cooldown.missing_id: "Issue found in file - The config '' is missing the required 'id' argument for 'on_cooldown' condition." +warning.config.condition.inventory_has_item.missing_id: "Issue found in file - The config '' is missing the required 'id' argument for 'inventory_has_item' condition." warning.config.structure.not_section: "Issue found in file - The config '' is expected to be a config section while it's actually a(n) ''." warning.config.image.duplicate: "Issue found in file - Duplicated image ''. Please check if there is the same configuration in other files." warning.config.image.missing_height: "Issue found in file - The image '' is missing the required 'height' argument." @@ -543,6 +544,7 @@ warning.config.function.transform_block.missing_block: "Issue found in f warning.config.function.cycle_block_property.missing_property: "Issue found in file - The config '' is missing the required 'property' argument for 'cycle_block_property' function." warning.config.function.set_exp.missing_count: "Issue found in file - The config '' is missing the required 'count' argument for 'set_exp' function." warning.config.function.set_level.missing_count: "Issue found in file - The config '' is missing the required 'count' argument for 'set_level' function." +warning.config.function.clear_item.missing_id: "Issue found in file - The config '' is missing the required 'id' argument for 'clear_item' function." warning.config.selector.missing_type: "Issue found in file - The config '' is missing the required 'type' argument for selector." warning.config.selector.invalid_type: "Issue found in file - The config '' is using an invalid selector type ''." warning.config.selector.invalid_target: "Issue found in file - The config '' is using an invalid selector target ''." diff --git a/common-files/src/main/resources/translations/zh_cn.yml b/common-files/src/main/resources/translations/zh_cn.yml index 71fbf6f5e..bf82355f0 100644 --- a/common-files/src/main/resources/translations/zh_cn.yml +++ b/common-files/src/main/resources/translations/zh_cn.yml @@ -167,6 +167,7 @@ warning.config.condition.is_null.missing_argument: "在文件 warning.config.condition.hand.missing_hand: "在文件 发现问题 - 配置项 '' 缺少 'hand' 条件必需的 'hand' 参数" warning.config.condition.hand.invalid_hand: "在文件 发现问题 - 配置项 '' 使用了无效的 'hand' 参数 '' ('hand' 条件). 允许的手部类型: []" warning.config.condition.on_cooldown.missing_id: "在文件 发现问题 - 配置项 '' 缺少 'on_cooldown' 条件必需的 'id' 参数" +warning.config.condition.inventory_has_item.missing_id: "在文件 发现问题 - 配置项 '' 缺少 'inventory_has_item' 条件必需的 'id' 参数" warning.config.structure.not_section: "在文件 发现问题 - 配置项 '' 应为配置段落 但实际类型为 ''" warning.config.image.duplicate: "在文件 发现问题 - 重复的图片配置 '' 请检查其他文件中是否存在相同配置" warning.config.image.missing_height: "在文件 发现问题 - 图片 '' 缺少必需的 'height' 参数" @@ -535,6 +536,7 @@ warning.config.function.transform_block.missing_block: "在文件 在文件 发现问题 - 配置项 '' 缺少 'cycle_block_property' 函数所需的 'property' 参数" warning.config.function.set_exp.missing_count: "在文件 发现问题 - 配置项 '' 缺少 'set_exp' 函数所需的 'count' 参数" warning.config.function.set_level.missing_count: "在文件 发现问题 - 配置项 '' 缺少 'set_level' 函数所需的 'count' 参数" +warning.config.function.clear_item.missing_id: "在文件 发现问题 - 配置项 '' 缺少 'clear_item' 函数所需的 'id' 参数" warning.config.selector.missing_type: "在文件 发现问题 - 配置项 '' 缺少选择器必需的 'type' 参数" warning.config.selector.invalid_type: "在文件 发现问题 - 配置项 '' 使用了无效的选择器类型 ''" warning.config.selector.invalid_target: "在文件 发现问题 - 配置项 '' 使用了无效的选择器目标 ''" diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InventoryHasItemCondition.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InventoryHasItemCondition.java index 3498ccd7f..4b849ab41 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InventoryHasItemCondition.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/condition/InventoryHasItemCondition.java @@ -43,7 +43,7 @@ public class InventoryHasItemCondition implements Condition @Override public Condition create(Map arguments) { - Key itemId = Key.of(ResourceConfigUtils.requireNonEmptyStringOrThrow(ResourceConfigUtils.get(arguments, "id", "item"), "warning.config.condition.inventory_has_item.missing_item_id")); + Key itemId = Key.of(ResourceConfigUtils.requireNonEmptyStringOrThrow(ResourceConfigUtils.get(arguments, "id", "item"), "warning.config.condition.inventory_has_item.missing_id")); NumberProvider count = NumberProviders.fromObject(arguments.getOrDefault("count", 1)); return new InventoryHasItemCondition<>(itemId, count); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ClearItemFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ClearItemFunction.java index 0be7887b5..578266f53 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ClearItemFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ClearItemFunction.java @@ -46,7 +46,7 @@ public class ClearItemFunction extends AbstractConditionalF @Override public Function create(Map arguments) { - Key itemId = Key.of(ResourceConfigUtils.requireNonEmptyStringOrThrow(ResourceConfigUtils.get(arguments, "id", "item"), "warning.config.function.clear_item.missing_item_id")); + Key itemId = Key.of(ResourceConfigUtils.requireNonEmptyStringOrThrow(ResourceConfigUtils.get(arguments, "id", "item"), "warning.config.function.clear_item.missing_id")); NumberProvider count = NumberProviders.fromObject(arguments.getOrDefault("count", 1)); return new ClearItemFunction<>(getPredicates(arguments), itemId, count); } From b310559c0dbd9c2616f8c3a3aed6640a47616e53 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Fri, 5 Dec 2025 02:56:19 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E6=9E=84=E9=80=A0?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E5=8F=82=E6=95=B0=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/context/event/EventFunctions.java | 1 + .../context/function/BreakBlockFunction.java | 4 +- .../context/function/CommonFunctions.java | 1 + .../context/function/DamageFunction.java | 4 +- .../context/function/DamageItemFunction.java | 4 +- .../context/function/LevelerExpFunction.java | 4 +- .../function/MythicMobsSkillFunction.java | 4 +- .../context/function/ParticleFunction.java | 4 +- .../context/function/PlaceBlockFunction.java | 9 +- .../context/function/PlaySoundFunction.java | 12 +-- .../function/PotionEffectFunction.java | 4 +- .../function/RemoveCooldownFunction.java | 6 +- .../function/RemoveFurnitureFunction.java | 4 +- .../function/RemovePotionEffectFunction.java | 6 +- .../function/ReplaceFurnitureFunction.java | 13 +-- .../function/RotateFurnitureFunction.java | 84 +++++++++++++++++++ .../plugin/context/function/RunFunction.java | 4 +- .../context/function/SetCooldownFunction.java | 4 +- .../context/function/SetCountFunction.java | 4 +- .../context/function/SetFoodFunction.java | 4 +- .../function/SetSaturationFunction.java | 4 +- .../function/SpawnFurnitureFunction.java | 12 +-- .../context/function/SwingHandFunction.java | 4 +- .../function/TransformBlockFunction.java | 11 +-- .../function/UpdateBlockPropertyFunction.java | 10 +-- gradle.properties | 12 +-- 26 files changed, 140 insertions(+), 93 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RotateFurnitureFunction.java diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java index 0feab6450..5cbe2e8db 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java @@ -43,6 +43,7 @@ public class EventFunctions { register(CommonFunctions.SPAWN_FURNITURE, new SpawnFurnitureFunction.FactoryImpl<>(EventConditions::fromMap)); register(CommonFunctions.REMOVE_FURNITURE, new RemoveFurnitureFunction.FactoryImpl<>(EventConditions::fromMap)); register(CommonFunctions.REPLACE_FURNITURE, new ReplaceFurnitureFunction.FactoryImpl<>(EventConditions::fromMap)); + register(CommonFunctions.ROTATE_FURNITURE, new RotateFurnitureFunction.FactoryImpl<>(EventConditions::fromMap)); register(CommonFunctions.MYTHIC_MOBS_SKILL, new MythicMobsSkillFunction.FactoryImpl<>(EventConditions::fromMap)); register(CommonFunctions.TELEPORT, new TeleportFunction.FactoryImpl<>(EventConditions::fromMap)); register(CommonFunctions.SET_VARIABLE, new SetVariableFunction.FactoryImpl<>(EventConditions::fromMap)); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/BreakBlockFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/BreakBlockFunction.java index d0b63f852..ad9543d18 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/BreakBlockFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/BreakBlockFunction.java @@ -18,7 +18,7 @@ public class BreakBlockFunction extends AbstractConditional private final NumberProvider y; private final NumberProvider z; - public BreakBlockFunction(NumberProvider x, NumberProvider y, NumberProvider z, List> predicates) { + public BreakBlockFunction(List> predicates, NumberProvider y, NumberProvider z, NumberProvider x) { super(predicates); this.x = x; this.y = y; @@ -47,7 +47,7 @@ public class BreakBlockFunction extends AbstractConditional NumberProvider x = NumberProviders.fromObject(arguments.getOrDefault("x", "")); NumberProvider y = NumberProviders.fromObject(arguments.getOrDefault("y", "")); NumberProvider z = NumberProviders.fromObject(arguments.getOrDefault("z", "")); - return new BreakBlockFunction<>(x, y, z, getPredicates(arguments)); + return new BreakBlockFunction<>(getPredicates(arguments), y, z, x); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java index b77e6fc06..3083f3cf6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java @@ -32,6 +32,7 @@ public final class CommonFunctions { public static final Key SPAWN_FURNITURE = Key.of("craftengine:spawn_furniture"); public static final Key REMOVE_FURNITURE = Key.of("craftengine:remove_furniture"); public static final Key REPLACE_FURNITURE = Key.of("craftengine:replace_furniture"); + public static final Key ROTATE_FURNITURE = Key.of("craftengine:rotate_furniture"); public static final Key MYTHIC_MOBS_SKILL = Key.of("craftengine:mythic_mobs_skill"); public static final Key TELEPORT = Key.of("craftengine:teleport"); public static final Key TOAST = Key.of("craftengine:toast"); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/DamageFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/DamageFunction.java index 97e197b55..6fd52692b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/DamageFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/DamageFunction.java @@ -17,7 +17,7 @@ public class DamageFunction extends AbstractConditionalFunc private final Key damageType; private final NumberProvider amount; - public DamageFunction(PlayerSelector selector, Key damageType, NumberProvider amount, List> predicates) { + public DamageFunction(List> predicates, Key damageType, NumberProvider amount, PlayerSelector selector) { super(predicates); this.selector = selector; this.damageType = damageType; @@ -45,7 +45,7 @@ public class DamageFunction extends AbstractConditionalFunc PlayerSelector selector = PlayerSelectors.fromObject(arguments.getOrDefault("target", "self"), conditionFactory()); Key damageType = Key.of(ResourceConfigUtils.getAsStringOrNull(arguments.getOrDefault("damage-type", "generic"))); NumberProvider amount = NumberProviders.fromObject(arguments.getOrDefault("amount", 1f)); - return new DamageFunction<>(selector, damageType, amount, getPredicates(arguments)); + return new DamageFunction<>(getPredicates(arguments), damageType, amount, selector); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/DamageItemFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/DamageItemFunction.java index e5cbedec6..d1580f33b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/DamageItemFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/DamageItemFunction.java @@ -17,7 +17,7 @@ import java.util.Map; public class DamageItemFunction extends AbstractConditionalFunction { private final NumberProvider amount; - public DamageItemFunction(NumberProvider amount, List> predicates) { + public DamageItemFunction(List> predicates, NumberProvider amount) { super(predicates); this.amount = amount; } @@ -51,7 +51,7 @@ public class DamageItemFunction extends AbstractConditional @Override public Function create(Map arguments) { NumberProvider amount = NumberProviders.fromObject(arguments.getOrDefault("amount", 1)); - return new DamageItemFunction<>(amount, getPredicates(arguments)); + return new DamageItemFunction<>(getPredicates(arguments), amount); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/LevelerExpFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/LevelerExpFunction.java index 51316f239..a6ddff9b4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/LevelerExpFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/LevelerExpFunction.java @@ -20,7 +20,7 @@ public class LevelerExpFunction extends AbstractConditional private final String leveler; private final String plugin; - public LevelerExpFunction(NumberProvider count, String leveler, String plugin, PlayerSelector selector, List> predicates) { + public LevelerExpFunction(List> predicates, String leveler, String plugin, PlayerSelector selector, NumberProvider count) { super(predicates); this.count = count; this.leveler = leveler; @@ -58,7 +58,7 @@ public class LevelerExpFunction extends AbstractConditional Object count = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("count"), "warning.config.function.leveler_exp.missing_count"); String leveler = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("leveler"), "warning.config.function.leveler_exp.missing_leveler"); String plugin = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("plugin"), "warning.config.function.leveler_exp.missing_plugin"); - return new LevelerExpFunction<>(NumberProviders.fromObject(count), leveler, plugin, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), getPredicates(arguments)); + return new LevelerExpFunction<>(getPredicates(arguments), leveler, plugin, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), NumberProviders.fromObject(count)); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/MythicMobsSkillFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/MythicMobsSkillFunction.java index 031ed08da..9d97eb14c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/MythicMobsSkillFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/MythicMobsSkillFunction.java @@ -14,7 +14,7 @@ public class MythicMobsSkillFunction extends AbstractCondit private final String skill; private final float power; - public MythicMobsSkillFunction(String skill, float power, List> predicates) { + public MythicMobsSkillFunction(List> predicates, float power, String skill) { super(predicates); this.skill = skill; this.power = power; @@ -42,7 +42,7 @@ public class MythicMobsSkillFunction extends AbstractCondit public Function create(Map args) { String skill = ResourceConfigUtils.requireNonEmptyStringOrThrow(args.get("skill"), "warning.config.function.mythic_mobs_skill.missing_skill"); float power = ResourceConfigUtils.getAsFloat(args.getOrDefault("power", 1.0), "power"); - return new MythicMobsSkillFunction<>(skill, power, getPredicates(args)); + return new MythicMobsSkillFunction<>(getPredicates(args), power, skill); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ParticleFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ParticleFunction.java index 4893d19f8..dd4f29458 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ParticleFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ParticleFunction.java @@ -17,7 +17,7 @@ import java.util.Optional; public class ParticleFunction extends AbstractConditionalFunction { private final ParticleConfig config; - public ParticleFunction(ParticleConfig config, List> predicates) { + public ParticleFunction(List> predicates, ParticleConfig config) { super(predicates); this.config = config; } @@ -45,7 +45,7 @@ public class ParticleFunction extends AbstractConditionalFu @Override public Function create(Map arguments) { - return new ParticleFunction<>(ParticleConfig.fromMap$function(arguments), getPredicates(arguments)); + return new ParticleFunction<>(getPredicates(arguments), ParticleConfig.fromMap$function(arguments)); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/PlaceBlockFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/PlaceBlockFunction.java index fedd7639a..f71b2ae08 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/PlaceBlockFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/PlaceBlockFunction.java @@ -26,7 +26,7 @@ public class PlaceBlockFunction extends AbstractConditional private final NumberProvider z; private final NumberProvider updateFlags; - public PlaceBlockFunction(LazyReference lazyBlockState, NumberProvider x, NumberProvider y, NumberProvider z, NumberProvider updateFlags, List> predicates) { + public PlaceBlockFunction(List> predicates, NumberProvider x, NumberProvider y, NumberProvider z, NumberProvider updateFlags, LazyReference lazyBlockState) { super(predicates); this.lazyBlockState = lazyBlockState; this.x = x; @@ -58,12 +58,7 @@ public class PlaceBlockFunction extends AbstractConditional @Override public Function create(Map arguments) { String state = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("block-state"), "warning.config.function.place_block.missing_block_state"); - return new PlaceBlockFunction<>(LazyReference.lazyReference(() -> CraftEngine.instance().blockManager().createBlockState(state)), - NumberProviders.fromObject(arguments.getOrDefault("x", "")), - NumberProviders.fromObject(arguments.getOrDefault("y", "")), - NumberProviders.fromObject(arguments.getOrDefault("z", "")), - Optional.ofNullable(arguments.get("update-flags")).map(NumberProviders::fromObject).orElse(NumberProviders.direct(UpdateOption.UPDATE_ALL.flags())), - getPredicates(arguments)); + return new PlaceBlockFunction<>(getPredicates(arguments), NumberProviders.fromObject(arguments.getOrDefault("x", "")), NumberProviders.fromObject(arguments.getOrDefault("y", "")), NumberProviders.fromObject(arguments.getOrDefault("z", "")), Optional.ofNullable(arguments.get("update-flags")).map(NumberProviders::fromObject).orElse(NumberProviders.direct(UpdateOption.UPDATE_ALL.flags())), LazyReference.lazyReference(() -> CraftEngine.instance().blockManager().createBlockState(state))); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/PlaySoundFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/PlaySoundFunction.java index 00004bbb8..cc71ff1ba 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/PlaySoundFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/PlaySoundFunction.java @@ -31,15 +31,7 @@ public class PlaySoundFunction extends AbstractConditionalF private final PlayerSelector selector; public PlaySoundFunction( - Key soundEvent, - NumberProvider x, - NumberProvider y, - NumberProvider z, - NumberProvider volume, - NumberProvider pitch, - SoundSource source, - PlayerSelector selector, - List> predicates + List> predicates, NumberProvider x, NumberProvider y, NumberProvider z, NumberProvider volume, NumberProvider pitch, SoundSource source, PlayerSelector selector, Key soundEvent ) { super(predicates); this.soundEvent = soundEvent; @@ -89,7 +81,7 @@ public class PlaySoundFunction extends AbstractConditionalF NumberProvider pitch = NumberProviders.fromObject(arguments.getOrDefault("pitch", 1)); SoundSource source = Optional.ofNullable(arguments.get("source")).map(String::valueOf).map(it -> SoundSource.valueOf(it.toUpperCase(Locale.ENGLISH))).orElse(SoundSource.MASTER); PlayerSelector selector = PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()); - return new PlaySoundFunction<>(soundEvent, x, y, z, volume, pitch, source, selector, getPredicates(arguments)); + return new PlaySoundFunction<>(getPredicates(arguments), x, y, z, volume, pitch, source, selector, soundEvent); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/PotionEffectFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/PotionEffectFunction.java index fa25af75f..cf87e324c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/PotionEffectFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/PotionEffectFunction.java @@ -21,7 +21,7 @@ public class PotionEffectFunction extends AbstractCondition private final boolean ambient; private final boolean particles; - public PotionEffectFunction(Key potionEffectType, NumberProvider duration, NumberProvider amplifier, boolean ambient, boolean particles, PlayerSelector selector, List> predicates) { + public PotionEffectFunction(List> predicates, NumberProvider duration, NumberProvider amplifier, boolean ambient, boolean particles, PlayerSelector selector, Key potionEffectType) { super(predicates); this.potionEffectType = potionEffectType; this.duration = duration; @@ -63,7 +63,7 @@ public class PotionEffectFunction extends AbstractCondition NumberProvider amplifier = NumberProviders.fromObject(arguments.getOrDefault("amplifier", 0)); boolean ambient = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("ambient", false), "ambient"); boolean particles = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("particles", true), "particles"); - return new PotionEffectFunction<>(effectType, duration, amplifier, ambient, particles, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), getPredicates(arguments)); + return new PotionEffectFunction<>(getPredicates(arguments), duration, amplifier, ambient, particles, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), effectType); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RemoveCooldownFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RemoveCooldownFunction.java index 84982ec78..5beae2853 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RemoveCooldownFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RemoveCooldownFunction.java @@ -19,7 +19,7 @@ public class RemoveCooldownFunction extends AbstractConditi private final String id; private final boolean all; - public RemoveCooldownFunction(String id, boolean all, PlayerSelector selector, List> predicates) { + public RemoveCooldownFunction(List> predicates, boolean all, PlayerSelector selector, String id) { super(predicates); this.selector = selector; this.id = id; @@ -59,10 +59,10 @@ public class RemoveCooldownFunction extends AbstractConditi public Function create(Map arguments) { boolean all = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("all", false), "all"); if (all) { - return new RemoveCooldownFunction<>(null, true, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), getPredicates(arguments)); + return new RemoveCooldownFunction<>(getPredicates(arguments), true, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), null); } else { String id = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("id"), "warning.config.function.remove_cooldown.missing_id"); - return new RemoveCooldownFunction<>(id, false, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), getPredicates(arguments)); + return new RemoveCooldownFunction<>(getPredicates(arguments), false, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), id); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RemoveFurnitureFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RemoveFurnitureFunction.java index 518b061cd..3fb802c80 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RemoveFurnitureFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RemoveFurnitureFunction.java @@ -24,7 +24,7 @@ public class RemoveFurnitureFunction extends AbstractCondit private final boolean dropLoot; private final boolean playSound; - public RemoveFurnitureFunction(boolean dropLoot, boolean playSound, List> predicates) { + public RemoveFurnitureFunction(List> predicates, boolean playSound, boolean dropLoot) { super(predicates); this.dropLoot = dropLoot; this.playSound = playSound; @@ -80,7 +80,7 @@ public class RemoveFurnitureFunction extends AbstractCondit public Function create(Map arguments) { boolean dropLoot = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("drop-loot", true), "drop-loot"); boolean playSound = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("play-sound", true), "play-sound"); - return new RemoveFurnitureFunction<>(dropLoot, playSound, getPredicates(arguments)); + return new RemoveFurnitureFunction<>(getPredicates(arguments), playSound, dropLoot); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RemovePotionEffectFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RemovePotionEffectFunction.java index 55322a946..70af392c1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RemovePotionEffectFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RemovePotionEffectFunction.java @@ -17,7 +17,7 @@ public class RemovePotionEffectFunction extends AbstractCon private final Key potionEffectType; private final boolean all; - public RemovePotionEffectFunction(Key potionEffectType, boolean all, PlayerSelector selector, List> predicates) { + public RemovePotionEffectFunction(List> predicates, boolean all, PlayerSelector selector, Key potionEffectType) { super(predicates); this.potionEffectType = potionEffectType; this.selector = selector; @@ -54,10 +54,10 @@ public class RemovePotionEffectFunction extends AbstractCon public Function create(Map arguments) { boolean all = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("all", false), "all"); if (all) { - return new RemovePotionEffectFunction<>(null, true, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), getPredicates(arguments)); + return new RemovePotionEffectFunction<>(getPredicates(arguments), true, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), null); } else { Key effectType = Key.of(ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("potion-effect"), "warning.config.function.remove_potion_effect.missing_potion_effect")); - return new RemovePotionEffectFunction<>(effectType, false, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), getPredicates(arguments)); + return new RemovePotionEffectFunction<>(getPredicates(arguments), false, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), effectType); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ReplaceFurnitureFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ReplaceFurnitureFunction.java index 2c4577909..c2bfed095 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ReplaceFurnitureFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ReplaceFurnitureFunction.java @@ -26,16 +26,7 @@ public class ReplaceFurnitureFunction extends AbstractCondi private final boolean playSound; public ReplaceFurnitureFunction( - Key newFurnitureId, - NumberProvider x, - NumberProvider y, - NumberProvider z, - NumberProvider pitch, - NumberProvider yaw, - String variant, - boolean dropLoot, - boolean playSound, - List> predicates + List> predicates, NumberProvider x, NumberProvider y, NumberProvider z, NumberProvider pitch, NumberProvider yaw, String variant, boolean dropLoot, boolean playSound, Key newFurnitureId ) { super(predicates); this.newFurnitureId = newFurnitureId; @@ -96,7 +87,7 @@ public class ReplaceFurnitureFunction extends AbstractCondi String variant = ResourceConfigUtils.getAsStringOrNull(ResourceConfigUtils.get(arguments, "variant", "anchor-type")); boolean dropLoot = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("drop-loot", true), "drop-loot"); boolean playSound = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("play-sound", true), "play-sound"); - return new ReplaceFurnitureFunction<>(furnitureId, x, y, z, pitch, yaw, variant, dropLoot, playSound, getPredicates(arguments)); + return new ReplaceFurnitureFunction<>(getPredicates(arguments), x, y, z, pitch, yaw, variant, dropLoot, playSound, furnitureId); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RotateFurnitureFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RotateFurnitureFunction.java new file mode 100644 index 000000000..1256826a8 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RotateFurnitureFunction.java @@ -0,0 +1,84 @@ +package net.momirealms.craftengine.core.plugin.context.function; + +import net.momirealms.craftengine.core.entity.furniture.Furniture; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootTable; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; +import net.momirealms.craftengine.core.plugin.context.ContextHolder; +import net.momirealms.craftengine.core.plugin.context.event.EventFunctions; +import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; +import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; +import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; +import net.momirealms.craftengine.core.sound.SoundData; +import net.momirealms.craftengine.core.sound.SoundSource; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import net.momirealms.craftengine.core.world.World; +import net.momirealms.craftengine.core.world.WorldPosition; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class RotateFurnitureFunction extends AbstractConditionalFunction { + private final NumberProvider degree; + private final List> successFunctions; + private final List> failureFunctions; + + public RotateFurnitureFunction(List> predicates, NumberProvider degree, List> successFunctions, List> failureFunctions) { + super(predicates); + this.degree = degree; + this.successFunctions = successFunctions; + this.failureFunctions = failureFunctions; + } + + @Override + public void runInternal(CTX ctx) { + ctx.getOptionalParameter(DirectContextParameters.FURNITURE).ifPresent(furniture -> rotateFurniture(ctx, furniture)); + } + + public void rotateFurniture(CTX ctx, Furniture furniture) { + if (!furniture.isValid()) return; + WorldPosition position = furniture.position(); + WorldPosition newPos = new WorldPosition(position.world, position.x, position.y, position.z, position.xRot, position.yRot + this.degree.getFloat(ctx)); + furniture.moveTo(newPos).thenAccept(success -> { + if (success) { + for (Function successFunction : this.successFunctions) { + successFunction.run(ctx); + } + } else { + for (Function failureFunction : this.failureFunctions) { + failureFunction.run(ctx); + } + } + }); + } + + @Override + public Key type() { + return CommonFunctions.ROTATE_FURNITURE; + } + + public NumberProvider degree() { + return degree; + } + + public static class FactoryImpl extends AbstractFactory { + + public FactoryImpl(java.util.function.Function, Condition> factory) { + super(factory); + } + + @Override + public Function create(Map arguments) { + NumberProvider degree = NumberProviders.fromObject(arguments.getOrDefault("degree", 90)); + List> onSuccess = ResourceConfigUtils.parseConfigAsList(arguments.get("on-success"), EventFunctions::fromMap); + List> onFailure = ResourceConfigUtils.parseConfigAsList(arguments.get("on-failure"), EventFunctions::fromMap); + return new RotateFurnitureFunction<>(getPredicates(arguments), degree, onSuccess, onFailure); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RunFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RunFunction.java index 15f5b0586..154bbc919 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RunFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/RunFunction.java @@ -21,7 +21,7 @@ public class RunFunction extends AbstractConditionalFunctio private final List> functions; private final NumberProvider delay; - public RunFunction(List> functions, NumberProvider delay, List> predicates) { + public RunFunction(List> predicates, NumberProvider delay, List> functions) { super(predicates); this.functions = functions; this.delay = delay; @@ -75,7 +75,7 @@ public class RunFunction extends AbstractConditionalFunctio for (Map function : functions) { fun.add(this.functionFactory.apply(function)); } - return new RunFunction<>(fun, delay, getPredicates(arguments)); + return new RunFunction<>(getPredicates(arguments), delay, fun); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SetCooldownFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SetCooldownFunction.java index 5634d5f19..a773bdcb1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SetCooldownFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SetCooldownFunction.java @@ -21,7 +21,7 @@ public class SetCooldownFunction extends AbstractConditiona private final String id; private final boolean add; - public SetCooldownFunction(TextProvider time, String id, boolean add, PlayerSelector selector, List> predicates) { + public SetCooldownFunction(List> predicates, String id, boolean add, PlayerSelector selector, TextProvider time) { super(predicates); this.time = time; this.add = add; @@ -66,7 +66,7 @@ public class SetCooldownFunction extends AbstractConditiona String id = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("id"), "warning.config.function.set_cooldown.missing_id"); String time = ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("time"), "warning.config.function.set_cooldown.missing_time"); boolean add = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("add", false), "add"); - return new SetCooldownFunction<>(TextProviders.fromString(time), id, add, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), getPredicates(arguments)); + return new SetCooldownFunction<>(getPredicates(arguments), id, add, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), TextProviders.fromString(time)); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SetCountFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SetCountFunction.java index aa005230c..b6cd3f22d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SetCountFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SetCountFunction.java @@ -17,7 +17,7 @@ public class SetCountFunction extends AbstractConditionalFu private final NumberProvider count; private final boolean add; - public SetCountFunction(NumberProvider count, boolean add, List> predicates) { + public SetCountFunction(List> predicates, boolean add, NumberProvider count) { super(predicates); this.count = count; this.add = add; @@ -51,7 +51,7 @@ public class SetCountFunction extends AbstractConditionalFu public Function create(Map arguments) { Object value = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("count"), "warning.config.function.set_count.missing_count"); boolean add = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("add", false), "add"); - return new SetCountFunction<>(NumberProviders.fromObject(value), add, getPredicates(arguments)); + return new SetCountFunction<>(getPredicates(arguments), add, NumberProviders.fromObject(value)); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SetFoodFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SetFoodFunction.java index 544a2a147..1c77bab4e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SetFoodFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SetFoodFunction.java @@ -19,7 +19,7 @@ public class SetFoodFunction extends AbstractConditionalFun private final NumberProvider count; private final boolean add; - public SetFoodFunction(NumberProvider count, boolean add, PlayerSelector selector, List> predicates) { + public SetFoodFunction(List> predicates, boolean add, PlayerSelector selector, NumberProvider count) { super(predicates); this.count = count; this.add = add; @@ -54,7 +54,7 @@ public class SetFoodFunction extends AbstractConditionalFun public Function create(Map arguments) { Object value = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("food"), "warning.config.function.set_food.missing_food"); boolean add = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("add", false), "add"); - return new SetFoodFunction<>(NumberProviders.fromObject(value), add, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), getPredicates(arguments)); + return new SetFoodFunction<>(getPredicates(arguments), add, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), NumberProviders.fromObject(value)); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SetSaturationFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SetSaturationFunction.java index 9c6d24e98..56fbef9d2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SetSaturationFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SetSaturationFunction.java @@ -19,7 +19,7 @@ public class SetSaturationFunction extends AbstractConditio private final NumberProvider count; private final boolean add; - public SetSaturationFunction(NumberProvider count, boolean add, PlayerSelector selector, List> predicates) { + public SetSaturationFunction(List> predicates, boolean add, PlayerSelector selector, NumberProvider count) { super(predicates); this.count = count; this.add = add; @@ -54,7 +54,7 @@ public class SetSaturationFunction extends AbstractConditio public Function create(Map arguments) { Object value = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("saturation"), "warning.config.function.set_saturation.missing_saturation"); boolean add = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("add", false), "add"); - return new SetSaturationFunction<>(NumberProviders.fromObject(value), add, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), getPredicates(arguments)); + return new SetSaturationFunction<>(getPredicates(arguments), add, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), NumberProviders.fromObject(value)); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SpawnFurnitureFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SpawnFurnitureFunction.java index e297cf2f8..e7e91d5e2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SpawnFurnitureFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SpawnFurnitureFunction.java @@ -26,15 +26,7 @@ public class SpawnFurnitureFunction extends AbstractConditi private final boolean playSound; public SpawnFurnitureFunction( - Key furnitureId, - NumberProvider x, - NumberProvider y, - NumberProvider z, - NumberProvider pitch, - NumberProvider yaw, - String variant, - boolean playSound, - List> predicates + List> predicates, NumberProvider x, NumberProvider y, NumberProvider z, NumberProvider pitch, NumberProvider yaw, String variant, boolean playSound, Key furnitureId ) { super(predicates); this.furnitureId = furnitureId; @@ -86,7 +78,7 @@ public class SpawnFurnitureFunction extends AbstractConditi NumberProvider yaw = NumberProviders.fromObject(arguments.getOrDefault("yaw", "")); String variant = ResourceConfigUtils.getAsStringOrNull(ResourceConfigUtils.get(arguments, "variant", "anchor-type")); boolean playSound = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("play-sound", true), "play-sound"); - return new SpawnFurnitureFunction<>(furnitureId, x, y, z, pitch, yaw, variant, playSound, getPredicates(arguments)); + return new SpawnFurnitureFunction<>(getPredicates(arguments), x, y, z, pitch, yaw, variant, playSound, furnitureId); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SwingHandFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SwingHandFunction.java index 935fa210e..3f79089c6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SwingHandFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/SwingHandFunction.java @@ -15,7 +15,7 @@ import java.util.Optional; public class SwingHandFunction extends AbstractConditionalFunction { private final Optional hand; - public SwingHandFunction(Optional hand, List> predicates) { + public SwingHandFunction(List> predicates, Optional hand) { super(predicates); this.hand = hand; } @@ -46,7 +46,7 @@ public class SwingHandFunction extends AbstractConditionalF @Override public Function create(Map arguments) { Optional optionalHand = Optional.ofNullable(arguments.get("hand")).map(it -> InteractionHand.valueOf(it.toString().toUpperCase(Locale.ENGLISH))); - return new SwingHandFunction<>(optionalHand, getPredicates(arguments)); + return new SwingHandFunction<>(getPredicates(arguments), optionalHand); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/TransformBlockFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/TransformBlockFunction.java index b27f438c4..2cd56d21e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/TransformBlockFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/TransformBlockFunction.java @@ -30,7 +30,7 @@ public class TransformBlockFunction extends AbstractConditi private final NumberProvider z; private final NumberProvider updateFlags; - public TransformBlockFunction(LazyReference lazyBlockState, CompoundTag properties, NumberProvider x, NumberProvider y, NumberProvider z, NumberProvider updateFlags, List> predicates) { + public TransformBlockFunction(List> predicates, CompoundTag properties, NumberProvider x, NumberProvider y, NumberProvider z, NumberProvider updateFlags, LazyReference lazyBlockState) { super(predicates); this.properties = properties; this.x = x; @@ -84,13 +84,8 @@ public class TransformBlockFunction extends AbstractConditi } } return new TransformBlockFunction<>( - LazyReference.lazyReference(() -> CraftEngine.instance().blockManager().createBlockState(block)), - properties, - NumberProviders.fromObject(arguments.getOrDefault("x", "")), - NumberProviders.fromObject(arguments.getOrDefault("y", "")), - NumberProviders.fromObject(arguments.getOrDefault("z", "")), - Optional.ofNullable(arguments.get("update-flags")).map(NumberProviders::fromObject).orElse(NumberProviders.direct(UpdateOption.UPDATE_ALL.flags())), - getPredicates(arguments)); + getPredicates(arguments), properties, NumberProviders.fromObject(arguments.getOrDefault("x", "")), NumberProviders.fromObject(arguments.getOrDefault("y", "")), NumberProviders.fromObject(arguments.getOrDefault("z", "")), Optional.ofNullable(arguments.get("update-flags")).map(NumberProviders::fromObject).orElse(NumberProviders.direct(UpdateOption.UPDATE_ALL.flags())), LazyReference.lazyReference(() -> CraftEngine.instance().blockManager().createBlockState(block)) + ); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/UpdateBlockPropertyFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/UpdateBlockPropertyFunction.java index b59202282..dd079a78c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/UpdateBlockPropertyFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/UpdateBlockPropertyFunction.java @@ -26,7 +26,7 @@ public class UpdateBlockPropertyFunction extends AbstractCo private final NumberProvider z; private final NumberProvider updateFlags; - public UpdateBlockPropertyFunction(CompoundTag properties, NumberProvider x, NumberProvider y, NumberProvider z, NumberProvider updateFlags, List> predicates) { + public UpdateBlockPropertyFunction(List> predicates, NumberProvider x, NumberProvider y, NumberProvider z, NumberProvider updateFlags, CompoundTag properties) { super(predicates); this.properties = properties; this.x = x; @@ -67,12 +67,8 @@ public class UpdateBlockPropertyFunction extends AbstractCo for (Map.Entry entry : state.entrySet()) { properties.putString(entry.getKey(), String.valueOf(entry.getValue())); } - return new UpdateBlockPropertyFunction<>(properties, - NumberProviders.fromObject(arguments.getOrDefault("x", "")), - NumberProviders.fromObject(arguments.getOrDefault("y", "")), - NumberProviders.fromObject(arguments.getOrDefault("z", "")), - Optional.ofNullable(arguments.get("update-flags")).map(NumberProviders::fromObject).orElse(NumberProviders.direct(UpdateOption.UPDATE_ALL.flags())), - getPredicates(arguments)); + return new UpdateBlockPropertyFunction<>(getPredicates(arguments), NumberProviders.fromObject(arguments.getOrDefault("x", "")), NumberProviders.fromObject(arguments.getOrDefault("y", "")), NumberProviders.fromObject(arguments.getOrDefault("z", "")), Optional.ofNullable(arguments.get("update-flags")).map(NumberProviders::fromObject).orElse(NumberProviders.direct(UpdateOption.UPDATE_ALL.flags())), properties + ); } } } diff --git a/gradle.properties b/gradle.properties index 255046cbe..48efe6d60 100644 --- a/gradle.properties +++ b/gradle.properties @@ -59,9 +59,9 @@ concurrent_util_version=0.0.3 bucket4j_version=8.15.0 # Proxy settings -#systemProp.socks.proxyHost=127.0.0.1 -#systemProp.socks.proxyPort=7890 -#systemProp.http.proxyHost=127.0.0.1 -#systemProp.http.proxyPort=7890 -#systemProp.https.proxyHost=127.0.0.1 -#systemProp.https.proxyPort=7890 \ No newline at end of file +systemProp.socks.proxyHost=127.0.0.1 +systemProp.socks.proxyPort=7890 +systemProp.http.proxyHost=127.0.0.1 +systemProp.http.proxyPort=7890 +systemProp.https.proxyHost=127.0.0.1 +systemProp.https.proxyPort=7890 \ No newline at end of file