diff --git a/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/EntityAccessVehicleMultiPassenger.java b/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/EntityAccessVehicleMultiPassenger.java index 41e69f3a..6c3dd507 100644 --- a/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/EntityAccessVehicleMultiPassenger.java +++ b/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/EntityAccessVehicleMultiPassenger.java @@ -21,4 +21,9 @@ public class EntityAccessVehicleMultiPassenger implements IEntityAccessVehicle { return entity.getPassengers(); } + @Override + public boolean addPassenger(final Entity entity, final Entity vehicle) { + return vehicle.addPassenger(entity); + } + } diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/EntityAccessVehicleLegacy.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/EntityAccessVehicleLegacy.java index bdd9e5e6..d65d1904 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/EntityAccessVehicleLegacy.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/EntityAccessVehicleLegacy.java @@ -21,4 +21,10 @@ public class EntityAccessVehicleLegacy implements IEntityAccessVehicle { return Arrays.asList(entity.getPassenger()); } + @SuppressWarnings("deprecation") + @Override + public boolean addPassenger(final Entity entity, final Entity vehicle) { + return vehicle.setPassenger(entity); + } + } diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/components/entity/IEntityAccessVehicle.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/components/entity/IEntityAccessVehicle.java index 56ec8b3a..3788036d 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/components/entity/IEntityAccessVehicle.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/components/entity/IEntityAccessVehicle.java @@ -20,4 +20,13 @@ public interface IEntityAccessVehicle { */ public List getEntityPassengers(Entity entity); + /** + * Add a new passenger (entity) to the given vehicle. + * + * @param entity + * @param vehicle + * @return + */ + public boolean addPassenger(Entity entity, Entity vehicle); + } diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/entity/PassengerUtil.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/entity/PassengerUtil.java index f22e129a..11fd5a5d 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/entity/PassengerUtil.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/utilities/entity/PassengerUtil.java @@ -167,12 +167,14 @@ public class PassengerUtil { // TODO: Account for nested passengers and inconsistencies. final MovingData data = MovingData.getData(player); data.isVehicleSetBack = true; - // TODO: Adjust to multiple passengers. - final Entity passenger = vehicle.getPassenger(); + + final List passengers = handleVehicle.getHandle().getEntityPassengers(vehicle); + final boolean playerIsPassenger = passengers.contains(player); + // TODO: Multi-passenger teleport, playerIsCaptain? Similar... + boolean vehicleTeleported = false; - final boolean playerIsPassenger = player.equals(passenger); boolean playerTeleported = false; - // TODO: TeleportCause needs some central configuration (plugin vs. unknown vs. future). + if (vehicle.isDead() || !vehicle.isValid()) { // TODO: Still consider teleporting the player. vehicleTeleported = false; @@ -198,7 +200,7 @@ public class PassengerUtil { BridgeMisc.TELEPORT_CAUSE_CORRECTION_OF_POSITION); } } - else if (passenger == null) { + else if (passengers.isEmpty()) { vehicleTeleported = vehicle.teleport(location, BridgeMisc.TELEPORT_CAUSE_CORRECTION_OF_POSITION); } @@ -213,8 +215,11 @@ public class PassengerUtil { if (playerIsPassenger && playerTeleported && vehicleTeleported && player.getLocation().distance(vehicle.getLocation(useLoc)) < 1.5) { // Somewhat check against tp showing something wrong (< 1.0). - vehicle.setPassenger(player); // NOTE: VehicleEnter fires, unknown TP fires. - // TODO: What on failure of setPassenger? + // NOTE: VehicleEnter fires, unknown TP fires. + // TODO: Is teleporting the player superfluous? + if (!handleVehicle.getHandle().addPassenger(player, vehicle)) { + // TODO: What? + } // Ensure a set back. // TODO: Set backs get invalidated somewhere, likely on an extra unknown TP. Use data.isVehicleSetBack in MovingListener/teleport. if (data.vehicleSetBacks.getFirstValidEntry(location) == null) {