diff --git a/src/main/java/xyz/nucleoid/plasmid/api/game/player/JoinAcceptor.java b/src/main/java/xyz/nucleoid/plasmid/api/game/player/JoinAcceptor.java index 29f7e9d5..1871f009 100644 --- a/src/main/java/xyz/nucleoid/plasmid/api/game/player/JoinAcceptor.java +++ b/src/main/java/xyz/nucleoid/plasmid/api/game/player/JoinAcceptor.java @@ -124,4 +124,30 @@ default JoinAcceptorResult.Teleport teleport(ServerWorld world, Vec3d position) default JoinAcceptorResult pass() { return JoinAcceptorResult.PASS; } + + /** + * The result of this function only is selected for spectators, returning pass for non-spectators + * {@link GamePlayerEvents#ACCEPT} listener. + * @return a result + */ + default JoinAcceptorResult ifSpectator(Function spectatorFunction) { + if (this.intent() == JoinIntent.SPECTATE) { + return spectatorFunction.apply(this); + } else { + return this.pass(); + } + } + + /** + * The result of this function only is selected for participants, returning pass for spectators + * {@link GamePlayerEvents#ACCEPT} listener. + * @return a result + */ + default JoinAcceptorResult ifParticipant(Function participantFunction) { + if (this.intent() == JoinIntent.PLAY) { + return participantFunction.apply(this); + } else { + return this.pass(); + } + } } diff --git a/src/main/java/xyz/nucleoid/plasmid/api/game/player/JoinAcceptorResult.java b/src/main/java/xyz/nucleoid/plasmid/api/game/player/JoinAcceptorResult.java index b7539d67..aae596f7 100644 --- a/src/main/java/xyz/nucleoid/plasmid/api/game/player/JoinAcceptorResult.java +++ b/src/main/java/xyz/nucleoid/plasmid/api/game/player/JoinAcceptorResult.java @@ -2,6 +2,7 @@ import net.minecraft.server.network.ServerPlayerEntity; +import java.util.function.BiConsumer; import java.util.function.Consumer; public sealed interface JoinAcceptorResult permits JoinAcceptorResult.Pass, JoinAcceptorResult.Teleport { @@ -13,10 +14,18 @@ private Pass() { } non-sealed interface Teleport extends JoinAcceptorResult { - Teleport thenRun(Consumer consumer); + Teleport thenRun(BiConsumer consumer); + + default Teleport thenRun(Consumer consumer) { + return this.thenRun((players, intent) -> consumer.accept(players)); + } default Teleport thenRunForEach(Consumer consumer) { - return this.thenRun(players -> players.forEach(consumer)); + return this.thenRun((players, intent) -> players.forEach(consumer)); + } + + default Teleport thenRunForEach(BiConsumer consumer) { + return this.thenRun((players, intent) -> players.forEach(player -> consumer.accept(player, intent))); } } } diff --git a/src/main/java/xyz/nucleoid/plasmid/impl/game/manager/ManagedGameSpacePlayers.java b/src/main/java/xyz/nucleoid/plasmid/impl/game/manager/ManagedGameSpacePlayers.java index 18f27065..ce981a10 100644 --- a/src/main/java/xyz/nucleoid/plasmid/impl/game/manager/ManagedGameSpacePlayers.java +++ b/src/main/java/xyz/nucleoid/plasmid/impl/game/manager/ManagedGameSpacePlayers.java @@ -85,7 +85,7 @@ private GameResult accept(Collection players, JoinIntent int this.space.onAddPlayer(player); joiningSet.add(player); } - teleport.runCallbacks(joiningSet); + teleport.runCallbacks(joiningSet, intent); return GameResult.ok(); } catch (Throwable throwable) { diff --git a/src/main/java/xyz/nucleoid/plasmid/impl/player/LocalJoinAcceptor.java b/src/main/java/xyz/nucleoid/plasmid/impl/player/LocalJoinAcceptor.java index 1f449436..ff5da493 100644 --- a/src/main/java/xyz/nucleoid/plasmid/impl/player/LocalJoinAcceptor.java +++ b/src/main/java/xyz/nucleoid/plasmid/impl/player/LocalJoinAcceptor.java @@ -13,6 +13,7 @@ import xyz.nucleoid.plasmid.api.util.PlayerPos; import java.util.*; +import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; @@ -74,21 +75,21 @@ public JoinAcceptorResult.Teleport teleport(ServerWorld world, Vec3d position, f public static class Teleport implements JoinAcceptorResult.Teleport { private final Map positions; - private final List> thenRun = new ArrayList<>(); + private final List> thenRun = new ArrayList<>(); Teleport(Map positions) { this.positions = positions; } @Override - public JoinAcceptorResult.Teleport thenRun(Consumer consumer) { + public JoinAcceptorResult.Teleport thenRun(BiConsumer consumer) { this.thenRun.add(consumer); return this; } - public void runCallbacks(PlayerSet players) { + public void runCallbacks(PlayerSet players, JoinIntent intent) { for (var consumer : this.thenRun) { - consumer.accept(players); + consumer.accept(players, intent); } }