Skip to content

Commit 0986613

Browse files
authored
Merge pull request #678 from Multiverse/fix/vehicle-teleport
Fix vehicle teleporting through portals
2 parents 92dfba9 + d6cf38f commit 0986613

File tree

1 file changed

+47
-21
lines changed

1 file changed

+47
-21
lines changed

src/main/java/org/mvplugins/multiverse/portals/listeners/MVPVehicleListener.java

Lines changed: 47 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,19 @@
88
package org.mvplugins.multiverse.portals.listeners;
99

1010
import java.util.Date;
11+
import java.util.List;
12+
import java.util.concurrent.CompletableFuture;
1113

1214
import com.dumptruckman.minecraft.util.Logging;
15+
import org.bukkit.Bukkit;
1316
import org.bukkit.event.Listener;
1417
import org.mvplugins.multiverse.core.destination.DestinationInstance;
1518
import org.mvplugins.multiverse.core.teleportation.LocationManipulation;
1619
import org.mvplugins.multiverse.core.teleportation.AsyncSafetyTeleporter;
1720
import org.mvplugins.multiverse.external.jakarta.inject.Inject;
1821
import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull;
1922
import org.jvnet.hk2.annotations.Service;
23+
import org.mvplugins.multiverse.external.paperlib.PaperLib;
2024
import org.mvplugins.multiverse.portals.destination.PortalDestinationInstance;
2125
import org.mvplugins.multiverse.portals.enums.MoveType;
2226
import org.bukkit.Location;
@@ -53,6 +57,7 @@ public class MVPVehicleListener implements Listener {
5357

5458
@EventHandler
5559
public void vehicleMove(VehicleMoveEvent event) {
60+
// todo: add support for multiple passengers, e.g. boats
5661
if (event.getVehicle().getPassenger() instanceof Player) {
5762
Vehicle v = event.getVehicle();
5863
Player p = (Player) v.getPassenger();
@@ -64,7 +69,9 @@ public void vehicleMove(VehicleMoveEvent event) {
6469
}
6570

6671
// Teleport the Player
67-
teleportVehicle(p, v, event.getTo());
72+
if (!teleportVehicle(p, v, event.getTo())) {
73+
Logging.warning("Failed to teleport vehicle: " + event.getVehicle());
74+
}
6875
} else {
6976
MVPortal portal = this.portalManager.getPortal(event.getFrom());
7077
if ((portal != null) && (portal.getTeleportNonPlayers())) {
@@ -77,6 +84,12 @@ public void vehicleMove(VehicleMoveEvent event) {
7784
return;
7885
}
7986

87+
Class<? extends Entity> vehicleClass = event.getVehicle().getType().getEntityClass();
88+
if (vehicleClass == null) {
89+
Logging.warning("No vehicle class found for vehicle: " + event.getVehicle());
90+
return;
91+
}
92+
8093
Vector vehicleVec = event.getVehicle().getVelocity();
8194
Location target = dest.getLocation(event.getVehicle()).getOrNull();
8295
if (dest instanceof PortalDestinationInstance pd) {
@@ -86,19 +99,20 @@ public void vehicleMove(VehicleMoveEvent event) {
8699

87100
this.setVehicleVelocity(vehicleVec, dest, event.getVehicle());
88101

89-
Entity formerPassenger = event.getVehicle().getPassenger();
102+
List<Entity> formerPassengers = event.getVehicle().getPassengers();
90103
event.getVehicle().eject();
91104

92-
Vehicle newVehicle = target.getWorld().spawn(target, event.getVehicle().getClass());
93-
94-
if (formerPassenger != null) {
95-
formerPassenger.teleport(target);
96-
newVehicle.setPassenger(formerPassenger);
97-
}
98-
99-
this.setVehicleVelocity(vehicleVec, dest, newVehicle);
100-
101-
// remove the old one
105+
Entity newVehicle = target.getWorld().spawn(target, vehicleClass);
106+
Vector finalVehicleVec = vehicleVec;
107+
CompletableFuture.allOf(formerPassengers.stream()
108+
.map(passenger -> PaperLib.teleportAsync(passenger, target))
109+
.toArray(CompletableFuture[]::new))
110+
.thenRun(() -> {
111+
Bukkit.getScheduler().runTask(plugin, () -> {
112+
formerPassengers.forEach(newVehicle::addPassenger);
113+
this.setVehicleVelocity(finalVehicleVec, dest, newVehicle);
114+
});
115+
});
102116
event.getVehicle().remove();
103117
}
104118
}
@@ -168,16 +182,28 @@ private boolean teleportVehicleSeperately(
168182
// Add an offset to ensure the player is 1 higher than where the cart was.
169183
playerToLocation.add(0, 0.5, 0);
170184

185+
Class<? extends Entity> vehicleClass = vehicle.getType().getEntityClass();
186+
if (vehicleClass == null) {
187+
Logging.warning("No vehicle class found for vehicle: " + vehicle);
188+
return false;
189+
}
190+
// Now create a new vehicle:
191+
Vehicle newVehicle = (Vehicle) vehicleToLocation.getWorld().spawn(vehicleToLocation, vehicleClass);
192+
171193
safetyTeleporter.to(destination).teleport(player)
172194
.onSuccess(() -> {
173-
// Now create a new vehicle:
174-
Vehicle newVehicle = vehicleToLocation.getWorld().spawn(vehicleToLocation, vehicle.getClass());
175-
// Set the vehicle's velocity to ours.
176-
this.setVehicleVelocity(vehicle.getVelocity(), destination, newVehicle);
177-
// Set the new player
178-
newVehicle.addPassenger(player);
179-
// They did teleport. Let's delete the old vehicle.
180-
vehicle.remove();
195+
Bukkit.getScheduler().runTask(plugin, () -> {
196+
// Set the new player
197+
if (newVehicle.addPassenger(player)) {
198+
Logging.finer("Added passenger to new vehicle: " + newVehicle);
199+
} else {
200+
Logging.warning("Failed to add passenger to new vehicle: " + newVehicle);
201+
}
202+
// Set the vehicle's velocity to ours.
203+
this.setVehicleVelocity(vehicle.getVelocity(), destination, newVehicle);
204+
// They did teleport. Let's delete the old vehicle.
205+
vehicle.remove();
206+
});
181207
})
182208
.onFailure(reason -> {
183209
Logging.fine("Failed to teleport player '%s' to destination '%s'. Reason: %s", player.getDisplayName(), destination, reason);
@@ -187,7 +213,7 @@ private boolean teleportVehicleSeperately(
187213
return true;
188214
}
189215

190-
private void setVehicleVelocity(Vector calculated, DestinationInstance<?, ?> to, Vehicle newVehicle) {
216+
private void setVehicleVelocity(Vector calculated, DestinationInstance<?, ?> to, Entity newVehicle) {
191217
// If the destination has a non-zero velocity, use that,
192218
// otherwise use the existing velocity, because velocities
193219
// are preserved through portals... duh.

0 commit comments

Comments
 (0)