added control input

This commit is contained in:
Lars Neuhaus 2024-10-19 22:57:05 +02:00
parent 7ea39f9aad
commit 9d287f7c2f

@ -5,14 +5,19 @@ import eu.mhsl.minenet.minigames.score.FirstWinsScore;
import eu.mhsl.minenet.minigames.util.BatchUtil; import eu.mhsl.minenet.minigames.util.BatchUtil;
import eu.mhsl.minenet.minigames.instance.Dimension; import eu.mhsl.minenet.minigames.instance.Dimension;
import eu.mhsl.minenet.minigames.world.generator.terrain.CircularPlateTerrainGenerator; 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.Pos;
import net.minestom.server.coordinate.Vec; import net.minestom.server.coordinate.Vec;
import net.minestom.server.entity.Player; 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.batch.AbsoluteBlockBatch;
import net.minestom.server.instance.block.Block; 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 org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
class Tetris extends StatelessGame { class Tetris extends StatelessGame {
@ -20,6 +25,8 @@ class Tetris extends StatelessGame {
private final int width = 9; private final int width = 9;
private final int height = 20; private final int height = 20;
private final Map<Button, Long> lastPresses = new HashMap<>();
enum Button { enum Button {
W, W,
A, A,
@ -35,17 +42,36 @@ class Tetris extends StatelessGame {
this.setGenerator(new CircularPlateTerrainGenerator(30).setPlateHeight(0)); this.setGenerator(new CircularPlateTerrainGenerator(30).setPlateHeight(0));
this.isFast = isFast; 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) { protected void pressedButton(Button button) {
if(lastPresses.getOrDefault(button, 0L) >= System.currentTimeMillis()-200) return;
lastPresses.put(button, System.currentTimeMillis());
switch (button) { switch (button) {
case A -> System.out.println("A"); case A -> System.out.println("A");
case S -> System.out.println("S"); case S -> System.out.println("S");
case D -> System.out.println("D"); case D -> System.out.println("D");
case W -> System.out.println("W"); 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 @Override
protected void onLoad(@NotNull CompletableFuture<Void> callback) { protected void onLoad(@NotNull CompletableFuture<Void> callback) {
AbsoluteBlockBatch batch = new AbsoluteBlockBatch(); AbsoluteBlockBatch batch = new AbsoluteBlockBatch();
@ -64,43 +90,71 @@ class Tetris extends StatelessGame {
batch.setBlock(x, 45, 1, Block.GRAY_CONCRETE); 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)); BatchUtil.loadAndApplyBatch(batch, this, () -> callback.complete(null));
} }
@Override @Override
protected void onPlayerMove(@NotNull PlayerMoveEvent playerMoveEvent) { protected void onPlayerMove(@NotNull PlayerMoveEvent event) {
super.onPlayerMove(playerMoveEvent); super.onPlayerMove(event);
// if(playerMoveEvent.getNewPosition().z() < getSpawn().z()) { Player player = event.getPlayer();
// pressedButton(Button.W); Pos previousPosition = event.getPlayer().getPosition();
// } Pos currentPosition = event.getNewPosition();
// 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 = 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))) { double forwardAmount = movementVector.dot(forward);
playerMoveEvent.setNewPosition(getSpawn().withView(playerMoveEvent.getNewPosition())); double leftAmount = movementVector.dot(left);
// return;
// } 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 @Override
protected boolean onPlayerJoin(Player p) { 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); return super.onPlayerJoin(p);
} }