Add /reset to start over from scratch and hint at it in the endless stage

This commit is contained in:
MineTec committed 2026-10-08 00:48:44 +02:00
1 parent e2c574bf0b
commit 249cd0c08a
5 files changed
+69 -17

No files matched your search

@@ -3,6 +3,8 @@ package eu.mhsl.minecraft.endlessjumper;
import eu.mhsl.minecraft.endlessjumper.generator.JumpGenerator;
import net.minestom.server.Auth;
import net.minestom.server.MinecraftServer;
import net.minestom.server.command.builder.Command;
import net.minestom.server.coordinate.Vec;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.entity.Player;
import net.minestom.server.entity.PlayerSkin;
@@ -20,7 +22,6 @@ import net.minestom.server.event.player.PlayerUseItemEvent;
import net.minestom.server.event.player.PlayerUseItemOnBlockEvent;
import net.minestom.server.instance.Instance;
import net.minestom.server.instance.InstanceContainer;
import net.minestom.server.instance.InstanceManager;
import net.minestom.server.instance.block.Block;
import net.minestom.server.item.ItemStack;
@@ -32,26 +33,20 @@ import java.util.concurrent.ConcurrentHashMap;
public class EndlessJumper {
private static final Pos START = new Pos(0, 100, 0);
private static final Pos SPAWN = START.add(0.5, 1, 0.5);
private static final Map<Player, JumpGenerator> games = new ConcurrentHashMap<>();
public static void main(String[] args) throws IOException {
MinecraftServer server = MinecraftServer.init(new Auth.Velocity(readForwardingSecret()));
Progress.load();
InstanceManager instanceManager = MinecraftServer.getInstanceManager();
GlobalEventHandler eventHandler = MinecraftServer.getGlobalEventHandler();
PlayerSkin skin = PlayerSkin.fromUsername("Notch");
eventHandler.addListener(AsyncPlayerConfigurationEvent.class, event -> {
final Player p = event.getPlayer();
p.setRespawnPoint(START.add(0.5, 1.5, 0.5));
final InstanceContainer world = instanceManager.createInstanceContainer();
world.setBlock(START, Block.DIAMOND_BLOCK);
// Tageszeit steuert der jeweilige Abschnitt
world.defaultClock().pause();
p.setRespawnPoint(SPAWN);
p.setSkin(skin);
event.setSpawningInstance(world);
event.setSpawningInstance(createWorld());
});
eventHandler.addListener(PlayerSpawnEvent.class, event -> {
@@ -94,13 +89,46 @@ public class EndlessJumper {
games.remove(p);
ScoreTab.leave(p);
// jede Partie hat eine eigene Welt: nach dem Verlassen freigeben
Instance world = p.getInstance();
if(world != null) MinecraftServer.getSchedulerManager().scheduleNextTick(() -> instanceManager.unregisterInstance(world));
releaseLater(p.getInstance());
});
Command reset = new Command("reset");
reset.setDefaultExecutor((sender, context) -> {
if(sender instanceof Player player) resetGame(player);
});
MinecraftServer.getCommandManager().register(reset);
server.start("0.0.0.0", 25501);
}
private static InstanceContainer createWorld() {
InstanceContainer world = MinecraftServer.getInstanceManager().createInstanceContainer();
world.setBlock(START, Block.DIAMOND_BLOCK);
// Tageszeit steuert der jeweilige Abschnitt
world.defaultClock().pause();
return world;
}
private static void releaseLater(Instance world) {
if(world != null) MinecraftServer.getSchedulerManager().scheduleNextTick(() -> MinecraftServer.getInstanceManager().unregisterInstance(world));
}
/** /reset: Fortschritt, Strecke, Score und Joker zurücksetzen und in einer frischen Welt bei 0 beginnen. */
private static void resetGame(Player player) {
JumpGenerator old = games.remove(player);
if(old != null) old.close();
Progress.reset(player.getUuid());
Instance oldWorld = player.getInstance();
InstanceContainer world = createWorld();
player.setVelocity(Vec.ZERO);
player.setInstance(world, SPAWN).thenRun(() -> {
Jokers.giveStart(player);
games.put(player, new JumpGenerator(START, 0, player, world));
releaseLater(oldWorld);
});
}
private static void useJoker(Player player, ItemStack item) {
JumpGenerator generator = games.get(player);
if(generator != null && Jokers.BRIDGE.matches(item) && generator.useBridge()) Jokers.BRIDGE.take(player);