added turtleGame playfield and movement

This commit is contained in:
2025-09-02 22:29:47 +02:00
parent c87d318421
commit d98cebd86f
4 changed files with 135 additions and 2 deletions

View File

@@ -18,6 +18,7 @@ import eu.mhsl.minenet.minigames.instance.game.stateless.types.sumo.SumoFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.types.tntrun.TntRunFactory; import eu.mhsl.minenet.minigames.instance.game.stateless.types.tntrun.TntRunFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.types.towerdefense.TowerdefenseFactory; import eu.mhsl.minenet.minigames.instance.game.stateless.types.towerdefense.TowerdefenseFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.types.trafficlightrace.TrafficLightRaceFactory; import eu.mhsl.minenet.minigames.instance.game.stateless.types.trafficlightrace.TrafficLightRaceFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.types.turtleGame.TurtleGameFactory;
public enum GameList { public enum GameList {
DEATHCUBE(new DeathcubeFactory(), GameType.JUMPNRUN), DEATHCUBE(new DeathcubeFactory(), GameType.JUMPNRUN),
@@ -28,6 +29,7 @@ public enum GameList {
BEDWARS(new BedwarsFactory(), GameType.PROTOTYPE), BEDWARS(new BedwarsFactory(), GameType.PROTOTYPE),
BACKROOMS(new BackroomsFactory(), GameType.PROTOTYPE), BACKROOMS(new BackroomsFactory(), GameType.PROTOTYPE),
BOWSPLEEF(new BowSpleefFactory(), GameType.PROTOTYPE), BOWSPLEEF(new BowSpleefFactory(), GameType.PROTOTYPE),
TURTLEGAME(new TurtleGameFactory(), GameType.PROTOTYPE),
TETRIS(new TetrisFactory(), GameType.OTHER), TETRIS(new TetrisFactory(), GameType.OTHER),
TNTRUN(new TntRunFactory(), GameType.OTHER), TNTRUN(new TntRunFactory(), GameType.OTHER),
ANVILRUN(new AnvilRunFactory(), GameType.PVE), ANVILRUN(new AnvilRunFactory(), GameType.PVE),

View File

@@ -2,10 +2,69 @@ package eu.mhsl.minenet.minigames.instance.game.stateless.types.turtleGame;
import eu.mhsl.minenet.minigames.instance.Dimension; import eu.mhsl.minenet.minigames.instance.Dimension;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame; import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.instance.game.stateless.types.turtleGame.game.TurtleGameInstance;
import eu.mhsl.minenet.minigames.score.PointsWinScore; import eu.mhsl.minenet.minigames.score.PointsWinScore;
import net.kyori.adventure.text.Component;
import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.EntityCreature;
import net.minestom.server.entity.Player;
import net.minestom.server.entity.attribute.Attribute;
import net.minestom.server.event.player.PlayerMoveEvent;
import net.minestom.server.item.ItemStack;
import net.minestom.server.item.Material;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
import java.util.WeakHashMap;
class TurtleGame extends StatelessGame { class TurtleGame extends StatelessGame {
public TurtleGame() { private final boolean firstPerson;
private final Map<Player, TurtleGameInstance> gameInstances = new WeakHashMap<>();
public TurtleGame(boolean firstPerson) {
super(Dimension.OVERWORLD.key, "Tetris", new PointsWinScore()); super(Dimension.OVERWORLD.key, "Tetris", new PointsWinScore());
this.firstPerson = firstPerson;
this.eventNode()
.addListener(PlayerMoveEvent.class, this::onPlayerMove);
}
protected void onPlayerMove(@NotNull PlayerMoveEvent event) {
TurtleGameInstance gameInstance = this.gameInstances.get(event.getPlayer());
gameInstance.getTurtle().setView(event.getPlayer().getPosition().yaw(), gameInstance.getTurtle().getPosition().pitch());
if(this.isRunning()) gameInstance.moveTurtle(event.getPlayer().getPosition().direction());
}
@Override
protected boolean onPlayerJoin(Player p) {
p.getInventory().setItemStack(0, ItemStack.builder(Material.BARRIER).customName(Component.text("Reset")).build());
if(this.gameInstances.get(p) == null) {
this.gameInstances.put(p, new TurtleGameInstance(
this,
this.getSpawn().sub(6, 8, 15).add(this.gameInstances.size()*50, 0, 0)
));
this.gameInstances.get(p).generate();
}
TurtleGameInstance gameInstance = this.gameInstances.get(p);
p.teleport(gameInstance.getPlayerSpawnPosition());
EntityCreature turtle = gameInstance.getTurtle();
MinecraftServer.getSchedulerManager().scheduleNextTick(() -> {
turtle.setInstance(this);
turtle.teleport(gameInstance.getPlayerSpawnPosition());
turtle.addPassenger(p);
turtle.getAttribute(Attribute.MOVEMENT_SPEED).setBaseValue(0.15);
});
return super.onPlayerJoin(p);
}
@Override
protected void onStart() {
this.gameInstances.forEach(((player, gameInstance) -> gameInstance.moveTurtle(player.getPosition().direction())));
// this.gameInstances.forEach(((player, turtleGameInstance) -> turtleGameInstance.start()));
} }
} }

View File

@@ -1,10 +1,13 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.turtleGame; package eu.mhsl.minenet.minigames.instance.game.stateless.types.turtleGame;
import eu.mhsl.minenet.minigames.instance.game.Game; import eu.mhsl.minenet.minigames.instance.game.Game;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.ConfigManager;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.GameFactory; import eu.mhsl.minenet.minigames.instance.game.stateless.config.GameFactory;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.Option; import eu.mhsl.minenet.minigames.instance.game.stateless.config.Option;
import eu.mhsl.minenet.minigames.instance.game.stateless.config.common.BoolOption;
import eu.mhsl.minenet.minigames.instance.room.Room; import eu.mhsl.minenet.minigames.instance.room.Room;
import eu.mhsl.minenet.minigames.message.component.TranslatedComponent; import eu.mhsl.minenet.minigames.message.component.TranslatedComponent;
import net.minestom.server.item.Material;
import java.util.Map; import java.util.Map;
@@ -15,8 +18,24 @@ public class TurtleGameFactory implements GameFactory {
return TranslatedComponent.byId("game_TurtleGame#name"); return TranslatedComponent.byId("game_TurtleGame#name");
} }
@Override
public TranslatedComponent description() {
return TranslatedComponent.byId("game_TurtleGame#description");
}
@Override
public ConfigManager configuration() {
return new ConfigManager()
.addOption(new BoolOption("firstPerson", Material.SPYGLASS, TranslatedComponent.byId("game_TurtleGame#firstPerson")));
}
@Override @Override
public Game manufacture(Room parent, Map<String, Option<?>> configuration) throws Exception { public Game manufacture(Room parent, Map<String, Option<?>> configuration) throws Exception {
return new TurtleGame(); return new TurtleGame(configuration.get("firstPerson").getAsBoolean());
}
@Override
public Material symbol() {
return Material.TURTLE_EGG;
} }
} }

View File

@@ -0,0 +1,53 @@
package eu.mhsl.minenet.minigames.instance.game.stateless.types.turtleGame.game;
import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
import eu.mhsl.minenet.minigames.util.BatchUtil;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.coordinate.Vec;
import net.minestom.server.entity.EntityCreature;
import net.minestom.server.entity.EntityType;
import net.minestom.server.instance.batch.AbsoluteBlockBatch;
import net.minestom.server.instance.block.Block;
import java.awt.*;
public class TurtleGameInstance {
private final StatelessGame instance;
private final Pos startPosition;
private final EntityCreature turtle = new EntityCreature(EntityType.TURTLE);
public TurtleGameInstance(StatelessGame instance, Pos startPosition) {
this.instance = instance;
this.startPosition = startPosition;
}
public void moveTurtle(Vec direction) {
Vec targetDirection = direction.withY(0).normalize().mul(100);
Pos targetPosition = this.turtle.getPosition().add(targetDirection);
this.turtle.getNavigator().setPathTo(targetPosition);
}
public void generate() {
AbsoluteBlockBatch batch = new AbsoluteBlockBatch();
for (int z = -1; z < 66; z++) {
for (int x = -1; x < 44; x++) {
if(z < 0 || z >= 65 || x < 0 || x >= 43) {
batch.setBlock(this.startPosition.add(x, 1, z), Block.STONE);
batch.setBlock(this.startPosition.add(x, 2, z), Block.STONE_SLAB);
}
batch.setBlock(this.startPosition.add(x, 0, z), Block.SAND);
}
}
BatchUtil.loadAndApplyBatch(batch, this.instance, () -> {});
}
public Pos getPlayerSpawnPosition() {
return this.startPosition.add(20, 1, 30);
}
public EntityCreature getTurtle() {
return this.turtle;
}
}