diff --git a/game/src/main/java/net/onelitefeather/cygnus/Cygnus.java b/game/src/main/java/net/onelitefeather/cygnus/Cygnus.java index f1af353..30ec472 100644 --- a/game/src/main/java/net/onelitefeather/cygnus/Cygnus.java +++ b/game/src/main/java/net/onelitefeather/cygnus/Cygnus.java @@ -36,11 +36,13 @@ import net.onelitefeather.cygnus.common.util.Helper; import net.onelitefeather.cygnus.event.GameFinishEvent; import net.onelitefeather.cygnus.event.SlenderReviveEvent; +import net.onelitefeather.cygnus.event.StaminaStateChangeEvent; import net.onelitefeather.cygnus.listener.PlayerChatListener; import net.onelitefeather.cygnus.listener.PlayerDeathListener; import net.onelitefeather.cygnus.listener.PlayerLoginListener; import net.onelitefeather.cygnus.listener.PlayerQuitListener; import net.onelitefeather.cygnus.listener.PlayerSpawnListener; +import net.onelitefeather.cygnus.listener.StaminaStateChangeListener; import net.onelitefeather.cygnus.listener.game.GameFinishListener; import net.onelitefeather.cygnus.listener.game.GamePageListener; import net.onelitefeather.cygnus.listener.game.GamePreLaunchListener; @@ -152,6 +154,7 @@ private void registerGameListener() { manager.addListener( SlenderReviveEvent.class, new GameReviveListener(((GameMapProvider) this.mapProvider).getGameMap(), this.staminaService)); manager.addListener(GamePreLaunchEvent.class, new GamePreLaunchListener(this.pageProvider::setMaxPageAmount)); + manager.addListener(StaminaStateChangeEvent.class, new StaminaStateChangeListener()); MinecraftServer.getPacketListenerManager().setPlayListener(ClientEntityActionPacket.class, CygnusEntityActionListener::listener); } diff --git a/game/src/main/java/net/onelitefeather/cygnus/event/StaminaStateChangeEvent.java b/game/src/main/java/net/onelitefeather/cygnus/event/StaminaStateChangeEvent.java new file mode 100644 index 0000000..b5679d7 --- /dev/null +++ b/game/src/main/java/net/onelitefeather/cygnus/event/StaminaStateChangeEvent.java @@ -0,0 +1,47 @@ +package net.onelitefeather.cygnus.event; + +import net.minestom.server.entity.Player; +import net.minestom.server.event.trait.PlayerEvent; +import net.onelitefeather.cygnus.stamina.StaminaBar; + +/** + * Called when the state of a StaminaBar changes. + * + * @author Joltra + * @version 1.0.0 + * @since 1.0.0 + **/ +@SuppressWarnings("java:S6206") +public final class StaminaStateChangeEvent implements PlayerEvent { + + private final Player player; + private final StaminaBar.State state; + + /** + * Creates a new instance of the {@link StaminaStateChangeEvent}. + * + * @param player the player whose stamina state changed + * @param state the new state + */ + public StaminaStateChangeEvent(Player player, StaminaBar.State state) { + this.player = player; + this.state = state; + } + + /** + * {@inheritDoc} + */ + @Override + public Player getPlayer() { + return this.player; + } + + /** + * Returns the new state of the stamina bar. + * + * @return the state + */ + public StaminaBar.State getState() { + return state; + } +} diff --git a/game/src/main/java/net/onelitefeather/cygnus/listener/StaminaStateChangeListener.java b/game/src/main/java/net/onelitefeather/cygnus/listener/StaminaStateChangeListener.java new file mode 100644 index 0000000..68ad58f --- /dev/null +++ b/game/src/main/java/net/onelitefeather/cygnus/listener/StaminaStateChangeListener.java @@ -0,0 +1,40 @@ +package net.onelitefeather.cygnus.listener; + +import net.minestom.server.MinecraftServer; +import net.minestom.server.entity.Player; +import net.minestom.server.utils.PacketSendingUtils; +import net.onelitefeather.cygnus.event.StaminaStateChangeEvent; +import net.onelitefeather.cygnus.stamina.StaminaBar; + +import java.util.function.Consumer; + +/** + * Listener for stamina state changes to handle packet broadcasting. + * + * @author Joltra + * @version 1.0.0 + * @since 1.0.0 + **/ +public final class StaminaStateChangeListener implements Consumer { + + @Override + public void accept(StaminaStateChangeEvent event) { + Player player = event.getPlayer(); + StaminaBar.State state = event.getState(); + + if (state == StaminaBar.State.DRAINING) { + PacketSendingUtils.broadcastPlayPacket(player.getMetadataPacket()); + MinecraftServer.getConnectionManager().getOnlinePlayers() + .stream().filter(p -> !p.getUuid().equals(player.getUuid())).forEach(player::updateNewViewer); + PacketSendingUtils.broadcastPlayPacket(player.getMetadataPacket()); + return; + } + + if (state == StaminaBar.State.REGENERATING) { + PacketSendingUtils.broadcastPlayPacket(player.getMetadataPacket()); + MinecraftServer.getConnectionManager().getOnlinePlayers() + .stream().filter(p -> !p.getUuid().equals(player.getUuid())).forEach(player::updateOldViewer); + PacketSendingUtils.broadcastPlayPacket(player.getMetadataPacket()); + } + } +} diff --git a/game/src/main/java/net/onelitefeather/cygnus/stamina/SlenderBar.java b/game/src/main/java/net/onelitefeather/cygnus/stamina/SlenderBar.java index 2541c3f..78e5f19 100644 --- a/game/src/main/java/net/onelitefeather/cygnus/stamina/SlenderBar.java +++ b/game/src/main/java/net/onelitefeather/cygnus/stamina/SlenderBar.java @@ -1,18 +1,16 @@ package net.onelitefeather.cygnus.stamina; import net.kyori.adventure.sound.Sound; -import net.minestom.server.coordinate.Pos; -import net.minestom.server.entity.Player; import net.minestom.server.entity.attribute.Attribute; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.instance.Instance; import net.minestom.server.sound.SoundEvent; import net.onelitefeather.cygnus.common.Tags; import net.onelitefeather.cygnus.common.util.Helper; +import net.onelitefeather.cygnus.event.StaminaStateChangeEvent; import net.onelitefeather.cygnus.player.CygnusPlayer; -import org.jetbrains.annotations.Nullable; import java.time.temporal.ChronoUnit; -import java.util.function.BiConsumer; /** * @author theEvilReaper @@ -29,7 +27,6 @@ public non-sealed class SlenderBar extends StaminaBar implements SlenderBarHelpe private static final float TIME_STEP = 0.5f; private final String tileChar; private final int time; - private @Nullable BiConsumer accept; private double currentTime; private StaminaColors colorState; @@ -41,10 +38,6 @@ public non-sealed class SlenderBar extends StaminaBar implements SlenderBarHelpe this.colorState = StaminaColors.DRAINING; } - public void setAccept(BiConsumer accept) { - this.accept = accept; - } - @Override protected void onStart() { this.state = State.READY; @@ -72,7 +65,7 @@ private void handleDraining() { state = State.REGENERATING; colorState = StaminaColors.REGENERATING; player.setTag(Tags.HIDDEN, Helper.ONE_ID); - this.accept.accept(player, state); + EventDispatcher.call(new StaminaStateChangeEvent(player, state)); this.applyNightVision(player); player.getAttribute(Attribute.MOVEMENT_SPEED).setBaseValue(0.1f); player.sendSpringPackets(); @@ -104,7 +97,7 @@ public boolean changeStatus() { player.sendSpringPackets(); player.setSprinting(false); player.setBlockedSprinting(true); - this.accept.accept(player, State.DRAINING); + EventDispatcher.call(new StaminaStateChangeEvent(player, state)); } case REGENERATING -> { state = State.DRAINING; @@ -116,7 +109,7 @@ public boolean changeStatus() { player.sendSpringPackets(); player.setSprinting(false); player.setBlockedSprinting(true); - this.accept.accept(player, State.DRAINING); + EventDispatcher.call(new StaminaStateChangeEvent(player, state)); } case DRAINING -> { state = State.REGENERATING; @@ -127,7 +120,7 @@ public boolean changeStatus() { player.getAttribute(Attribute.MOVEMENT_SPEED).setBaseValue(0.1f); player.sendSpringPackets(); player.setBlockedSprinting(false); - this.accept.accept(player, State.REGENERATING); + EventDispatcher.call(new StaminaStateChangeEvent(player, state)); } } return true; diff --git a/game/src/main/java/net/onelitefeather/cygnus/stamina/StaminaService.java b/game/src/main/java/net/onelitefeather/cygnus/stamina/StaminaService.java index 7f54b01..5372404 100644 --- a/game/src/main/java/net/onelitefeather/cygnus/stamina/StaminaService.java +++ b/game/src/main/java/net/onelitefeather/cygnus/stamina/StaminaService.java @@ -1,8 +1,6 @@ package net.onelitefeather.cygnus.stamina; -import net.minestom.server.utils.PacketSendingUtils; import net.theevilreaper.xerus.api.team.Team; -import net.minestom.server.MinecraftServer; import net.minestom.server.entity.Player; import net.minestom.server.utils.validate.Check; import net.onelitefeather.cygnus.player.CygnusPlayer; @@ -64,22 +62,6 @@ public void setSlenderBar(Player player, boolean forceStart) { public void createStaminaBars(Team team) { Check.argCondition(!staminaBars.isEmpty(), "Unable to load stamina bars twice"); Check.argCondition(team.getPlayers().isEmpty(), "Can't add players from a team without teams"); - ((SlenderBar) this.slenderBar).setAccept((player, state) -> { - if (state == StaminaBar.State.DRAINING) { - PacketSendingUtils.broadcastPlayPacket(player.getMetadataPacket()); - MinecraftServer.getConnectionManager().getOnlinePlayers() - .stream().filter(p -> !p.getUuid().equals(player.getUuid())).forEach(player::updateNewViewer); - PacketSendingUtils.broadcastPlayPacket(player.getMetadataPacket()); - return; - } - - if (state == StaminaBar.State.REGENERATING) { - PacketSendingUtils.broadcastPlayPacket(player.getMetadataPacket()); - MinecraftServer.getConnectionManager().getOnlinePlayers() - .stream().filter(p -> !p.getUuid().equals(player.getUuid())).forEach(player::updateOldViewer); - PacketSendingUtils.broadcastPlayPacket(player.getMetadataPacket()); - } - }); for (Player player : team.getPlayers()) { this.staminaBars.put(player.getUuid(), StaminaFactory.createFoodStamina((CygnusPlayer) player)); }