Refactored player state management in SpaceSnake and implemented endgame handling
This commit is contained in:
@@ -37,7 +37,7 @@ public class SpaceSnake extends StatelessGame {
|
||||
}
|
||||
}
|
||||
|
||||
private final Map<Player, PlayState> playerBlocks = new WeakHashMap<>();
|
||||
private final Map<Player, PlayState> playerStates = new WeakHashMap<>();
|
||||
private int mapSize;
|
||||
private final Supplier<Integer> posInBoundsW = () -> this.rnd.nextInt(-this.mapSize/2, this.mapSize/2);
|
||||
private final Supplier<Integer> posInBoundsH = () -> this.rnd.nextInt(-60, 300);
|
||||
@@ -79,6 +79,11 @@ public class SpaceSnake extends StatelessGame {
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
this.getPlayers().forEach(player -> this.getScore().insertResult(player, this.playerStates.get(player).length.get()));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onPlayerJoin(Player p) {
|
||||
Pos spawn = new Pos(this.posInBoundsW.get(), -60, this.posInBoundsW.get());
|
||||
@@ -88,7 +93,7 @@ public class SpaceSnake extends StatelessGame {
|
||||
MaterialUtil.getRandomFullBlock(material -> !material.equals(Material.DIAMOND_BLOCK)),
|
||||
spawn
|
||||
);
|
||||
this.playerBlocks.put(p, state);
|
||||
this.playerStates.put(p, state);
|
||||
this.setBlock(spawn, state.blockType.block());
|
||||
MinecraftServer.getSchedulerManager().scheduleNextTick(
|
||||
() -> p.teleport(this.getSaveSpawn(spawn))
|
||||
@@ -98,7 +103,7 @@ public class SpaceSnake extends StatelessGame {
|
||||
|
||||
@Override
|
||||
protected void onPlayerMove(@NotNull PlayerMoveEvent playerMoveEvent) {
|
||||
PlayState state = this.playerBlocks.get(playerMoveEvent.getPlayer());
|
||||
PlayState state = this.playerStates.get(playerMoveEvent.getPlayer());
|
||||
if(this.isBeforeBeginning) {
|
||||
boolean falling = state.blocks.stream().anyMatch(pos -> pos.y() > playerMoveEvent.getNewPosition().y());
|
||||
if(falling) playerMoveEvent.getPlayer().teleport(this.getSaveSpawn(state.spawn));
|
||||
@@ -109,6 +114,11 @@ public class SpaceSnake extends StatelessGame {
|
||||
this.getScore().insertResult(playerMoveEvent.getPlayer(), state.length.get());
|
||||
playerMoveEvent.getPlayer().teleport(this.getSpawn());
|
||||
playerMoveEvent.getPlayer().setGameMode(GameMode.SPECTATOR);
|
||||
long livingPlayers = this.getPlayers().stream()
|
||||
.filter(p -> this.getScore().hasResult(p))
|
||||
.count();
|
||||
if(livingPlayers == 1) this.setTimeLimit(10);
|
||||
if(livingPlayers == 0) this.stop();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -119,7 +129,7 @@ public class SpaceSnake extends StatelessGame {
|
||||
return;
|
||||
}
|
||||
|
||||
PlayState state = this.playerBlocks.get(playerBlockPlaceEvent.getPlayer());
|
||||
PlayState state = this.playerStates.get(playerBlockPlaceEvent.getPlayer());
|
||||
state.blocks.add(playerBlockPlaceEvent.getBlockPosition().asVec().asPosition());
|
||||
state.cutToLength(pos -> this.setBlock(pos, Block.AIR));
|
||||
|
||||
@@ -135,7 +145,7 @@ public class SpaceSnake extends StatelessGame {
|
||||
PlayerInventory inventory = player.getInventory();
|
||||
inventory.clear();
|
||||
inventory.addItemStack(ItemStack.of(Material.STICK, 1).with(builder -> builder.glowing(true)));
|
||||
inventory.addItemStack(ItemStack.of(this.playerBlocks.get(player).blockType, 64));
|
||||
inventory.addItemStack(ItemStack.of(this.playerStates.get(player).blockType, 64));
|
||||
}
|
||||
|
||||
private void spawnPowerUp() {
|
||||
@@ -164,7 +174,7 @@ public class SpaceSnake extends StatelessGame {
|
||||
}
|
||||
|
||||
private void onPowerup(Player player) {
|
||||
PlayState state = this.playerBlocks.get(player);
|
||||
PlayState state = this.playerStates.get(player);
|
||||
state.length.incrementAndGet();
|
||||
player.setLevel(player.getLevel() + 1);
|
||||
player.playSound(Sound.sound(SoundEvent.ENTITY_EXPERIENCE_ORB_PICKUP, Sound.Source.PLAYER, 1f, 1f));
|
||||
|
Reference in New Issue
Block a user