From a4b530c1dcef4a95a7a6f12d0b74f2a88232c27c Mon Sep 17 00:00:00 2001 From: Felix Cravic Date: Sat, 23 May 2020 14:04:53 +0200 Subject: [PATCH] WIP vehicle support --- .../fr/themode/demo/entity/TestArrow.java | 5 +- .../net/minestom/server/entity/Entity.java | 13 +++- .../minestom/server/entity/ItemEntity.java | 5 +- .../minestom/server/entity/ObjectEntity.java | 6 +- .../server/entity/type/EntityBoat.java | 67 +++++++++++++++++++ .../listener/PlayerVehicleListener.java | 37 ++++++++++ .../manager/PacketListenerManager.java | 2 + 7 files changed, 127 insertions(+), 8 deletions(-) create mode 100644 src/main/java/net/minestom/server/entity/type/EntityBoat.java diff --git a/src/main/java/fr/themode/demo/entity/TestArrow.java b/src/main/java/fr/themode/demo/entity/TestArrow.java index e103c0efe..ce2e76daa 100644 --- a/src/main/java/fr/themode/demo/entity/TestArrow.java +++ b/src/main/java/fr/themode/demo/entity/TestArrow.java @@ -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; } diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index 74a284923..e2011c296 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -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; diff --git a/src/main/java/net/minestom/server/entity/ItemEntity.java b/src/main/java/net/minestom/server/entity/ItemEntity.java index 9005e729b..87ab4b7b5 100644 --- a/src/main/java/net/minestom/server/entity/ItemEntity.java +++ b/src/main/java/net/minestom/server/entity/ItemEntity.java @@ -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); diff --git a/src/main/java/net/minestom/server/entity/ObjectEntity.java b/src/main/java/net/minestom/server/entity/ObjectEntity.java index 70fd69c4d..04fc82334 100644 --- a/src/main/java/net/minestom/server/entity/ObjectEntity.java +++ b/src/main/java/net/minestom/server/entity/ObjectEntity.java @@ -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(); diff --git a/src/main/java/net/minestom/server/entity/type/EntityBoat.java b/src/main/java/net/minestom/server/entity/type/EntityBoat.java new file mode 100644 index 000000000..33ffcfb35 --- /dev/null +++ b/src/main/java/net/minestom/server/entity/type/EntityBoat.java @@ -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 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); + } + +} diff --git a/src/main/java/net/minestom/server/listener/PlayerVehicleListener.java b/src/main/java/net/minestom/server/listener/PlayerVehicleListener.java index 3bfd85cbf..844dbaedf 100644 --- a/src/main/java/net/minestom/server/listener/PlayerVehicleListener.java +++ b/src/main/java/net/minestom/server/listener/PlayerVehicleListener.java @@ -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); + } + } diff --git a/src/main/java/net/minestom/server/listener/manager/PacketListenerManager.java b/src/main/java/net/minestom/server/listener/manager/PacketListenerManager.java index 28d545bee..0e9f0586f 100644 --- a/src/main/java/net/minestom/server/listener/manager/PacketListenerManager.java +++ b/src/main/java/net/minestom/server/listener/manager/PacketListenerManager.java @@ -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);