Skip to content

Commit 3ca8232

Browse files
committed
additionally listen to BlockCanBuildEvent in block-limits
1 parent 2755e55 commit 3ca8232

File tree

2 files changed

+104
-46
lines changed
  • AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/chunklimits
  • AnarchyExploitFixesLegacy/src/main/java/me/xginko/aef/modules/chunklimits

2 files changed

+104
-46
lines changed

AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/chunklimits/BlockLimit.java

Lines changed: 63 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212
import org.bukkit.Chunk;
1313
import org.bukkit.Location;
1414
import org.bukkit.Material;
15+
import org.bukkit.entity.Player;
1516
import org.bukkit.event.EventHandler;
1617
import org.bukkit.event.EventPriority;
1718
import org.bukkit.event.HandlerList;
1819
import org.bukkit.event.Listener;
1920
import org.bukkit.event.block.Action;
21+
import org.bukkit.event.block.BlockCanBuildEvent;
2022
import org.bukkit.event.block.BlockPlaceEvent;
2123
import org.bukkit.event.player.PlayerInteractEvent;
2224
import org.jetbrains.annotations.NotNull;
@@ -184,14 +186,71 @@ public void disable() {
184186
}
185187
}
186188

189+
private void sendPlayerNotification(Player player, Material block, int existing, int limit) {
190+
if (notifyPlayer) player.sendMessage(
191+
AnarchyExploitFixes.translation(player).chunklimits_block_limit_exceeded
192+
.replaceText(TextReplacementConfig.builder()
193+
.matchLiteral("%block%")
194+
.replacement(block.name())
195+
.build())
196+
.replaceText(TextReplacementConfig.builder()
197+
.matchLiteral("%existing%")
198+
.replacement(Integer.toString(existing))
199+
.build())
200+
.replaceText(TextReplacementConfig.builder()
201+
.matchLiteral("%limit%")
202+
.replacement(Integer.toString(limit))
203+
.build()));
204+
}
205+
206+
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
207+
private void onBlockCanBuild(BlockCanBuildEvent event) {
208+
if (event.getPlayer() == null) return;
209+
210+
if (!blockLimits.containsKey(event.getMaterial())) {
211+
return;
212+
}
213+
214+
if (AnarchyExploitFixes.permissions().permissionValue(event.getPlayer(), AEFPermission.BYPASS_CHUNK_LIMITS_BLOCK_LIMIT.node()).toBoolean()) {
215+
logger().debug("Ignoring {} for player '{}' because they have bypass permission: {}",
216+
event.getEventName(),
217+
event.getPlayer().getName(),
218+
AEFPermission.BYPASS_CHUNK_LIMITS_BLOCK_LIMIT.node());
219+
return;
220+
}
221+
222+
int materialCount = getMaterialCountForChunk(event.getBlock().getType(), event.getBlock().getChunk());
223+
int limit = blockLimits.get(event.getBlock().getType());
224+
225+
if (materialCount <= limit) {
226+
logger().debug("Allowing player '{}' to place {} at location {} => count={} limit={}",
227+
event.getPlayer().getName(),
228+
event.getMaterial(),
229+
LocationUtil.toString(event.getBlock().getLocation()),
230+
materialCount,
231+
limit);
232+
return;
233+
}
234+
235+
event.setBuildable(false);
236+
237+
sendPlayerNotification(event.getPlayer(), event.getMaterial(), materialCount, limit);
238+
logger().info("Preventing player '{}' from placing {} at location {} => count={} limit={}",
239+
event.getPlayer().getName(),
240+
event.getBlock().getType(),
241+
LocationUtil.toString(event.getBlock().getLocation()),
242+
materialCount,
243+
limit);
244+
}
245+
187246
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
188247
private void onBlockPlace(BlockPlaceEvent event) {
189248
if (!blockLimits.containsKey(event.getBlock().getType())) {
190249
return;
191250
}
192251

193252
if (AnarchyExploitFixes.permissions().permissionValue(event.getPlayer(), AEFPermission.BYPASS_CHUNK_LIMITS_BLOCK_LIMIT.node()).toBoolean()) {
194-
logger.debug("Ignoring {} for player '{}' because they have bypass permission: {}",
253+
logger().debug("Ignoring {} for player '{}' because they have bypass permission: {}",
195254
event.getEventName(),
196255
event.getPlayer().getName(),
197256
AEFPermission.BYPASS_CHUNK_LIMITS_BLOCK_LIMIT.node());
@@ -213,21 +272,7 @@ private void onBlockPlace(BlockPlaceEvent event) {
213272

214273
event.setCancelled(true);
215274

216-
if (notifyPlayer) event.getPlayer().sendMessage(
217-
AnarchyExploitFixes.translation(event.getPlayer()).chunklimits_block_limit_exceeded
218-
.replaceText(TextReplacementConfig.builder()
219-
.matchLiteral("%block%")
220-
.replacement(event.getBlock().getType().name())
221-
.build())
222-
.replaceText(TextReplacementConfig.builder()
223-
.matchLiteral("%existing%")
224-
.replacement(Integer.toString(materialCount))
225-
.build())
226-
.replaceText(TextReplacementConfig.builder()
227-
.matchLiteral("%limit%")
228-
.replacement(Integer.toString(limit))
229-
.build()));
230-
275+
sendPlayerNotification(event.getPlayer(), event.getBlock().getType(), materialCount, limit);
231276
logger().info("Preventing player '{}' from placing {} at location {} => count={} limit={}",
232277
event.getPlayer().getName(),
233278
event.getBlock().getType(),
@@ -246,7 +291,7 @@ private void onPlayerInteract(PlayerInteractEvent event) {
246291
}
247292

248293
if (AnarchyExploitFixes.permissions().permissionValue(event.getPlayer(), AEFPermission.BYPASS_CHUNK_LIMITS_BLOCK_LIMIT.node()).toBoolean()) {
249-
logger.debug("Ignoring {} for player '{}' because they have bypass permission: {}",
294+
logger().debug("Ignoring {} for player '{}' because they have bypass permission: {}",
250295
event.getEventName(),
251296
event.getPlayer().getName(),
252297
AEFPermission.BYPASS_CHUNK_LIMITS_BLOCK_LIMIT.node());
@@ -274,21 +319,7 @@ private void onPlayerInteract(PlayerInteractEvent event) {
274319

275320
event.setCancelled(true);
276321

277-
if (notifyPlayer) event.getPlayer().sendMessage(
278-
AnarchyExploitFixes.translation(event.getPlayer()).chunklimits_block_limit_exceeded
279-
.replaceText(TextReplacementConfig.builder()
280-
.matchLiteral("%block%")
281-
.replacement(event.getMaterial().name())
282-
.build())
283-
.replaceText(TextReplacementConfig.builder()
284-
.matchLiteral("%existing%")
285-
.replacement(Integer.toString(materialCount))
286-
.build())
287-
.replaceText(TextReplacementConfig.builder()
288-
.matchLiteral("%limit%")
289-
.replacement(Integer.toString(limit))
290-
.build()));
291-
322+
sendPlayerNotification(event.getPlayer(), event.getMaterial(), materialCount, limit);
292323
logger().info("Preventing player '{}' from placing {} at location {} => count={} limit={}",
293324
event.getPlayer().getName(),
294325
event.getMaterial(),

AnarchyExploitFixesLegacy/src/main/java/me/xginko/aef/modules/chunklimits/BlockLimit.java

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212
import org.bukkit.Chunk;
1313
import org.bukkit.Location;
1414
import org.bukkit.Material;
15+
import org.bukkit.entity.Player;
1516
import org.bukkit.event.EventHandler;
1617
import org.bukkit.event.EventPriority;
1718
import org.bukkit.event.HandlerList;
1819
import org.bukkit.event.Listener;
1920
import org.bukkit.event.block.Action;
21+
import org.bukkit.event.block.BlockCanBuildEvent;
2022
import org.bukkit.event.block.BlockPlaceEvent;
2123
import org.bukkit.event.player.PlayerInteractEvent;
2224
import org.jetbrains.annotations.NotNull;
@@ -184,14 +186,49 @@ public void disable() {
184186
}
185187
}
186188

189+
private void sendPlayerNotification(Player player, Material block, int existing, int limit) {
190+
if (notifyPlayer) player.sendMessage(
191+
AnarchyExploitFixes.translation(player.getLocale()).chunklimits_block_limit_exceeded
192+
.replace("%block%", block.name())
193+
.replace("%existing%", Integer.toString(existing))
194+
.replace("%limit%", Integer.toString(limit)));
195+
}
196+
197+
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
198+
private void onBlockCanBuild(BlockCanBuildEvent event) {
199+
if (!blockLimits.containsKey(event.getMaterial())) {
200+
return;
201+
}
202+
203+
int materialCount = getMaterialCountForChunk(event.getBlock().getType(), event.getBlock().getChunk());
204+
int limit = blockLimits.get(event.getBlock().getType());
205+
206+
if (materialCount <= limit) {
207+
logger().debug("Allowing UNKNOWN to place {} at location {} => count={} limit={}",
208+
event.getMaterial(),
209+
LocationUtil.toString(event.getBlock().getLocation()),
210+
materialCount,
211+
limit);
212+
return;
213+
}
214+
215+
event.setBuildable(false);
216+
217+
logger().info("Preventing UNKNOWN from placing {} at location {} => count={} limit={}",
218+
event.getBlock().getType(),
219+
LocationUtil.toString(event.getBlock().getLocation()),
220+
materialCount,
221+
limit);
222+
}
223+
187224
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
188225
private void onBlockPlace(BlockPlaceEvent event) {
189226
if (!blockLimits.containsKey(event.getBlock().getType())) {
190227
return;
191228
}
192229

193230
if (AnarchyExploitFixes.permissions().permissionValue(event.getPlayer(), AEFPermission.BYPASS_CHUNK_LIMITS_BLOCK_LIMIT.node()).toBoolean()) {
194-
logger.debug("Ignoring {} for player '{}' because they have bypass permission: {}",
231+
logger().debug("Ignoring {} for player '{}' because they have bypass permission: {}",
195232
event.getEventName(),
196233
event.getPlayer().getName(),
197234
AEFPermission.BYPASS_CHUNK_LIMITS_BLOCK_LIMIT.node());
@@ -213,12 +250,7 @@ private void onBlockPlace(BlockPlaceEvent event) {
213250

214251
event.setCancelled(true);
215252

216-
if (notifyPlayer) event.getPlayer().sendMessage(
217-
AnarchyExploitFixes.translation(event.getPlayer().getLocale()).chunklimits_block_limit_exceeded
218-
.replace("%block%", event.getBlock().getType().name())
219-
.replace("%existing%", Integer.toString(materialCount))
220-
.replace("%limit%", Integer.toString(limit)));
221-
253+
sendPlayerNotification(event.getPlayer(), event.getBlock().getType(), materialCount, limit);
222254
logger().info("Preventing player '{}' from placing {} at location {} => count={} limit={}",
223255
event.getPlayer().getName(),
224256
event.getBlock().getType(),
@@ -236,7 +268,7 @@ private void onPlayerInteract(PlayerInteractEvent event) {
236268
}
237269

238270
if (AnarchyExploitFixes.permissions().permissionValue(event.getPlayer(), AEFPermission.BYPASS_CHUNK_LIMITS_BLOCK_LIMIT.node()).toBoolean()) {
239-
logger.debug("Ignoring {} for player '{}' because they have bypass permission: {}",
271+
logger().debug("Ignoring {} for player '{}' because they have bypass permission: {}",
240272
event.getEventName(),
241273
event.getPlayer().getName(),
242274
AEFPermission.BYPASS_CHUNK_LIMITS_BLOCK_LIMIT.node());
@@ -259,12 +291,7 @@ private void onPlayerInteract(PlayerInteractEvent event) {
259291

260292
event.setCancelled(true);
261293

262-
if (notifyPlayer) event.getPlayer().sendMessage(
263-
AnarchyExploitFixes.translation(event.getPlayer().getLocale()).chunklimits_block_limit_exceeded
264-
.replace("%block%", event.getMaterial().name())
265-
.replace("%existing%", Integer.toString(materialCount))
266-
.replace("%limit%", Integer.toString(limit)));
267-
294+
sendPlayerNotification(event.getPlayer(), event.getMaterial(), materialCount, limit);
268295
logger().info("Preventing player '{}' from placing {} at location {} => count={} limit={}",
269296
event.getPlayer().getName(),
270297
event.getMaterial(),

0 commit comments

Comments
 (0)