From e71dccb98d9add15993bdc3704e0a8c70f46c45f Mon Sep 17 00:00:00 2001
From: lars <larslukasneuhaus@gmx.de>
Date: Wed, 9 Oct 2024 12:55:50 +0200
Subject: [PATCH] started with tetris

---
 .../minigames/instance/game/GameList.java     |   6 +
 .../stateless/types/anvilRun/AnvilRun.java    |   6 +-
 .../game/stateless/types/tetris/Tetris.java   | 111 ++++++++++++++++++
 .../stateless/types/tetris/TetrisFactory.java |  38 ++++++
 4 files changed, 160 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/Tetris.java
 create mode 100644 src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/TetrisFactory.java

diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/GameList.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/GameList.java
index 8f9b9d1..df91bce 100644
--- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/GameList.java
+++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/GameList.java
@@ -1,6 +1,7 @@
 package eu.mhsl.minenet.minigames.instance.game;
 
 import eu.mhsl.minenet.minigames.instance.game.stateless.config.GameFactory;
+import eu.mhsl.minenet.minigames.instance.game.stateless.types.anvilRun.AnvilRunFactory;
 import eu.mhsl.minenet.minigames.instance.game.stateless.types.bowSpleef.BowSpleefFactory;
 import eu.mhsl.minenet.minigames.instance.game.stateless.types.elytraRace.ElytraRaceFactory;
 import eu.mhsl.minenet.minigames.instance.game.stateless.types.backrooms.BackroomsFactory;
@@ -10,6 +11,7 @@ import eu.mhsl.minenet.minigames.instance.game.stateless.types.deathcube.Deathcu
 import eu.mhsl.minenet.minigames.instance.game.stateless.types.minerun.MinerunFactory;
 import eu.mhsl.minenet.minigames.instance.game.stateless.types.spleef.SpleefFactory;
 import eu.mhsl.minenet.minigames.instance.game.stateless.types.stickfight.StickFightFactory;
+import eu.mhsl.minenet.minigames.instance.game.stateless.types.tetris.TetrisFactory;
 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.trafficlightrace.TrafficLightRaceFactory;
@@ -22,6 +24,10 @@ public enum GameList {
     TOWERDEFENSE(new TowerdefenseFactory(), GameType.PROTOTYPE),
     BEDWARS(new BedwarsFactory(), GameType.PROTOTYPE),
     BACKROOMS(new BackroomsFactory(), GameType.PROTOTYPE),
+
+    ANVILRUN(new AnvilRunFactory(), GameType.PROTOTYPE),
+    TETRIS(new TetrisFactory(), GameType.PROTOTYPE),
+
     TNTRUN(new TntRunFactory(), GameType.OTHER),
     ACIDRAIN(new AcidRainFactory(), GameType.PVE),
     ELYTRARACE(new ElytraRaceFactory(), GameType.PVP),
diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/anvilRun/AnvilRun.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/anvilRun/AnvilRun.java
index b9c0870..cb5002c 100644
--- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/anvilRun/AnvilRun.java
+++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/anvilRun/AnvilRun.java
@@ -12,11 +12,14 @@ import net.minestom.server.event.player.PlayerMoveEvent;
 import net.minestom.server.instance.block.Block;
 import org.jetbrains.annotations.NotNull;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.CompletableFuture;
 
 class AnvilRun extends StatelessGame {
 
     final int radius;
+    final List<Entity> anvils = new ArrayList<>();
 
     public AnvilRun(int radius, int pvpEnabled) {
         super(Dimension.THE_END.key, "Deathcube", new LastWinsScore());
@@ -35,6 +38,7 @@ class AnvilRun extends StatelessGame {
                 ((FallingBlockMeta) anvil.getEntityMeta()).setBlock(Block.ANVIL);
                 anvil.setNoGravity(true);
 
+                anvils.add(anvil);
             }
         }
     }
@@ -43,7 +47,7 @@ class AnvilRun extends StatelessGame {
     protected void onStart() {
         super.onStart();
 
-        // Liste mit anvils
+        anvils.forEach(anvil -> anvil.setNoGravity(false));
     }
 
     @Override
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
new file mode 100644
index 0000000..cb03e4f
--- /dev/null
+++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/Tetris.java
@@ -0,0 +1,111 @@
+package eu.mhsl.minenet.minigames.instance.game.stateless.types.tetris;
+
+import eu.mhsl.minenet.minigames.instance.game.stateless.StatelessGame;
+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.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.instance.batch.AbsoluteBlockBatch;
+import net.minestom.server.instance.block.Block;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.concurrent.CompletableFuture;
+
+class Tetris extends StatelessGame {
+    private final boolean isFast;
+    private final int width = 9;
+    private final int height = 20;
+
+    enum Button {
+        W,
+        A,
+        S,
+        D,
+        mouseLeft,
+        mouseRight,
+        space
+    }
+
+    public Tetris(boolean isFast) {
+        super(Dimension.THE_END.key, "Tetris", new FirstWinsScore());
+        this.setGenerator(new CircularPlateTerrainGenerator(30).setPlateHeight(0));
+
+        this.isFast = isFast;
+    }
+
+    protected void pressedButton(Button button) {
+        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");
+        }
+    }
+
+    @Override
+    protected void onLoad(@NotNull CompletableFuture<Void> callback) {
+        AbsoluteBlockBatch batch = new AbsoluteBlockBatch();
+
+        for(int y = 45; y <= 45+height; y++) {
+            for(int x = -(width/2)-1; x <= (width/2)+1; x++) {
+                batch.setBlock(x, y, 0, Block.STONE);
+            }
+        }
+
+        for(int y = 45; y <= 45+height; y++) {
+            batch.setBlock(-(width/2)-1, y, 1, Block.GRAY_CONCRETE);
+            batch.setBlock((width/2)+1, y, 1, Block.GRAY_CONCRETE);
+        }
+        for(int x = -(width/2)-1; x <= (width/2)+1; x++) {
+            batch.setBlock(x, 45, 1, Block.GRAY_CONCRETE);
+        }
+
+        BatchUtil.loadAndApplyBatch(batch, this, () -> callback.complete(null));
+    }
+
+    @Override
+    protected void onPlayerMove(@NotNull PlayerMoveEvent playerMoveEvent) {
+        super.onPlayerMove(playerMoveEvent);
+
+//        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);
+//        }
+
+//        playerMoveEvent.getNewPosition().asVec();
+
+        Vec movementVector = playerMoveEvent.getPlayer().getPreviousPosition().asVec().sub(playerMoveEvent.getNewPosition());
+
+        
+
+        System.out.println(movementVector);
+
+//        if(!(playerMoveEvent.getNewPosition().withYaw(0).withPitch(0) == getSpawn().withYaw(0).withPitch(0))) {
+            playerMoveEvent.setNewPosition(getSpawn().withView(playerMoveEvent.getNewPosition()));
+//            return;
+//        }
+    }
+
+    @Override
+    protected boolean onPlayerJoin(Player p) {
+        p.setNoGravity(true);
+        return super.onPlayerJoin(p);
+    }
+
+    @Override
+    public Pos getSpawn() {
+        return new Pos(0, 50, 15).withView(180, 0);
+    }
+}
diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/TetrisFactory.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/TetrisFactory.java
new file mode 100644
index 0000000..02d6f3c
--- /dev/null
+++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/TetrisFactory.java
@@ -0,0 +1,38 @@
+package eu.mhsl.minenet.minigames.instance.game.stateless.types.tetris;
+
+import eu.mhsl.minenet.minigames.instance.game.Game;
+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.ConfigManager;
+import eu.mhsl.minenet.minigames.instance.room.Room;
+import eu.mhsl.minenet.minigames.message.component.TranslatedComponent;
+import net.minestom.server.item.Material;
+
+import java.util.Map;
+
+public class TetrisFactory implements GameFactory {
+    @Override
+    public TranslatedComponent name() {
+        return TranslatedComponent.byId("game_Tetris#name");
+    }
+
+    @Override
+    public TranslatedComponent description() {
+        return TranslatedComponent.byId("game_Tetris#description");
+    }
+
+    @Override
+    public ConfigManager configuration() {
+        return new ConfigManager();
+    }
+
+    @Override
+    public Game manufacture(Room parent, Map<String, Option<?>> configuration) {
+        return new Tetris(false).setParent(parent);
+    }
+
+    @Override
+    public Material symbol() {
+        return Material.PURPLE_WOOL;
+    }
+}