119 lines
4.1 KiB
Java
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);
|
|
}
|
|
}
|
|
}
|
|
}
|