Skip to content

Commit 325ed93

Browse files
committed
Implement radius argument in sponge implementation.
1 parent 2d05467 commit 325ed93

17 files changed

+283
-85
lines changed

SkyChanger-Bukkit/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ repositories {
1010
}
1111

1212
dependencies {
13-
compile 'org.bstats:bstats-bukkit:1.4'
14-
compileOnly 'org.spigotmc:spigot-api:1.14-R0.1-SNAPSHOT'
13+
compile 'org.bstats:bstats-bukkit:1.5'
14+
compileOnly 'org.spigotmc:spigot-api:1.14.4-R0.1-SNAPSHOT'
1515
}
1616

1717
bukkit {

SkyChanger-Sponge/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ repositories {
3636
}
3737

3838
dependencies {
39-
compile 'org.bstats:bstats-sponge:1.4'
39+
compile 'org.bstats:bstats-sponge:1.5'
4040
compileOnly 'org.spongepowered:spongeapi:7.1.0'
4141
}
4242

SkyChanger-Sponge/src/main/java/com/dscalzi/skychanger/sponge/SkyChangerPlugin.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,13 @@ public void onPostInit(GamePostInitializationEvent event) {
138138
opdb.assign(PermissionDescription.ROLE_USER, true).description(Text.of("Access to every part of the main SkyChanger command.")).id(plugin.getId() + ".changesky").register();
139139
opdb.assign(PermissionDescription.ROLE_USER, true).description(Text.of("Access to change your personal sky color.")).id(plugin.getId() + ".changesky.self").register();
140140
opdb.assign(PermissionDescription.ROLE_USER, true).description(Text.of("Access to changing a specific person's sky color.")).id(plugin.getId() + ".changesky.others").register();
141+
opdb.assign(PermissionDescription.ROLE_USER, true).description(Text.of("Access to change the sky color for players within a radius.")).id(plugin.getId() + ".changesky.radius").register();
141142
opdb.assign(PermissionDescription.ROLE_USER, true).description(Text.of("Access to changing a specific world's sky color.")).id(plugin.getId() + ".changesky.world").register();
142143
opdb.assign(PermissionDescription.ROLE_USER, true).description(Text.of("Access to changing the sky color of all online players.")).id(plugin.getId() + ".changesky.all").register();
143144
opdb.assign(PermissionDescription.ROLE_USER, true).description(Text.of("Access to every part of the SkyChanger freeze and unfreeze commands.")).id(plugin.getId() + ".freeze").register();
144145
opdb.assign(PermissionDescription.ROLE_USER, true).description(Text.of("Access to freeze/unfreeze yourself.")).id(plugin.getId() + ".freeze.self").register();
145146
opdb.assign(PermissionDescription.ROLE_USER, true).description(Text.of("Access to freeze/unfreeze a specific person.")).id(plugin.getId() + ".freeze.others").register();
147+
opdb.assign(PermissionDescription.ROLE_USER, true).description(Text.of("Access to freeze/unfreeze a players within a radius.")).id(plugin.getId() + ".freeze.radius").register();
146148
opdb.assign(PermissionDescription.ROLE_USER, true).description(Text.of("Access to freeze/unfreeze a specific world.")).id(plugin.getId() + ".freeze.world").register();
147149
opdb.assign(PermissionDescription.ROLE_USER, true).description(Text.of("Access to freeze/unfreeze all online players.")).id(plugin.getId() + ".freeze.all").register();
148150
opdb.assign(PermissionDescription.ROLE_USER, true).description(Text.of("Bypass the packet range limits set in the config.yml.")).id(plugin.getId() + ".bypasslimit").register();

SkyChanger-Sponge/src/main/java/com/dscalzi/skychanger/sponge/internal/MainExecutor.java

Lines changed: 118 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import org.spongepowered.api.command.CommandException;
3434
import org.spongepowered.api.command.CommandResult;
3535
import org.spongepowered.api.command.CommandSource;
36+
import org.spongepowered.api.command.source.CommandBlockSource;
37+
import org.spongepowered.api.command.source.ConsoleSource;
3638
import org.spongepowered.api.entity.living.player.Player;
3739
import org.spongepowered.api.text.Text;
3840
import org.spongepowered.api.world.Location;
@@ -100,8 +102,9 @@ private void cmdChangeSky(CommandSource sender, String[] args) {
100102
boolean s = sender.hasPermission(basePerm + ".self");
101103
boolean o = sender.hasPermission(basePerm + ".others");
102104
boolean a = sender.hasPermission(basePerm + ".all");
103-
boolean w = WorldPermissionUtil.hasGeneralChangeskyPerm(sender);
104-
if (!s && !o && !a && !w) {
105+
boolean w = WildcardPermissionUtil.hasGeneralChangeskyWorldPerm(sender);
106+
boolean r = WildcardPermissionUtil.hasGeneralChangeskyRadiusPerm(sender);
107+
if (!s && !o && !a && !w && !r) {
105108
mm.noPermission(sender);
106109
return;
107110
}
@@ -155,7 +158,7 @@ private void cmdChangeSky(CommandSource sender, String[] args) {
155158
}
156159
t = ((Player) sender).getWorld();
157160
}
158-
if (!WorldPermissionUtil.hasChangeskyPerm(sender, t)) {
161+
if (!WildcardPermissionUtil.hasChangeskyWorldPerm(sender, t)) {
159162
mm.noPermission(sender);
160163
return;
161164
}
@@ -165,6 +168,49 @@ private void cmdChangeSky(CommandSource sender, String[] args) {
165168
mm.packetSent(sender, mm.getString("message.allPlayersIn") + " " + t.getName());
166169
return;
167170
}
171+
// Check if requested for radius
172+
if (args[1].equalsIgnoreCase("-r")) {
173+
if (sender instanceof ConsoleSource) {
174+
MessageManager.getInstance().denyNonPlayer(sender);
175+
return;
176+
}
177+
if(args.length > 2) {
178+
double radius;
179+
double radiusSq;
180+
try {
181+
radius = Double.parseDouble(args[2]);
182+
183+
if (!WildcardPermissionUtil.hasChangeskyRadiusPerm(sender, radius)) {
184+
mm.noPermission(sender);
185+
return;
186+
}
187+
188+
radiusSq = Math.pow(radius, 2);
189+
} catch (NumberFormatException e) {
190+
MessageManager.getInstance().radiusFormatError(sender);
191+
return;
192+
}
193+
Location<World> origin;
194+
if (sender instanceof Player) {
195+
origin = ((Player)sender).getLocation();
196+
} else if (sender instanceof CommandBlockSource) {
197+
origin = ((CommandBlockSource)sender).getLocation();
198+
} else {
199+
MessageManager.getInstance().denyNonPlayer(sender);
200+
return;
201+
}
202+
for(Player p : origin.getExtent().getPlayers()) {
203+
if(Math.abs(origin.getPosition().distanceSquared(p.getPosition())) <= radiusSq) {
204+
api.changeSky(p, pN);
205+
}
206+
}
207+
mm.packetSent(sender, mm.getString("message.allPlayersInRadius") + " " + args[2]);
208+
return;
209+
} else {
210+
mm.mustSpecifyRadius(sender);
211+
return;
212+
}
213+
}
168214
// Check if param is a player
169215
if (!o) {
170216
mm.noPermission(sender);
@@ -209,8 +255,9 @@ private void cmdFreeze(CommandSource sender, boolean unfreeze, String[] args) {
209255
boolean s = sender.hasPermission(basePerm + ".self");
210256
boolean o = sender.hasPermission(basePerm + ".others");
211257
boolean a = sender.hasPermission(basePerm + ".all");
212-
boolean w = WorldPermissionUtil.hasGeneralFreezePerm(sender);
213-
if (!s && !o && !a && !w) {
258+
boolean w = WildcardPermissionUtil.hasGeneralFreezeWorldPerm(sender);
259+
boolean r = WildcardPermissionUtil.hasGeneralFreezeRadiusPerm(sender);
260+
if (!s && !o && !a && !w && !r) {
214261
mm.noPermission(sender);
215262
return;
216263
}
@@ -251,7 +298,7 @@ private void cmdFreeze(CommandSource sender, boolean unfreeze, String[] args) {
251298
}
252299
t = ((Player) sender).getWorld();
253300
}
254-
if (!WorldPermissionUtil.hasFreezePerm(sender, t)) {
301+
if (!WildcardPermissionUtil.hasFreezeWorldPerm(sender, t)) {
255302
mm.noPermission(sender);
256303
return;
257304
}
@@ -267,6 +314,55 @@ private void cmdFreeze(CommandSource sender, boolean unfreeze, String[] args) {
267314
mm.packetSent(sender, mm.getString("message.allPlayersIn") + " " + t.getName());
268315
return;
269316
}
317+
// Check if requested for radius
318+
if (args[1].equalsIgnoreCase("-r")) {
319+
if (sender instanceof ConsoleSource) {
320+
MessageManager.getInstance().denyNonPlayer(sender);
321+
return;
322+
}
323+
if(args.length > 2) {
324+
double radius;
325+
double radiusSq;
326+
try {
327+
radius = Double.parseDouble(args[2]);
328+
329+
if (!WildcardPermissionUtil.hasFreezeRadiusPerm(sender, radius)) {
330+
mm.noPermission(sender);
331+
return;
332+
}
333+
334+
radiusSq = Math.pow(radius, 2);
335+
} catch (NumberFormatException e) {
336+
MessageManager.getInstance().radiusFormatError(sender);
337+
return;
338+
}
339+
Location<World> origin;
340+
if (sender instanceof Player) {
341+
origin = ((Player)sender).getLocation();
342+
} else if (sender instanceof CommandBlockSource) {
343+
origin = ((CommandBlockSource)sender).getLocation();
344+
} else {
345+
MessageManager.getInstance().denyNonPlayer(sender);
346+
return;
347+
}
348+
for(Player p : origin.getExtent().getPlayers()) {
349+
if(Math.abs(origin.getPosition().distanceSquared(p.getPosition())) <= radiusSq) {
350+
if (unfreeze)
351+
api.unfreeze(p);
352+
else
353+
api.freeze(p);
354+
}
355+
}
356+
if (unfreeze)
357+
mm.packetUnfreeze(sender, mm.getString("message.allPlayersInRadius") + " " + args[2]);
358+
else
359+
mm.packetSent(sender, mm.getString("message.allPlayersInRadius") + " " + args[2]);
360+
return;
361+
} else {
362+
mm.mustSpecifyRadius(sender);
363+
return;
364+
}
365+
}
270366
// Check if param is a player
271367
if (!o) {
272368
mm.noPermission(sender);
@@ -343,7 +439,8 @@ public List<String> getSuggestions(CommandSource source, String arguments, Locat
343439
List<String> ret = new ArrayList<String>();
344440

345441
boolean b = source.hasPermission("skychanger.freeze.self") || source.hasPermission("skychanger.freeze.others")
346-
|| source.hasPermission("skychanger.freeze.all") || WorldPermissionUtil.hasGeneralFreezePerm(source);
442+
|| source.hasPermission("skychanger.freeze.all") || WildcardPermissionUtil.hasGeneralFreezeWorldPerm(source)
443+
|| WildcardPermissionUtil.hasGeneralFreezeRadiusPerm(source);
347444

348445
if (args.length == 1) {
349446
if ("help".startsWith(args[0].toLowerCase()))
@@ -374,14 +471,24 @@ public List<String> getSuggestions(CommandSource source, String arguments, Locat
374471
}
375472
// World flag
376473
if (args[0].equalsIgnoreCase("freeze") || args[0].equalsIgnoreCase("unfreeze")) {
377-
if ("-w".startsWith(args[1].toLowerCase()) && WorldPermissionUtil.hasGeneralFreezePerm(source)) {
474+
if ("-w".startsWith(args[1].toLowerCase()) && WildcardPermissionUtil.hasGeneralFreezeWorldPerm(source)) {
378475
ret.add("-w");
379476
}
380477
} else {
381-
if ("-w".startsWith(args[1].toLowerCase()) && WorldPermissionUtil.hasGeneralChangeskyPerm(source)) {
478+
if ("-w".startsWith(args[1].toLowerCase()) && WildcardPermissionUtil.hasGeneralChangeskyWorldPerm(source)) {
382479
ret.add("-w");
383480
}
384481
}
482+
// Radius flag
483+
if (args[0].equalsIgnoreCase("freeze") || args[0].equalsIgnoreCase("unfreeze")) {
484+
if ("-r".startsWith(args[1].toLowerCase()) && WildcardPermissionUtil.hasGeneralFreezeRadiusPerm(source)) {
485+
ret.add("-r");
486+
}
487+
} else {
488+
if ("-r".startsWith(args[1].toLowerCase()) && WildcardPermissionUtil.hasGeneralChangeskyRadiusPerm(source)) {
489+
ret.add("-r");
490+
}
491+
}
385492
}
386493

387494
// World names
@@ -390,14 +497,14 @@ public List<String> getSuggestions(CommandSource source, String arguments, Locat
390497
if (packetNum.matcher(args[0]).matches()) {
391498
for (World w : plugin.getGame().getServer().getWorlds()) {
392499
if (w.getName().toLowerCase().startsWith(args[2].toLowerCase())
393-
&& WorldPermissionUtil.hasChangeskyPerm(source, w)) {
500+
&& WildcardPermissionUtil.hasChangeskyWorldPerm(source, w)) {
394501
ret.add(w.getName());
395502
}
396503
}
397504
} else if (args[0].equalsIgnoreCase("freeze") || args[0].equalsIgnoreCase("unfreeze")) {
398505
for (World w : plugin.getGame().getServer().getWorlds()) {
399506
if (w.getName().toLowerCase().startsWith(args[2].toLowerCase())
400-
&& WorldPermissionUtil.hasFreezePerm(source, w)) {
507+
&& WildcardPermissionUtil.hasFreezeWorldPerm(source, w)) {
401508
ret.add(w.getName());
402509
}
403510
}
Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,23 +25,35 @@
2525
package com.dscalzi.skychanger.sponge.internal;
2626

2727
import java.util.Map;
28+
import java.util.function.Predicate;
2829

2930
import org.spongepowered.api.command.source.ConsoleSource;
3031
import org.spongepowered.api.service.permission.Subject;
3132
import org.spongepowered.api.world.World;
3233

33-
public class WorldPermissionUtil {
34+
public class WildcardPermissionUtil {
3435

3536
private static final String CWORLDPERM = "skychanger.changesky.world";
3637
private static final String FWORLDPERM = "skychanger.freeze.world";
38+
39+
private static final String CRADIUSPERM = "skychanger.changesky.radius";
40+
private static final String FRADIUSPERM = "skychanger.freeze.radius";
3741

38-
public static boolean hasGeneralChangeskyPerm(Subject p) {
42+
public static boolean hasGeneralChangeskyWorldPerm(Subject p) {
3943
return hasGeneralPerm(p, CWORLDPERM);
4044
}
4145

42-
public static boolean hasGeneralFreezePerm(Subject p) {
46+
public static boolean hasGeneralFreezeWorldPerm(Subject p) {
4347
return hasGeneralPerm(p, FWORLDPERM);
4448
}
49+
50+
public static boolean hasGeneralChangeskyRadiusPerm(Subject p) {
51+
return hasGeneralPerm(p, CRADIUSPERM);
52+
}
53+
54+
public static boolean hasGeneralFreezeRadiusPerm(Subject p) {
55+
return hasGeneralPerm(p, FRADIUSPERM);
56+
}
4557

4658
private static boolean hasGeneralPerm(Subject p, String perm) {
4759
if(p instanceof ConsoleSource) {
@@ -56,18 +68,44 @@ private static boolean hasGeneralPerm(Subject p, String perm) {
5668
}
5769
}
5870
}
59-
return false;
71+
return p.hasPermission(perm);
6072
}
6173

62-
public static boolean hasChangeskyPerm(Subject p, World w) {
74+
public static boolean hasChangeskyWorldPerm(Subject p, World w) {
6375
return hasWorldPerm(p, w, CWORLDPERM);
6476
}
6577

66-
public static boolean hasFreezePerm(Subject p, World w) {
78+
public static boolean hasFreezeWorldPerm(Subject p, World w) {
6779
return hasWorldPerm(p, w, FWORLDPERM);
6880
}
69-
81+
7082
private static boolean hasWorldPerm(Subject p, World w, String perm) {
83+
84+
return hasPerm(p, (s) -> s.getKey().substring(perm.length() + 1).equals(w.getName()), perm)
85+
|| p.hasPermission(perm);
86+
}
87+
88+
public static boolean hasChangeskyRadiusPerm(Subject p, double radius) {
89+
return hasRadiusPerm(p, radius, CRADIUSPERM);
90+
}
91+
92+
public static boolean hasFreezeRadiusPerm(Subject p, double radius) {
93+
return hasRadiusPerm(p, radius, FRADIUSPERM);
94+
}
95+
96+
public static boolean hasRadiusPerm(Subject p, double radius, String perm) {
97+
return hasPerm(p, (s) -> {
98+
try {
99+
double radiusLimit = Double.parseDouble(s.getKey().substring(perm.length() + 1));
100+
return radius <= radiusLimit;
101+
} catch (NumberFormatException e) {
102+
// Malformed permission.
103+
return false;
104+
}
105+
}, perm) || p.hasPermission(perm);
106+
}
107+
108+
private static boolean hasPerm(Subject p, Predicate<Map.Entry<String, Boolean>> hasSpecificPermissionTest, String perm) {
71109
if(p instanceof ConsoleSource) {
72110
return true;
73111
}
@@ -77,7 +115,7 @@ private static boolean hasWorldPerm(Subject p, World w, String perm) {
77115
final String effective = s.getKey().toLowerCase();
78116
if (effective.equals(perm)) {
79117
canByRight = s.getValue();
80-
} else if (effective.indexOf(perm) > -1 && s.getKey().substring(perm.length() + 1).equals(w.getName())) {
118+
} else if (effective.indexOf(perm) > -1 && hasSpecificPermissionTest.test(s)) {
81119
return s.getValue();
82120
}
83121
}

0 commit comments

Comments
 (0)