Add /reset to start over from scratch and hint at it in the endless stage
This commit is contained in:
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);
|
||||
|
||||
Reference in new issue
Block a user