diff --git a/game/src/main/java/net/onelitefeather/cygnus/Cygnus.java b/game/src/main/java/net/onelitefeather/cygnus/Cygnus.java index 30ec472..f16c90f 100644 --- a/game/src/main/java/net/onelitefeather/cygnus/Cygnus.java +++ b/game/src/main/java/net/onelitefeather/cygnus/Cygnus.java @@ -1,9 +1,9 @@ package net.onelitefeather.cygnus; -import net.minestom.server.utils.PacketSendingUtils; +import net.onelitefeather.cygnus.event.GameStartEvent; +import net.onelitefeather.cygnus.listener.game.GameStartListener; import net.onelitefeather.cygnus.map.GameMapProvider; import net.onelitefeather.cygnus.map.event.GameMapLoadedEvent; -import net.onelitefeather.cygnus.utils.Items; import net.theevilreaper.aves.map.provider.AbstractMapProvider; import net.theevilreaper.aves.util.Strings; import net.theevilreaper.aves.util.TimeFormat; @@ -122,9 +122,9 @@ private void handleAllPageFound() { private void initListener() { Supplier phaseSupplier = this.linearPhaseSeries::getCurrentPhase; var manager = MinecraftServer.getGlobalEventHandler(); - manager.addListener(GameMapLoadedEvent.class, event -> { - this.pageProvider.loadPageData(event.gameMap().getPageFaces()); - }); + manager.addListener(GameMapLoadedEvent.class, event -> + this.pageProvider.loadPageData(event.gameMap().getPageFaces()) + ); manager.addListener(PlayerSpawnEvent.class, new PlayerSpawnListener(player -> this.mapProvider.teleportToSpawn(player, false), phaseSupplier)); PlayerQuitListener quitListener = new PlayerQuitListener(phaseSupplier, teamService, this.staminaService::forceStopSlenderBar, this.gameConfig.minPlayers()); manager.addListener(PlayerDisconnectEvent.class, quitListener); @@ -146,6 +146,7 @@ private void registerGameListener() { SlenderBarTrigger trigger = new SlenderBarTrigger(this.staminaService::getSlenderBar, this::triggerViewRuleUpdate); new SlenderItemListener(trigger, manager); manager.addListener(GameFinishEvent.class, new GameFinishListener()); + manager.addListener(GameStartEvent.class, new GameStartListener(this.teamService, this.ambientProvider, this.staminaService, this.pageProvider)); manager.addListener(PlayerDeathEvent.class, new PlayerDeathListener(phaseSupplier, this.teamService)); manager.addListener(PlayerEntityInteractEvent.class, new PlayerPageInteractListener(this.pageProvider)); manager.addListener(PageEvent.class, new GamePageListener(this.pageProvider)); @@ -171,7 +172,7 @@ private void initPhases() { LobbyPhase lobbyPhase = new LobbyPhase(gameMapLoader, staminaInitializer, this.gameConfig.lobbyTime(), this.gameConfig.minPlayers()); this.linearPhaseSeries.add(lobbyPhase); this.linearPhaseSeries.add(new WaitingPhase(this.view, instanceSwitch, teamInitializer)); - this.linearPhaseSeries.add(new GamePhase(this.view, this::triggerGameStart, this::finishGame, this.gameConfig.gameTime())); + this.linearPhaseSeries.add(new GamePhase(this.view, this::finishGame, this.gameConfig.gameTime())); this.linearPhaseSeries.add(new RestartPhase()); } @@ -191,29 +192,6 @@ private void finishGame() { ); } - private void triggerGameStart() { - var slenderPlayer = this.teamService.getTeams().get(Helper.SLENDER_ID).getPlayers().stream().findFirst().get(); - slenderPlayer.setTag(Tags.HIDDEN, (byte) 1); - slenderPlayer.sendMessage(Messages.SLENDER_JOIN_PART); - Items.setSlenderEye(slenderPlayer); - this.staminaService.start(); - this.pageProvider.spawn(); - this.ambientProvider.startTask(); - var message = Messages.getSurvivorJoinMessage(String.valueOf(this.pageProvider.getMaxPageAmount())); - this.teamService.getTeams().get(Helper.SURVIVOR_ID).getPlayers().forEach(player -> { - player.sendMessage(message); - player.setTag(Tags.HIDDEN, (byte) 0); - }); - TeamHelper.updateTabList(this.teamService); - PacketSendingUtils.broadcastPlayPacket(slenderPlayer.getMetadataPacket()); - MinecraftServer.getConnectionManager().getOnlinePlayers().stream().filter(p -> !p.getUuid().equals(slenderPlayer.getUuid())).forEach(p -> { - slenderPlayer.updateOldViewer(p); - }); - GameMapProvider gameMapProvider = (GameMapProvider) this.mapProvider; - MinecraftServer.getConnectionManager().getOnlinePlayers().forEach(player -> player.setRespawnPoint(gameMapProvider.getActiveMap().getSpawn())); - PacketSendingUtils.broadcastPlayPacket(slenderPlayer.getMetadataPacket()); - } - private void triggerViewRuleUpdate(@NotNull Player player) { ViewRuleUpdater.updateViewer(player, this.teamService.getTeams().get(Helper.SURVIVOR_ID)); } diff --git a/game/src/main/java/net/onelitefeather/cygnus/event/GameStartEvent.java b/game/src/main/java/net/onelitefeather/cygnus/event/GameStartEvent.java new file mode 100644 index 0000000..8d1305a --- /dev/null +++ b/game/src/main/java/net/onelitefeather/cygnus/event/GameStartEvent.java @@ -0,0 +1,14 @@ +package net.onelitefeather.cygnus.event; + +import net.minestom.server.event.Event; + +/** + * The event will be called when the game starts. + * + * @author theEvilReaper + * @version 1.0.0 + * @see net.onelitefeather.cygnus.phase.GamePhase + * @since 2.3.1 + */ +public class GameStartEvent implements Event { +} diff --git a/game/src/main/java/net/onelitefeather/cygnus/listener/game/GameStartListener.java b/game/src/main/java/net/onelitefeather/cygnus/listener/game/GameStartListener.java new file mode 100644 index 0000000..28ba131 --- /dev/null +++ b/game/src/main/java/net/onelitefeather/cygnus/listener/game/GameStartListener.java @@ -0,0 +1,54 @@ +package net.onelitefeather.cygnus.listener.game; + +import net.minestom.server.MinecraftServer; +import net.minestom.server.utils.PacketSendingUtils; +import net.onelitefeather.cygnus.ambient.AmbientProvider; +import net.onelitefeather.cygnus.common.Messages; +import net.onelitefeather.cygnus.common.Tags; +import net.onelitefeather.cygnus.common.page.PageProvider; +import net.onelitefeather.cygnus.common.util.Helper; +import net.onelitefeather.cygnus.event.GameStartEvent; +import net.onelitefeather.cygnus.stamina.StaminaService; +import net.onelitefeather.cygnus.utils.Items; +import net.onelitefeather.cygnus.utils.TeamHelper; +import net.theevilreaper.xerus.api.team.TeamService; + +import java.util.function.Consumer; + +public final class GameStartListener implements Consumer { + + private final TeamService teamService; + private final AmbientProvider ambientProvider; + private final StaminaService staminaService; + private final PageProvider pageProvider; + + public GameStartListener(TeamService teamService, AmbientProvider ambientProvider, StaminaService staminaService, PageProvider pageProvider) { + this.teamService = teamService; + this.ambientProvider = ambientProvider; + this.staminaService = staminaService; + this.pageProvider = pageProvider; + } + + @Override + public void accept(GameStartEvent event) { + var slenderPlayer = this.teamService.getTeams().get(Helper.SLENDER_ID).getPlayers().stream().findFirst().get(); + slenderPlayer.setTag(Tags.HIDDEN, (byte) 1); + slenderPlayer.sendMessage(Messages.SLENDER_JOIN_PART); + Items.setSlenderEye(slenderPlayer); + this.staminaService.start(); + this.pageProvider.spawn(); + this.ambientProvider.startTask(); + var message = Messages.getSurvivorJoinMessage(String.valueOf(this.pageProvider.getMaxPageAmount())); + this.teamService.getTeams().get(Helper.SURVIVOR_ID).getPlayers().forEach(player -> { + player.sendMessage(message); + player.setTag(Tags.HIDDEN, (byte) 0); + }); + TeamHelper.updateTabList(this.teamService); + PacketSendingUtils.broadcastPlayPacket(slenderPlayer.getMetadataPacket()); + MinecraftServer.getConnectionManager().getOnlinePlayers() + .stream() + .filter(p -> !p.equals(slenderPlayer)) + .forEach(slenderPlayer::updateOldViewer); + PacketSendingUtils.broadcastPlayPacket(slenderPlayer.getMetadataPacket()); + } +} diff --git a/game/src/main/java/net/onelitefeather/cygnus/phase/GamePhase.java b/game/src/main/java/net/onelitefeather/cygnus/phase/GamePhase.java index 7d7fdda..c109d51 100644 --- a/game/src/main/java/net/onelitefeather/cygnus/phase/GamePhase.java +++ b/game/src/main/java/net/onelitefeather/cygnus/phase/GamePhase.java @@ -1,5 +1,7 @@ package net.onelitefeather.cygnus.phase; +import net.minestom.server.event.EventDispatcher; +import net.onelitefeather.cygnus.event.GameStartEvent; import net.theevilreaper.xerus.api.phase.TickDirection; import net.theevilreaper.xerus.api.phase.TimedPhase; import net.minestom.server.MinecraftServer; @@ -20,19 +22,16 @@ public final class GamePhase extends TimedPhase { private final GameView gameView; - private final Runnable startRunnable; private @Nullable GameFinishEvent finishEvent; /** * Creates a new instance from the {@link GamePhase}. * * @param gameView the view to update - * @param startRunnable the runnable to execute on start * @param endRunnable the runnable to execute on end */ public GamePhase( GameView gameView, - Runnable startRunnable, Runnable endRunnable, int gameTime ) { @@ -41,7 +40,6 @@ public GamePhase( this.setTickDirection(TickDirection.DOWN); this.setEndTicks(0); this.gameView = gameView; - this.startRunnable = startRunnable; this.setFinishedCallback(endRunnable); } @@ -59,7 +57,7 @@ public void setFinishEvent(GameFinishEvent finishEvent) { public void onStart() { super.onStart(); addListener(PlayerTickEvent.class, new CygnusPlayerTickListener()); - this.startRunnable.run(); + EventDispatcher.call(new GameStartEvent()); } @Override