diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/Tetris.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/Tetris.java index cb03e4f..421e5cb 100644 --- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/Tetris.java +++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/Tetris.java @@ -5,14 +5,19 @@ import eu.mhsl.minenet.minigames.score.FirstWinsScore; import eu.mhsl.minenet.minigames.util.BatchUtil; import eu.mhsl.minenet.minigames.instance.Dimension; import eu.mhsl.minenet.minigames.world.generator.terrain.CircularPlateTerrainGenerator; +import net.kyori.adventure.text.Component; import net.minestom.server.coordinate.Pos; import net.minestom.server.coordinate.Vec; import net.minestom.server.entity.Player; -import net.minestom.server.event.player.PlayerMoveEvent; +import net.minestom.server.event.player.*; import net.minestom.server.instance.batch.AbsoluteBlockBatch; import net.minestom.server.instance.block.Block; +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; import org.jetbrains.annotations.NotNull; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.CompletableFuture; class Tetris extends StatelessGame { @@ -20,6 +25,8 @@ class Tetris extends StatelessGame { private final int width = 9; private final int height = 20; + private final Map lastPresses = new HashMap<>(); + enum Button { W, A, @@ -35,17 +42,36 @@ class Tetris extends StatelessGame { this.setGenerator(new CircularPlateTerrainGenerator(30).setPlateHeight(0)); this.isFast = isFast; + + eventNode() + .addListener(PlayerUseItemEvent.class, this::onPlayerInteract) + .addListener(PlayerHandAnimationEvent.class, this::onPlayerAttack); + } + + @Override + protected void onStart() { + super.onStart(); } protected void pressedButton(Button button) { + if(lastPresses.getOrDefault(button, 0L) >= System.currentTimeMillis()-200) return; + lastPresses.put(button, System.currentTimeMillis()); + switch (button) { case A -> System.out.println("A"); case S -> System.out.println("S"); case D -> System.out.println("D"); case W -> System.out.println("W"); + case mouseLeft -> System.out.println("mouse left"); + case mouseRight -> System.out.println("mouse right"); + case space -> System.out.println("space"); } } + protected void releasedButton(Button button) { + lastPresses.put(button, 0L); + } + @Override protected void onLoad(@NotNull CompletableFuture callback) { AbsoluteBlockBatch batch = new AbsoluteBlockBatch(); @@ -64,43 +90,71 @@ class Tetris extends StatelessGame { batch.setBlock(x, 45, 1, Block.GRAY_CONCRETE); } + batch.setBlock((int) getSpawn().x(), (int) (getSpawn().y()-1), (int) getSpawn().z(), Block.STONE); + BatchUtil.loadAndApplyBatch(batch, this, () -> callback.complete(null)); } @Override - protected void onPlayerMove(@NotNull PlayerMoveEvent playerMoveEvent) { - super.onPlayerMove(playerMoveEvent); + protected void onPlayerMove(@NotNull PlayerMoveEvent event) { + super.onPlayerMove(event); -// if(playerMoveEvent.getNewPosition().z() < getSpawn().z()) { -// pressedButton(Button.W); -// } -// if(playerMoveEvent.getNewPosition().z() > getSpawn().z()) { -// pressedButton(Button.S); -// } -// if(playerMoveEvent.getNewPosition().x() < getSpawn().x()) { -// pressedButton(Button.A); -// } -// if(playerMoveEvent.getNewPosition().x() > getSpawn().x()) { -// pressedButton(Button.D); -// } + Player player = event.getPlayer(); + Pos previousPosition = event.getPlayer().getPosition(); + Pos currentPosition = event.getNewPosition(); -// playerMoveEvent.getNewPosition().asVec(); + Vec movementVector = currentPosition.asVec().sub(previousPosition.asVec()); - Vec movementVector = playerMoveEvent.getPlayer().getPreviousPosition().asVec().sub(playerMoveEvent.getNewPosition()); + float yaw = player.getPosition().yaw(); - + double yawRadians = Math.toRadians(yaw); + double forwardX = -Math.sin(yawRadians); + double forwardZ = Math.cos(yawRadians); - System.out.println(movementVector); + Vec forward = new Vec(forwardX, 0, forwardZ).normalize(); + Vec left = forward.cross(new Vec(0, 1, 0)).normalize(); -// if(!(playerMoveEvent.getNewPosition().withYaw(0).withPitch(0) == getSpawn().withYaw(0).withPitch(0))) { - playerMoveEvent.setNewPosition(getSpawn().withView(playerMoveEvent.getNewPosition())); -// return; -// } + double forwardAmount = movementVector.dot(forward); + double leftAmount = movementVector.dot(left); + + if (forwardAmount > 0.01) { + pressedButton(Button.W); + releasedButton(Button.S); + } else if (forwardAmount < -0.01) { + pressedButton(Button.S); + releasedButton(Button.W); + } else { + releasedButton(Button.W); + releasedButton(Button.S); + } + + if (leftAmount > 0.01) { + pressedButton(Button.D); + releasedButton(Button.A); + } else if (leftAmount < -0.01) { + pressedButton(Button.A); + releasedButton(Button.D); + } else { + releasedButton(Button.A); + releasedButton(Button.D); + } + + if(previousPosition.y() < currentPosition.y()) pressedButton(Button.space); + + event.setNewPosition(getSpawn().withView(event.getNewPosition())); + } + + protected void onPlayerInteract(@NotNull PlayerUseItemEvent event) { + pressedButton(Button.mouseRight); + } + + protected void onPlayerAttack(@NotNull PlayerHandAnimationEvent event) { + pressedButton(Button.mouseLeft); } @Override protected boolean onPlayerJoin(Player p) { - p.setNoGravity(true); + p.getInventory().setItemStack(0, ItemStack.builder(Material.BIRCH_BUTTON).customName(Component.text("Controller")).build()); return super.onPlayerJoin(p); }