Additional changes for second Playtest
This commit is contained in:
parent
cdc73cc230
commit
70e69cc76f
12 changed files with 180 additions and 160 deletions
Binary file not shown.
|
@ -3,7 +3,7 @@ package dev.celestialfox.spectrumsurvival;
|
||||||
import dev.celestialfox.spectrumsurvival.game.commands.*;
|
import dev.celestialfox.spectrumsurvival.game.commands.*;
|
||||||
import dev.celestialfox.spectrumsurvival.game.managers.GameManager;
|
import dev.celestialfox.spectrumsurvival.game.managers.GameManager;
|
||||||
import dev.celestialfox.spectrumsurvival.game.managers.QueueManager;
|
import dev.celestialfox.spectrumsurvival.game.managers.QueueManager;
|
||||||
import dev.celestialfox.spectrumsurvival.utils.classes.SignHandler;
|
import dev.celestialfox.spectrumsurvival.utils.classes.Randomized;
|
||||||
import dev.celestialfox.spectrumsurvival.utils.config.Checks;
|
import dev.celestialfox.spectrumsurvival.utils.config.Checks;
|
||||||
import dev.celestialfox.spectrumsurvival.utils.config.Settings;
|
import dev.celestialfox.spectrumsurvival.utils.config.Settings;
|
||||||
import dev.celestialfox.spectrumsurvival.utils.events.MiscEvents;
|
import dev.celestialfox.spectrumsurvival.utils.events.MiscEvents;
|
||||||
|
@ -44,7 +44,6 @@ public class Server {
|
||||||
|
|
||||||
Terminal.start();
|
Terminal.start();
|
||||||
tablist();
|
tablist();
|
||||||
MinecraftServer.getBlockManager().registerHandler("minecraft:spruce_wall_sign", SignHandler::new);
|
|
||||||
|
|
||||||
// Server Start
|
// Server Start
|
||||||
BungeeCordProxy.enable();
|
BungeeCordProxy.enable();
|
||||||
|
@ -67,31 +66,9 @@ public class Server {
|
||||||
.append(Component.text("\nᴘʟᴀʏᴇʀѕ ɪɴ-ɢᴀᴍᴇ: " + GameManager.getPlayersInGame() + "\n", NamedTextColor.BLUE)));
|
.append(Component.text("\nᴘʟᴀʏᴇʀѕ ɪɴ-ɢᴀᴍᴇ: " + GameManager.getPlayersInGame() + "\n", NamedTextColor.BLUE)));
|
||||||
|
|
||||||
Component footer = Component.newline()
|
Component footer = Component.newline()
|
||||||
.append(Component.text("ᴍᴀᴅᴇ ʙʏ: CelestialFox Studio", randomMadeByColor()));
|
.append(Component.text("ᴍᴀᴅᴇ ʙʏ: CelestialFox Studio", Randomized.madeByColor()));
|
||||||
|
|
||||||
Audiences.players().sendPlayerListHeaderAndFooter(header, footer);
|
Audiences.players().sendPlayerListHeaderAndFooter(header, footer);
|
||||||
}, TaskSchedule.tick(10), TaskSchedule.tick(10));
|
}, TaskSchedule.tick(10), TaskSchedule.tick(10));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static NamedTextColor randomMadeByColor() {
|
|
||||||
Random random = new Random();
|
|
||||||
int num = random.nextInt(4);
|
|
||||||
switch (num) {
|
|
||||||
case 0 -> {
|
|
||||||
return NamedTextColor.BLUE;
|
|
||||||
}
|
|
||||||
case 1 -> {
|
|
||||||
return NamedTextColor.GRAY;
|
|
||||||
}
|
|
||||||
case 2 -> {
|
|
||||||
return NamedTextColor.GOLD;
|
|
||||||
}
|
|
||||||
case 3 -> {
|
|
||||||
return NamedTextColor.GREEN;
|
|
||||||
}
|
|
||||||
default -> {
|
|
||||||
return NamedTextColor.RED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -33,8 +33,10 @@ public class GameLobby {
|
||||||
private Task latestTask;
|
private Task latestTask;
|
||||||
private Task repeatTask;
|
private Task repeatTask;
|
||||||
private Task endTask;
|
private Task endTask;
|
||||||
|
private Task bossBarTask;
|
||||||
private Instance instance;
|
private Instance instance;
|
||||||
private String name = "";
|
private String name = "";
|
||||||
|
private long phaseStartTime;
|
||||||
|
|
||||||
public void setPlayers(ArrayList<UUID> playerList) {
|
public void setPlayers(ArrayList<UUID> playerList) {
|
||||||
players.addAll(playerList);
|
players.addAll(playerList);
|
||||||
|
@ -116,18 +118,28 @@ public class GameLobby {
|
||||||
public Task getTask() {
|
public Task getTask() {
|
||||||
return latestTask;
|
return latestTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRepeatTask(Task task) {
|
public void setRepeatTask(Task task) {
|
||||||
repeatTask = task;
|
repeatTask = task;
|
||||||
}
|
}
|
||||||
public Task getRepeatTask() {
|
public Task getRepeatTask() {
|
||||||
return repeatTask;
|
return repeatTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setEndTask(Task task) {
|
public void setEndTask(Task task) {
|
||||||
endTask = task;
|
endTask = task;
|
||||||
}
|
}
|
||||||
public Task getEndTask() {
|
public Task getEndTask() {
|
||||||
return endTask;
|
return endTask;
|
||||||
}
|
}
|
||||||
|
public void setBossBarTask(Task task) {
|
||||||
|
bossBarTask = task;
|
||||||
|
}
|
||||||
|
public Task getBossBarTask() {
|
||||||
|
return bossBarTask;
|
||||||
|
}
|
||||||
|
public long getPhaseStartTime() {
|
||||||
|
return phaseStartTime;
|
||||||
|
}
|
||||||
|
public void setPhaseStartTime(long phaseStartTime) {
|
||||||
|
this.phaseStartTime = phaseStartTime;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import net.minestom.server.entity.EntityType;
|
||||||
import net.minestom.server.entity.GameMode;
|
import net.minestom.server.entity.GameMode;
|
||||||
import net.minestom.server.entity.Player;
|
import net.minestom.server.entity.Player;
|
||||||
import net.minestom.server.entity.ai.goal.MeleeAttackGoal;
|
import net.minestom.server.entity.ai.goal.MeleeAttackGoal;
|
||||||
|
import net.minestom.server.entity.ai.goal.RandomStrollGoal;
|
||||||
import net.minestom.server.entity.ai.target.ClosestEntityTarget;
|
import net.minestom.server.entity.ai.target.ClosestEntityTarget;
|
||||||
import net.minestom.server.entity.attribute.Attribute;
|
import net.minestom.server.entity.attribute.Attribute;
|
||||||
import net.minestom.server.utils.time.TimeUnit;
|
import net.minestom.server.utils.time.TimeUnit;
|
||||||
|
@ -15,16 +16,15 @@ public class ZombieCreature extends EntityCreature {
|
||||||
|
|
||||||
public ZombieCreature() {
|
public ZombieCreature() {
|
||||||
super(EntityType.ZOMBIE);
|
super(EntityType.ZOMBIE);
|
||||||
|
getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).setBaseValue(0.2);
|
||||||
getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).setBaseValue(0.15);
|
|
||||||
|
|
||||||
addAIGroup(
|
addAIGroup(
|
||||||
List.of(
|
List.of(
|
||||||
new MeleeAttackGoal(this, 1.6, 20, TimeUnit.SERVER_TICK) // Attack the target
|
new MeleeAttackGoal(this, 1.6, 20, TimeUnit.SERVER_TICK), // Attack the target
|
||||||
|
new RandomStrollGoal(this, 20) // Walk around
|
||||||
),
|
),
|
||||||
List.of(
|
List.of(
|
||||||
new ClosestEntityTarget(this, 50,
|
new ClosestEntityTarget(this, 64, entity -> entity instanceof Player player
|
||||||
entity -> entity instanceof Player && ((Player) entity).getGameMode() != GameMode.SPECTATOR) // Target the nearest player
|
&& player.getGameMode() != GameMode.SPECTATOR) // If there is none, target the nearest player
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package dev.celestialfox.spectrumsurvival.game.managers;
|
package dev.celestialfox.spectrumsurvival.game.managers;
|
||||||
|
|
||||||
import dev.celestialfox.spectrumsurvival.game.classes.GameLobby;
|
|
||||||
import dev.celestialfox.spectrumsurvival.utils.Misc;
|
import dev.celestialfox.spectrumsurvival.utils.Misc;
|
||||||
import dev.celestialfox.spectrumsurvival.game.classes.GameQueue;
|
import dev.celestialfox.spectrumsurvival.game.classes.GameQueue;
|
||||||
import net.kyori.adventure.key.Key;
|
import net.kyori.adventure.key.Key;
|
||||||
|
@ -22,7 +21,7 @@ public class QueueManager {
|
||||||
public static List<GameQueue> queues = new ArrayList<>();
|
public static List<GameQueue> queues = new ArrayList<>();
|
||||||
private static final HashMap<GameQueue, Task> countdownTasks = new HashMap<>();
|
private static final HashMap<GameQueue, Task> countdownTasks = new HashMap<>();
|
||||||
private static int minPlayers = 6;
|
private static int minPlayers = 6;
|
||||||
private static int maxPlayers = 10;
|
private static int maxPlayers = 12;
|
||||||
public static Instance lobbyInstance;
|
public static Instance lobbyInstance;
|
||||||
|
|
||||||
public static void joinPlayer(Player player) {
|
public static void joinPlayer(Player player) {
|
||||||
|
@ -46,8 +45,8 @@ public class QueueManager {
|
||||||
createQueue(player);
|
createQueue(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendMessage(Component.text("The queue starts the countdown from §e6 players.", NamedTextColor.GRAY));
|
player.sendMessage(Component.text("The queue starts the countdown from §e" + minPlayers + " players.", NamedTextColor.GRAY));
|
||||||
player.sendMessage(Component.text("One queue can hold up to §e10 players.", NamedTextColor.GRAY));
|
player.sendMessage(Component.text("One queue can hold up to §e" + maxPlayers + " players.", NamedTextColor.GRAY));
|
||||||
player.sendMessage(Component.text("§e§lWaiting for too long? §rUse §a/queue force §rto start now.", NamedTextColor.GRAY));
|
player.sendMessage(Component.text("§e§lWaiting for too long? §rUse §a/queue force §rto start now.", NamedTextColor.GRAY));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
package dev.celestialfox.spectrumsurvival.game.phases;
|
||||||
|
|
||||||
|
import dev.celestialfox.spectrumsurvival.game.classes.GameLobby;
|
||||||
|
import dev.celestialfox.spectrumsurvival.utils.Misc;
|
||||||
|
import net.kyori.adventure.bossbar.BossBar;
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
|
|
||||||
|
public class PhaseBossBar {
|
||||||
|
public static void updateBossBar(GameLobby game, BossBar nextPhaseBossBar, int phaseDuration) {
|
||||||
|
long currentTime = System.currentTimeMillis();
|
||||||
|
long elapsedMillis = currentTime - game.getPhaseStartTime();
|
||||||
|
long elapsedSeconds = elapsedMillis / 1000;
|
||||||
|
float progress = 1.0f - (float) elapsedSeconds / phaseDuration;
|
||||||
|
nextPhaseBossBar.progress(Math.max(progress, 0.0f));
|
||||||
|
long remainingSeconds = phaseDuration - elapsedSeconds;
|
||||||
|
String remainingTime = String.format("%d seconds until next phase", Math.max(remainingSeconds, 0));
|
||||||
|
nextPhaseBossBar.name(Component.text(remainingTime, NamedTextColor.WHITE));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void resetBossBarProgress(BossBar nextPhaseBossBar) {
|
||||||
|
nextPhaseBossBar.progress(1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeBossBar(GameLobby game, BossBar nextPhaseBossBar) {
|
||||||
|
game.getPlayers().forEach(uuid -> Misc.getPlayer(uuid).hideBossBar(nextPhaseBossBar));
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,6 +6,7 @@ import dev.celestialfox.spectrumsurvival.utils.Misc;
|
||||||
import dev.celestialfox.spectrumsurvival.game.classes.GameLobby;
|
import dev.celestialfox.spectrumsurvival.game.classes.GameLobby;
|
||||||
import dev.celestialfox.spectrumsurvival.game.managers.ConversionManager;
|
import dev.celestialfox.spectrumsurvival.game.managers.ConversionManager;
|
||||||
import net.hollowcube.polar.PolarLoader;
|
import net.hollowcube.polar.PolarLoader;
|
||||||
|
import net.kyori.adventure.bossbar.BossBar;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.format.NamedTextColor;
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
import net.minestom.server.MinecraftServer;
|
import net.minestom.server.MinecraftServer;
|
||||||
|
@ -42,6 +43,7 @@ public class PhaseLogic {
|
||||||
private static Task endTask;
|
private static Task endTask;
|
||||||
|
|
||||||
private static final int zombiesSpawn = 5;
|
private static final int zombiesSpawn = 5;
|
||||||
|
private static BossBar nextPhaseBossBar;
|
||||||
|
|
||||||
public static void random(GameLobby game) {
|
public static void random(GameLobby game) {
|
||||||
if (game.getRepeatTask() != null) {
|
if (game.getRepeatTask() != null) {
|
||||||
|
@ -51,15 +53,26 @@ public class PhaseLogic {
|
||||||
game.getEndTask().cancel();
|
game.getEndTask().cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nextPhaseBossBar = BossBar.bossBar(
|
||||||
|
Component.text("Time until next phase", NamedTextColor.WHITE),
|
||||||
|
1.0f, // progress (between 0.0 and 1.0)
|
||||||
|
BossBar.Color.WHITE,
|
||||||
|
BossBar.Overlay.PROGRESS
|
||||||
|
);
|
||||||
|
|
||||||
|
game.getPlayers().forEach(uuid -> Misc.getPlayer(uuid).showBossBar(nextPhaseBossBar));
|
||||||
|
|
||||||
|
Task bossBarTask = scheduler.buildTask(() -> PhaseBossBar.updateBossBar(game, nextPhaseBossBar, phaseDuration))
|
||||||
|
.repeat(TaskSchedule.tick(1))
|
||||||
|
.schedule();
|
||||||
|
|
||||||
|
game.setBossBarTask(bossBarTask);
|
||||||
|
|
||||||
repeatTask = scheduler.buildTask(() -> {
|
repeatTask = scheduler.buildTask(() -> {
|
||||||
// Check if all players are eliminated
|
// Check if all players are eliminated
|
||||||
if (game.getEliminated().size() == game.getPlayers().size()) {
|
if (game.getEliminated().size() == game.getPlayers().size()) {
|
||||||
ConversionManager.fromGame(game);
|
endGame(game);
|
||||||
game.getRepeatTask().cancel();
|
|
||||||
game.getEndTask().cancel();
|
game.getEndTask().cancel();
|
||||||
if (game.getTask() != null) {
|
|
||||||
game.getTask().cancel();
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
logger.debug("Starting random phase selection for GameLobby: {}", game.getName());
|
logger.debug("Starting random phase selection for GameLobby: {}", game.getName());
|
||||||
if (game.getTask() != null) {
|
if (game.getTask() != null) {
|
||||||
|
@ -68,9 +81,9 @@ public class PhaseLogic {
|
||||||
try {
|
try {
|
||||||
Phase[] phases = Phase.values();
|
Phase[] phases = Phase.values();
|
||||||
Phase selectedPhase;
|
Phase selectedPhase;
|
||||||
|
Random random = new Random(System.nanoTime());
|
||||||
do {
|
do {
|
||||||
int randomIndex = new Random().nextInt(phases.length);
|
selectedPhase = phases[random.nextInt(phases.length)];
|
||||||
selectedPhase = phases[randomIndex];
|
|
||||||
} while (
|
} while (
|
||||||
(selectedPhase == game.getPhase())
|
(selectedPhase == game.getPhase())
|
||||||
|| ((selectedPhase == Phase.GRAY || selectedPhase == Phase.BLUE) && (game.getPlayers().size() == game.getEliminated().size()+1)));
|
|| ((selectedPhase == Phase.GRAY || selectedPhase == Phase.BLUE) && (game.getPlayers().size() == game.getEliminated().size()+1)));
|
||||||
|
@ -92,17 +105,13 @@ public class PhaseLogic {
|
||||||
|
|
||||||
endTask = scheduler.buildTask(() -> {
|
endTask = scheduler.buildTask(() -> {
|
||||||
try {
|
try {
|
||||||
logger.debug("Ending game for GameLobby: {}", game.getName());
|
endGame(game);
|
||||||
ConversionManager.fromGame(game);
|
|
||||||
game.getRepeatTask().cancel();
|
|
||||||
if (game.getTask() != null) {
|
|
||||||
game.getTask().cancel();
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error("Exception occurred during game ending: {}", e.getMessage());
|
logger.error("Exception occurred during game ending: {}", e.getMessage());
|
||||||
}
|
}
|
||||||
}).delay(TaskSchedule.seconds(gameTime)).schedule();
|
}).delay(TaskSchedule.seconds(gameTime)).schedule();
|
||||||
|
|
||||||
|
game.setPhaseStartTime(System.currentTimeMillis());
|
||||||
game.setRepeatTask(repeatTask);
|
game.setRepeatTask(repeatTask);
|
||||||
game.setEndTask(endTask);
|
game.setEndTask(endTask);
|
||||||
}
|
}
|
||||||
|
@ -114,16 +123,16 @@ public class PhaseLogic {
|
||||||
|
|
||||||
// Logic
|
// Logic
|
||||||
List<Pos> positions = new ArrayList<>();
|
List<Pos> positions = new ArrayList<>();
|
||||||
int minX = -10;
|
int minX = -20;
|
||||||
int maxX = 10;
|
int maxX = 20;
|
||||||
int minZ = -10;
|
int minZ = -20;
|
||||||
int maxZ = 10;
|
int maxZ = 20;
|
||||||
for (int x = minX; x <= maxX; x++) {
|
for (int x = minX; x <= maxX; x++) {
|
||||||
for (int z = minZ; z <= maxZ; z++) {
|
for (int z = minZ; z <= maxZ; z++) {
|
||||||
for (int y = 55; y < 75; y++) {
|
for (int y = 66; y < 70; y++) {
|
||||||
Pos pos = new Pos(x, y, z);
|
Pos pos = new Pos(x, y, z);
|
||||||
if (new Random().nextInt(10) < 2) {
|
if (new Random().nextInt(5) < 2) {
|
||||||
if (isFlamableBlock(game.getInstance().getBlock(pos))) {
|
if (Misc.isFlamableBlock(game.getInstance().getBlock(pos))) {
|
||||||
positions.add(pos);
|
positions.add(pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -138,7 +147,7 @@ public class PhaseLogic {
|
||||||
Pos pos = iterator.next();
|
Pos pos = iterator.next();
|
||||||
game.getInstance().setBlock(pos, Block.FIRE);
|
game.getInstance().setBlock(pos, Block.FIRE);
|
||||||
}
|
}
|
||||||
}).repeat(Duration.ofMillis(250)).schedule();
|
}).repeat(TaskSchedule.tick(1)).schedule();
|
||||||
|
|
||||||
scheduler.buildTask(() -> {
|
scheduler.buildTask(() -> {
|
||||||
task.cancel();
|
task.cancel();
|
||||||
|
@ -197,7 +206,7 @@ public class PhaseLogic {
|
||||||
}
|
}
|
||||||
public static void green(GameLobby game) {
|
public static void green(GameLobby game) {
|
||||||
setupPhase(game, Phase.GREEN, "New color picked! §aGREEN",
|
setupPhase(game, Phase.GREEN, "New color picked! §aGREEN",
|
||||||
"Avoid wither roses and zombies! Wither roses deal damage, while zombies eliminate players instantly.",
|
"Wither roses harm, zombies kill instantly.",
|
||||||
"Green", NamedTextColor.GREEN, 18000, Weather.CLEAR);
|
"Green", NamedTextColor.GREEN, 18000, Weather.CLEAR);
|
||||||
|
|
||||||
// Logic
|
// Logic
|
||||||
|
@ -253,13 +262,13 @@ public class PhaseLogic {
|
||||||
lightning.setInstance(randomPlayer.getInstance(), lightningPos);
|
lightning.setInstance(randomPlayer.getInstance(), lightningPos);
|
||||||
lightning.spawn();
|
lightning.spawn();
|
||||||
}
|
}
|
||||||
}).delay(Duration.ofSeconds(5)).repeat(Duration.ofSeconds(2)).schedule();
|
}).delay(Duration.ofSeconds(5)).repeat(Duration.ofSeconds(3)).schedule();
|
||||||
game.setTask(task);
|
game.setTask(task);
|
||||||
}
|
}
|
||||||
public static void gray(GameLobby game) {
|
public static void gray(GameLobby game) {
|
||||||
setupPhase(game, Phase.GRAY, "New color picked! §8GRAY",
|
setupPhase(game, Phase.GRAY, "New color picked! §8GRAY",
|
||||||
"Darkness everywhere, PvP active. Fight everyone to survive.",
|
"Darkness everywhere, PvP active. Fight everyone to survive.",
|
||||||
"Gray", NamedTextColor.DARK_GRAY, 18000, Weather.CLEAR);
|
"Gray", NamedTextColor.GRAY, 18000, Weather.CLEAR);
|
||||||
|
|
||||||
// Logic
|
// Logic
|
||||||
game.getPlayers().forEach(uuid -> {
|
game.getPlayers().forEach(uuid -> {
|
||||||
|
@ -273,10 +282,14 @@ public class PhaseLogic {
|
||||||
|
|
||||||
public static void setupPhase(GameLobby game, Phase phase, String colorPicked, String desc,
|
public static void setupPhase(GameLobby game, Phase phase, String colorPicked, String desc,
|
||||||
String colorText, NamedTextColor color, int time, Weather weather) {
|
String colorText, NamedTextColor color, int time, Weather weather) {
|
||||||
|
PhaseBossBar.resetBossBarProgress(nextPhaseBossBar);
|
||||||
|
game.setPhaseStartTime(System.currentTimeMillis());
|
||||||
|
PhaseBossBar.updateBossBar(game, nextPhaseBossBar, phaseDuration);
|
||||||
|
|
||||||
game.setPhase(phase);
|
game.setPhase(phase);
|
||||||
game.sendMessage(Component.text(colorPicked, NamedTextColor.GRAY));
|
game.sendMessage(Component.text(colorPicked, NamedTextColor.WHITE));
|
||||||
game.sendMessage(Component.text(desc, color));
|
game.sendMessage(Component.text(desc, color));
|
||||||
Misc.showTitle(game.getInstance(), Component.text("■", color), Component.text(colorText, color));
|
Misc.showTitle(game.getInstance(), Component.text("■ " + colorText + " ■", color), Component.text(desc, color));
|
||||||
|
|
||||||
long currentGameTime = game.getInstance().getTime();
|
long currentGameTime = game.getInstance().getTime();
|
||||||
if (time != currentGameTime) {
|
if (time != currentGameTime) {
|
||||||
|
@ -286,6 +299,17 @@ public class PhaseLogic {
|
||||||
game.getInstance().setWeather(weather);
|
game.getInstance().setWeather(weather);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void endGame(GameLobby game) {
|
||||||
|
logger.debug("Ending game for GameLobby: {}", game.getName());
|
||||||
|
ConversionManager.fromGame(game);
|
||||||
|
game.getRepeatTask().cancel();
|
||||||
|
game.getBossBarTask().cancel();
|
||||||
|
if (game.getTask() != null) {
|
||||||
|
game.getTask().cancel();
|
||||||
|
}
|
||||||
|
PhaseBossBar.removeBossBar(game, nextPhaseBossBar);
|
||||||
|
}
|
||||||
|
|
||||||
private static boolean isUnderBlock(Player player) {
|
private static boolean isUnderBlock(Player player) {
|
||||||
Pos playerPosition = player.getPosition();
|
Pos playerPosition = player.getPosition();
|
||||||
for (int i = 1; i <= 5; i++) {
|
for (int i = 1; i <= 5; i++) {
|
||||||
|
@ -346,45 +370,6 @@ public class PhaseLogic {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isFlamableBlock(Block block) {
|
|
||||||
return !block.compare(Block.AIR)
|
|
||||||
&& !block.compare(Block.GRASS_BLOCK)
|
|
||||||
&& !block.compare(Block.FARMLAND)
|
|
||||||
&& !block.compare(Block.STONE)
|
|
||||||
&& !block.compare(Block.ANDESITE)
|
|
||||||
&& !block.compare(Block.ANDESITE_STAIRS)
|
|
||||||
&& !block.compare(Block.ANDESITE_SLAB)
|
|
||||||
&& !block.compare(Block.GRAVEL)
|
|
||||||
&& !block.compare(Block.DIRT_PATH)
|
|
||||||
&& !block.compare(Block.OAK_FENCE)
|
|
||||||
&& !block.compare(Block.OAK_FENCE_GATE)
|
|
||||||
&& !block.compare(Block.STONE_BRICKS)
|
|
||||||
&& !block.compare(Block.MOSSY_STONE_BRICK_WALL)
|
|
||||||
&& !block.compare(Block.MOSSY_STONE_BRICKS)
|
|
||||||
&& !block.compare(Block.MOSSY_STONE_BRICK_STAIRS)
|
|
||||||
&& !block.compare(Block.STONE_BRICK_STAIRS)
|
|
||||||
&& !block.compare(Block.MOSSY_STONE_BRICK_SLAB)
|
|
||||||
&& !block.compare(Block.STONE_BRICK_WALL)
|
|
||||||
&& !block.compare(Block.BRICK_SLAB)
|
|
||||||
&& !block.compare(Block.BRICK_STAIRS)
|
|
||||||
&& !block.compare(Block.CHAIN)
|
|
||||||
&& !block.compare(Block.WATER_CAULDRON)
|
|
||||||
&& !block.compare(Block.OAK_TRAPDOOR)
|
|
||||||
&& !block.compare(Block.SPRUCE_FENCE)
|
|
||||||
&& !block.compare(Block.SPRUCE_FENCE_GATE)
|
|
||||||
&& !block.compare(Block.SPRUCE_TRAPDOOR)
|
|
||||||
&& !block.compare(Block.SPRUCE_WALL_SIGN)
|
|
||||||
&& !block.compare(Block.SPRUCE_STAIRS)
|
|
||||||
&& !block.compare(Block.BARRIER)
|
|
||||||
&& !block.compare(Block.SAND)
|
|
||||||
&& !block.compare(Block.MOSS_BLOCK)
|
|
||||||
&& !block.compare(Block.WATER)
|
|
||||||
&& !block.compare(Block.SEA_LANTERN)
|
|
||||||
&& !block.compare(Block.RED_CARPET)
|
|
||||||
&& !block.compare(Block.WHITE_CARPET)
|
|
||||||
&& !block.compare(Block.TRIPWIRE);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void resetInstance(GameLobby game) {
|
public static void resetInstance(GameLobby game) {
|
||||||
InstanceManager instanceManager = MinecraftServer.getInstanceManager();
|
InstanceManager instanceManager = MinecraftServer.getInstanceManager();
|
||||||
InstanceContainer instanceContainer = instanceManager.createInstanceContainer();
|
InstanceContainer instanceContainer = instanceManager.createInstanceContainer();
|
||||||
|
@ -396,4 +381,6 @@ public class PhaseLogic {
|
||||||
|
|
||||||
game.setInstance(instanceContainer);
|
game.setInstance(instanceContainer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,34 +26,6 @@ public class Misc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void replaceInRegion(Instance instance, Pos start, Pos end, Block newBlockType) {
|
|
||||||
int startX = (int) Math.min(start.x(), end.x());
|
|
||||||
int startY = (int) Math.min(start.y(), end.y());
|
|
||||||
int startZ = (int) Math.min(start.z(), end.z());
|
|
||||||
|
|
||||||
int endX = (int) Math.max(start.x(), end.x());
|
|
||||||
int endY = (int) Math.max(start.y(), end.y());
|
|
||||||
int endZ = (int) Math.max(start.z(), end.z());
|
|
||||||
|
|
||||||
for (int x = startX; x <= endX; x++) {
|
|
||||||
for (int y = startY; y <= endY; y++) {
|
|
||||||
for (int z = startZ; z <= endZ; z++) {
|
|
||||||
Pos pos = new Pos(x, y, z);
|
|
||||||
if (instance.getBlock(pos).compare(Block.AIR)
|
|
||||||
|| instance.getBlock(pos).compare(Block.MOSS_CARPET)
|
|
||||||
|| instance.getBlock(pos).compare(Block.SHORT_GRASS)
|
|
||||||
|| instance.getBlock(pos).compare(Block.TALL_GRASS)
|
|
||||||
|| instance.getBlock(pos).compare(Block.WHEAT)
|
|
||||||
|| instance.getBlock(pos).compare(Block.CREEPER_HEAD)
|
|
||||||
|| instance.getBlock(pos).compare(Block.RED_CARPET)
|
|
||||||
|| instance.getBlock(pos).compare(Block.WHITE_CARPET)) {
|
|
||||||
instance.setBlock(pos, newBlockType);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void transitionToTime(GameLobby game, Duration duration, long startTime, long endTime) {
|
public static void transitionToTime(GameLobby game, Duration duration, long startTime, long endTime) {
|
||||||
long transitionDuration = duration.toMillis();
|
long transitionDuration = duration.toMillis();
|
||||||
long startMillis = System.currentTimeMillis();
|
long startMillis = System.currentTimeMillis();
|
||||||
|
@ -78,4 +50,45 @@ public class Misc {
|
||||||
Instance instance = player.getInstance();
|
Instance instance = player.getInstance();
|
||||||
return instance.getBlock(playerPosition);
|
return instance.getBlock(playerPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isFlamableBlock(Block block) {
|
||||||
|
return !block.compare(Block.AIR)
|
||||||
|
&& !block.compare(Block.GRASS_BLOCK)
|
||||||
|
&& !block.compare(Block.FARMLAND)
|
||||||
|
&& !block.compare(Block.STONE)
|
||||||
|
&& !block.compare(Block.ANDESITE)
|
||||||
|
&& !block.compare(Block.ANDESITE_STAIRS)
|
||||||
|
&& !block.compare(Block.ANDESITE_SLAB)
|
||||||
|
&& !block.compare(Block.GRAVEL)
|
||||||
|
&& !block.compare(Block.DIRT_PATH)
|
||||||
|
&& !block.compare(Block.OAK_FENCE)
|
||||||
|
&& !block.compare(Block.OAK_FENCE_GATE)
|
||||||
|
&& !block.compare(Block.STONE_BRICKS)
|
||||||
|
&& !block.compare(Block.MOSSY_STONE_BRICK_WALL)
|
||||||
|
&& !block.compare(Block.MOSSY_STONE_BRICKS)
|
||||||
|
&& !block.compare(Block.MOSSY_STONE_BRICK_STAIRS)
|
||||||
|
&& !block.compare(Block.STONE_BRICK_STAIRS)
|
||||||
|
&& !block.compare(Block.MOSSY_STONE_BRICK_SLAB)
|
||||||
|
&& !block.compare(Block.STONE_BRICK_WALL)
|
||||||
|
&& !block.compare(Block.BRICK_SLAB)
|
||||||
|
&& !block.compare(Block.BRICK_STAIRS)
|
||||||
|
&& !block.compare(Block.CHAIN)
|
||||||
|
&& !block.compare(Block.WATER_CAULDRON)
|
||||||
|
&& !block.compare(Block.OAK_TRAPDOOR)
|
||||||
|
&& !block.compare(Block.OAK_PLANKS)
|
||||||
|
&& !block.compare(Block.SPRUCE_FENCE)
|
||||||
|
&& !block.compare(Block.SPRUCE_FENCE_GATE)
|
||||||
|
&& !block.compare(Block.SPRUCE_TRAPDOOR)
|
||||||
|
&& !block.compare(Block.SPRUCE_WALL_SIGN)
|
||||||
|
&& !block.compare(Block.SPRUCE_STAIRS)
|
||||||
|
&& !block.compare(Block.BARRIER)
|
||||||
|
&& !block.compare(Block.SAND)
|
||||||
|
&& !block.compare(Block.MOSS_BLOCK)
|
||||||
|
&& !block.compare(Block.WATER)
|
||||||
|
&& !block.compare(Block.LILY_PAD)
|
||||||
|
&& !block.compare(Block.SEA_LANTERN)
|
||||||
|
&& !block.compare(Block.RED_CARPET)
|
||||||
|
&& !block.compare(Block.WHITE_CARPET)
|
||||||
|
&& !block.compare(Block.TRIPWIRE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package dev.celestialfox.spectrumsurvival.utils.classes;
|
package dev.celestialfox.spectrumsurvival.utils.classes;
|
||||||
|
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
import net.minestom.server.entity.Player;
|
import net.minestom.server.entity.Player;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
@ -19,4 +20,26 @@ public class Randomized {
|
||||||
default -> Component.text(elIcon + player.getUsername() + " §cgot eliminated.");
|
default -> Component.text(elIcon + player.getUsername() + " §cgot eliminated.");
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static NamedTextColor madeByColor() {
|
||||||
|
Random random = new Random();
|
||||||
|
int num = random.nextInt(4);
|
||||||
|
switch (num) {
|
||||||
|
case 0 -> {
|
||||||
|
return NamedTextColor.BLUE;
|
||||||
|
}
|
||||||
|
case 1 -> {
|
||||||
|
return NamedTextColor.GRAY;
|
||||||
|
}
|
||||||
|
case 2 -> {
|
||||||
|
return NamedTextColor.GOLD;
|
||||||
|
}
|
||||||
|
case 3 -> {
|
||||||
|
return NamedTextColor.GREEN;
|
||||||
|
}
|
||||||
|
default -> {
|
||||||
|
return NamedTextColor.RED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
package dev.celestialfox.spectrumsurvival.utils.classes;
|
|
||||||
|
|
||||||
import net.minestom.server.instance.block.BlockHandler;
|
|
||||||
import net.minestom.server.tag.Tag;
|
|
||||||
import net.minestom.server.utils.NamespaceID;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public final class SignHandler implements BlockHandler {
|
|
||||||
@Override
|
|
||||||
public @NotNull Collection<Tag<?>> getBlockEntityTags() {
|
|
||||||
return List.of(
|
|
||||||
Tag.Boolean("is_waxed"),
|
|
||||||
Tag.NBT("front_text"),
|
|
||||||
Tag.NBT("back_text")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public @NotNull NamespaceID getNamespaceId() {
|
|
||||||
return NamespaceID.from("minecraft:sign");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -8,20 +8,17 @@ import dev.celestialfox.spectrumsurvival.game.managers.QueueManager;
|
||||||
import dev.celestialfox.spectrumsurvival.game.phases.Phase;
|
import dev.celestialfox.spectrumsurvival.game.phases.Phase;
|
||||||
import dev.celestialfox.spectrumsurvival.utils.Misc;
|
import dev.celestialfox.spectrumsurvival.utils.Misc;
|
||||||
import dev.celestialfox.spectrumsurvival.utils.classes.NPC;
|
import dev.celestialfox.spectrumsurvival.utils.classes.NPC;
|
||||||
import net.kyori.adventure.sound.Sound;
|
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.minestom.server.MinecraftServer;
|
import net.minestom.server.MinecraftServer;
|
||||||
import net.minestom.server.coordinate.Pos;
|
import net.minestom.server.coordinate.Pos;
|
||||||
import net.minestom.server.coordinate.Vec;
|
import net.minestom.server.coordinate.Vec;
|
||||||
import net.minestom.server.entity.Entity;
|
import net.minestom.server.entity.Entity;
|
||||||
import net.minestom.server.entity.EntityType;
|
|
||||||
import net.minestom.server.entity.GameMode;
|
import net.minestom.server.entity.GameMode;
|
||||||
import net.minestom.server.entity.Player;
|
import net.minestom.server.entity.Player;
|
||||||
import net.minestom.server.entity.damage.Damage;
|
import net.minestom.server.entity.damage.Damage;
|
||||||
import net.minestom.server.entity.damage.DamageType;
|
import net.minestom.server.entity.damage.DamageType;
|
||||||
import net.minestom.server.event.GlobalEventHandler;
|
import net.minestom.server.event.GlobalEventHandler;
|
||||||
import net.minestom.server.event.entity.EntityAttackEvent;
|
import net.minestom.server.event.entity.EntityAttackEvent;
|
||||||
import net.minestom.server.event.entity.EntityDamageEvent;
|
|
||||||
import net.minestom.server.event.entity.projectile.ProjectileCollideWithBlockEvent;
|
import net.minestom.server.event.entity.projectile.ProjectileCollideWithBlockEvent;
|
||||||
import net.minestom.server.event.entity.projectile.ProjectileCollideWithEntityEvent;
|
import net.minestom.server.event.entity.projectile.ProjectileCollideWithEntityEvent;
|
||||||
import net.minestom.server.event.player.PlayerDeathEvent;
|
import net.minestom.server.event.player.PlayerDeathEvent;
|
||||||
|
@ -35,7 +32,6 @@ import net.minestom.server.timer.TaskSchedule;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import javax.swing.text.Position;
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class MiscEvents {
|
public class MiscEvents {
|
||||||
|
@ -113,7 +109,7 @@ public class MiscEvents {
|
||||||
|
|
||||||
if (item.material() == Material.SNOWBALL) {
|
if (item.material() == Material.SNOWBALL) {
|
||||||
Pos playerPosition = player.getPosition().add(0, 1.5, 0);
|
Pos playerPosition = player.getPosition().add(0, 1.5, 0);
|
||||||
Vec direction = player.getPosition().direction().normalize().mul(30);
|
Vec direction = player.getPosition().direction().normalize().mul(25);
|
||||||
SnowballProjectile snowball = new SnowballProjectile(player);
|
SnowballProjectile snowball = new SnowballProjectile(player);
|
||||||
|
|
||||||
snowball.setInstance(player.getInstance(), playerPosition);
|
snowball.setInstance(player.getInstance(), playerPosition);
|
||||||
|
|
|
@ -5,6 +5,8 @@ import dev.celestialfox.spectrumsurvival.utils.classes.NPC;
|
||||||
import net.hollowcube.polar.PolarLoader;
|
import net.hollowcube.polar.PolarLoader;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.format.NamedTextColor;
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
|
import net.kyori.adventure.title.Title;
|
||||||
|
import net.kyori.adventure.title.TitlePart;
|
||||||
import net.minestom.server.MinecraftServer;
|
import net.minestom.server.MinecraftServer;
|
||||||
import net.minestom.server.coordinate.Pos;
|
import net.minestom.server.coordinate.Pos;
|
||||||
import net.minestom.server.entity.GameMode;
|
import net.minestom.server.entity.GameMode;
|
||||||
|
@ -14,6 +16,11 @@ import net.minestom.server.event.player.AsyncPlayerConfigurationEvent;
|
||||||
import net.minestom.server.event.player.PlayerChatEvent;
|
import net.minestom.server.event.player.PlayerChatEvent;
|
||||||
import net.minestom.server.event.player.PlayerSpawnEvent;
|
import net.minestom.server.event.player.PlayerSpawnEvent;
|
||||||
import net.minestom.server.instance.*;
|
import net.minestom.server.instance.*;
|
||||||
|
import net.minestom.server.item.ItemStack;
|
||||||
|
import net.minestom.server.item.Material;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.annotations.UnknownNullability;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@ -52,6 +59,9 @@ public class StartEvents {
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
|
|
||||||
if (event.isFirstSpawn()) {
|
if (event.isFirstSpawn()) {
|
||||||
|
player.showTitle(Title.title(
|
||||||
|
Component.text("Welcome!", NamedTextColor.DARK_AQUA),
|
||||||
|
Component.text("Use §e/about game §rto read the rules", NamedTextColor.AQUA)));
|
||||||
player.sendMessage(
|
player.sendMessage(
|
||||||
Component.text("Use §e/about game §rto read the rules.\n", NamedTextColor.GRAY)
|
Component.text("Use §e/about game §rto read the rules.\n", NamedTextColor.GRAY)
|
||||||
.append(Component.text("Use §e/credits and /about us §rto know who made the game.\n", NamedTextColor.GRAY))
|
.append(Component.text("Use §e/credits and /about us §rto know who made the game.\n", NamedTextColor.GRAY))
|
||||||
|
|
Loading…
Add table
Reference in a new issue