Skip to content
Draft
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
10 changes: 4 additions & 6 deletions game/src/main/java/net/onelitefeather/cygnus/Cygnus.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import net.onelitefeather.cygnus.common.util.Helper;
import net.onelitefeather.cygnus.event.GameFinishEvent;
import net.onelitefeather.cygnus.event.SlenderReviveEvent;
import net.onelitefeather.cygnus.event.SlenderVisibilityChangeEvent;
import net.onelitefeather.cygnus.event.StaminaStateChangeEvent;
import net.onelitefeather.cygnus.listener.PlayerChatListener;
import net.onelitefeather.cygnus.listener.PlayerDeathListener;
Expand All @@ -54,6 +55,7 @@
import net.onelitefeather.cygnus.listener.game.PlayerStartSprintingListener;
import net.onelitefeather.cygnus.listener.game.PlayerStopSprintingListener;
import net.onelitefeather.cygnus.listener.game.SlenderItemListener;
import net.onelitefeather.cygnus.listener.game.SlenderVisibilityChangeListener;
import net.onelitefeather.cygnus.movement.CygnusEntityActionListener;
import net.onelitefeather.cygnus.movement.PlayerStartSprintingEvent;
import net.onelitefeather.cygnus.movement.PlayerStopSprintingEvent;
Expand All @@ -65,7 +67,6 @@
import net.onelitefeather.cygnus.stamina.SlenderBarTrigger;
import net.onelitefeather.cygnus.stamina.StaminaService;
import net.onelitefeather.cygnus.utils.StaminaHelper;
import net.onelitefeather.cygnus.utils.ViewRuleUpdater;
import net.onelitefeather.cygnus.view.GameView;
import net.onelitefeather.cygnus.view.GameViewImpl;
import org.jetbrains.annotations.NotNull;
Expand Down Expand Up @@ -143,8 +144,9 @@ private void registerGameListener() {
Supplier<Phase> phaseSupplier = this.linearPhaseSeries::getCurrentPhase;
var manager = MinecraftServer.getGlobalEventHandler();

SlenderBarTrigger trigger = new SlenderBarTrigger(this.staminaService::getSlenderBar, this::triggerViewRuleUpdate);
SlenderBarTrigger trigger = new SlenderBarTrigger(this.staminaService::getSlenderBar);
new SlenderItemListener(trigger, manager);
manager.addListener(SlenderVisibilityChangeEvent.class, new SlenderVisibilityChangeListener());
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));
Expand Down Expand Up @@ -182,8 +184,4 @@ private void finishGame() {
this.ambientProvider.stopTask();
MinecraftServer.getPacketListenerManager().setPlayListener(ClientEntityActionPacket.class, EntityActionListener::listener);
}

private void triggerViewRuleUpdate(@NotNull Player player) {
ViewRuleUpdater.updateViewer(player, this.teamService.getTeams().get(TeamHelper.SURVIVOR_TEAM_ID));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package net.onelitefeather.cygnus.event;

import net.minestom.server.entity.Player;
import net.minestom.server.event.trait.PlayerEvent;

/**
* Called when the slender changes their visibility state.
*
* @author theEvilReaper
* @version 1.0.0
* @since 2.6.6
**/
@SuppressWarnings("java:S6206")
public final class SlenderVisibilityChangeEvent implements PlayerEvent {

private final Player player;
private final boolean hidden;

/**
* Creates a new instance of the {@link SlenderVisibilityChangeEvent}.
*
* @param player the slender player whose visibility changed
* @param hidden true if the slender is now hidden, false if visible
*/
public SlenderVisibilityChangeEvent(Player player, boolean hidden) {
this.player = player;
this.hidden = hidden;
}

/**
* {@inheritDoc}
*/
@Override
public Player getPlayer() {
return this.player;
}

/**
* Returns whether the slender is now hidden.
*
* @return true if hidden, false if visible
*/
public boolean isHidden() {
return hidden;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ public void accept(GameStartEvent event) {
var message = Messages.getSurvivorJoinMessage(String.valueOf(this.pageProvider.getMaxPageAmount()));
this.teamService.getTeams().get(TeamHelper.SURVIVOR_TEAM_ID).getPlayers().forEach(player -> {
player.sendMessage(message);
player.setTag(Tags.HIDDEN, SlenderBarHelper.VISIBLE);
});
TeamHelper.updateTabList(this.teamService);
PacketSendingUtils.broadcastPlayPacket(slenderPlayer.getMetadataPacket());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package net.onelitefeather.cygnus.listener.game;

import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.Player;
import net.onelitefeather.cygnus.common.Tags;
import net.onelitefeather.cygnus.common.map.GameMap;
import net.onelitefeather.cygnus.event.SlenderReviveEvent;
import net.onelitefeather.cygnus.event.SlenderVisibilityChangeEvent;
import net.onelitefeather.cygnus.stamina.StaminaService;
import net.onelitefeather.cygnus.team.TeamHelper;
import net.onelitefeather.cygnus.utils.Items;
Expand Down Expand Up @@ -32,6 +34,7 @@ public void accept(SlenderReviveEvent event) {
Player player = event.getPlayer();
staminaService.setSlenderBar(player, true);
player.setTag(Tags.TEAM_ID, TeamHelper.SLENDER_TEAM_ID);
MinecraftServer.getGlobalEventHandler().call(new SlenderVisibilityChangeEvent(player, false));
player.teleport(gameMap.getSlenderSpawn());
Items.setSlenderEye(player);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package net.onelitefeather.cygnus.listener.game;

import net.minestom.server.entity.Player;
import net.onelitefeather.cygnus.event.SlenderVisibilityChangeEvent;

import java.util.function.Consumer;

/**
* Listens for the {@link SlenderVisibilityChangeEvent} to update the visibility rule of the Slender.
*
* @author theEvilReaper
* @version 1.0.0
* @since 1.0.0
*/
public final class SlenderVisibilityChangeListener implements Consumer<SlenderVisibilityChangeEvent> {

@Override
public void accept(SlenderVisibilityChangeEvent event) {
Player slender = event.getPlayer();
boolean hidden = event.isHidden();
slender.updateViewableRule(viewer -> !hidden);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package net.onelitefeather.cygnus.stamina;

import net.minestom.server.event.EventDispatcher;
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.event.SlenderVisibilityChangeEvent;
import org.jetbrains.annotations.Nullable;

import java.util.function.Supplier;
Expand All @@ -25,19 +26,16 @@ public final class SlenderBarTrigger {
private static final Sound ABORT_SOUND = Sound.sound(SoundEvent.ENTITY_ITEM_BREAK, Sound.Source.MASTER, 1F, 0F);

private final Supplier<@Nullable StaminaBar> slenderBarSupplier;
private final PlayerConsumer updateRuneFunction;

private long lastSoundTimeStamp = 0;

/**
* Creates a new instance of this class.
*
* @param slenderBarSupplier the supplier to get the {@link SlenderBar}
* @param updateRuneFunction the function to update the rune status
*/
public SlenderBarTrigger(Supplier<@Nullable StaminaBar> slenderBarSupplier, PlayerConsumer updateRuneFunction) {
public SlenderBarTrigger(Supplier<@Nullable StaminaBar> slenderBarSupplier) {
this.slenderBarSupplier = slenderBarSupplier;
this.updateRuneFunction = updateRuneFunction;
}

/**
Expand All @@ -57,7 +55,6 @@ public void trigger(Player player) {
lastSoundTimeStamp = System.currentTimeMillis() + COOLDOWN_TIME;
if (slenderBar.changeStatus()) {
this.changeVisibilityStatus(player);
this.updateRuneFunction.accept(player);
}
}

Expand All @@ -69,6 +66,8 @@ public void trigger(Player player) {
private void changeVisibilityStatus(Player player) {
Byte value = player.getTag(Tags.HIDDEN);
byte currentValue = value != null ? value : SlenderBarHelper.VISIBLE;
player.setTag(Tags.HIDDEN, currentValue == SlenderBarHelper.VISIBLE ? SlenderBarHelper.HIDDEN : SlenderBarHelper.VISIBLE);
byte newValue = currentValue == SlenderBarHelper.VISIBLE ? SlenderBarHelper.HIDDEN : SlenderBarHelper.VISIBLE;
player.setTag(Tags.HIDDEN, newValue);
EventDispatcher.call(new SlenderVisibilityChangeEvent(player, newValue == SlenderBarHelper.HIDDEN));
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package net.onelitefeather.cygnus.team;

import net.minestom.server.event.EventDispatcher;
import net.onelitefeather.cygnus.common.strategy.TeleportStrategy;
import net.onelitefeather.cygnus.utils.ViewRuleUpdater;
import net.onelitefeather.cygnus.event.SlenderVisibilityChangeEvent;
import net.theevilreaper.aves.util.Players;
import net.theevilreaper.xerus.api.team.Team;
import net.theevilreaper.xerus.api.team.TeamService;
Expand Down Expand Up @@ -83,7 +84,7 @@ private static Player selectSlenderPlayer() {
*/
private static void assignSlender(Player player, Team slenderTeam) {
player.setTag(Tags.TEAM_ID, SLENDER_TEAM_ID);
player.updateViewableRule(ViewRuleUpdater::viewableRuleForSlender);
EventDispatcher.call(new SlenderVisibilityChangeEvent(player, false));
slenderTeam.addPlayer(player);
}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package net.onelitefeather.cygnus.listener.game;

import net.minestom.server.entity.Player;
import net.minestom.server.instance.Instance;
import net.minestom.testing.Env;
import net.minestom.testing.extension.MicrotusExtension;
import net.onelitefeather.cygnus.event.SlenderVisibilityChangeEvent;
import org.jetbrains.annotations.NotNull;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

@ExtendWith(MicrotusExtension.class)
class SlenderVisibilityChangeListenerTest {

@Test
void testSlenderHidden(@NotNull Env env) {
Instance instance = env.createFlatInstance();
Player slender = env.createPlayer(instance);
Player viewer = env.createPlayer(instance);

// Register the listener to the test environment's EventNode
env.process().eventHandler().addListener(SlenderVisibilityChangeEvent.class, new SlenderVisibilityChangeListener());

// Fire the event via Minestom's event handler
SlenderVisibilityChangeEvent event = new SlenderVisibilityChangeEvent(slender, true);
env.process().eventHandler().call(event);

assertFalse(slender.isViewer(viewer), "Slender should be hidden to viewers");

env.destroyInstance(instance, true);
}

@Test
void testSlenderVisible(@NotNull Env env) {
Instance instance = env.createFlatInstance();
Player slender = env.createPlayer(instance);
Player viewer = env.createPlayer(instance);

// Register the listener to the test environment's EventNode
env.process().eventHandler().addListener(SlenderVisibilityChangeEvent.class, new SlenderVisibilityChangeListener());

// Set up the state first as hidden, to test visibility toggle
slender.updateViewableRule(v -> false);
assertFalse(slender.isViewer(viewer));

// Fire the event via Minestom's event handler
SlenderVisibilityChangeEvent event = new SlenderVisibilityChangeEvent(slender, false);
env.process().eventHandler().call(event);

assertTrue(slender.isViewer(viewer), "Slender should be visible to viewers");

env.destroyInstance(instance, true);
}
}
Loading