WIP vehicle support

This commit is contained in:
Felix Cravic 2020-05-23 14:04:53 +02:00
parent 378639af1e
commit a4b530c1dc
7 changed files with 127 additions and 8 deletions

View File

@ -3,13 +3,14 @@ package fr.themode.demo.entity;
import net.minestom.server.entity.EntityType;
import net.minestom.server.entity.LivingEntity;
import net.minestom.server.entity.ObjectEntity;
import net.minestom.server.utils.Position;
public class TestArrow extends ObjectEntity {
private LivingEntity shooter;
public TestArrow(LivingEntity shooter) {
super(EntityType.ARROW.getId());
public TestArrow(LivingEntity shooter, Position spawnPosition) {
super(EntityType.ARROW, spawnPosition);
this.shooter = shooter;
}

View File

@ -556,8 +556,10 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer {
position.setY(y);
position.setZ(z);
for (Entity passenger : getPassengers()) {
passenger.refreshPosition(x, y, z);
if (hasPassenger()) {
for (Entity passenger : getPassengers()) {
passenger.refreshPosition(x, y, z);
}
}
Instance instance = getInstance();
@ -634,6 +636,13 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer {
position.setPitch(pitch);
}
/**
* Ask for a synchronization (position) to happen during next entity update
*/
public void askSynchronization() {
this.lastSynchronizationTime = 0;
}
public void refreshSneaking(boolean sneaking) {
this.crouched = sneaking;
this.pose = sneaking ? Pose.SNEAKING : Pose.STANDING;

View File

@ -5,6 +5,7 @@ import net.minestom.server.instance.Chunk;
import net.minestom.server.item.ItemStack;
import net.minestom.server.item.StackingRule;
import net.minestom.server.network.packet.PacketWriter;
import net.minestom.server.utils.Position;
import java.util.Set;
import java.util.function.Consumer;
@ -19,8 +20,8 @@ public class ItemEntity extends ObjectEntity {
private long spawnTime;
private long pickupDelay;
public ItemEntity(ItemStack itemStack) {
super(35);
public ItemEntity(ItemStack itemStack, Position spawnPosition) {
super(EntityType.ITEM, spawnPosition);
this.itemStack = itemStack;
setBoundingBox(0.25f, 0.25f, 0.25f);
setGravity(0.025f);

View File

@ -2,11 +2,13 @@ package net.minestom.server.entity;
import net.minestom.server.network.packet.server.play.SpawnEntityPacket;
import net.minestom.server.network.player.PlayerConnection;
import net.minestom.server.utils.Position;
public abstract class ObjectEntity extends Entity {
public ObjectEntity(int entityType) {
super(entityType);
public ObjectEntity(EntityType entityType, Position spawnPosition) {
super(entityType.getId(), spawnPosition);
setGravity(0.02f);
}
public abstract int getObjectData();

View File

@ -0,0 +1,67 @@
package net.minestom.server.entity.type;
import net.minestom.server.entity.EntityType;
import net.minestom.server.entity.ObjectEntity;
import net.minestom.server.network.packet.PacketWriter;
import net.minestom.server.utils.Position;
import java.util.function.Consumer;
public class EntityBoat extends ObjectEntity {
private boolean leftPaddleTurning;
private boolean rightPaddleTurning;
public EntityBoat(Position spawnPosition) {
super(EntityType.BOAT, spawnPosition);
setBoundingBox(1.375f, 0.5625f, 1.375f);
}
@Override
public int getObjectData() {
return 0;
}
@Override
public void update() {
}
@Override
public void spawn() {
}
@Override
public Consumer<PacketWriter> getMetadataConsumer() {
return packet -> {
super.getMetadataConsumer().accept(packet);
fillMetadataIndex(packet, 11);
fillMetadataIndex(packet, 12);
// TODO all remaining metadata
};
}
@Override
protected void fillMetadataIndex(PacketWriter packet, int index) {
super.fillMetadataIndex(packet, index);
if (index == 11) {
packet.writeByte((byte) 11);
packet.writeByte(METADATA_BOOLEAN);
packet.writeBoolean(leftPaddleTurning);
} else if (index == 12) {
packet.writeByte((byte) 12);
packet.writeByte(METADATA_BOOLEAN);
packet.writeBoolean(rightPaddleTurning);
}
}
public void refreshPaddle(boolean left, boolean right) {
this.leftPaddleTurning = left;
this.rightPaddleTurning = right;
sendMetadataIndex(11);
sendMetadataIndex(12);
}
}

View File

@ -1,7 +1,13 @@
package net.minestom.server.listener;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.Player;
import net.minestom.server.entity.type.EntityBoat;
import net.minestom.server.network.packet.client.play.ClientSteerBoatPacket;
import net.minestom.server.network.packet.client.play.ClientSteerVehiclePacket;
import net.minestom.server.network.packet.client.play.ClientVehicleMovePacket;
import net.minestom.server.network.packet.server.play.VehicleMovePacket;
import net.minestom.server.utils.Position;
public class PlayerVehicleListener {
@ -12,4 +18,35 @@ public class PlayerVehicleListener {
player.refreshVehicleSteer(packet.sideways, packet.forward, jump, unmount);
}
public static void vehicleMoveListener(ClientVehicleMovePacket packet, Player player) {
Entity vehicle = player.getVehicle();
if (vehicle == null)
return;
Position newPosition = new Position((float) packet.x, (float) packet.y, (float) packet.z);
vehicle.refreshPosition(newPosition);
vehicle.refreshView(packet.yaw, packet.pitch);
vehicle.askSynchronization();
VehicleMovePacket vehicleMovePacket = new VehicleMovePacket();
vehicleMovePacket.x = packet.x;
vehicleMovePacket.y = packet.y;
vehicleMovePacket.z = packet.z;
vehicleMovePacket.yaw = packet.yaw;
vehicleMovePacket.pitch = packet.pitch;
player.getPlayerConnection().sendPacket(vehicleMovePacket);
}
public static void boatSteerListener(ClientSteerBoatPacket packet, Player player) {
Entity vehicle = player.getVehicle();
if (vehicle == null || !(vehicle instanceof EntityBoat))
return;
EntityBoat boat = (EntityBoat) vehicle;
boat.refreshPaddle(packet.leftPaddleTurning, packet.rightPaddleTurning);
}
}

View File

@ -26,6 +26,8 @@ public class PacketListenerManager {
addListener(ClientHeldItemChangePacket.class, PlayerHeldListener::heldListener);
addListener(ClientPlayerBlockPlacementPacket.class, BlockPlacementListener::listener);
addListener(ClientSteerVehiclePacket.class, PlayerVehicleListener::steerVehicleListener);
addListener(ClientVehicleMovePacket.class, PlayerVehicleListener::vehicleMoveListener);
addListener(ClientSteerBoatPacket.class, PlayerVehicleListener::boatSteerListener);
addListener(ClientPlayerPacket.class, PlayerPositionListener::playerPacketListener);
addListener(ClientPlayerLookPacket.class, PlayerPositionListener::playerLookListener);
addListener(ClientPlayerPositionPacket.class, PlayerPositionListener::playerPositionListener);