From 9d287f7c2f03855a8ecf2e1faab616db7a1b0914 Mon Sep 17 00:00:00 2001
From: lars <larslukasneuhaus@gmx.de>
Date: Sat, 19 Oct 2024 22:57:05 +0200
Subject: [PATCH] added control input

---
 .../game/stateless/types/tetris/Tetris.java   | 102 +++++++++++++-----
 1 file changed, 78 insertions(+), 24 deletions(-)

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<Button, Long> 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<Void> 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);
     }