11package 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+
315import nl .svenar .powercamera .CameraHandler ;
416import nl .svenar .powercamera .PowerCamera ;
517import nl .svenar .powercamera .commands .PowerCameraCommand ;
618import nl .svenar .powercamera .commands .structure .CommandExecutionContext ;
719import nl .svenar .powercamera .data .CameraMode ;
820import 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" })
1624public 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