Skip to content

Commit

Permalink
Use async teleporting
Browse files Browse the repository at this point in the history
  • Loading branch information
DarkArc committed Jan 31, 2020
1 parent 823cae3 commit 6d8790c
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 41 deletions.
Expand Up @@ -44,6 +44,7 @@
import org.bukkit.event.player.PlayerTeleportEvent;

import java.io.File;
import java.util.concurrent.CompletableFuture;

@ComponentInformation(friendlyName = "Spawn Locations", desc = "Allows exact spawn locations for players, " +
"as well as getting and setting the world's spawn.")
Expand Down Expand Up @@ -137,7 +138,7 @@ public void spawn(CommandContext args, CommandSender sender) throws CommandExcep
(new PlayerIteratorAction(sender) {

@Override
public boolean perform(Player player) {
public CompletableFuture<Boolean> perform(Player player) {
return PlayerUtil.teleportTo(sender, player, getSpawnPoint(player.getWorld()), true);
}

Expand Down
Expand Up @@ -25,6 +25,8 @@
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;

import java.util.concurrent.CompletableFuture;

public class PlayerUtil {

/**
Expand All @@ -50,31 +52,32 @@ public static Player checkPlayer(CommandSender sender) throws CommandException {
* @param target
* @param allowVehicles
*/
public static boolean teleportTo(CommandSender sender, Player player, Location target, boolean allowVehicles) {
public static CompletableFuture<Boolean> teleportTo(CommandSender sender, Player player, Location target, boolean allowVehicles) {
target.getChunk().load(true);
if (player.getVehicle() != null) {
Entity vehicle = player.getVehicle();
vehicle.eject();

boolean success = player.teleport(target);
return player.teleportAsync(target).thenApply((success) -> {
if (!allowVehicles) {
return success;
}

if (!allowVehicles) {
return success;
}

// Check vehicle permissions
String permString = "commandbook.teleport.vehicle." + vehicle.getType().getName().toLowerCase();
// Check vehicle permissions
String permString = "commandbook.teleport.vehicle." + vehicle.getType().getName().toLowerCase();

if (CommandBook.inst().hasPermission(player, permString)) {
if (player.getWorld().equals(target.getWorld())
|| CommandBook.inst().hasPermission(player, target.getWorld(), permString)) {
success = success && vehicle.teleport(player);
vehicle.setPassenger(player);
if (CommandBook.inst().hasPermission(player, permString)) {
if (player.getWorld().equals(target.getWorld())
|| CommandBook.inst().hasPermission(player, target.getWorld(), permString)) {
success = success && vehicle.teleport(player);
vehicle.setPassenger(player);
}
}
}
return success;
return success;
});
} else {
return player.teleport(target);
return player.teleportAsync(target);
}
}
}
Expand Up @@ -21,6 +21,10 @@
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
* Performs an action over a list of players.
*
Expand Down Expand Up @@ -48,30 +52,38 @@ public PlayerIteratorAction(CommandSender sender) {
* @param targets
*/
public void iterate(Iterable<Player> targets) {
List<CompletableFuture<Void>> teleportResults = new ArrayList<>();

for (Player player : targets) {
if (!perform(player)) continue;

// Tell the user
if (player.equals(sender)) {
onCaller(player);

// Keep track of this
included = true;
} else {
onVictim(sender, player);
}

affected++;
}

if (!included) {
onInform(sender, affected);
onInformMany(sender, affected);
} else if (affected > 1) {
onInformMany(sender, affected);
teleportResults.add(perform(player).thenAccept((success) -> {
if (!success) {
return;
}

// Tell the user
if (player.equals(sender)) {
onCaller(player);

// Keep track of this
included = true;
} else {
onVictim(sender, player);
}

affected++;
}));
}

onComplete(sender, affected);

CompletableFuture.allOf(teleportResults.toArray(new CompletableFuture[0])).thenAccept((ignored) -> {
if (!included) {
onInform(sender, affected);
onInformMany(sender, affected);
} else if (affected > 1) {
onInformMany(sender, affected);
}

onComplete(sender, affected);
});
}

/**
Expand All @@ -88,7 +100,7 @@ public CommandSender getSender() {
*
* @param player
*/
public abstract boolean perform(Player player);
public abstract CompletableFuture<Boolean> perform(Player player);

/**
* Called when the caller is affected by the action.
Expand Down
Expand Up @@ -26,6 +26,8 @@
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import java.util.concurrent.CompletableFuture;

public class TeleportPlayerIterator extends PlayerIteratorAction {

protected final Location loc;
Expand Down Expand Up @@ -55,7 +57,7 @@ public TeleportPlayerIterator(CommandSender sender, LocationTarget target, boole
}

@Override
public boolean perform(Player player) {
public CompletableFuture<Boolean> perform(Player player) {
oldLoc = player.getLocation();
Location newLoc = loc;
// for each coord, if it is relative, add the given location's coord
Expand All @@ -72,7 +74,7 @@ public boolean perform(Player player) {
return teleport(player, newLoc);
}

public boolean teleport(Player player, Location newLoc) {
public CompletableFuture<Boolean> teleport(Player player, Location newLoc) {

return PlayerUtil.teleportTo(sender, player, newLoc, true);
}
Expand Down

0 comments on commit 6d8790c

Please sign in to comment.