8
8
package org .mvplugins .multiverse .portals .listeners ;
9
9
10
10
import java .util .Date ;
11
+ import java .util .List ;
12
+ import java .util .concurrent .CompletableFuture ;
11
13
12
14
import com .dumptruckman .minecraft .util .Logging ;
15
+ import org .bukkit .Bukkit ;
13
16
import org .bukkit .event .Listener ;
14
17
import org .mvplugins .multiverse .core .destination .DestinationInstance ;
15
18
import org .mvplugins .multiverse .core .teleportation .LocationManipulation ;
16
19
import org .mvplugins .multiverse .core .teleportation .AsyncSafetyTeleporter ;
17
20
import org .mvplugins .multiverse .external .jakarta .inject .Inject ;
18
21
import org .mvplugins .multiverse .external .jetbrains .annotations .NotNull ;
19
22
import org .jvnet .hk2 .annotations .Service ;
23
+ import org .mvplugins .multiverse .external .paperlib .PaperLib ;
20
24
import org .mvplugins .multiverse .portals .destination .PortalDestinationInstance ;
21
25
import org .mvplugins .multiverse .portals .enums .MoveType ;
22
26
import org .bukkit .Location ;
@@ -53,6 +57,7 @@ public class MVPVehicleListener implements Listener {
53
57
54
58
@ EventHandler
55
59
public void vehicleMove (VehicleMoveEvent event ) {
60
+ // todo: add support for multiple passengers, e.g. boats
56
61
if (event .getVehicle ().getPassenger () instanceof Player ) {
57
62
Vehicle v = event .getVehicle ();
58
63
Player p = (Player ) v .getPassenger ();
@@ -64,7 +69,9 @@ public void vehicleMove(VehicleMoveEvent event) {
64
69
}
65
70
66
71
// 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
+ }
68
75
} else {
69
76
MVPortal portal = this .portalManager .getPortal (event .getFrom ());
70
77
if ((portal != null ) && (portal .getTeleportNonPlayers ())) {
@@ -77,6 +84,12 @@ public void vehicleMove(VehicleMoveEvent event) {
77
84
return ;
78
85
}
79
86
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
+
80
93
Vector vehicleVec = event .getVehicle ().getVelocity ();
81
94
Location target = dest .getLocation (event .getVehicle ()).getOrNull ();
82
95
if (dest instanceof PortalDestinationInstance pd ) {
@@ -86,19 +99,20 @@ public void vehicleMove(VehicleMoveEvent event) {
86
99
87
100
this .setVehicleVelocity (vehicleVec , dest , event .getVehicle ());
88
101
89
- Entity formerPassenger = event .getVehicle ().getPassenger ();
102
+ List < Entity > formerPassengers = event .getVehicle ().getPassengers ();
90
103
event .getVehicle ().eject ();
91
104
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
+ });
102
116
event .getVehicle ().remove ();
103
117
}
104
118
}
@@ -168,16 +182,28 @@ private boolean teleportVehicleSeperately(
168
182
// Add an offset to ensure the player is 1 higher than where the cart was.
169
183
playerToLocation .add (0 , 0.5 , 0 );
170
184
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
+
171
193
safetyTeleporter .to (destination ).teleport (player )
172
194
.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
+ });
181
207
})
182
208
.onFailure (reason -> {
183
209
Logging .fine ("Failed to teleport player '%s' to destination '%s'. Reason: %s" , player .getDisplayName (), destination , reason );
@@ -187,7 +213,7 @@ private boolean teleportVehicleSeperately(
187
213
return true ;
188
214
}
189
215
190
- private void setVehicleVelocity (Vector calculated , DestinationInstance <?, ?> to , Vehicle newVehicle ) {
216
+ private void setVehicleVelocity (Vector calculated , DestinationInstance <?, ?> to , Entity newVehicle ) {
191
217
// If the destination has a non-zero velocity, use that,
192
218
// otherwise use the existing velocity, because velocities
193
219
// are preserved through portals... duh.
0 commit comments