mirror of
https://github.com/Minestom/Minestom.git
synced 2024-09-27 14:13:24 +02:00
WIP vehicle support
This commit is contained in:
parent
378639af1e
commit
a4b530c1dc
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user