secreterproject/src/main/java/net/pivipi/ball/BallKicker.java
2024-07-08 10:00:58 +02:00

119 lines
4.1 KiB
Java

package net.pivipi.ball;
import javax.print.attribute.standard.MediaSize.Engineering;
import javax.swing.plaf.basic.BasicInternalFrameTitlePane.IconifyAction;
import net.minestom.server.coordinate.Point;
import net.minestom.server.coordinate.Pos;
import net.minestom.server.coordinate.Vec;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.Player;
import net.minestom.server.entity.Entity.Pose;
import net.minestom.server.event.GlobalEventHandler;
import net.minestom.server.event.player.PlayerEntityInteractEvent;
import net.minestom.server.event.player.PlayerHandAnimationEvent;
import net.minestom.server.event.player.PlayerMoveEvent;
import net.minestom.server.event.player.PlayerStartSneakingEvent;
import net.minestom.server.event.player.PlayerStopSneakingEvent;
import net.minestom.server.instance.block.Block;
import net.minestom.server.item.ItemStack;
import net.minestom.server.network.packet.server.play.BlockActionPacket;
import net.minestom.server.particle.Particle.Item;
import net.pivipi.physics.Collision;
import net.pivipi.physics.CollisionData;
import net.pivipi.world.Stadium;
public class BallKicker { // TODO apply physics settings here
public final Stadium stadium;
private long lastSneak;
private int sneakStreak;
private double reach = 3;
private double verticalReach = 2.5;
private double maxKickStrength = 10; // if reach is 0, but you'll never hit the max
private double shootStrength = 10; // when holding
public BallKicker(Stadium stadium) {
this.stadium = stadium;
}
public void setup(GlobalEventHandler globalEventHandler) {
//globalEventHandler.addListener(PlayerMoveEvent.class, event -> onMove(event));
globalEventHandler.addListener(PlayerStartSneakingEvent.class, event -> onSneak(event));
globalEventHandler.addListener(PlayerStopSneakingEvent.class, event -> onStopSneaking(event));
globalEventHandler.addListener(PlayerHandAnimationEvent.class, event -> onSwing(event));
globalEventHandler.addListener(PlayerEntityInteractEvent.class, event -> onInteract(event));
}
private void onStopSneaking(PlayerStopSneakingEvent event) {
Player player = event.getPlayer();
Pos deltaPos = new Pos(0, 0.3, 0);
boolean collides = Collision.collidesWithEntity(stadium.ball, player);
if (collides) {
System.out.println(deltaPos);
stadium.ball.addPos(deltaPos.asVec());
stadium.ball.addVelocity(deltaPos.asVec().mul(10));
}
}
private void onSneak(PlayerStartSneakingEvent event) {
long now = System.currentTimeMillis();
long sneakDelay = now - lastSneak;
lastSneak = now;
if (sneakDelay < 500) {
if (++sneakStreak > 5) {
Player player = event.getPlayer();
Point targetPos = player.getTargetBlockPosition(10);
if (targetPos == null) targetPos = player.getPosition();
targetPos = targetPos.add(0, 5, 0);
Ball ball = new Ball(stadium);
ball.setInstance(event.getInstance());
ball.teleport(new Pos(targetPos));
stadium.ball.remove();
stadium.ball = ball;
sneakStreak = 0;
}
} else {
sneakStreak = 0;
}
}
private void onSwing(PlayerHandAnimationEvent event) {
Player player = event.getPlayer();
CollisionData collisionData = new CollisionData();
Collision.pushOutside(player, stadium.ball, collisionData);
double distance = collisionData.distance.withY(0).distance(0, 0, 0);
if (collisionData.distance.y() < verticalReach && distance < reach) {
if (stadium.ball.getHolder() != null) {
stadium.ball.addVelocity(player.getPosition().direction().mul(shootStrength));
} else {
double percent = 1 - distance / reach;
stadium.ball.addVelocity(player.getPosition().direction().withY(y -> y + 1 - collisionData.distance.y()).mul(maxKickStrength * percent));
}
stadium.ball.setHolder(null);
}
}
private void onInteract(PlayerEntityInteractEvent event) {
Entity entity = event.getTarget();
if (entity instanceof Ball) {
Ball ball = (Ball) entity;
Player player = event.getPlayer();
if (player.isSneaking()) {
Block block = player.getItemInHand(event.getHand()).material().block();
if (block != null) ball.setBlock(block);
} else {
ball.setHolder(player);
}
}
}
}