diff --git a/api/src/main/java/lol/pyr/znpcsplus/api/npc/Npc.java b/api/src/main/java/lol/pyr/znpcsplus/api/npc/Npc.java index 9302b4b..9546ed4 100644 --- a/api/src/main/java/lol/pyr/znpcsplus/api/npc/Npc.java +++ b/api/src/main/java/lol/pyr/znpcsplus/api/npc/Npc.java @@ -196,4 +196,16 @@ public interface Npc extends PropertyHolder { void removePassenger(int entityId); + /** + * Gets the vehicle entity id of this npc + * @return The entity id of the vehicle + */ + @Nullable Integer getVehicleId(); + + /** + * Sets the vehicle id of this npc + * @param vehicleId The entity id of the vehicle + */ + void setVehicleId(Integer vehicleId); + } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/PacketEntity.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/PacketEntity.java index 8b2fe03..cdee0e8 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/PacketEntity.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/PacketEntity.java @@ -31,6 +31,7 @@ public class PacketEntity implements PropertyHolder { private NpcLocation location; private PacketEntity vehicle; + private Integer vehicleId; private List passengers; public PacketEntity(PacketFactory packetFactory, PropertyHolder properties, Viewable viewable, EntityType type, NpcLocation location) { @@ -71,9 +72,8 @@ public class PacketEntity implements PropertyHolder { public void spawn(Player player) { if (type == EntityTypes.PLAYER) packetFactory.spawnPlayer(player, this, properties); else packetFactory.spawnEntity(player, this, properties); - if (vehicle != null) { - vehicle.spawn(player); - packetFactory.setPassengers(player, vehicle.getEntityId(), this.getEntityId()); + if (vehicleId != null) { + packetFactory.setPassengers(player, vehicleId, this.getEntityId()); } if(passengers != null) { packetFactory.setPassengers(player, this.getEntityId(), passengers.stream().mapToInt(Integer::intValue).toArray()); @@ -92,6 +92,26 @@ public class PacketEntity implements PropertyHolder { return viewable; } + public void setVehicleId(Integer vehicleId) { + if (this.vehicle != null) { + for (Player player : viewable.getViewers()) { + packetFactory.setPassengers(player, this.vehicle.getEntityId()); + this.vehicle.despawn(player); + packetFactory.teleportEntity(player, this); + } + } else if (this.vehicleId != null) { + for (Player player : viewable.getViewers()) { + packetFactory.setPassengers(player, this.vehicleId); + } + } + this.vehicleId = vehicleId; + if (vehicleId == null) return; + + for (Player player : viewable.getViewers()) { + packetFactory.setPassengers(player, this.getEntityId(), vehicleId); + } + } + public void setVehicle(PacketEntity vehicle) { // remove old vehicle if (this.vehicle != null) { @@ -100,6 +120,10 @@ public class PacketEntity implements PropertyHolder { this.vehicle.despawn(player); packetFactory.teleportEntity(player, this); } + } else if (this.vehicleId != null) { + for (Player player : viewable.getViewers()) { + packetFactory.setPassengers(player, this.vehicleId); + } } this.vehicle = vehicle; @@ -112,6 +136,10 @@ public class PacketEntity implements PropertyHolder { } } + public Integer getVehicleId() { + return vehicleId; + } + public List getPassengers() { return passengers; } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcImpl.java index 39c4c4a..fafe780 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/npc/NpcImpl.java @@ -261,4 +261,16 @@ public class NpcImpl extends Viewable implements Npc { public void removePassenger(int entityId) { entity.removePassenger(entityId); } + + @Override + public @Nullable Integer getVehicleId() { + return entity.getVehicleId(); + } + + @Override + public void setVehicleId(Integer vehicleId) { + entity.setVehicleId(vehicleId); + } + + }