@@ -986,7 +986,7 @@ private void onPlayerMoveChunk(Player player, WorldCoord from, WorldCoord to, Ca
986986 // Paper doesn't currently throw PlayerMoveEvents for passengers in vehicles who aren't the driver.
987987 // This workaround ensures that any passengers that are players will cause PlayerChangePlotEvents.
988988 if (player .isInsideVehicle ())
989- handleAnimalVehiclesWorkaround (player , player .getVehicle () , from , to , moveEvent );
989+ handleAnimalVehiclesWorkaround (player .getVehicle (), from , to , moveEvent );
990990
991991 PlayerChangePlotEvent event = new PlayerChangePlotEvent (player , from , to );
992992 BukkitTools .fireEvent (event );
@@ -1002,13 +1002,12 @@ private void onPlayerMoveChunk(Player player, WorldCoord from, WorldCoord to, Ca
10021002 * ridden they stop throwing EntityMoveEvents. The driver is the only one who
10031003 * will have a PlayerMoveEvent thrown which is why we're doing this here.
10041004 *
1005- * @param player Player driving the Vehicle.
10061005 * @param vehicle Vehicle being driven.
10071006 * @param from WorldCoord the players are leaving.
10081007 * @param to WorldCoord the players are entering.
10091008 * @param moveEvent PlayerMoveEvent of the driving player.
10101009 */
1011- private void handleAnimalVehiclesWorkaround (Player player , @ Nullable Entity vehicle , WorldCoord from , WorldCoord to , PlayerMoveEvent moveEvent ) {
1010+ private void handleAnimalVehiclesWorkaround (@ Nullable Entity vehicle , WorldCoord from , WorldCoord to , Cancellable moveEvent ) {
10121011 if (!EntityLists .MULTISEAT_ANIMAL_MOUNTS .contains (vehicle ))
10131012 return ;
10141013
@@ -1020,8 +1019,11 @@ private void handleAnimalVehiclesWorkaround(Player player, @Nullable Entity vehi
10201019 passengers .remove (0 );
10211020
10221021 for (Entity entity : passengers ) {
1023- if (entity instanceof Player rider )
1024- BukkitTools .fireEvent (new PlayerChangePlotEvent (rider , from , to , moveEvent ));
1022+ if (entity instanceof Player rider ) {
1023+ PlayerChangePlotEvent event = new PlayerChangePlotEvent (rider , from , to );
1024+ BukkitTools .fireEvent (event );
1025+ if (event .isCancelled ()) moveEvent .setCancelled (true );
1026+ }
10251027 }
10261028 }
10271029
@@ -1039,18 +1041,27 @@ public void onPlayerChangePlotEvent(PlayerChangePlotEvent event) {
10391041 return ;
10401042 if (to .isWilderness ()) {
10411043 // Gone from a Town into the wilderness.
1042- BukkitTools .fireEvent (new PlayerExitsFromTownBorderEvent (event .getPlayer (), to , from , from .getTownOrNull (), event .getMoveEvent ()));
1044+ PlayerExitsFromTownBorderEvent playerExitsFromTownBorderEvent = new PlayerExitsFromTownBorderEvent (event .getPlayer (), to , from , from .getTownOrNull ());
1045+ BukkitTools .fireEvent (playerExitsFromTownBorderEvent );
1046+ if (playerExitsFromTownBorderEvent .isCancelled ()) event .setCancelled (true );
10431047 } else if (from .isWilderness ()) {
10441048 // Gone from wilderness into Town.
1045- BukkitTools .fireEvent (new PlayerEntersIntoTownBorderEvent (event .getPlayer (), to , from , to .getTownOrNull (), event .getMoveEvent ()));
1049+ PlayerEntersIntoTownBorderEvent playerEntersIntoTownBorderEvent = new PlayerEntersIntoTownBorderEvent (event .getPlayer (), to , from , to .getTownOrNull ());
1050+ BukkitTools .fireEvent (playerEntersIntoTownBorderEvent );
1051+ if (playerEntersIntoTownBorderEvent .isCancelled ()) event .setCancelled (true );
10461052 // Both to and from have towns.
10471053 } else if (to .getTownOrNull ().equals (from .getTownOrNull ())) {
10481054 // The towns are the same, no event will fire.
10491055 return ;
10501056 } else {
10511057 // Player has left one Town and immediately entered a different one.
1052- BukkitTools .fireEvent (new PlayerEntersIntoTownBorderEvent (event .getPlayer (), to , from , to .getTownOrNull (), event .getMoveEvent ()));
1053- BukkitTools .fireEvent (new PlayerExitsFromTownBorderEvent (event .getPlayer (), to , from , from .getTownOrNull (), event .getMoveEvent ()));
1058+ PlayerEntersIntoTownBorderEvent e1 = new PlayerEntersIntoTownBorderEvent (event .getPlayer (), to , from , to .getTownOrNull ());
1059+ BukkitTools .fireEvent (e1 );
1060+ if (e1 .isCancelled ()) event .setCancelled (true );
1061+
1062+ PlayerExitsFromTownBorderEvent e2 = new PlayerExitsFromTownBorderEvent (event .getPlayer (), to , from , from .getTownOrNull ());
1063+ BukkitTools .fireEvent (e2 );
1064+ if (e2 .isCancelled ()) event .setCancelled (true );
10541065 }
10551066 }
10561067
@@ -1075,24 +1086,39 @@ public void onPlayerChangeDistricts(PlayerChangePlotEvent event) {
10751086
10761087 if (to .isWilderness () && fromHasDistrict ) {
10771088 // Gone from a Town into the wilderness.
1078- BukkitTools .fireEvent (new PlayerExitsFromDistrictEvent (event .getPlayer (), to , from , fromDistrict , event .getMoveEvent ()));
1089+ PlayerExitsFromDistrictEvent e1 = new PlayerExitsFromDistrictEvent (event .getPlayer (), to , from , fromDistrict );
1090+ BukkitTools .fireEvent (e1 );
1091+ if (e1 .isCancelled ()) event .setCancelled (true );
10791092
10801093 } else if (from .isWilderness () && toHasDistrict ) {
10811094 // Gone from wilderness into Town.
1082- BukkitTools .fireEvent (new PlayerEntersIntoDistrictEvent (event .getPlayer (), to , from , toDistrict , event .getMoveEvent ()));
1095+ PlayerEntersIntoDistrictEvent e2 = new PlayerEntersIntoDistrictEvent (event .getPlayer (), to , from , toDistrict );
1096+ BukkitTools .fireEvent (e2 );
1097+ if (e2 .isCancelled ()) event .setCancelled (true );
10831098
10841099 } else if (!to .isWilderness () && !from .isWilderness () && to .getTownOrNull ().equals (from .getTownOrNull ())
10851100 && fromHasDistrict && toHasDistrict && !fromDistrict .equals (toDistrict )) {
10861101 // Moving in same town, between two different Districts.
1087- BukkitTools .fireEvent (new PlayerExitsFromDistrictEvent (event .getPlayer (), to , from , fromDistrict , event .getMoveEvent ()));
1088- BukkitTools .fireEvent (new PlayerEntersIntoDistrictEvent (event .getPlayer (), to , from , toDistrict , event .getMoveEvent ()));
1102+ PlayerExitsFromDistrictEvent e1 = new PlayerExitsFromDistrictEvent (event .getPlayer (), to , from , fromDistrict );
1103+ BukkitTools .fireEvent (e1 );
1104+ if (e1 .isCancelled ()) event .setCancelled (true );
1105+
1106+ PlayerEntersIntoDistrictEvent e2 = new PlayerEntersIntoDistrictEvent (event .getPlayer (), to , from , toDistrict );
1107+ BukkitTools .fireEvent (e2 );
1108+ if (e2 .isCancelled ()) event .setCancelled (true );
10891109
10901110 } else {
10911111 // Player has left one Town and immediately entered a different one, check if there were districts.
1092- if (fromHasDistrict )
1093- BukkitTools .fireEvent (new PlayerExitsFromDistrictEvent (event .getPlayer (), to , from , fromDistrict , event .getMoveEvent ()));
1094- if (toHasDistrict )
1095- BukkitTools .fireEvent (new PlayerEntersIntoDistrictEvent (event .getPlayer (), to , from , toDistrict , event .getMoveEvent ()));
1112+ if (fromHasDistrict ) {
1113+ PlayerExitsFromDistrictEvent e1 = new PlayerExitsFromDistrictEvent (event .getPlayer (), to , from , fromDistrict );
1114+ BukkitTools .fireEvent (e1 );
1115+ if (e1 .isCancelled ()) event .setCancelled (true );
1116+ }
1117+ if (toHasDistrict ) {
1118+ PlayerEntersIntoDistrictEvent e2 = new PlayerEntersIntoDistrictEvent (event .getPlayer (), to , from , toDistrict );
1119+ BukkitTools .fireEvent (e2 );
1120+ if (e2 .isCancelled ()) event .setCancelled (true );
1121+ }
10961122 }
10971123 }
10981124
0 commit comments