Skip to content

Commit a7f3eac

Browse files
authored
Merge pull request #624 from zyxkad/dev/1.19.2
fix player can bypass the maximum chatbox/playerdetector range by setting a negative range
2 parents 4350ca5 + 8fda0f4 commit a7f3eac

File tree

3 files changed

+39
-23
lines changed

3 files changed

+39
-23
lines changed

src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,7 @@ public final MethodResult sendFormattedMessage(@NotNull IArguments arguments) th
111111
return withChatOperation(ignored -> {
112112
String message = arguments.getString(0);
113113
int maxRange = APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get();
114-
int range = arguments.optInt(4, maxRange);
115-
range = maxRange == -1 ? range : Math.min(range, APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get());
114+
int range = arguments.optInt(4, -1);
116115
ResourceKey<Level> dimension = getLevel().dimension();
117116
MutableComponent component = Component.Serializer.fromJson(message);
118117
if (component == null)
@@ -129,7 +128,7 @@ public final MethodResult sendFormattedMessage(@NotNull IArguments arguments) th
129128
for (ServerPlayer player : ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayers()) {
130129
if (!APConfig.PERIPHERALS_CONFIG.chatBoxMultiDimensional.get() && player.getLevel().dimension() != dimension)
131130
continue;
132-
if (range == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange))
131+
if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange))
133132
player.sendSystemMessage(preparedMessage);
134133
}
135134
return MethodResult.of(true);
@@ -141,8 +140,7 @@ public final MethodResult sendMessage(@NotNull IArguments arguments) throws LuaE
141140
return withChatOperation(ignored -> {
142141
String message = arguments.getString(0);
143142
int maxRange = APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get();
144-
int range = arguments.optInt(4, maxRange);
145-
range = maxRange == -1 ? range : Math.min(range, APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get());
143+
int range = arguments.optInt(4, -1);
146144
ResourceKey<Level> dimension = getLevel().dimension();
147145
if (checkBrackets(arguments.optString(2)))
148146
return MethodResult.of(null, "incorrect bracket string (e.g. [], {}, <>, ...)");
@@ -155,7 +153,7 @@ public final MethodResult sendMessage(@NotNull IArguments arguments) throws LuaE
155153
for (ServerPlayer player : ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayers()) {
156154
if (!APConfig.PERIPHERALS_CONFIG.chatBoxMultiDimensional.get() && player.getLevel().dimension() != dimension)
157155
continue;
158-
if (range == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange))
156+
if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange))
159157
player.sendSystemMessage(preparedMessage);
160158
}
161159
return MethodResult.of(true);
@@ -168,8 +166,7 @@ public final MethodResult sendFormattedMessageToPlayer(@NotNull IArguments argum
168166
String message = arguments.getString(0);
169167
String playerName = arguments.getString(1);
170168
int maxRange = APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get();
171-
int range = arguments.optInt(5, maxRange);
172-
range = maxRange == -1 ? range : Math.min(range, APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get());
169+
int range = Math.min(arguments.optInt(5, -1), maxRange);
173170
ResourceKey<Level> dimension = getLevel().dimension();
174171
ServerPlayer player = getPlayer(playerName);
175172
if (player == null)
@@ -190,7 +187,7 @@ public final MethodResult sendFormattedMessageToPlayer(@NotNull IArguments argum
190187
if (!APConfig.PERIPHERALS_CONFIG.chatBoxMultiDimensional.get() && player.getLevel().dimension() != dimension)
191188
return MethodResult.of(false, "NOT_SAME_DIMENSION");
192189

193-
if (range == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange))
190+
if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange))
194191
player.sendSystemMessage(preparedMessage);
195192
return MethodResult.of(true);
196193
});
@@ -204,8 +201,7 @@ public final MethodResult sendFormattedToastToPlayer(@NotNull IArguments argumen
204201
String title = arguments.getString(1);
205202
String playerName = arguments.getString(2);
206203
int maxRange = APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get();
207-
int range = arguments.optInt(6, maxRange);
208-
range = maxRange == -1 ? range : Math.min(range, APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get());
204+
int range = arguments.optInt(6, -1);
209205
ResourceKey<Level> dimension = getLevel().dimension();
210206
ServerPlayer player = getPlayer(playerName);
211207
if (player == null)
@@ -231,7 +227,7 @@ public final MethodResult sendFormattedToastToPlayer(@NotNull IArguments argumen
231227
if (!APConfig.PERIPHERALS_CONFIG.chatBoxMultiDimensional.get() && player.getLevel().dimension() != dimension)
232228
return MethodResult.of(false, "NOT_SAME_DIMENSION");
233229

234-
if (range == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) {
230+
if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) {
235231
ToastToClientPacket packet = new ToastToClientPacket(titleComponent, preparedMessage);
236232
APNetworking.sendTo(packet, player);
237233
}
@@ -246,8 +242,7 @@ public final MethodResult sendMessageToPlayer(@NotNull IArguments arguments) thr
246242
String message = arguments.getString(0);
247243
String playerName = arguments.getString(1);
248244
int maxRange = APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get();
249-
int range = arguments.optInt(5, maxRange);
250-
range = maxRange == -1 ? range : Math.min(range, APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get());
245+
int range = arguments.optInt(5, -1);
251246
ResourceKey<Level> dimension = getLevel().dimension();
252247
ServerPlayer player = getPlayer(playerName);
253248
if (player == null)
@@ -264,7 +259,7 @@ public final MethodResult sendMessageToPlayer(@NotNull IArguments arguments) thr
264259
if (!APConfig.PERIPHERALS_CONFIG.chatBoxMultiDimensional.get() && player.getLevel().dimension() != dimension)
265260
return MethodResult.of(false, "NOT_SAME_DIMENSION");
266261

267-
if (range == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange))
262+
if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange))
268263
player.sendSystemMessage(preparedMessage, false);
269264
return MethodResult.of(true);
270265
});
@@ -277,8 +272,7 @@ public final MethodResult sendToastToPlayer(@NotNull IArguments arguments) throw
277272
String title = arguments.getString(1);
278273
String playerName = arguments.getString(2);
279274
int maxRange = APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get();
280-
int range = arguments.optInt(6, maxRange);
281-
range = maxRange == -1 ? range : Math.min(range, APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get());
275+
int range = arguments.optInt(6, -1);
282276
ResourceKey<Level> dimension = getLevel().dimension();
283277
ServerPlayer player = getPlayer(playerName);
284278
if (player == null)
@@ -296,7 +290,7 @@ public final MethodResult sendToastToPlayer(@NotNull IArguments arguments) throw
296290
if (!APConfig.PERIPHERALS_CONFIG.chatBoxMultiDimensional.get() && player.getLevel().dimension() != dimension)
297291
return MethodResult.of(false, "NOT_SAME_DIMENSION");
298292

299-
if (range == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) {
293+
if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange)) {
300294
ToastToClientPacket packet = new ToastToClientPacket(Component.literal(title), preparedMessage);
301295
APNetworking.sendTo(packet, player);
302296
}

src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/PlayerDetectorPeripheral.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public final List<String> getPlayersInRange(int range) {
9797
for (ServerPlayer player : getPlayers()) {
9898
if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension)
9999
continue;
100-
if (range == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, range, MAX_RANGE))
100+
if (CoordUtil.isInRange(getPos(), getLevel(), player, range, MAX_RANGE))
101101
playersName.add(player.getName().getString());
102102
}
103103
return playersName;
@@ -142,7 +142,7 @@ public final boolean isPlayersInRange(int range) {
142142
for (ServerPlayer player : getPlayers()) {
143143
if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension)
144144
continue;
145-
if (range == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, range, MAX_RANGE)) return true;
145+
if (CoordUtil.isInRange(getPos(), getLevel(), player, range, MAX_RANGE)) return true;
146146
}
147147
return false;
148148
}
@@ -185,7 +185,7 @@ public final boolean isPlayerInRange(int range, String username) {
185185
for (Player player : getPlayers()) {
186186
if (!isAllowedMultiDimensional() && player.getLevel().dimension() != dimension)
187187
continue;
188-
if (range == -1 || CoordUtil.isInRange(getPos(), getLevel(), player, range, MAX_RANGE)) {
188+
if (CoordUtil.isInRange(getPos(), getLevel(), player, range, MAX_RANGE)) {
189189
if(player.getName().getString().equals(username))
190190
return true;
191191
}

src/main/java/de/srendi/advancedperipherals/common/util/CoordUtil.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,35 @@
1616

1717
public class CoordUtil {
1818

19+
/**
20+
* isInRange checks if the player is in the range
21+
*
22+
* @param pos the position to start check
23+
* @param world the world to start check
24+
* @param player the player going to be check
25+
* @param range the range that user want to reach, must be -1, 0, or a positive number
26+
* @param maxRange the maximum range the user can reach, must be -1, 0, or a positive number
27+
*
28+
* @return If the player is in the {@code range} as well as in the {@code maxRange}, or {@code range} and {@code maxRange} are -1
29+
*/
1930
public static boolean isInRange(@Nullable BlockPos pos, @Nullable Level world, @Nullable Player player, int range, int maxRange) {
2031
// There are rare cases where these are null. For example if a player detector pocket computer runs while not in a player inventory
2132
// Fixes https://github.com/SirEndii/AdvancedPeripherals/issues/356
22-
if (pos == null || world == null || player == null)
33+
if (pos == null || world == null || player == null) {
2334
return false;
35+
}
2436

25-
range = maxRange == -1 ? range : Math.min(Math.abs(range), maxRange);
37+
if (range == 0 || maxRange == 0) {
38+
return false;
39+
}
40+
if (range < 0) {
41+
if (maxRange < 0) {
42+
return true;
43+
}
44+
range = maxRange;
45+
} else if (maxRange > 0 && range > maxRange) {
46+
range = maxRange;
47+
}
2648
return isPlayerInBlockRange(pos, world, player, (double) range);
2749
}
2850

0 commit comments

Comments
 (0)