Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions game/src/main/java/net/onelitefeather/cygnus/Cygnus.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
import net.onelitefeather.cygnus.map.GameMapProvider;
import net.onelitefeather.cygnus.map.event.GameMapLoadEvent;
import net.onelitefeather.cygnus.map.event.GameMapLoadedEvent;
import net.onelitefeather.cygnus.map.event.GamePrepareEvent;
import net.onelitefeather.cygnus.team.TeamCreator;
import net.onelitefeather.cygnus.team.TeamHelper;
import net.onelitefeather.cygnus.view.event.ViewUpdateEvent;
import net.theevilreaper.aves.map.provider.AbstractMapProvider;
import net.theevilreaper.aves.util.functional.VoidConsumer;
Expand Down Expand Up @@ -62,7 +65,6 @@
import net.onelitefeather.cygnus.stamina.SlenderBarTrigger;
import net.onelitefeather.cygnus.stamina.StaminaService;
import net.onelitefeather.cygnus.utils.StaminaHelper;
import net.onelitefeather.cygnus.utils.TeamHelper;
import net.onelitefeather.cygnus.utils.ViewRuleUpdater;
import net.onelitefeather.cygnus.view.GameView;
import net.onelitefeather.cygnus.view.GameViewImpl;
Expand Down Expand Up @@ -131,6 +133,9 @@ private void initListener() {
);
manager.addListener(PlayerChatEvent.class, new PlayerChatListener());
manager.addListener(GameMapLoadEvent.class, _ -> ((GameMapProvider) this.mapProvider).loadGameMap());
manager.addListener(GamePrepareEvent.class, _ -> {
StaminaHelper.initStaminaObjects(this.teamService, this.staminaService);
});
registerCancelListener(manager);
}

Expand All @@ -153,20 +158,18 @@ private void registerGameListener() {
manager.addListener(StaminaStateChangeEvent.class, new StaminaStateChangeListener());
manager.addListener(PageDiscoveryCompletedEvent.class, new PageDiscoveryCompleteListener(this.linearPhaseSeries));
manager.addListener(ViewUpdateEvent.class, new ViewUpdateListener(this.view, this.pageProvider));

MinecraftServer.getPacketListenerManager().setPlayListener(ClientEntityActionPacket.class, CygnusEntityActionListener::listener);
}

private void initPhases() {
GameMapProvider gameMapProvider = ((GameMapProvider) this.mapProvider);
VoidConsumer staminaInitializer = () -> StaminaHelper.initStaminaObjects(this.teamService, this.staminaService);
VoidConsumer instanceSwitch = gameMapProvider::switchToGameMap;
VoidConsumer teamInitializer = () -> TeamHelper.teleportTeams(
this.teamService,
gameMapProvider.getGameMap(),
gameMapProvider.getActiveInstance().get()
);
LobbyPhase lobbyPhase = new LobbyPhase(staminaInitializer, this.gameConfig);
LobbyPhase lobbyPhase = new LobbyPhase(this.gameConfig);
this.linearPhaseSeries.add(lobbyPhase);
this.linearPhaseSeries.add(new WaitingPhase(this.view, instanceSwitch, teamInitializer));
this.linearPhaseSeries.add(new GamePhase(this.view, this::finishGame, this.gameConfig.gameTime()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import net.onelitefeather.cygnus.common.event.GamePreLaunchEvent;
import net.onelitefeather.cygnus.common.page.PageCalculation;
import net.onelitefeather.cygnus.common.util.HealthScalingCalculation;
import net.onelitefeather.cygnus.utils.TeamHelper;
import net.onelitefeather.cygnus.team.TeamHelper;

import java.util.function.Consumer;
import java.util.function.IntConsumer;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
import net.onelitefeather.cygnus.common.util.Helper;
import net.onelitefeather.cygnus.event.GameStartEvent;
import net.onelitefeather.cygnus.stamina.StaminaService;
import net.onelitefeather.cygnus.team.TeamHelper;
import net.onelitefeather.cygnus.utils.Items;
import net.onelitefeather.cygnus.utils.TeamHelper;
import net.theevilreaper.xerus.api.team.TeamService;

import java.util.function.Consumer;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import net.minestom.server.event.player.PlayerEntityInteractEvent;
import net.onelitefeather.cygnus.common.Tags;
import net.onelitefeather.cygnus.common.page.PageProvider;
import net.onelitefeather.cygnus.utils.TeamHelper;
import net.onelitefeather.cygnus.team.TeamHelper;

import java.util.UUID;
import java.util.function.Consumer;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import net.onelitefeather.cygnus.movement.PlayerStartSprintingEvent;
import net.onelitefeather.cygnus.player.CygnusPlayer;
import net.onelitefeather.cygnus.stamina.FoodBar;
import net.onelitefeather.cygnus.utils.TeamHelper;
import net.onelitefeather.cygnus.team.TeamHelper;

import java.util.function.Consumer;
import java.util.function.Function;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import net.onelitefeather.cygnus.common.Tags;
import net.onelitefeather.cygnus.movement.PlayerStopSprintingEvent;
import net.onelitefeather.cygnus.stamina.FoodBar;
import net.onelitefeather.cygnus.utils.TeamHelper;
import net.onelitefeather.cygnus.team.TeamHelper;

import java.util.function.Consumer;
import java.util.function.Function;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import net.minestom.server.item.ItemStack;
import net.onelitefeather.cygnus.common.Tags;
import net.onelitefeather.cygnus.stamina.SlenderBarTrigger;
import net.onelitefeather.cygnus.utils.TeamHelper;
import net.onelitefeather.cygnus.team.TeamHelper;

public final class SlenderItemListener {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package net.onelitefeather.cygnus.map.event;

import net.minestom.server.event.Event;

/**
* Event is used in the game to indicate that the game is about to start and some things must be loaded.
*
* @version 1.0.0
* @author theEvilReaper
* @since 2.6.6
*/
public class GamePrepareEvent implements Event {
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import net.minestom.server.event.EventDispatcher;
import net.onelitefeather.cygnus.common.config.GameConfig;
import net.onelitefeather.cygnus.map.event.GameMapLoadEvent;
import net.theevilreaper.aves.util.functional.VoidConsumer;
import net.onelitefeather.cygnus.map.event.GamePrepareEvent;
import net.theevilreaper.xerus.api.phase.TickDirection;
import net.theevilreaper.xerus.api.phase.TimedPhase;
import net.kyori.adventure.text.Component;
Expand Down Expand Up @@ -39,18 +39,13 @@ public final class LobbyPhase extends TimedPhase {

private static final ConnectionManager CONNECTION_MANAGER = MinecraftServer.getConnectionManager();
private final Task waitingTask;
private final VoidConsumer staminaInstantiation;
private final int lobbyTime;
private final int minPlayers;
private boolean forceStarted;
private Component displayComponent;

public LobbyPhase(
VoidConsumer staminaInstantiation,
GameConfig gameConfig
) {
public LobbyPhase(GameConfig gameConfig) {
super("Lobby", ChronoUnit.SECONDS, 1);
this.staminaInstantiation = staminaInstantiation;
this.lobbyTime = gameConfig.lobbyTime();
this.minPlayers = gameConfig.minPlayers();
this.setPaused(true);
Expand Down Expand Up @@ -112,13 +107,13 @@ public void onUpdate() {
}

if (getCurrentTicks() == 0) {
this.staminaInstantiation.apply();
EventDispatcher.call(new GamePrepareEvent());
}
}

/**
* Checks if the player requirements are met.
* If the player requirements are not met the phase will be paused.
* If the player requirements are not met, the phase will be paused.
*/
public void checkPlayerRequirements() {
if (CONNECTION_MANAGER.getOnlinePlayers().size() - 1 < this.minPlayers) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package net.onelitefeather.cygnus.stamina;

import net.onelitefeather.cygnus.team.TeamHelper;
import net.theevilreaper.aves.util.functional.PlayerConsumer;
import net.kyori.adventure.sound.Sound;
import net.minestom.server.entity.Player;
import net.minestom.server.sound.SoundEvent;
import net.onelitefeather.cygnus.common.Tags;
import net.onelitefeather.cygnus.common.util.Helper;
import net.onelitefeather.cygnus.utils.TeamHelper;
import org.jetbrains.annotations.Nullable;

import java.util.function.Supplier;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package net.onelitefeather.cygnus.stamina;

import net.theevilreaper.xerus.api.team.Team;
import net.minestom.server.entity.Player;
import net.minestom.server.utils.validate.Check;
import net.onelitefeather.cygnus.player.CygnusPlayer;
import org.jetbrains.annotations.Nullable;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.UUID;

/**
Expand Down Expand Up @@ -59,10 +59,10 @@ public void setSlenderBar(Player player, boolean forceStart) {
*
* @param team the team to get the player from it
*/
public void createStaminaBars(Team team) {
public void createStaminaBars(Set<Player> 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");
for (Player player : team.getPlayers()) {
Check.argCondition(team.isEmpty(), "Can't add players from a team without teams");
for (Player player : team) {
this.staminaBars.put(player.getUuid(), StaminaFactory.createFoodStamina((CygnusPlayer) player));
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package net.onelitefeather.cygnus;
package net.onelitefeather.cygnus.team;

import net.kyori.adventure.key.Key;
import net.onelitefeather.cygnus.component.TeamNameComponent;
Expand All @@ -7,12 +7,11 @@
import net.theevilreaper.xerus.api.team.Team;
import net.theevilreaper.xerus.api.team.TeamService;
import net.onelitefeather.cygnus.common.config.GameConfig;
import org.jetbrains.annotations.NotNull;

import java.util.Locale;

/**
* The interface contains a method to create the teams objects which are required for the game.
* The interface contains a method to create the team objects which are required for the game.
*
* @author theEvilReaper
* @version 1.0.0
Expand All @@ -26,10 +25,7 @@ public interface TeamCreator {
* @param gameConfig the configuration to get some values from it
* @param teamService the service to add the teams
*/
default void createTeams(
@NotNull GameConfig gameConfig,
@NotNull TeamService teamService
) {
default void createTeams(GameConfig gameConfig, TeamService teamService) {
Team slenderTeam = Team.of(
Key.key("cygnus", GameConfig.SLENDER_TEAM_NAME.toLowerCase(Locale.ROOT)),
gameConfig.slenderTeamSize()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package net.onelitefeather.cygnus.utils;
package net.onelitefeather.cygnus.team;

import net.onelitefeather.cygnus.utils.ViewRuleUpdater;
import net.theevilreaper.aves.util.Players;
import net.theevilreaper.xerus.api.team.Team;
import net.theevilreaper.xerus.api.team.TeamService;
Expand All @@ -14,7 +15,6 @@
import net.onelitefeather.cygnus.common.map.GameMap;

import java.util.HashSet;
import java.util.Optional;
import java.util.Set;

import static net.onelitefeather.cygnus.common.util.Helper.SLENDER_ID;
Expand All @@ -29,32 +29,81 @@
*/
public final class TeamHelper {

/**
* Result of a team allocation, containing the chosen slender player and the resulting survivors.
*
* @param slender the player who is the slender
* @param survivors the players who are survivors
*/
public record TeamAllocation(Player slender, Set<Player> survivors) {
}

/**
* Prepares which player should be the slender and which players should be the survivors.
*
* @param slenderTeam the team for the slender
* @param survivorTeam the team for the survivors
* @return the player who is the slender
* @return the resulting allocation, containing the slender player and the survivors
*/
public static Player prepareTeamAllocation(Team slenderTeam, Team survivorTeam) {
public static TeamAllocation prepareTeamAllocation(Team slenderTeam, Team survivorTeam) {
Check.argCondition(slenderTeam.getCapacity() != 1, "The slender team must have a capacity from one");
Optional<Player> randomPlayer = Players.getRandomPlayer();
if (randomPlayer.isEmpty()) {
throw new IllegalStateException("No player found to be the slender");
}

Player slenderPlayer = randomPlayer.get();
slenderPlayer.setTag(Tags.TEAM_ID, SLENDER_ID);
slenderPlayer.updateViewableRule(ViewRuleUpdater::viewableRuleForSlender);
Player slenderPlayer = selectSlenderPlayer();
assignSlender(slenderPlayer, slenderTeam);

Set<Player> survivors = collectSurvivors(slenderPlayer);
assignSurvivors(survivors, survivorTeam);

return new TeamAllocation(slenderPlayer, survivors);
}

/**
* Picks a random online player to become the slender.
*
* @return the chosen player
*/
private static Player selectSlenderPlayer() {
return Players.getRandomPlayer()
.orElseThrow(() -> new IllegalStateException("No player found to be the slender"));
}

slenderTeam.addPlayer(slenderPlayer);
Set<Player> onlinePlayers = new HashSet<>(MinecraftServer.getConnectionManager().getOnlinePlayers());
onlinePlayers.removeIf(player -> player.getUuid().equals(slenderPlayer.getUuid()));
survivorTeam.addPlayers(onlinePlayers);
/**
* Tags and assigns the given player as the slender and updates their view rule.
*
* @param player the player to become the slender
* @param slenderTeam the team to add the player to
*/
private static void assignSlender(Player player, Team slenderTeam) {
player.setTag(Tags.TEAM_ID, SLENDER_ID);
player.updateViewableRule(ViewRuleUpdater::viewableRuleForSlender);
slenderTeam.addPlayer(player);
}

onlinePlayers.forEach(player -> player.setTag(Tags.TEAM_ID, SURVIVOR_ID));
/**
* Collects all online players except the slender in a single pass.
*
* @param slenderPlayer the player to exclude
* @return the set of survivor candidates
*/
private static Set<Player> collectSurvivors(Player slenderPlayer) {
Set<Player> survivors = new HashSet<>();
for (Player player : MinecraftServer.getConnectionManager().getOnlinePlayers()) {
if (!player.getUuid().equals(slenderPlayer.getUuid())) {
survivors.add(player);
}
}
return survivors;
}

return slenderPlayer;
/**
* Tags the given players as survivors and adds them to the survivor team.
*
* @param survivors the players to assign
* @param survivorTeam the team to add them to
*/
private static void assignSurvivors(Set<Player> survivors, Team survivorTeam) {
survivors.forEach(player -> player.setTag(Tags.TEAM_ID, SURVIVOR_ID));
survivorTeam.addPlayers(survivors);
}

/**
Expand All @@ -66,11 +115,9 @@ public static Player prepareTeamAllocation(Team slenderTeam, Team survivorTeam)
*/
public static void teleportTeams(TeamService teamService, GameMap gameMap, Instance gameInstance) {
Team slenderTeam = teamService.getTeams().getFirst();

slenderTeam.getPlayers().forEach(player -> updateInstance(player, gameInstance, gameMap.getSlenderSpawn()));

Team survivorTeam = teamService.getTeams().getLast();

if (gameMap.getSurvivorSpawns().size() == 1) {
Pos position = gameMap.getSurvivorSpawns().iterator().next();
survivorTeam.getPlayers().forEach(player -> updateInstance(player, gameInstance, position));
Expand Down Expand Up @@ -140,4 +187,4 @@ private static void updateInstance(Player player, Instance instance, Pos positio
private TeamHelper() {
throw new UnsupportedOperationException("This class cannot be instantiated");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NotNullByDefault
package net.onelitefeather.cygnus.team;

import org.jetbrains.annotations.NotNullByDefault;
Loading
Loading