From caee255688dea27229b5c2b7f08b9825881bb60c Mon Sep 17 00:00:00 2001 From: Realizedd Date: Tue, 5 Apr 2022 23:09:40 +0900 Subject: [PATCH] Separate lighting task --- .../arenaregen/nms/fallback/NMSHandler.java | 3 ++ .../de/arenaregen/util/BlockUtil.java | 25 ++++++++++ .../de/arenaregen/zone/ResetZone.java | 50 ++++++++++++++++--- arenaregen/src/main/resources/config.yml | 2 +- .../me/realized/de/arenaregen/nms/NMS.java | 2 + .../arenaregen/nms/v1_12_R1/NMSHandler.java | 24 ++------- .../arenaregen/nms/v1_14_R1/NMSHandler.java | 24 ++------- .../arenaregen/nms/v1_15_R1/NMSHandler.java | 24 ++------- .../arenaregen/nms/v1_16_R3/NMSHandler.java | 24 ++------- .../arenaregen/nms/v1_17_R1/NMSHandler.java | 24 ++------- .../arenaregen/nms/v1_18_R1/NMSHandler.java | 38 +++++--------- .../de/arenaregen/nms/v1_8_R3/NMSHandler.java | 24 ++------- .../nms/v1_8_R3_paper/NMSHandler.java | 25 +++------- 13 files changed, 123 insertions(+), 166 deletions(-) create mode 100644 arenaregen/src/main/java/me/realized/de/arenaregen/util/BlockUtil.java diff --git a/arenaregen/src/main/java/me/realized/de/arenaregen/nms/fallback/NMSHandler.java b/arenaregen/src/main/java/me/realized/de/arenaregen/nms/fallback/NMSHandler.java index a0f4233..19d9e6b 100644 --- a/arenaregen/src/main/java/me/realized/de/arenaregen/nms/fallback/NMSHandler.java +++ b/arenaregen/src/main/java/me/realized/de/arenaregen/nms/fallback/NMSHandler.java @@ -30,4 +30,7 @@ public void setBlockFast(final Block block, final Material material, final int d } catch (IllegalAccessException | InvocationTargetException ignored) {} } } + + @Override + public void updateLighting(Block bukkitBlock) {} } diff --git a/arenaregen/src/main/java/me/realized/de/arenaregen/util/BlockUtil.java b/arenaregen/src/main/java/me/realized/de/arenaregen/util/BlockUtil.java new file mode 100644 index 0000000..896508f --- /dev/null +++ b/arenaregen/src/main/java/me/realized/de/arenaregen/util/BlockUtil.java @@ -0,0 +1,25 @@ +package me.realized.de.arenaregen.util; + +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; + +public final class BlockUtil { + + public static boolean isSurrounded(final Block block) { + final Block east = block.getRelative(BlockFace.EAST); + final Block west = block.getRelative(BlockFace.WEST); + final Block south = block.getRelative(BlockFace.SOUTH); + final Block north = block.getRelative(BlockFace.NORTH); + final Block up = block.getRelative(BlockFace.UP); + final Block down = block.getRelative(BlockFace.DOWN); + return !east.getType().isTransparent() + && !west.getType().isTransparent() + && !up.getType().isTransparent() + && !down.getType().isTransparent() + && !south.getType().isTransparent() + && !north.getType().isTransparent(); + } + + private BlockUtil() {} + +} diff --git a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/ResetZone.java b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/ResetZone.java index 59b62f6..e80cd20 100644 --- a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/ResetZone.java +++ b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/ResetZone.java @@ -34,7 +34,9 @@ import me.realized.de.arenaregen.ArenaRegen; import me.realized.de.arenaregen.config.Config; import me.realized.de.arenaregen.nms.NMS; +import me.realized.de.arenaregen.nms.fallback.NMSHandler; import me.realized.de.arenaregen.util.BlockInfo; +import me.realized.de.arenaregen.util.BlockUtil; import me.realized.de.arenaregen.util.Callback; import me.realized.de.arenaregen.util.Pair; import me.realized.de.arenaregen.util.Position; @@ -292,7 +294,7 @@ public class IndexTask extends BukkitRunnable { private final Callback onDone; private final Queue> changed = new LinkedList<>(); - private int y = max.getBlockY(); + private int x = min.getBlockX(); public IndexTask(final Callback onDone) { this.onDone = onDone; @@ -300,13 +302,14 @@ public IndexTask(final Callback onDone) { @Override public void run() { - for (int x = min.getBlockX(); x <= max.getBlockX(); x++) { + for (int y = min.getBlockY(); y <= max.getBlockY(); y++) { for (int z = min.getBlockZ(); z <= max.getBlockZ(); z++) { final Block block = min.getWorld().getBlockAt(x, y, z); final Position position = new Position(block); final BlockInfo info = blocks.get(position); + chunks.add(new ChunkLoc(block.getChunk())); - + if (info == null) { // If no stored information is available (= air) but block is not air, set to air if (block.getType() != Material.AIR) { @@ -322,9 +325,9 @@ public void run() { } } - y--; + x++; - if (y < min.getBlockY()) { + if (x > max.getBlockX()) { cancel(); task = new ResetTask(onDone, changed); task.runTaskTimer(api, 1L, 1L); @@ -359,11 +362,46 @@ public void run() { } cancel(); - task = new ChunkRefreshTask(onDone); + + // Skip relighting if using fallback handler + task = handler instanceof NMSHandler ? new ChunkRefreshTask(onDone) : new RelightTask(onDone); task.runTaskTimer(api, 1L, 1L); } } + public class RelightTask extends BukkitRunnable { + + private final Callback onDone; + private int x = min.getBlockX(); + + public RelightTask(final Callback onDone) { + this.onDone = onDone; + } + + @Override + public void run() { + for (int y = min.getBlockY(); y <= max.getBlockY(); y++) { + for (int z = min.getBlockZ(); z <= max.getBlockZ(); z++) { + final Block block = min.getWorld().getBlockAt(x, y, z); + + if (block.getType() == Material.AIR || BlockUtil.isSurrounded(block)) { + continue; + } + + handler.updateLighting(block); + } + } + + x++; + + if (x > max.getBlockX()) { + cancel(); + task = new ChunkRefreshTask(onDone); + task.runTaskTimer(api, 1L, 1L); + } + } + } + public class ChunkRefreshTask extends BukkitRunnable { diff --git a/arenaregen/src/main/resources/config.yml b/arenaregen/src/main/resources/config.yml index c402a9c..926244c 100644 --- a/arenaregen/src/main/resources/config.yml +++ b/arenaregen/src/main/resources/config.yml @@ -3,7 +3,7 @@ selecting-tool: IRON_HOE # Blocks to reset per tick. -blocks-per-tick: 25 +blocks-per-tick: 1000 # Allow breaking blocks in the reset zone that is not placed by a player in match. # default: false diff --git a/nms/src/main/java/me/realized/de/arenaregen/nms/NMS.java b/nms/src/main/java/me/realized/de/arenaregen/nms/NMS.java index 5cb1aaa..19aece3 100644 --- a/nms/src/main/java/me/realized/de/arenaregen/nms/NMS.java +++ b/nms/src/main/java/me/realized/de/arenaregen/nms/NMS.java @@ -11,4 +11,6 @@ public interface NMS { void setBlockFast(final Block bukkitBlock, final Material material, final int data); + void updateLighting(final Block bukkitBlock); + } diff --git a/v1_12_R1/src/main/java/me/realized/de/arenaregen/nms/v1_12_R1/NMSHandler.java b/v1_12_R1/src/main/java/me/realized/de/arenaregen/nms/v1_12_R1/NMSHandler.java index eeacd24..3ca70fa 100644 --- a/v1_12_R1/src/main/java/me/realized/de/arenaregen/nms/v1_12_R1/NMSHandler.java +++ b/v1_12_R1/src/main/java/me/realized/de/arenaregen/nms/v1_12_R1/NMSHandler.java @@ -31,27 +31,13 @@ public void setBlockFast(final Block bukkitBlock, final Material material, final final net.minecraft.server.v1_12_R1.Block block = CraftMagicNumbers.getBlock(material); final IBlockData blockData = block.fromLegacyData(data); chunk.a(position, blockData); + } - if (bukkitBlock.getType() == Material.AIR || isSurrounded(bukkitBlock)) { - return; - } - + @Override + public void updateLighting(Block bukkitBlock) { + final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + final BlockPosition position = new BlockPosition(x, y, z); final World world = ((CraftWorld) bukkitBlock.getWorld()).getHandle(); world.c(EnumSkyBlock.BLOCK, position); } - - private boolean isSurrounded(final Block block) { - final Block east = block.getRelative(BlockFace.EAST); - final Block west = block.getRelative(BlockFace.WEST); - final Block south = block.getRelative(BlockFace.SOUTH); - final Block north = block.getRelative(BlockFace.NORTH); - final Block up = block.getRelative(BlockFace.UP); - final Block down = block.getRelative(BlockFace.DOWN); - return !east.getType().isTransparent() - && !west.getType().isTransparent() - && !up.getType().isTransparent() - && !down.getType().isTransparent() - && !south.getType().isTransparent() - && !north.getType().isTransparent(); - } } diff --git a/v1_14_R1/src/main/java/me/realized/de/arenaregen/nms/v1_14_R1/NMSHandler.java b/v1_14_R1/src/main/java/me/realized/de/arenaregen/nms/v1_14_R1/NMSHandler.java index e554729..1099018 100644 --- a/v1_14_R1/src/main/java/me/realized/de/arenaregen/nms/v1_14_R1/NMSHandler.java +++ b/v1_14_R1/src/main/java/me/realized/de/arenaregen/nms/v1_14_R1/NMSHandler.java @@ -30,27 +30,13 @@ public void setBlockFast(final Block bukkitBlock, final Material material, final final net.minecraft.server.v1_14_R1.Block block = CraftMagicNumbers.getBlock(material); final IBlockData blockData = block.getBlockData(); chunk.setType(position, blockData, true); + } - if (bukkitBlock.getType() == Material.AIR || isSurrounded(bukkitBlock)) { - return; - } - + @Override + public void updateLighting(Block bukkitBlock) { + final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + final BlockPosition position = new BlockPosition(x, y, z); final World world = ((CraftWorld) bukkitBlock.getWorld()).getHandle(); world.getChunkProvider().getLightEngine().a(position); } - - private boolean isSurrounded(final Block block) { - final Block east = block.getRelative(BlockFace.EAST); - final Block west = block.getRelative(BlockFace.WEST); - final Block south = block.getRelative(BlockFace.SOUTH); - final Block north = block.getRelative(BlockFace.NORTH); - final Block up = block.getRelative(BlockFace.UP); - final Block down = block.getRelative(BlockFace.DOWN); - return !east.getType().isTransparent() - && !west.getType().isTransparent() - && !up.getType().isTransparent() - && !down.getType().isTransparent() - && !south.getType().isTransparent() - && !north.getType().isTransparent(); - } } diff --git a/v1_15_R1/src/main/java/me/realized/de/arenaregen/nms/v1_15_R1/NMSHandler.java b/v1_15_R1/src/main/java/me/realized/de/arenaregen/nms/v1_15_R1/NMSHandler.java index e2482b3..aad172c 100644 --- a/v1_15_R1/src/main/java/me/realized/de/arenaregen/nms/v1_15_R1/NMSHandler.java +++ b/v1_15_R1/src/main/java/me/realized/de/arenaregen/nms/v1_15_R1/NMSHandler.java @@ -30,27 +30,13 @@ public void setBlockFast(final Block bukkitBlock, final Material material, final final net.minecraft.server.v1_15_R1.Block block = CraftMagicNumbers.getBlock(material); final IBlockData blockData = block.getBlockData(); chunk.setType(position, blockData, true); + } - if (bukkitBlock.getType() == Material.AIR || isSurrounded(bukkitBlock)) { - return; - } - + @Override + public void updateLighting(Block bukkitBlock) { + final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + final BlockPosition position = new BlockPosition(x, y, z); final World world = ((CraftWorld) bukkitBlock.getWorld()).getHandle(); world.getChunkProvider().getLightEngine().a(position); } - - private boolean isSurrounded(final Block block) { - final Block east = block.getRelative(BlockFace.EAST); - final Block west = block.getRelative(BlockFace.WEST); - final Block south = block.getRelative(BlockFace.SOUTH); - final Block north = block.getRelative(BlockFace.NORTH); - final Block up = block.getRelative(BlockFace.UP); - final Block down = block.getRelative(BlockFace.DOWN); - return !east.getType().isTransparent() - && !west.getType().isTransparent() - && !up.getType().isTransparent() - && !down.getType().isTransparent() - && !south.getType().isTransparent() - && !north.getType().isTransparent(); - } } diff --git a/v1_16_R3/src/main/java/me/realized/de/arenaregen/nms/v1_16_R3/NMSHandler.java b/v1_16_R3/src/main/java/me/realized/de/arenaregen/nms/v1_16_R3/NMSHandler.java index d2b0ea3..864d562 100644 --- a/v1_16_R3/src/main/java/me/realized/de/arenaregen/nms/v1_16_R3/NMSHandler.java +++ b/v1_16_R3/src/main/java/me/realized/de/arenaregen/nms/v1_16_R3/NMSHandler.java @@ -30,27 +30,13 @@ public void setBlockFast(final Block bukkitBlock, final Material material, final final net.minecraft.server.v1_16_R3.Block block = CraftMagicNumbers.getBlock(material); final IBlockData blockData = block.getBlockData(); chunk.setType(position, blockData, true); + } - if (bukkitBlock.getType() == Material.AIR || isSurrounded(bukkitBlock)) { - return; - } - + @Override + public void updateLighting(Block bukkitBlock) { + final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + final BlockPosition position = new BlockPosition(x, y, z); final World world = ((CraftWorld) bukkitBlock.getWorld()).getHandle(); world.getChunkProvider().getLightEngine().a(position); } - - private boolean isSurrounded(final Block block) { - final Block east = block.getRelative(BlockFace.EAST); - final Block west = block.getRelative(BlockFace.WEST); - final Block south = block.getRelative(BlockFace.SOUTH); - final Block north = block.getRelative(BlockFace.NORTH); - final Block up = block.getRelative(BlockFace.UP); - final Block down = block.getRelative(BlockFace.DOWN); - return !east.getType().isTransparent() - && !west.getType().isTransparent() - && !up.getType().isTransparent() - && !down.getType().isTransparent() - && !south.getType().isTransparent() - && !north.getType().isTransparent(); - } } diff --git a/v1_17_R1/src/main/java/me/realized/de/arenaregen/nms/v1_17_R1/NMSHandler.java b/v1_17_R1/src/main/java/me/realized/de/arenaregen/nms/v1_17_R1/NMSHandler.java index 6cd72f7..b2bcb2e 100644 --- a/v1_17_R1/src/main/java/me/realized/de/arenaregen/nms/v1_17_R1/NMSHandler.java +++ b/v1_17_R1/src/main/java/me/realized/de/arenaregen/nms/v1_17_R1/NMSHandler.java @@ -30,27 +30,13 @@ public void setBlockFast(final Block bukkitBlock, final Material material, final final net.minecraft.world.level.block.Block block = CraftMagicNumbers.getBlock(material); final IBlockData blockData = block.getBlockData(); chunk.setType(position, blockData, true); + } - if (bukkitBlock.getType() == Material.AIR || isSurrounded(bukkitBlock)) { - return; - } - + @Override + public void updateLighting(Block bukkitBlock) { + final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + final BlockPosition position = new BlockPosition(x, y, z); final World world = ((CraftWorld) bukkitBlock.getWorld()).getHandle(); world.getChunkProvider().getLightEngine().a(position); } - - private boolean isSurrounded(final Block block) { - final Block east = block.getRelative(BlockFace.EAST); - final Block west = block.getRelative(BlockFace.WEST); - final Block south = block.getRelative(BlockFace.SOUTH); - final Block north = block.getRelative(BlockFace.NORTH); - final Block up = block.getRelative(BlockFace.UP); - final Block down = block.getRelative(BlockFace.DOWN); - return !east.getType().isTransparent() - && !west.getType().isTransparent() - && !up.getType().isTransparent() - && !down.getType().isTransparent() - && !south.getType().isTransparent() - && !north.getType().isTransparent(); - } } diff --git a/v1_18_R1/src/main/java/me/realized/de/arenaregen/nms/v1_18_R1/NMSHandler.java b/v1_18_R1/src/main/java/me/realized/de/arenaregen/nms/v1_18_R1/NMSHandler.java index 0d89a0f..6e7263d 100644 --- a/v1_18_R1/src/main/java/me/realized/de/arenaregen/nms/v1_18_R1/NMSHandler.java +++ b/v1_18_R1/src/main/java/me/realized/de/arenaregen/nms/v1_18_R1/NMSHandler.java @@ -1,20 +1,20 @@ package me.realized.de.arenaregen.nms.v1_18_R1; -import me.realized.de.arenaregen.nms.NMS; -import net.minecraft.core.BlockPosition; -import net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket; -import net.minecraft.world.level.World; -import net.minecraft.world.level.block.state.IBlockData; -import net.minecraft.world.level.chunk.Chunk; +import org.bukkit.Chunk; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.craftbukkit.v1_18_R1.CraftChunk; import org.bukkit.craftbukkit.v1_18_R1.CraftWorld; import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_18_R1.util.CraftMagicNumbers; import org.bukkit.entity.Player; +import me.realized.de.arenaregen.nms.NMS; +import net.minecraft.core.BlockPosition; +import net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket; +import net.minecraft.world.level.block.state.IBlockData; + public class NMSHandler implements NMS { @Override @@ -31,27 +31,13 @@ public void setBlockFast(final Block bukkitBlock, final Material material, final final net.minecraft.world.level.block.Block block = CraftMagicNumbers.getBlock(material); final IBlockData blockData = block.n(); chunk.a(position, blockData, true); + } - if (bukkitBlock.getType() == Material.AIR || isSurrounded(bukkitBlock)) { - return; - } - + @Override + public void updateLighting(Block bukkitBlock) { + final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + final BlockPosition position = new BlockPosition(x, y, z); final World world = ((CraftWorld) bukkitBlock.getWorld()).getHandle(); world.L().m().a(position); } - - private boolean isSurrounded(final Block block) { - final Block east = block.getRelative(BlockFace.EAST); - final Block west = block.getRelative(BlockFace.WEST); - final Block south = block.getRelative(BlockFace.SOUTH); - final Block north = block.getRelative(BlockFace.NORTH); - final Block up = block.getRelative(BlockFace.UP); - final Block down = block.getRelative(BlockFace.DOWN); - return !east.getType().isTransparent() - && !west.getType().isTransparent() - && !up.getType().isTransparent() - && !down.getType().isTransparent() - && !south.getType().isTransparent() - && !north.getType().isTransparent(); - } } diff --git a/v1_8_R3/src/main/java/me/realized/de/arenaregen/nms/v1_8_R3/NMSHandler.java b/v1_8_R3/src/main/java/me/realized/de/arenaregen/nms/v1_8_R3/NMSHandler.java index 10ac9fd..fb0b804 100644 --- a/v1_8_R3/src/main/java/me/realized/de/arenaregen/nms/v1_8_R3/NMSHandler.java +++ b/v1_8_R3/src/main/java/me/realized/de/arenaregen/nms/v1_8_R3/NMSHandler.java @@ -31,27 +31,13 @@ public void setBlockFast(final Block bukkitBlock, final Material material, final final net.minecraft.server.v1_8_R3.Block block = CraftMagicNumbers.getBlock(material); final IBlockData blockData = block.fromLegacyData(data); chunk.a(position, blockData); + } - if (bukkitBlock.getType() == Material.AIR || isSurrounded(bukkitBlock)) { - return; - } - + @Override + public void updateLighting(Block bukkitBlock) { final World world = ((CraftWorld) bukkitBlock.getWorld()).getHandle(); + final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + final BlockPosition position = new BlockPosition(x, y, z); world.c(EnumSkyBlock.BLOCK, position); } - - private boolean isSurrounded(final Block block) { - final Block east = block.getRelative(BlockFace.EAST); - final Block west = block.getRelative(BlockFace.WEST); - final Block south = block.getRelative(BlockFace.SOUTH); - final Block north = block.getRelative(BlockFace.NORTH); - final Block up = block.getRelative(BlockFace.UP); - final Block down = block.getRelative(BlockFace.DOWN); - return !east.getType().isTransparent() - && !west.getType().isTransparent() - && !up.getType().isTransparent() - && !down.getType().isTransparent() - && !south.getType().isTransparent() - && !north.getType().isTransparent(); - } } diff --git a/v1_8_R3_paper/src/main/java/me/realized/de/arenaregen/nms/v1_8_R3_paper/NMSHandler.java b/v1_8_R3_paper/src/main/java/me/realized/de/arenaregen/nms/v1_8_R3_paper/NMSHandler.java index 1df7c2a..9219ef2 100644 --- a/v1_8_R3_paper/src/main/java/me/realized/de/arenaregen/nms/v1_8_R3_paper/NMSHandler.java +++ b/v1_8_R3_paper/src/main/java/me/realized/de/arenaregen/nms/v1_8_R3_paper/NMSHandler.java @@ -31,27 +31,14 @@ public void setBlockFast(final Block bukkitBlock, final Material material, final final net.minecraft.server.v1_8_R3.Block block = CraftMagicNumbers.getBlock(material); final IBlockData blockData = block.fromLegacyData(data); chunk.a(position, blockData); + } - if (bukkitBlock.getType() == Material.AIR || isSurrounded(bukkitBlock)) { - return; - } - + @Override + public void updateLighting(Block bukkitBlock) { + final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + final BlockPosition position = new BlockPosition(x, y, z); final World world = ((CraftWorld) bukkitBlock.getWorld()).getHandle(); world.updateLight(EnumSkyBlock.BLOCK, position); - } - - private boolean isSurrounded(final Block block) { - final Block east = block.getRelative(BlockFace.EAST); - final Block west = block.getRelative(BlockFace.WEST); - final Block south = block.getRelative(BlockFace.SOUTH); - final Block north = block.getRelative(BlockFace.NORTH); - final Block up = block.getRelative(BlockFace.UP); - final Block down = block.getRelative(BlockFace.DOWN); - return !east.getType().isTransparent() - && !west.getType().isTransparent() - && !up.getType().isTransparent() - && !down.getType().isTransparent() - && !south.getType().isTransparent() - && !north.getType().isTransparent(); + } }