diff --git a/src/main/java/net/onelitefeather/stardust/listener/PlayerVanishListener.java b/src/main/java/net/onelitefeather/stardust/listener/PlayerVanishListener.java index 0ed5d3d1..8e62cc5e 100644 --- a/src/main/java/net/onelitefeather/stardust/listener/PlayerVanishListener.java +++ b/src/main/java/net/onelitefeather/stardust/listener/PlayerVanishListener.java @@ -8,7 +8,10 @@ import net.onelitefeather.stardust.user.UserPropertyType; import org.bukkit.Bukkit; import org.bukkit.block.data.Powerable; -import org.bukkit.entity.*; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -21,6 +24,7 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerItemConsumeEvent; import org.bukkit.event.raid.RaidTriggerEvent; import java.util.Arrays; @@ -138,16 +142,21 @@ public void onTarget(EntityTargetEvent event) { } } + @EventHandler + public void onItemConsume(PlayerItemConsumeEvent event) { + var player = event.getPlayer(); + User user = stardustPlugin.getUserService().getUser(player.getUniqueId()); + if (user == null) return; + if (!user.isVanished()) return; + event.setCancelled(true); + } + @EventHandler public void onFoodLevelChange(FoodLevelChangeEvent event) { - if (event.getEntity() instanceof Player player) { - try { - User user = stardustPlugin.getUserService().getUser(player.getUniqueId()); - event.setCancelled(user != null && (user.isVanished() || player.isInvulnerable())); - } catch (Exception e) { - stardustPlugin.getLogger().throwing(PlayerVanishListener.class.getSimpleName(), "onFoodLevelChange", e); - } - } + if (!(event.getEntity() instanceof Player player)) return; + if (event.getFoodLevel() >= event.getEntity().getFoodLevel()) return; //Ignore food level increment + if (!player.isInvulnerable()) return; + event.setCancelled(true); } @EventHandler diff --git a/src/main/java/net/onelitefeather/stardust/task/UserTask.java b/src/main/java/net/onelitefeather/stardust/task/UserTask.java index 6356db7d..5672a3a4 100644 --- a/src/main/java/net/onelitefeather/stardust/task/UserTask.java +++ b/src/main/java/net/onelitefeather/stardust/task/UserTask.java @@ -3,6 +3,7 @@ import net.kyori.adventure.text.Component; import net.onelitefeather.stardust.StardustPlugin; import net.onelitefeather.stardust.util.PlayerUtil; +import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; public class UserTask implements Runnable { @@ -17,12 +18,14 @@ public UserTask(@NotNull StardustPlugin plugin) { public void run() { plugin.getServer().getOnlinePlayers().forEach(player -> { + if (player.isInvulnerable()) saturatePlayer(player); + var user = plugin.getUserService().getUser(player.getUniqueId()); if (user == null) return; if (user.isVanished()) { player.sendActionBar(Component.translatable("plugin.vanish-actionbar")); - + saturatePlayer(player); //Keep fly mode if the player's gamemode was changed to survival or adventure if (!player.getAllowFlight() && !PlayerUtil.canEnterFlyMode(player)) { player.setAllowFlight(true); @@ -36,4 +39,13 @@ public void run() { } }); } + + private void saturatePlayer(Player player) { + int requiredFoodLevel = 3; //Required food level for sprinting + if(player.getFoodLevel() <= requiredFoodLevel) { + player.setFoodLevel(20); + player.setSaturation(20); + player.setExhaustion(0); + } + } }