Skip to content

Commit 4d1cf9b

Browse files
authored
chore: replace SlenderBar BiConsumer with event-based state change system (#75)
* chore(game): add StaminaChangeEvent and listener * chore(game): register new listener * chore(game): replace consumer with event calls
1 parent 0bc02bd commit 4d1cf9b

5 files changed

Lines changed: 96 additions & 31 deletions

File tree

game/src/main/java/net/onelitefeather/cygnus/Cygnus.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,13 @@
3636
import net.onelitefeather.cygnus.common.util.Helper;
3737
import net.onelitefeather.cygnus.event.GameFinishEvent;
3838
import net.onelitefeather.cygnus.event.SlenderReviveEvent;
39+
import net.onelitefeather.cygnus.event.StaminaStateChangeEvent;
3940
import net.onelitefeather.cygnus.listener.PlayerChatListener;
4041
import net.onelitefeather.cygnus.listener.PlayerDeathListener;
4142
import net.onelitefeather.cygnus.listener.PlayerLoginListener;
4243
import net.onelitefeather.cygnus.listener.PlayerQuitListener;
4344
import net.onelitefeather.cygnus.listener.PlayerSpawnListener;
45+
import net.onelitefeather.cygnus.listener.StaminaStateChangeListener;
4446
import net.onelitefeather.cygnus.listener.game.GameFinishListener;
4547
import net.onelitefeather.cygnus.listener.game.GamePageListener;
4648
import net.onelitefeather.cygnus.listener.game.GamePreLaunchListener;
@@ -152,6 +154,7 @@ private void registerGameListener() {
152154
manager.addListener(
153155
SlenderReviveEvent.class, new GameReviveListener(((GameMapProvider) this.mapProvider).getGameMap(), this.staminaService));
154156
manager.addListener(GamePreLaunchEvent.class, new GamePreLaunchListener(this.pageProvider::setMaxPageAmount));
157+
manager.addListener(StaminaStateChangeEvent.class, new StaminaStateChangeListener());
155158
MinecraftServer.getPacketListenerManager().setPlayListener(ClientEntityActionPacket.class, CygnusEntityActionListener::listener);
156159
}
157160

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package net.onelitefeather.cygnus.event;
2+
3+
import net.minestom.server.entity.Player;
4+
import net.minestom.server.event.trait.PlayerEvent;
5+
import net.onelitefeather.cygnus.stamina.StaminaBar;
6+
7+
/**
8+
* Called when the state of a StaminaBar changes.
9+
*
10+
* @author Joltra
11+
* @version 1.0.0
12+
* @since 1.0.0
13+
**/
14+
@SuppressWarnings("java:S6206")
15+
public final class StaminaStateChangeEvent implements PlayerEvent {
16+
17+
private final Player player;
18+
private final StaminaBar.State state;
19+
20+
/**
21+
* Creates a new instance of the {@link StaminaStateChangeEvent}.
22+
*
23+
* @param player the player whose stamina state changed
24+
* @param state the new state
25+
*/
26+
public StaminaStateChangeEvent(Player player, StaminaBar.State state) {
27+
this.player = player;
28+
this.state = state;
29+
}
30+
31+
/**
32+
* {@inheritDoc}
33+
*/
34+
@Override
35+
public Player getPlayer() {
36+
return this.player;
37+
}
38+
39+
/**
40+
* Returns the new state of the stamina bar.
41+
*
42+
* @return the state
43+
*/
44+
public StaminaBar.State getState() {
45+
return state;
46+
}
47+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package net.onelitefeather.cygnus.listener;
2+
3+
import net.minestom.server.MinecraftServer;
4+
import net.minestom.server.entity.Player;
5+
import net.minestom.server.utils.PacketSendingUtils;
6+
import net.onelitefeather.cygnus.event.StaminaStateChangeEvent;
7+
import net.onelitefeather.cygnus.stamina.StaminaBar;
8+
9+
import java.util.function.Consumer;
10+
11+
/**
12+
* Listener for stamina state changes to handle packet broadcasting.
13+
*
14+
* @author Joltra
15+
* @version 1.0.0
16+
* @since 1.0.0
17+
**/
18+
public final class StaminaStateChangeListener implements Consumer<StaminaStateChangeEvent> {
19+
20+
@Override
21+
public void accept(StaminaStateChangeEvent event) {
22+
Player player = event.getPlayer();
23+
StaminaBar.State state = event.getState();
24+
25+
if (state == StaminaBar.State.DRAINING) {
26+
PacketSendingUtils.broadcastPlayPacket(player.getMetadataPacket());
27+
MinecraftServer.getConnectionManager().getOnlinePlayers()
28+
.stream().filter(p -> !p.getUuid().equals(player.getUuid())).forEach(player::updateNewViewer);
29+
PacketSendingUtils.broadcastPlayPacket(player.getMetadataPacket());
30+
return;
31+
}
32+
33+
if (state == StaminaBar.State.REGENERATING) {
34+
PacketSendingUtils.broadcastPlayPacket(player.getMetadataPacket());
35+
MinecraftServer.getConnectionManager().getOnlinePlayers()
36+
.stream().filter(p -> !p.getUuid().equals(player.getUuid())).forEach(player::updateOldViewer);
37+
PacketSendingUtils.broadcastPlayPacket(player.getMetadataPacket());
38+
}
39+
}
40+
}

game/src/main/java/net/onelitefeather/cygnus/stamina/SlenderBar.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
package net.onelitefeather.cygnus.stamina;
22

33
import net.kyori.adventure.sound.Sound;
4-
import net.minestom.server.coordinate.Pos;
5-
import net.minestom.server.entity.Player;
64
import net.minestom.server.entity.attribute.Attribute;
5+
import net.minestom.server.event.EventDispatcher;
76
import net.minestom.server.instance.Instance;
87
import net.minestom.server.sound.SoundEvent;
98
import net.onelitefeather.cygnus.common.Tags;
109
import net.onelitefeather.cygnus.common.util.Helper;
10+
import net.onelitefeather.cygnus.event.StaminaStateChangeEvent;
1111
import net.onelitefeather.cygnus.player.CygnusPlayer;
12-
import org.jetbrains.annotations.Nullable;
1312

1413
import java.time.temporal.ChronoUnit;
15-
import java.util.function.BiConsumer;
1614

1715
/**
1816
* @author theEvilReaper
@@ -29,7 +27,6 @@ public non-sealed class SlenderBar extends StaminaBar implements SlenderBarHelpe
2927
private static final float TIME_STEP = 0.5f;
3028
private final String tileChar;
3129
private final int time;
32-
private @Nullable BiConsumer<Player, State> accept;
3330
private double currentTime;
3431
private StaminaColors colorState;
3532

@@ -41,10 +38,6 @@ public non-sealed class SlenderBar extends StaminaBar implements SlenderBarHelpe
4138
this.colorState = StaminaColors.DRAINING;
4239
}
4340

44-
public void setAccept(BiConsumer<Player, State> accept) {
45-
this.accept = accept;
46-
}
47-
4841
@Override
4942
protected void onStart() {
5043
this.state = State.READY;
@@ -72,7 +65,7 @@ private void handleDraining() {
7265
state = State.REGENERATING;
7366
colorState = StaminaColors.REGENERATING;
7467
player.setTag(Tags.HIDDEN, Helper.ONE_ID);
75-
this.accept.accept(player, state);
68+
EventDispatcher.call(new StaminaStateChangeEvent(player, state));
7669
this.applyNightVision(player);
7770
player.getAttribute(Attribute.MOVEMENT_SPEED).setBaseValue(0.1f);
7871
player.sendSpringPackets();
@@ -104,7 +97,7 @@ public boolean changeStatus() {
10497
player.sendSpringPackets();
10598
player.setSprinting(false);
10699
player.setBlockedSprinting(true);
107-
this.accept.accept(player, State.DRAINING);
100+
EventDispatcher.call(new StaminaStateChangeEvent(player, state));
108101
}
109102
case REGENERATING -> {
110103
state = State.DRAINING;
@@ -116,7 +109,7 @@ public boolean changeStatus() {
116109
player.sendSpringPackets();
117110
player.setSprinting(false);
118111
player.setBlockedSprinting(true);
119-
this.accept.accept(player, State.DRAINING);
112+
EventDispatcher.call(new StaminaStateChangeEvent(player, state));
120113
}
121114
case DRAINING -> {
122115
state = State.REGENERATING;
@@ -127,7 +120,7 @@ public boolean changeStatus() {
127120
player.getAttribute(Attribute.MOVEMENT_SPEED).setBaseValue(0.1f);
128121
player.sendSpringPackets();
129122
player.setBlockedSprinting(false);
130-
this.accept.accept(player, State.REGENERATING);
123+
EventDispatcher.call(new StaminaStateChangeEvent(player, state));
131124
}
132125
}
133126
return true;

game/src/main/java/net/onelitefeather/cygnus/stamina/StaminaService.java

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package net.onelitefeather.cygnus.stamina;
22

3-
import net.minestom.server.utils.PacketSendingUtils;
43
import net.theevilreaper.xerus.api.team.Team;
5-
import net.minestom.server.MinecraftServer;
64
import net.minestom.server.entity.Player;
75
import net.minestom.server.utils.validate.Check;
86
import net.onelitefeather.cygnus.player.CygnusPlayer;
@@ -64,22 +62,6 @@ public void setSlenderBar(Player player, boolean forceStart) {
6462
public void createStaminaBars(Team team) {
6563
Check.argCondition(!staminaBars.isEmpty(), "Unable to load stamina bars twice");
6664
Check.argCondition(team.getPlayers().isEmpty(), "Can't add players from a team without teams");
67-
((SlenderBar) this.slenderBar).setAccept((player, state) -> {
68-
if (state == StaminaBar.State.DRAINING) {
69-
PacketSendingUtils.broadcastPlayPacket(player.getMetadataPacket());
70-
MinecraftServer.getConnectionManager().getOnlinePlayers()
71-
.stream().filter(p -> !p.getUuid().equals(player.getUuid())).forEach(player::updateNewViewer);
72-
PacketSendingUtils.broadcastPlayPacket(player.getMetadataPacket());
73-
return;
74-
}
75-
76-
if (state == StaminaBar.State.REGENERATING) {
77-
PacketSendingUtils.broadcastPlayPacket(player.getMetadataPacket());
78-
MinecraftServer.getConnectionManager().getOnlinePlayers()
79-
.stream().filter(p -> !p.getUuid().equals(player.getUuid())).forEach(player::updateOldViewer);
80-
PacketSendingUtils.broadcastPlayPacket(player.getMetadataPacket());
81-
}
82-
});
8365
for (Player player : team.getPlayers()) {
8466
this.staminaBars.put(player.getUuid(), StaminaFactory.createFoodStamina((CygnusPlayer) player));
8567
}

0 commit comments

Comments
 (0)