2019-12-17 12:37:59 +00:00
|
|
|
package pw.kaboom.extras.modules.block;
|
2019-07-30 17:14:24 +00:00
|
|
|
|
2019-12-17 18:23:24 +00:00
|
|
|
import java.util.HashSet;
|
|
|
|
|
2019-07-30 17:14:24 +00:00
|
|
|
import org.bukkit.Bukkit;
|
|
|
|
import org.bukkit.Material;
|
|
|
|
import org.bukkit.block.BlockFace;
|
2019-09-28 00:29:48 +00:00
|
|
|
import org.bukkit.entity.EntityType;
|
2019-07-30 17:14:24 +00:00
|
|
|
import org.bukkit.event.EventHandler;
|
|
|
|
import org.bukkit.event.Listener;
|
2020-02-18 03:34:21 +00:00
|
|
|
import org.bukkit.event.block.BlockFadeEvent;
|
2019-12-03 04:53:37 +00:00
|
|
|
import org.bukkit.event.block.BlockFormEvent;
|
2019-07-30 17:14:24 +00:00
|
|
|
import org.bukkit.event.block.BlockFromToEvent;
|
2019-12-18 14:25:17 +00:00
|
|
|
import org.bukkit.event.block.BlockPhysicsEvent;
|
2019-07-30 17:14:24 +00:00
|
|
|
import org.bukkit.event.block.BlockRedstoneEvent;
|
2019-09-28 00:29:48 +00:00
|
|
|
import org.bukkit.event.entity.EntityChangeBlockEvent;
|
2019-07-30 17:14:24 +00:00
|
|
|
|
2019-12-03 04:53:37 +00:00
|
|
|
import com.destroystokyo.paper.event.block.BlockDestroyEvent;
|
|
|
|
|
2019-12-21 14:12:26 +00:00
|
|
|
public final class BlockPhysics implements Listener {
|
2020-02-18 03:34:21 +00:00
|
|
|
|
|
|
|
// This class contains code to prevent large areas of non-solid blocks
|
|
|
|
// from crashing the server
|
|
|
|
|
2019-12-17 18:23:24 +00:00
|
|
|
public static HashSet<BlockFace> blockFaces = new HashSet<BlockFace>();
|
|
|
|
|
2020-02-18 03:34:21 +00:00
|
|
|
@EventHandler
|
|
|
|
void onBlockDestroy(final BlockDestroyEvent event) {
|
|
|
|
try {
|
|
|
|
if (!event.getBlock().getType().isSolid()) {
|
|
|
|
for (BlockFace face : blockFaces) {
|
|
|
|
if (event.getBlock().getRelative(face).getType() != event.getBlock().getType()) {
|
|
|
|
return;
|
|
|
|
}
|
2020-02-18 05:11:15 +00:00
|
|
|
if (!event.getBlock().getType().equals(Material.AIR)) {
|
|
|
|
event.getBlock().setType(Material.AIR, false);
|
|
|
|
}
|
|
|
|
if (!event.isCancelled()) {
|
|
|
|
event.setCancelled(true);
|
|
|
|
}
|
2020-02-18 03:34:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
event.setCancelled(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-18 05:11:15 +00:00
|
|
|
@EventHandler
|
2020-02-18 03:34:21 +00:00
|
|
|
void onBlockFade(final BlockFadeEvent event) {
|
|
|
|
try {
|
2020-02-18 05:11:15 +00:00
|
|
|
if (event.getBlock().getType() == Material.FIRE) {
|
2020-02-18 03:34:21 +00:00
|
|
|
event.getBlock().setType(Material.AIR, false);
|
|
|
|
event.setCancelled(true);
|
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
|
|
|
event.setCancelled(true);
|
|
|
|
}
|
2020-02-18 05:11:15 +00:00
|
|
|
}
|
2020-02-18 03:34:21 +00:00
|
|
|
|
2019-07-30 17:14:24 +00:00
|
|
|
@EventHandler
|
2019-12-21 14:12:26 +00:00
|
|
|
void onBlockForm(final BlockFormEvent event) {
|
|
|
|
if (event.getBlock().getType() == Material.LAVA
|
|
|
|
|| event.getBlock().getType() == Material.WATER) {
|
2019-12-17 18:23:24 +00:00
|
|
|
for (BlockFace face : blockFaces) {
|
2019-12-21 14:12:26 +00:00
|
|
|
if (event.getBlock().getRelative(face).getType() != Material.LAVA
|
|
|
|
&& event.getBlock().getRelative(face).getType() != Material.WATER) {
|
2019-12-03 04:53:37 +00:00
|
|
|
return;
|
2019-09-28 00:29:48 +00:00
|
|
|
}
|
2019-12-03 04:53:37 +00:00
|
|
|
event.setCancelled(true);
|
2019-09-28 00:29:48 +00:00
|
|
|
}
|
|
|
|
}
|
2019-07-30 17:14:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@EventHandler
|
2019-12-21 14:12:26 +00:00
|
|
|
void onBlockFromTo(final BlockFromToEvent event) {
|
|
|
|
if (event.getBlock().getType() == Material.LAVA
|
|
|
|
|| event.getBlock().getType() == Material.WATER) {
|
2019-12-03 04:53:37 +00:00
|
|
|
boolean lavaFound = false;
|
|
|
|
boolean waterFound = false;
|
|
|
|
|
2019-12-17 18:23:24 +00:00
|
|
|
for (BlockFace face : blockFaces) {
|
2020-02-18 05:11:15 +00:00
|
|
|
if (event.getBlock().getRelative(face).getType() == Material.LAVA && !lavaFound) {
|
2019-12-03 04:53:37 +00:00
|
|
|
lavaFound = true;
|
2020-02-18 05:11:15 +00:00
|
|
|
} else if (event.getBlock().getRelative(face).getType() == Material.WATER && !waterFound) {
|
2019-12-03 04:53:37 +00:00
|
|
|
waterFound = true;
|
|
|
|
}
|
2020-02-18 05:11:15 +00:00
|
|
|
|
2019-12-03 04:53:37 +00:00
|
|
|
if (lavaFound && waterFound) {
|
|
|
|
event.setCancelled(true);
|
2020-02-18 05:11:15 +00:00
|
|
|
return;
|
2019-10-03 16:30:18 +00:00
|
|
|
}
|
|
|
|
}
|
2019-12-03 04:53:37 +00:00
|
|
|
}
|
|
|
|
}
|
2019-12-17 18:23:24 +00:00
|
|
|
|
2019-12-18 14:25:17 +00:00
|
|
|
@EventHandler
|
2019-12-21 14:12:26 +00:00
|
|
|
void onBlockPhysics(final BlockPhysicsEvent event) {
|
2020-02-18 03:34:21 +00:00
|
|
|
try {
|
|
|
|
switch (event.getChangedType()) {
|
|
|
|
case COMPARATOR:
|
|
|
|
case REDSTONE_TORCH:
|
|
|
|
case REDSTONE_WIRE:
|
|
|
|
case REPEATER:
|
|
|
|
/*for (BlockFace face : blockFaces) {
|
|
|
|
if (event.getBlock().getRelative(face).getType() != event.getChangedType()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
event.setCancelled(true);
|
|
|
|
}*/
|
2019-12-18 14:25:17 +00:00
|
|
|
event.setCancelled(true);
|
2020-02-18 03:34:21 +00:00
|
|
|
return;
|
2020-02-20 14:58:07 +00:00
|
|
|
case ACTIVATOR_RAIL:
|
|
|
|
case DETECTOR_RAIL:
|
|
|
|
case POWERED_RAIL:
|
|
|
|
case RAIL:
|
|
|
|
for (BlockFace face : blockFaces) {
|
|
|
|
if (event.getBlock().getRelative(face).getType() != event.getChangedType()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
event.getBlock().setType(Material.AIR, false);
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
case TNT:
|
|
|
|
for (BlockFace face : blockFaces) {
|
|
|
|
if (event.getBlock().getRelative(face).getType() != Material.REDSTONE_BLOCK
|
|
|
|
&& event.getBlock().getRelative(face).getType() != Material.REDSTONE_TORCH) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return;
|
2020-02-18 03:34:21 +00:00
|
|
|
default:
|
|
|
|
break;
|
2019-12-18 14:25:17 +00:00
|
|
|
}
|
2020-02-18 03:34:21 +00:00
|
|
|
|
|
|
|
if (!event.getBlock().getType().isSolid()) {
|
|
|
|
for (BlockFace face : blockFaces) {
|
2020-02-18 05:11:15 +00:00
|
|
|
event.getBlock().getRelative(face).getType();
|
2019-12-22 05:25:47 +00:00
|
|
|
}
|
|
|
|
}
|
2020-02-18 03:34:21 +00:00
|
|
|
} catch (Exception e) {
|
|
|
|
event.setCancelled(true);
|
2019-12-18 14:25:17 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-30 17:14:24 +00:00
|
|
|
@EventHandler
|
2019-12-21 14:12:26 +00:00
|
|
|
void onBlockRedstone(final BlockRedstoneEvent event) {
|
2019-07-30 17:14:24 +00:00
|
|
|
final double tps = Bukkit.getServer().getTPS()[0];
|
2019-12-21 14:12:26 +00:00
|
|
|
final int maxTps = 10;
|
2019-07-30 17:14:24 +00:00
|
|
|
|
2019-12-21 14:12:26 +00:00
|
|
|
if (tps < maxTps) {
|
2019-07-30 17:14:24 +00:00
|
|
|
event.setNewCurrent(0);
|
|
|
|
}
|
|
|
|
}
|
2019-12-17 18:23:24 +00:00
|
|
|
|
2019-12-21 14:12:26 +00:00
|
|
|
private int fallingBlockCount;
|
2019-12-17 18:23:24 +00:00
|
|
|
|
2019-09-28 00:29:48 +00:00
|
|
|
@EventHandler
|
2019-12-21 14:12:26 +00:00
|
|
|
void onEntityChangeBlock(final EntityChangeBlockEvent event) {
|
|
|
|
if (event.getEntityType() == EntityType.FALLING_BLOCK
|
|
|
|
&& event.getTo() == Material.AIR) {
|
2019-12-11 01:36:35 +00:00
|
|
|
fallingBlockCount++;
|
2019-09-28 00:29:48 +00:00
|
|
|
|
2019-12-21 14:12:26 +00:00
|
|
|
final int maxFallingBlockCount = 10;
|
|
|
|
|
|
|
|
if (fallingBlockCount == maxFallingBlockCount) {
|
2019-09-28 00:29:48 +00:00
|
|
|
event.setCancelled(true);
|
2019-12-11 01:36:35 +00:00
|
|
|
fallingBlockCount = 0;
|
2019-09-28 00:29:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-07-30 17:14:24 +00:00
|
|
|
}
|