From a965d231a78813b46fbbd2dcf9091fb4a8e3554e Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Thu, 22 May 2025 23:57:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=8D=AF=E6=B0=B4=E6=95=88?= =?UTF-8?q?=E6=9E=9C=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../default/configuration/plants.yml | 7 +- .../bukkit/api/event/FurnitureBreakEvent.java | 1 - .../api/event/FurnitureInteractEvent.java | 1 - .../bukkit/api/event/FurniturePlaceEvent.java | 1 - .../plugin/user/BukkitServerPlayer.java | 21 ++++-- .../bukkit/util/ParticleUtils.java | 5 +- .../core/entity/player/Player.java | 4 ++ .../plugin/context/event/EventFunctions.java | 1 + .../context/function/ActionBarFunction.java | 4 +- .../context/function/CommandFunction.java | 4 +- .../context/function/MessageFunction.java | 4 +- .../context/function/OpenWindowFunction.java | 3 +- .../context/function/PlaceBlockFunction.java | 2 - .../function/PotionEffectFunction.java | 69 +++++++++++++++++++ .../context/function/SetFoodFunction.java | 22 ++++-- .../function/SetSaturationFunction.java | 22 ++++-- .../context/function/TitleFunction.java | 4 +- 17 files changed, 136 insertions(+), 39 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/PotionEffectFunction.java diff --git a/bukkit/loader/src/main/resources/resources/default/configuration/plants.yml b/bukkit/loader/src/main/resources/resources/default/configuration/plants.yml index 3fde1cb5a..89e99122c 100644 --- a/bukkit/loader/src/main/resources/resources/default/configuration/plants.yml +++ b/bukkit/loader/src/main/resources/resources/default/configuration/plants.yml @@ -216,9 +216,10 @@ blocks: z: " + 0.5" particle: "minecraft:end_rod" count: 15 - offset-x: 0.4 - offset-y: 0.4 - offset-z: 0.4 + offset-x: 0.05 + offset-y: 0.05 + offset-z: 0.05 + speed: 0.1 - type: play_sound sound: minecraft:entity.enderman.teleport x: " + 0.5" diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureBreakEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureBreakEvent.java index db42cb252..087004c50 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureBreakEvent.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureBreakEvent.java @@ -1,7 +1,6 @@ package net.momirealms.craftengine.bukkit.api.event; import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurniture; -import net.momirealms.craftengine.core.entity.furniture.Furniture; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureInteractEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureInteractEvent.java index b89bb7ba3..a9a523484 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureInteractEvent.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureInteractEvent.java @@ -1,7 +1,6 @@ package net.momirealms.craftengine.bukkit.api.event; import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurniture; -import net.momirealms.craftengine.core.entity.furniture.Furniture; import net.momirealms.craftengine.core.entity.player.InteractionHand; import org.bukkit.Location; import org.bukkit.entity.Player; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurniturePlaceEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurniturePlaceEvent.java index e6f1405c1..8ea0c9645 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurniturePlaceEvent.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurniturePlaceEvent.java @@ -1,7 +1,6 @@ package net.momirealms.craftengine.bukkit.api.event; import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurniture; -import net.momirealms.craftengine.core.entity.furniture.Furniture; import net.momirealms.craftengine.core.entity.player.InteractionHand; import org.bukkit.Location; import org.bukkit.entity.Player; 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 3dce61b66..40fac266a 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 @@ -28,16 +28,15 @@ import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.world.BlockPos; import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.WorldEvents; -import org.bukkit.FluidCollisionMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.SoundCategory; +import org.bukkit.*; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; import org.bukkit.block.Block; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; import org.bukkit.util.RayTraceResult; import org.jetbrains.annotations.Nullable; @@ -858,4 +857,18 @@ public class BukkitServerPlayer extends Player { public void setSaturation(float saturation) { this.platformPlayer().setSaturation(saturation); } + + @Override + public void addPotionEffect(Key potionEffectType, int duration, int amplifier, boolean ambient, boolean particles) { + PotionEffectType type = Registry.POTION_EFFECT_TYPE.get(KeyUtils.toNamespacedKey(potionEffectType)); + if (type == null) return; + this.platformPlayer().addPotionEffect(new PotionEffect(type, duration, amplifier, ambient, particles)); + } + + @Override + public void removePotionEffect(Key potionEffectType) { + PotionEffectType type = Registry.POTION_EFFECT_TYPE.get(KeyUtils.toNamespacedKey(potionEffectType)); + if (type == null) return; + this.platformPlayer().removePotionEffect(type); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java index a6697c9c2..e0ba3ccd0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ParticleUtils.java @@ -3,7 +3,10 @@ package net.momirealms.craftengine.bukkit.util; import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.world.particle.*; -import org.bukkit.*; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.Vibration; +import org.bukkit.World; public final class ParticleUtils { private ParticleUtils() {} 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 c0132edf8..4a5f8f7a8 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 @@ -124,4 +124,8 @@ public abstract class Player extends AbstractEntity implements NetWorkUser { public abstract float saturation(); public abstract void setSaturation(float saturation); + + public abstract void addPotionEffect(Key potionEffectType, int duration, int amplifier, boolean ambient, boolean particles); + + public abstract void removePotionEffect(Key potionEffectType); } 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 c8c0559bf..b2ce2de15 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 @@ -34,6 +34,7 @@ public class EventFunctions { register(CommonFunctions.SET_SATURATION, new SetSaturationFunction.FactoryImpl<>(EventConditions::fromMap)); register(CommonFunctions.PLAY_SOUND, new PlaySoundFunction.FactoryImpl<>(EventConditions::fromMap)); register(CommonFunctions.PARTICLE, new ParticleFunction.FactoryImpl<>(EventConditions::fromMap)); + register(CommonFunctions.POTION_EFFECT, new PotionEffectFunction.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/ActionBarFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ActionBarFunction.java index 4e04272f7..9f3781528 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ActionBarFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/ActionBarFunction.java @@ -14,7 +14,6 @@ import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Map; -import java.util.Optional; public class ActionBarFunction extends AbstractConditionalFunction { private final TextProvider message; @@ -28,9 +27,8 @@ public class ActionBarFunction extends AbstractConditionalF @Override public void runInternal(CTX ctx) { - Optional owner = ctx.getOptionalParameter(DirectContextParameters.PLAYER); if (this.selector == null) { - owner.ifPresent(it -> { + ctx.getOptionalParameter(DirectContextParameters.PLAYER).ifPresent(it -> { it.sendActionBar(AdventureHelper.miniMessage().deserialize(this.message.get(ctx), ctx.tagResolvers())); }); } else { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommandFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommandFunction.java index 61a4137c4..d85f44950 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommandFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommandFunction.java @@ -16,7 +16,6 @@ import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Map; -import java.util.Optional; public class CommandFunction extends AbstractConditionalFunction { private final List command; @@ -33,9 +32,8 @@ public class CommandFunction extends AbstractConditionalFun @Override public void runInternal(CTX ctx) { if (this.asPlayer) { - Optional owner = ctx.getOptionalParameter(DirectContextParameters.PLAYER); if (this.selector == null) { - owner.ifPresent(it -> { + ctx.getOptionalParameter(DirectContextParameters.PLAYER).ifPresent(it -> { for (TextProvider c : this.command) { it.performCommand(c.get(ctx)); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/MessageFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/MessageFunction.java index eeee93a4f..8c43e06f6 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/MessageFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/MessageFunction.java @@ -15,7 +15,6 @@ import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Map; -import java.util.Optional; public class MessageFunction extends AbstractConditionalFunction { private final List messages; @@ -31,9 +30,8 @@ public class MessageFunction extends AbstractConditionalFun @Override public void runInternal(CTX ctx) { - Optional owner = ctx.getOptionalParameter(DirectContextParameters.PLAYER); if (this.selector == null) { - owner.ifPresent(it -> { + ctx.getOptionalParameter(DirectContextParameters.PLAYER).ifPresent(it -> { for (TextProvider c : this.messages) { it.sendMessage(AdventureHelper.miniMessage().deserialize(c.get(ctx), ctx.tagResolvers()), this.overlay); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/OpenWindowFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/OpenWindowFunction.java index 53dd47587..9799f63e2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/OpenWindowFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/OpenWindowFunction.java @@ -35,9 +35,8 @@ public class OpenWindowFunction extends AbstractConditional @Override public void runInternal(CTX ctx) { - Optional owner = ctx.getOptionalParameter(DirectContextParameters.PLAYER); if (this.selector == null) { - owner.ifPresent(it -> { + ctx.getOptionalParameter(DirectContextParameters.PLAYER).ifPresent(it -> { CraftEngine.instance().guiManager().openInventory(it, this.guiType); if (this.optionalTitle != null) { CraftEngine.instance().guiManager().updateInventoryTitle(it, AdventureHelper.miniMessage().deserialize(this.optionalTitle.get(ctx), ctx.tagResolvers())); 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 b2d94cc6a..b5ee0bbeb 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 @@ -1,9 +1,7 @@ package net.momirealms.craftengine.core.plugin.context.function; -import net.momirealms.craftengine.core.block.BlockStateWrapper; import net.momirealms.craftengine.core.block.DelayedInitBlockState; import net.momirealms.craftengine.core.block.UpdateOption; -import net.momirealms.craftengine.core.plugin.CraftEngine; 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; 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 new file mode 100644 index 000000000..461e838ed --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/PotionEffectFunction.java @@ -0,0 +1,69 @@ +package net.momirealms.craftengine.core.plugin.context.function; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.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.plugin.context.selector.PlayerSelector; +import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelectors; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; + +import java.util.List; +import java.util.Map; + +public class PotionEffectFunction extends AbstractConditionalFunction { + private final PlayerSelector selector; + private final Key potionEffectType; + private final NumberProvider duration; + private final NumberProvider amplifier; + private final boolean ambient; + private final boolean particles; + + public PotionEffectFunction(Key potionEffectType, NumberProvider duration, NumberProvider amplifier, boolean ambient, boolean particles, PlayerSelector selector, List> predicates) { + super(predicates); + this.potionEffectType = potionEffectType; + this.duration = duration; + this.amplifier = amplifier; + this.selector = selector; + this.ambient = ambient; + this.particles = particles; + } + + @Override + public void runInternal(CTX ctx) { + if (this.selector == null) { + ctx.getOptionalParameter(DirectContextParameters.PLAYER).ifPresent(it -> { + it.addPotionEffect(this.potionEffectType, this.duration.getInt(ctx), this.amplifier.getInt(ctx), this.ambient, this.particles); + }); + } else { + for (Player target : this.selector.get(ctx)) { + RelationalContext relationalContext = ViewerContext.of(ctx, PlayerOptionalContext.of(target, ContextHolder.EMPTY)); + target.addPotionEffect(this.potionEffectType, this.duration.getInt(relationalContext), this.amplifier.getInt(relationalContext), this.ambient, this.particles); + } + } + } + + @Override + public Key type() { + return CommonFunctions.POTION_EFFECT; + } + + public static class FactoryImpl extends AbstractFactory { + + public FactoryImpl(java.util.function.Function, Condition> factory) { + super(factory); + } + + @Override + public Function create(Map arguments) { + Key effectType = Key.of(ResourceConfigUtils.requireNonEmptyStringOrThrow(arguments.get("potion-effect"), "warning.config.function.potion_effect.missing_potion_effect")); + NumberProvider duration = NumberProviders.fromObject(arguments.get("duration")); + NumberProvider amplifier = NumberProviders.fromObject(arguments.get("amplifier")); + boolean ambient = (boolean) arguments.getOrDefault("ambient", false); + boolean particles = (boolean) arguments.getOrDefault("particles", true); + return new PotionEffectFunction<>(effectType, duration, amplifier, ambient, particles, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), getPredicates(arguments)); + } + } +} 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 fcd05f71a..ebb1705a3 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 @@ -1,11 +1,12 @@ 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.*; 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.plugin.context.selector.PlayerSelector; +import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelectors; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -14,19 +15,28 @@ import java.util.Map; import java.util.Optional; public class SetFoodFunction extends AbstractConditionalFunction { + private final PlayerSelector selector; private final NumberProvider count; private final boolean add; - public SetFoodFunction(NumberProvider count, boolean add, List> predicates) { + public SetFoodFunction(NumberProvider count, boolean add, PlayerSelector selector, List> predicates) { super(predicates); this.count = count; this.add = add; + this.selector = selector; } @Override public void runInternal(CTX ctx) { - Optional optionalPlayer = ctx.getOptionalParameter(DirectContextParameters.PLAYER); - optionalPlayer.ifPresent(player -> player.setFoodLevel(this.add ? player.foodLevel() + this.count.getInt(ctx) : this.count.getInt(ctx))); + if (this.selector == null) { + Optional optionalPlayer = ctx.getOptionalParameter(DirectContextParameters.PLAYER); + optionalPlayer.ifPresent(player -> player.setFoodLevel(this.add ? player.foodLevel() + this.count.getInt(ctx) : this.count.getInt(ctx))); + } else { + for (Player target : this.selector.get(ctx)) { + RelationalContext relationalContext = ViewerContext.of(ctx, PlayerOptionalContext.of(target, ContextHolder.EMPTY)); + target.setFoodLevel(this.add ? target.foodLevel() + this.count.getInt(relationalContext) : this.count.getInt(relationalContext)); + } + } } @Override @@ -44,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 = (boolean) arguments.getOrDefault("add", false); - return new SetFoodFunction<>(NumberProviders.fromObject(value), add, getPredicates(arguments)); + return new SetFoodFunction<>(NumberProviders.fromObject(value), add, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), getPredicates(arguments)); } } } 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 86634543f..7afedc1c5 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 @@ -1,11 +1,12 @@ 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.*; 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.plugin.context.selector.PlayerSelector; +import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelectors; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.ResourceConfigUtils; @@ -14,19 +15,28 @@ import java.util.Map; import java.util.Optional; public class SetSaturationFunction extends AbstractConditionalFunction { + private final PlayerSelector selector; private final NumberProvider count; private final boolean add; - public SetSaturationFunction(NumberProvider count, boolean add, List> predicates) { + public SetSaturationFunction(NumberProvider count, boolean add, PlayerSelector selector, List> predicates) { super(predicates); this.count = count; this.add = add; + this.selector = selector; } @Override public void runInternal(CTX ctx) { - Optional optionalPlayer = ctx.getOptionalParameter(DirectContextParameters.PLAYER); - optionalPlayer.ifPresent(player -> player.setSaturation(this.add ? player.saturation() + this.count.getFloat(ctx) : this.count.getFloat(ctx))); + if (this.selector == null) { + Optional optionalPlayer = ctx.getOptionalParameter(DirectContextParameters.PLAYER); + optionalPlayer.ifPresent(player -> player.setSaturation(this.add ? player.saturation() + this.count.getFloat(ctx) : this.count.getFloat(ctx))); + } else { + for (Player target : this.selector.get(ctx)) { + RelationalContext relationalContext = ViewerContext.of(ctx, PlayerOptionalContext.of(target, ContextHolder.EMPTY)); + target.setSaturation(this.add ? target.saturation() + this.count.getFloat(relationalContext) : this.count.getFloat(relationalContext)); + } + } } @Override @@ -44,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 = (boolean) arguments.getOrDefault("add", false); - return new SetSaturationFunction<>(NumberProviders.fromObject(value), add, getPredicates(arguments)); + return new SetSaturationFunction<>(NumberProviders.fromObject(value), add, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), getPredicates(arguments)); } } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/TitleFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/TitleFunction.java index 28900c5a1..43eb8d195 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/TitleFunction.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/TitleFunction.java @@ -15,7 +15,6 @@ import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Map; -import java.util.Optional; public class TitleFunction extends AbstractConditionalFunction { private final PlayerSelector selector; @@ -38,9 +37,8 @@ public class TitleFunction extends AbstractConditionalFunct @Override public void runInternal(CTX ctx) { - Optional owner = ctx.getOptionalParameter(DirectContextParameters.PLAYER); if (this.selector == null) { - owner.ifPresent(it -> it.sendTitle( + ctx.getOptionalParameter(DirectContextParameters.PLAYER).ifPresent(it -> it.sendTitle( AdventureHelper.miniMessage().deserialize(this.main.get(ctx), ctx.tagResolvers()), AdventureHelper.miniMessage().deserialize(this.sub.get(ctx), ctx.tagResolvers()), this.fadeIn.getInt(ctx), this.stay.getInt(ctx), this.fadeOut.getInt(ctx)