1212import org .bukkit .Chunk ;
1313import org .bukkit .Location ;
1414import org .bukkit .Material ;
15+ import org .bukkit .entity .Player ;
1516import org .bukkit .event .EventHandler ;
1617import org .bukkit .event .EventPriority ;
1718import org .bukkit .event .HandlerList ;
1819import org .bukkit .event .Listener ;
1920import org .bukkit .event .block .Action ;
21+ import org .bukkit .event .block .BlockCanBuildEvent ;
2022import org .bukkit .event .block .BlockPlaceEvent ;
2123import org .bukkit .event .player .PlayerInteractEvent ;
2224import 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 (),
0 commit comments