Files
EndlessJumper/src/main/java/eu/mhsl/minecraft/endlessjumper/EndlessJumper.java
T
MineTecandClaude Opus 5.5 8e046c8603 migrated to Gradle and Minestom 2026.10.05-26.2
- Maven -> Gradle 9.6.1 (shadow 9.6.1, Java 25), shadow jar is build/libs/limbo.jar
- Minestom from Maven Central (net.minestom:minestom), speaks Minecraft 26.2 natively
- Velocity forwarding via Auth.Velocity; the secret is no longer hardcoded but read from
  forwarding.secret in the working directory or VELOCITY_FORWARDING_SECRET
- time rate via defaultClock().pause() (new clock API)
- slf4j-simple for logging (Minestom no longer ships a logger)
- removed target/ and Maven files from the repository
- uploadLimbo task copies the jar to the limbo server

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 23:47:40 +02:00

102 lines
4.0 KiB
Java

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.coordinate.Pos;
import net.minestom.server.entity.Player;
import net.minestom.server.entity.PlayerSkin;
import net.minestom.server.event.GlobalEventHandler;
import net.minestom.server.event.player.AsyncPlayerConfigurationEvent;
import net.minestom.server.event.player.PlayerBlockBreakEvent;
import net.minestom.server.event.player.PlayerDisconnectEvent;
import net.minestom.server.event.player.PlayerMoveEvent;
import net.minestom.server.instance.InstanceContainer;
import net.minestom.server.instance.InstanceManager;
import net.minestom.server.instance.block.Block;
import net.minestom.server.timer.TaskSchedule;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap;
public class EndlessJumper {
public static void main(String[] args) throws IOException {
MinecraftServer server = MinecraftServer.init(new Auth.Velocity(readForwardingSecret()));
InstanceManager instanceManager = MinecraftServer.getInstanceManager();
GlobalEventHandler eventHandler = MinecraftServer.getGlobalEventHandler();
PlayerSkin skin = PlayerSkin.fromUsername("Notch");
HashMap<Player, JumpGenerator> games = new HashMap<>();
eventHandler.addListener(AsyncPlayerConfigurationEvent.class, event -> {
final Player p = event.getPlayer();
p.setRespawnPoint(new Pos(0.5,101.5,0.5));
final InstanceContainer world = instanceManager.createInstanceContainer();
world.setGenerator(new TerrainGenerator());
Pos startingAt = new Pos(0,100,0);
world.setBlock(startingAt, Block.DIAMOND_BLOCK);
world.defaultClock().pause();
world.setTime(18000);
p.setSkin(skin);
event.setSpawningInstance(world);
MinecraftServer.getSchedulerManager().scheduleTask(
() -> games.put(p, new JumpGenerator(startingAt, p, world)),
TaskSchedule.seconds(3),
TaskSchedule.stop()
);
});
eventHandler.addListener(PlayerMoveEvent.class, event -> {
Player p = event.getPlayer();
if(!games.containsKey(p)) {
event.setCancelled(true);
return;
}
JumpGenerator generator = games.get(p);
//reset when falling down
if(p.getPosition().y() < generator.getNextLanding().y()-5 && p.getPosition().y() < generator.getCheckpoint().y()) generator.reset();
Pos p1 = BlockMath.roundToBlock(event.getNewPosition().sub(0.0,1.0,0.0));
Pos p2 = BlockMath.roundToBlock(event.getNewPosition().sub(0.0, 2.0, 0.0));
for(int i = 0; i <= generator.getPreview(); i++) {
Pos target = generator.getBlocks().get(generator.getBlocks().size()-i-1);
if(p1.sameBlock(target) || p2.sameBlock(target)) generator.generateNext();
}
//if(p.getPosition().z() > target.z()+2) generator.highlight();
});
eventHandler.addListener(PlayerBlockBreakEvent.class, event -> event.setCancelled(true));
eventHandler.addListener(PlayerDisconnectEvent.class, event -> games.remove(event.getPlayer()));
server.start("0.0.0.0", 25501);
}
// Wie bei Velocity: Secret aus forwarding.secret im Arbeitsverzeichnis, alternativ per Umgebungsvariable
private static String readForwardingSecret() throws IOException {
String fromEnv = System.getenv("VELOCITY_FORWARDING_SECRET");
if(fromEnv != null && !fromEnv.isBlank()) return fromEnv.trim();
Path file = Path.of("forwarding.secret");
if(!Files.exists(file))
throw new IllegalStateException("forwarding.secret fehlt im Arbeitsverzeichnis (oder VELOCITY_FORWARDING_SECRET setzen)");
return Files.readString(file).trim();
}
}