1
1
package nl .svenar .powercamera .commands .subcommand ;
2
2
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
+
3
15
import nl .svenar .powercamera .CameraHandler ;
4
16
import nl .svenar .powercamera .PowerCamera ;
5
17
import nl .svenar .powercamera .commands .PowerCameraCommand ;
6
18
import nl .svenar .powercamera .commands .structure .CommandExecutionContext ;
7
19
import nl .svenar .powercamera .data .CameraMode ;
8
20
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 ;
14
21
15
- @ SuppressWarnings ({"PMD.AvoidLiteralsInIfCondition" , "PMD.CommentRequired" , "PMD.LocalVariableCouldBeFinal" , "PMD.MethodArgumentCouldBeFinal" })
22
+ @ SuppressWarnings ({ "PMD.AvoidLiteralsInIfCondition" , "PMD.CommentRequired" , "PMD.LocalVariableCouldBeFinal" ,
23
+ "PMD.MethodArgumentCouldBeFinal" })
16
24
public class SubcommandStartOther extends PowerCameraCommand {
17
25
18
26
public SubcommandStartOther (PowerCamera plugin , String commandName ) {
@@ -22,7 +30,8 @@ public SubcommandStartOther(PowerCamera plugin, String commandName) {
22
30
@ Override
23
31
public boolean onCommand (CommandSender sender , Command cmd , String commandLabel , String [] args ) {
24
32
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>" );
26
35
return false ;
27
36
}
28
37
@@ -34,27 +43,77 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandLabel,
34
43
return false ;
35
44
}
36
45
37
- Player targetPlayer = Bukkit . getPlayer ( targetName );
46
+ List < Player > targetPlayers = getPlayersFromSelector ( sender , targetName );
38
47
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 + "'" );
41
50
return false ;
42
51
}
43
52
44
- PlayerCameraData cameraData = plugin .getPlayerData ().get (targetPlayer );
53
+ for (Player targetPlayer : targetPlayers ) {
54
+ PlayerCameraData cameraData = plugin .getPlayerData ().get (targetPlayer );
45
55
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
+ }
50
61
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
+ }
56
70
}
57
71
58
72
return false ;
59
73
}
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
+
60
119
}
0 commit comments