Skip to content

Commit e42989f

Browse files
committed
Added @A, @r and @p selector for /pr startother
1 parent 1dcc81c commit e42989f

1 file changed

Lines changed: 79 additions & 20 deletions

File tree

Lines changed: 79 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,26 @@
11
package nl.svenar.powercamera.commands.subcommand;
22

3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.Random;
6+
7+
import org.bukkit.Bukkit;
8+
import org.bukkit.ChatColor;
9+
import org.bukkit.Location;
10+
import org.bukkit.command.BlockCommandSender;
11+
import org.bukkit.command.Command;
12+
import org.bukkit.command.CommandSender;
13+
import org.bukkit.entity.Player;
14+
315
import nl.svenar.powercamera.CameraHandler;
416
import nl.svenar.powercamera.PowerCamera;
517
import nl.svenar.powercamera.commands.PowerCameraCommand;
618
import nl.svenar.powercamera.commands.structure.CommandExecutionContext;
719
import nl.svenar.powercamera.data.CameraMode;
820
import nl.svenar.powercamera.data.PlayerCameraData;
9-
import org.bukkit.Bukkit;
10-
import org.bukkit.ChatColor;
11-
import org.bukkit.command.Command;
12-
import org.bukkit.command.CommandSender;
13-
import org.bukkit.entity.Player;
1421

15-
@SuppressWarnings({"PMD.AvoidLiteralsInIfCondition", "PMD.CommentRequired", "PMD.LocalVariableCouldBeFinal", "PMD.MethodArgumentCouldBeFinal"})
22+
@SuppressWarnings({ "PMD.AvoidLiteralsInIfCondition", "PMD.CommentRequired", "PMD.LocalVariableCouldBeFinal",
23+
"PMD.MethodArgumentCouldBeFinal" })
1624
public class SubcommandStartOther extends PowerCameraCommand {
1725

1826
public SubcommandStartOther(PowerCamera plugin, String commandName) {
@@ -22,7 +30,8 @@ public SubcommandStartOther(PowerCamera plugin, String commandName) {
2230
@Override
2331
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
2432
if (args.length != 2) {
25-
sendMessage(sender, ChatColor.DARK_RED + "Usage: /" + commandLabel + " startother <playername> <cameraname>");
33+
sendMessage(sender,
34+
ChatColor.DARK_RED + "Usage: /" + commandLabel + " startother <playername> <cameraname>");
2635
return false;
2736
}
2837

@@ -34,27 +43,77 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel,
3443
return false;
3544
}
3645

37-
Player targetPlayer = Bukkit.getPlayer(targetName);
46+
List<Player> targetPlayers = getPlayersFromSelector(sender, targetName);
3847

39-
if (targetPlayer == null) {
40-
sendMessage(sender, ChatColor.DARK_RED + "Player '" + targetName + "' not found or is offline!");
48+
if (targetPlayers.isEmpty()) {
49+
sendMessage(sender, ChatColor.DARK_RED + "No matching players found for selector '" + targetName + "'");
4150
return false;
4251
}
4352

44-
PlayerCameraData cameraData = plugin.getPlayerData().get(targetPlayer);
53+
for (Player targetPlayer : targetPlayers) {
54+
PlayerCameraData cameraData = plugin.getPlayerData().get(targetPlayer);
4555

46-
if (cameraData.getCameraMode() != CameraMode.NONE) {
47-
sendMessage(sender, ChatColor.DARK_RED + "Player '" + targetPlayer.getName() + "' already has a camera active!");
48-
return false;
49-
}
56+
if (cameraData.getCameraMode() != CameraMode.NONE) {
57+
sendMessage(sender,
58+
ChatColor.DARK_RED + "Player '" + targetPlayer.getName() + "' already has a camera active!");
59+
continue;
60+
}
5061

51-
if (this.plugin.getConfigCameras().cameraExists(cameraName)) {
52-
cameraData.setCameraHandler(new CameraHandler(plugin, targetPlayer, cameraName).generatePath().start());
53-
sender.sendMessage(plugin.getPluginChatPrefix() + ChatColor.GREEN + "Playing '" + cameraName + "' on player: " + targetPlayer.getName());
54-
} else {
55-
sendMessage(sender, ChatColor.RED + "Camera '" + cameraName + "' not found!");
62+
if (this.plugin.getConfigCameras().cameraExists(cameraName)) {
63+
cameraData.setCameraHandler(new CameraHandler(plugin, targetPlayer, cameraName).generatePath().start());
64+
sender.sendMessage(plugin.getPluginChatPrefix() + ChatColor.GREEN + "Playing '" + cameraName
65+
+ "' on player: " + targetPlayer.getName());
66+
} else {
67+
sendMessage(sender, ChatColor.RED + "Camera '" + cameraName + "' not found!");
68+
break;
69+
}
5670
}
5771

5872
return false;
5973
}
74+
75+
private List<Player> getPlayersFromSelector(CommandSender sender, String selector) {
76+
selector = selector.replace("@", "").toLowerCase();
77+
78+
if (selector.equals("a")) {
79+
// All online players
80+
return new ArrayList<>(Bukkit.getOnlinePlayers());
81+
}
82+
83+
if (selector.equals("r")) {
84+
// Random online player
85+
List<Player> players = new ArrayList<>(Bukkit.getOnlinePlayers());
86+
if (!players.isEmpty()) {
87+
return List.of(players.get(new Random().nextInt(players.size())));
88+
}
89+
return List.of();
90+
}
91+
92+
if (selector.equals("p")) {
93+
// Nearest player to the command block or sender
94+
if (sender instanceof BlockCommandSender blockSender) {
95+
Location blockLocation = blockSender.getBlock().getLocation();
96+
double closestDistance = Double.MAX_VALUE;
97+
Player closestPlayer = null;
98+
99+
for (Player player : Bukkit.getOnlinePlayers()) {
100+
double distance = player.getLocation().distanceSquared(blockLocation);
101+
if (distance < closestDistance) {
102+
closestDistance = distance;
103+
closestPlayer = player;
104+
}
105+
}
106+
107+
return closestPlayer != null ? List.of(closestPlayer) : List.of();
108+
}
109+
110+
if (sender instanceof Player player) {
111+
return List.of(player);
112+
}
113+
}
114+
115+
Player namedPlayer = Bukkit.getPlayer(selector);
116+
return namedPlayer != null ? List.of(namedPlayer) : List.of();
117+
}
118+
60119
}

0 commit comments

Comments
 (0)