From 63d53e79b7b481e42c4b3007d77b7b1b665fe704 Mon Sep 17 00:00:00 2001 From: Realized Date: Sat, 31 Dec 2022 22:25:20 +0900 Subject: [PATCH] Attempted fix for excessive memory use by reset zones --- arenaregen/build.gradle | 2 + .../me/realized/de/arenaregen/ArenaRegen.java | 9 ++ .../command/commands/ResetCommand.java | 4 +- .../arenaregen/nms/fallback/NMSHandler.java | 6 +- .../me/realized/de/arenaregen/zone/Zone.java | 144 +++++++++--------- .../de/arenaregen/zone/ZoneListener.java | 25 ++- .../de/arenaregen/zone/ZoneManager.java | 14 +- .../zone/task/tasks/ChunkRefreshTask.java | 6 +- .../zone/task/tasks/FilterBlocksTask.java | 66 ++++++++ .../zone/task/tasks/RelightBlocksTask.java | 15 +- .../zone/task/tasks/ResetBlocksTask.java | 18 +-- .../zone/task/tasks/ScanBlocksTask.java | 15 +- arenaregen/src/main/resources/lang.yml | 2 +- build.gradle | 2 +- .../me/realized/de/arenaregen/nms/NMS.java | 6 +- settings.gradle | 1 + .../arenaregen/nms/v1_12_R1/NMSHandler.java | 14 +- .../arenaregen/nms/v1_14_R1/NMSHandler.java | 14 +- .../arenaregen/nms/v1_15_R1/NMSHandler.java | 14 +- .../arenaregen/nms/v1_16_R3/NMSHandler.java | 14 +- .../arenaregen/nms/v1_17_R1/NMSHandler.java | 14 +- .../arenaregen/nms/v1_18_R1/NMSHandler.java | 13 +- .../arenaregen/nms/v1_18_R2/NMSHandler.java | 13 +- v1_19_R1/build.gradle | 4 + .../arenaregen/nms/v1_19_R1/NMSHandler.java | 39 +++++ .../de/arenaregen/nms/v1_8_R3/NMSHandler.java | 14 +- .../nms/v1_8_R3_paper/NMSHandler.java | 15 +- 27 files changed, 294 insertions(+), 209 deletions(-) create mode 100644 arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/FilterBlocksTask.java create mode 100644 v1_19_R1/build.gradle create mode 100644 v1_19_R1/src/main/java/me/realized/de/arenaregen/nms/v1_19_R1/NMSHandler.java diff --git a/arenaregen/build.gradle b/arenaregen/build.gradle index 1ab32d3..ff374ac 100644 --- a/arenaregen/build.gradle +++ b/arenaregen/build.gradle @@ -28,6 +28,7 @@ dependencies { implementation project(':v1_17_R1') implementation project(':v1_18_R1') implementation project(':v1_18_R2') + implementation project(':v1_19_R1') } shadowJar { @@ -47,6 +48,7 @@ shadowJar { include(dependency(':v1_17_R1')) include(dependency(':v1_18_R1')) include(dependency(':v1_18_R2')) + include(dependency(':v1_19_R1')) } } diff --git a/arenaregen/src/main/java/me/realized/de/arenaregen/ArenaRegen.java b/arenaregen/src/main/java/me/realized/de/arenaregen/ArenaRegen.java index 603df14..b412564 100644 --- a/arenaregen/src/main/java/me/realized/de/arenaregen/ArenaRegen.java +++ b/arenaregen/src/main/java/me/realized/de/arenaregen/ArenaRegen.java @@ -28,6 +28,11 @@ public class ArenaRegen extends DuelsExtension { @Override public void onEnable() { this.configuration = new Config(this); + + if (configuration.isTrackBlockChanges() && configuration.isAllowArenaBlockBreak()) { + warn("The config options 'track-block-changes' and 'allow-arena-block-break' are incompatible with each other."); + } + this.lang = new Lang(this); this.handler = findHandler(); @@ -82,6 +87,10 @@ public void info(final String s) { api.info("[" + getName() + " Extension] " + s); } + public void warn(final String s) { + api.warn("[" + getName() + " Extension] " + s); + } + public void error(final String s) { api.error("[" + getName() + " Extension] " + s); } diff --git a/arenaregen/src/main/java/me/realized/de/arenaregen/command/commands/ResetCommand.java b/arenaregen/src/main/java/me/realized/de/arenaregen/command/commands/ResetCommand.java index f66dbb5..9390715 100644 --- a/arenaregen/src/main/java/me/realized/de/arenaregen/command/commands/ResetCommand.java +++ b/arenaregen/src/main/java/me/realized/de/arenaregen/command/commands/ResetCommand.java @@ -32,8 +32,6 @@ public void execute(final CommandSender sender, final String label, final String } lang.sendMessage(sender, "COMMAND.arenaregen.reset.start", "name", name); - zone.reset(() -> { - lang.sendMessage(sender, "COMMAND.arenaregen.reset.end", "name", name); - }, true); + zone.reset(() -> lang.sendMessage(sender, "COMMAND.arenaregen.reset.end", "name", name)); } } 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 19d9e6b..9909ffa 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 @@ -6,6 +6,7 @@ import me.realized.de.arenaregen.util.ReflectionUtil; import org.bukkit.Chunk; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.entity.Player; @@ -21,7 +22,8 @@ public NMSHandler() { public void sendChunkUpdate(final Player player, final Chunk chunk) {} @Override - public void setBlockFast(final Block block, final Material material, final int data) { + public void setBlockFast(final World world, final int x, final int y, final int z, final int data, final Material material) { + final Block block = world.getBlockAt(x, y, z); block.setType(material); if (SET_DATA != null) { @@ -32,5 +34,5 @@ public void setBlockFast(final Block block, final Material material, final int d } @Override - public void updateLighting(Block bukkitBlock) {} + public void updateLighting(final World world, final int x, final int y, final int z) {} } diff --git a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/Zone.java b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/Zone.java index 00b698f..6040292 100644 --- a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/Zone.java +++ b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/Zone.java @@ -10,23 +10,9 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Queue; import java.util.Set; - -import org.bukkit.Bukkit; -import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Entity; - import lombok.Getter; import me.realized.de.arenaregen.ArenaRegen; import me.realized.de.arenaregen.config.Config; @@ -35,13 +21,22 @@ import me.realized.de.arenaregen.util.BlockUtil; import me.realized.de.arenaregen.util.Callback; import me.realized.de.arenaregen.util.ChunkLoc; -import me.realized.de.arenaregen.util.Pair; import me.realized.de.arenaregen.util.Position; import me.realized.de.arenaregen.zone.task.Task; -import me.realized.de.arenaregen.zone.task.tasks.ResetBlocksTask; +import me.realized.de.arenaregen.zone.task.tasks.FilterBlocksTask; import me.realized.de.arenaregen.zone.task.tasks.ScanBlocksTask; import me.realized.duels.api.Duels; import me.realized.duels.api.arena.Arena; +import org.bukkit.Bukkit; +import org.bukkit.Chunk; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Entity; public class Zone { @@ -57,13 +52,14 @@ public class Zone { @Getter private Location min, max; + @Getter private File file; @Getter private Task task; @Getter - private final Map blocks = new HashMap<>(); + private volatile Map blocks = new HashMap<>(); @Getter private final Set chunks = new HashSet<>(); @@ -71,8 +67,7 @@ public class Zone { @Getter private final List spawnedEntities = new ArrayList<>(); - private Set changedBlocks = new HashSet<>(); - private Queue> changes = new LinkedList<>(); + private Set changedBlocks = new HashSet<>(); Zone(final ArenaRegen extension, final Duels api, final Arena arena, final File folder, final Location first, final Location second) { this.api = api; @@ -94,6 +89,9 @@ public class Zone { Math.max(first.getBlockZ(), second.getBlockZ()) ); + + final Map blocks = new HashMap<>(); + BlockUtil.runForCuboid(min, max, block -> { // Only store non-air blocks if (block.getType() == Material.AIR) { @@ -102,7 +100,11 @@ public class Zone { blocks.put(new Position(block), new BlockInfo(block.getState())); }); - + + if (!config.isTrackBlockChanges()) { + this.blocks = blocks; + } + try (final BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { writer.write(min.getWorld().getName()); writer.newLine(); @@ -176,7 +178,7 @@ public class Zone { this.file = file = newFile; } - + try (BufferedReader reader = new BufferedReader(new FileReader(file))) { String worldName = reader.readLine(); final World world; @@ -187,6 +189,23 @@ public class Zone { this.min = new Location(world, Integer.parseInt(reader.readLine()), Integer.parseInt(reader.readLine()), Integer.parseInt(reader.readLine())); this.max = new Location(world, Integer.parseInt(reader.readLine()), Integer.parseInt(reader.readLine()), Integer.parseInt(reader.readLine())); + } + + if (!config.isTrackBlockChanges()) { + this.blocks = loadBlocks(); + } + + loadChunks(); + } + + private Map loadBlocks() throws IOException { + final Map blocks = new HashMap<>(); + + try (final BufferedReader reader = new BufferedReader(new FileReader(file))) { + // Skip 7 lines to get to blocks section + for (int i = 0; i < 7; i++) { + reader.readLine(); + } String block; @@ -196,11 +215,11 @@ public class Zone { final Position pos = new Position(Integer.parseInt(posData[0]), Integer.parseInt(posData[1]), Integer.parseInt(posData[2])); final String[] blockData = data[1].split(";"); final BlockInfo info = new BlockInfo(Material.getMaterial(blockData[0]), Byte.parseByte(blockData[1])); - this.blocks.put(pos, info); + blocks.put(pos, info); } } - loadChunks(); + return blocks; } private void loadChunks() { @@ -219,8 +238,11 @@ public int getTotalBlocks() { return blocks.size(); } + public World getWorld() { + return min.getWorld(); + } + void delete() { - blocks.clear(); file.delete(); } @@ -229,14 +251,16 @@ public boolean isResetting() { } // Called before reset zones are saved to files. - public void resetInstant() { + public void resetInstant() throws IOException { + final Map blocks = loadBlocks(); + BlockUtil.runForCuboid(min, max, block -> { - final Position position = new Position(block); - final BlockInfo info = blocks.get(position); + final Position pos = new Position(block); + final BlockInfo info = blocks.get(pos); if (info == null) { if (block.getType() != Material.AIR) { - handler.setBlockFast(block, Material.AIR, 0); + handler.setBlockFast(getWorld(), pos.getX(), pos.getY(), pos.getZ(), 0, Material.AIR); } return; @@ -244,12 +268,12 @@ public void resetInstant() { return; } - handler.setBlockFast(block, info.getType(), info.getData()); - handler.updateLighting(block); + handler.setBlockFast(getWorld(), pos.getX(), pos.getY(), pos.getZ(), info.getData(), info.getType()); + handler.updateLighting(getWorld(), pos.getX(), pos.getY(), pos.getZ()); }); } - public void startTask(final Task task) { + public void startSyncTaskTimer(final Task task) { this.task = task; if (task != null) { @@ -257,25 +281,24 @@ public void startTask(final Task task) { } } - public void reset(final Callback onDone, final boolean hard) { - arena.setDisabled(true); - - if (hard) { - startTask(new ScanBlocksTask(extension, this, onDone)); - return; - } + public void startAsyncTask(final Task task) { + this.task = task; - if (config.isTrackBlockChanges()) { - startTask(new ResetBlocksTask(extension, this, onDone, this.changes)); - this.changedBlocks = new HashSet<>(); - this.changes = new LinkedList<>(); - } else { - startTask(new ScanBlocksTask(extension, this, onDone)); + if (task != null) { + task.runTaskAsynchronously(api); } } public void reset(final Callback onDone) { - reset(onDone, false); + arena.setDisabled(true); + + if (!config.isTrackBlockChanges()) { + startSyncTaskTimer(new ScanBlocksTask(extension, this, onDone)); + return; + } + + startAsyncTask(new FilterBlocksTask(extension, this, onDone, this.changedBlocks)); + this.changedBlocks = new HashSet<>(); } public void reset() { @@ -293,38 +316,19 @@ public boolean contains(final Block block) { return contains(block.getLocation()); } - boolean isCached(final Block block) { - return contains(block) && blocks.containsKey(new Position(block)); + public boolean contains(final Chunk chunk) { + return chunks.contains(new ChunkLoc(chunk)); } - boolean isCached(final Chunk chunk) { - return chunks.contains(new ChunkLoc(chunk)); + public boolean isCached(final Block block) { + return contains(block) && blocks.containsKey(new Position(block)); } public void track(final Block block) { - if (changedBlocks.contains(block)) { - return; - } - - final Position position = new Position(block); - final BlockInfo info = blocks.get(position); - - if (info == null) { - if (block.getType() != Material.AIR) { - changes.add(new Pair<>(block, new BlockInfo())); - changedBlocks.add(block); - } - - return; - } else if (info.matches(block)) { - return; - } - - changes.add(new Pair<>(block, info)); - changedBlocks.add(block); + changedBlocks.add(new Position(block)); } public void track(final Collection blocks) { - blocks.forEach(block -> track(block)); + blocks.forEach(this::track); } } diff --git a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/ZoneListener.java b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/ZoneListener.java index 602fc2f..c26839e 100644 --- a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/ZoneListener.java +++ b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/ZoneListener.java @@ -1,5 +1,12 @@ package me.realized.de.arenaregen.zone; +import me.realized.de.arenaregen.ArenaRegen; +import me.realized.de.arenaregen.config.Config; +import me.realized.de.arenaregen.config.Lang; +import me.realized.de.arenaregen.util.CompatUtil; +import me.realized.duels.api.arena.Arena; +import me.realized.duels.api.event.arena.ArenaRemoveEvent; +import me.realized.duels.api.event.match.MatchEndEvent; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Entity; @@ -15,22 +22,14 @@ import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.block.BlockGrowEvent; import org.bukkit.event.block.BlockIgniteEvent; +import org.bukkit.event.block.BlockIgniteEvent.IgniteCause; import org.bukkit.event.block.BlockPhysicsEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.LeavesDecayEvent; -import org.bukkit.event.block.BlockIgniteEvent.IgniteCause; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.event.world.ChunkUnloadEvent; -import me.realized.de.arenaregen.ArenaRegen; -import me.realized.de.arenaregen.config.Config; -import me.realized.de.arenaregen.config.Lang; -import me.realized.de.arenaregen.util.CompatUtil; -import me.realized.duels.api.arena.Arena; -import me.realized.duels.api.event.arena.ArenaRemoveEvent; -import me.realized.duels.api.event.match.MatchEndEvent; - public class ZoneListener implements Listener { private final Config config; @@ -45,7 +44,7 @@ public ZoneListener(final ArenaRegen extension, final ZoneManager zoneManager) { @EventHandler(priority = EventPriority.LOWEST) public void on(final ChunkUnloadEvent event) { - if (!CompatUtil.isPaper() && zoneManager.getZones().stream().anyMatch(zone -> zone.isResetting() && zone.isCached(event.getChunk()))) { + if (!CompatUtil.isPaper() && zoneManager.getZones().stream().anyMatch(zone -> zone.isResetting() && zone.contains(event.getChunk()))) { event.setCancelled(true); } } @@ -149,7 +148,7 @@ public void on(final BlockFadeEvent event) { zone.track(block); } - if (!config.isPreventBlockMelt() || !zone.isCached(block)) { + if (!config.isPreventBlockMelt()) { return; } @@ -175,7 +174,7 @@ public void on(final BlockBurnEvent event) { zone.track(block); } - if (!config.isPreventBlockBurn() || !zone.isCached(block)) { + if (!config.isPreventBlockBurn()) { return; } @@ -237,7 +236,7 @@ public void on(final BlockIgniteEvent event) { zone.track(block); } - if (!config.isPreventFireSpread() || event.getCause() != IgniteCause.SPREAD || !zone.isCached(block)) { + if (!config.isPreventFireSpread() || event.getCause() != IgniteCause.SPREAD) { return; } diff --git a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/ZoneManager.java b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/ZoneManager.java index 43dc080..e5d0e92 100644 --- a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/ZoneManager.java +++ b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/ZoneManager.java @@ -4,15 +4,13 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; - -import org.bukkit.block.Block; -import org.bukkit.entity.Player; - import me.realized.de.arenaregen.ArenaRegen; import me.realized.de.arenaregen.selection.Selection; import me.realized.duels.api.Duels; import me.realized.duels.api.arena.Arena; import me.realized.duels.api.arena.ArenaManager; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; public class ZoneManager { @@ -62,8 +60,12 @@ public void handleDisable() { if (zone.isResetting()) { zone.getTask().cancel(); } - - zone.resetInstant(); + + try { + zone.resetInstant(); + } catch (Exception ex) { + extension.error("Could not reset zone '" + zone.getName() + "'!", ex); + } }); } diff --git a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/ChunkRefreshTask.java b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/ChunkRefreshTask.java index 1888275..f1adca7 100644 --- a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/ChunkRefreshTask.java +++ b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/ChunkRefreshTask.java @@ -2,14 +2,12 @@ import java.util.LinkedList; import java.util.Queue; - -import org.bukkit.Chunk; - import me.realized.de.arenaregen.ArenaRegen; import me.realized.de.arenaregen.util.Callback; import me.realized.de.arenaregen.util.ChunkLoc; import me.realized.de.arenaregen.zone.Zone; import me.realized.de.arenaregen.zone.task.Task; +import org.bukkit.Chunk; public class ChunkRefreshTask extends Task { @@ -26,7 +24,7 @@ public void run() { if (current == null) { cancel(); - zone.startTask(null); + zone.startSyncTaskTimer(null); zone.getArena().setDisabled(false); if (onDone != null) { diff --git a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/FilterBlocksTask.java b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/FilterBlocksTask.java new file mode 100644 index 0000000..f781527 --- /dev/null +++ b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/FilterBlocksTask.java @@ -0,0 +1,66 @@ +package me.realized.de.arenaregen.zone.task.tasks; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Queue; +import java.util.Set; +import me.realized.de.arenaregen.ArenaRegen; +import me.realized.de.arenaregen.util.BlockInfo; +import me.realized.de.arenaregen.util.Callback; +import me.realized.de.arenaregen.util.Pair; +import me.realized.de.arenaregen.util.Position; +import me.realized.de.arenaregen.zone.Zone; +import me.realized.de.arenaregen.zone.task.Task; +import org.bukkit.Material; + +public class FilterBlocksTask extends Task { + + private final Set changedBlocks; + + public FilterBlocksTask(final ArenaRegen extension, final Zone zone, final Callback onDone, final Set changedBlocks) { + super(extension, zone, onDone); + this.changedBlocks = changedBlocks; + } + + @Override + public void run() { + final Queue> changes = new LinkedList<>(); + + try (final BufferedReader reader = new BufferedReader(new FileReader(zone.getFile()))) { + // Skip 7 lines to get to blocks section + for (int i = 0; i < 7; i++) { + reader.readLine(); + } + + String block; + + while ((block = reader.readLine()) != null) { + final String[] data = block.split(":"); + final String[] posData = data[0].split(";"); + final Position pos = new Position(Integer.parseInt(posData[0]), Integer.parseInt(posData[1]), Integer.parseInt(posData[2])); + + if (changedBlocks.contains(pos)) { + final String[] blockData = data[1].split(";"); + final BlockInfo info = new BlockInfo(Material.getMaterial(blockData[0]), Byte.parseByte(blockData[1])); + changes.add(new Pair<>(pos, info)); + changedBlocks.remove(pos); + } + } + } catch (IOException ignored) { + changes.clear(); + changedBlocks.clear(); + } + + Iterator iterator = changedBlocks.iterator(); + + while (iterator.hasNext()) { + changes.add(new Pair<>(iterator.next(), new BlockInfo())); + iterator.remove(); + } + + zone.startSyncTaskTimer(new ResetBlocksTask(extension, zone, onDone, changes)); + } +} diff --git a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/RelightBlocksTask.java b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/RelightBlocksTask.java index 7cbcf9a..800c56d 100644 --- a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/RelightBlocksTask.java +++ b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/RelightBlocksTask.java @@ -1,14 +1,13 @@ package me.realized.de.arenaregen.zone.task.tasks; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; - import me.realized.de.arenaregen.ArenaRegen; import me.realized.de.arenaregen.util.BlockUtil; import me.realized.de.arenaregen.util.Callback; import me.realized.de.arenaregen.zone.Zone; import me.realized.de.arenaregen.zone.task.Task; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; public class RelightBlocksTask extends Task { @@ -27,13 +26,13 @@ public RelightBlocksTask(final ArenaRegen extension, final Zone zone, final Call 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); - + final Block block = zone.getWorld().getBlockAt(x, y, z); + if (block.getType() == Material.AIR || BlockUtil.isSurrounded(block)) { continue; } - handler.updateLighting(block); + handler.updateLighting(zone.getWorld(), x, y, z); } } @@ -41,7 +40,7 @@ public void run() { if (x > max.getBlockX()) { cancel(); - zone.startTask(new ChunkRefreshTask(extension, zone, onDone)); + zone.startSyncTaskTimer(new ChunkRefreshTask(extension, zone, onDone)); } } } diff --git a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/ResetBlocksTask.java b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/ResetBlocksTask.java index c910c96..56c8b9e 100644 --- a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/ResetBlocksTask.java +++ b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/ResetBlocksTask.java @@ -1,22 +1,20 @@ package me.realized.de.arenaregen.zone.task.tasks; import java.util.Queue; - -import org.bukkit.block.Block; - import me.realized.de.arenaregen.ArenaRegen; import me.realized.de.arenaregen.nms.fallback.NMSHandler; import me.realized.de.arenaregen.util.BlockInfo; import me.realized.de.arenaregen.util.Callback; import me.realized.de.arenaregen.util.Pair; +import me.realized.de.arenaregen.util.Position; import me.realized.de.arenaregen.zone.Zone; import me.realized.de.arenaregen.zone.task.Task; public class ResetBlocksTask extends Task { - private final Queue> changed; + private final Queue> changed; - public ResetBlocksTask(final ArenaRegen extension, final Zone zone, final Callback onDone, final Queue> changed) { + public ResetBlocksTask(final ArenaRegen extension, final Zone zone, final Callback onDone, final Queue> changed) { super(extension, zone, onDone); this.changed = changed; } @@ -24,12 +22,12 @@ public ResetBlocksTask(final ArenaRegen extension, final Zone zone, final Callba @Override public void run() { int count = 0; - Pair current; + Pair current; while ((current = changed.poll()) != null) { - final Block block = current.getKey(); + final Position pos = current.getKey(); final BlockInfo info = current.getValue(); - handler.setBlockFast(block, info.getType(), info.getData()); + handler.setBlockFast(zone.getWorld(), pos.getX(), pos.getY(), pos.getZ(), info.getData(), info.getType()); count++; if (count >= config.getBlocksPerTick()) { @@ -41,7 +39,7 @@ public void run() { // Skip relighting if using fallback handler if (handler instanceof NMSHandler) { - zone.startTask(null); + zone.startSyncTaskTimer(null); zone.getArena().setDisabled(false); if (onDone != null) { @@ -51,6 +49,6 @@ public void run() { return; } - zone.startTask(new RelightBlocksTask(extension, zone, onDone)); + zone.startSyncTaskTimer(new RelightBlocksTask(extension, zone, onDone)); } } diff --git a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/ScanBlocksTask.java b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/ScanBlocksTask.java index 8a91cbd..d405eb6 100644 --- a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/ScanBlocksTask.java +++ b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/task/tasks/ScanBlocksTask.java @@ -2,10 +2,6 @@ import java.util.LinkedList; import java.util.Queue; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; - import me.realized.de.arenaregen.ArenaRegen; import me.realized.de.arenaregen.util.BlockInfo; import me.realized.de.arenaregen.util.Callback; @@ -13,10 +9,13 @@ import me.realized.de.arenaregen.util.Position; import me.realized.de.arenaregen.zone.Zone; import me.realized.de.arenaregen.zone.task.Task; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; public class ScanBlocksTask extends Task { - private final Queue> changed = new LinkedList<>(); + private final Queue> changed = new LinkedList<>(); private final Location min, max; @@ -40,7 +39,7 @@ public void run() { if (info == null) { // If no stored information is available (= air) but block is not air, set to air if (block.getType() != Material.AIR) { - changed.add(new Pair<>(block, new BlockInfo())); + changed.add(new Pair<>(position, new BlockInfo())); } continue; @@ -48,7 +47,7 @@ public void run() { continue; } - changed.add(new Pair<>(block, info)); + changed.add(new Pair<>(position, info)); } } @@ -56,7 +55,7 @@ public void run() { if (x > max.getBlockX()) { cancel(); - zone.startTask(new ResetBlocksTask(extension, zone, onDone, changed)); + zone.startSyncTaskTimer(new ResetBlocksTask(extension, zone, onDone, changed)); } } } diff --git a/arenaregen/src/main/resources/lang.yml b/arenaregen/src/main/resources/lang.yml index 8d70bcb..f412eb4 100644 --- a/arenaregen/src/main/resources/lang.yml +++ b/arenaregen/src/main/resources/lang.yml @@ -30,7 +30,7 @@ COMMAND: start: '{PREFIX} &7Resetting &f%name%&7...' end: '{PREFIX} &7Reset complete for &f%name%&7.' list: - header: '{PREFIX} &7List of &fReset Zones &9-' + header: '{PREFIX} &7List of loaded &fReset Zones &9-' format: '&bArena: &c%name% &7- &bMin: &c%min_pos% &7- &bMax: &c%max_pos% &7- &bBlocks: &c%blocks_count%' footer: '{PREFIX} &7Total: &a%zones_count%' sub-command-usage: '{PREFIX} &f/%command% %usage% &e- &7%description%' diff --git a/build.gradle b/build.gradle index b9e39f2..954edbf 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ buildscript { allprojects { group 'me.realized.de' - version '1.2.0' + version '1.3.0-SNAPSHOT' } subprojects { 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 19aece3..cf085ef 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 @@ -2,15 +2,15 @@ import org.bukkit.Chunk; import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.entity.Player; public interface NMS { void sendChunkUpdate(final Player player, final Chunk chunk); - void setBlockFast(final Block bukkitBlock, final Material material, final int data); + void setBlockFast(final World world, final int x, final int y, final int z, final int data, final Material material); - void updateLighting(final Block bukkitBlock); + void updateLighting(final World world, final int x, final int y, final int z); } diff --git a/settings.gradle b/settings.gradle index 048487c..8c8011a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -10,4 +10,5 @@ include 'v1_16_R3' include 'v1_17_R1' include 'v1_18_R1' include 'v1_18_R2' +include 'v1_19_R1' 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 3ca70fa..fd0e08d 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 @@ -8,8 +8,6 @@ import net.minecraft.server.v1_12_R1.PacketPlayOutMapChunk; import net.minecraft.server.v1_12_R1.World; import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.craftbukkit.v1_12_R1.CraftChunk; import org.bukkit.craftbukkit.v1_12_R1.CraftWorld; import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer; @@ -24,20 +22,18 @@ public void sendChunkUpdate(final Player player, final org.bukkit.Chunk chunk) { } @Override - public void setBlockFast(final Block bukkitBlock, final Material material, final int data) { - final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + public void setBlockFast(final org.bukkit.World world, final int x, final int y, final int z, final int data, final Material material) { final BlockPosition position = new BlockPosition(x, y, z); - final Chunk chunk = ((CraftChunk) bukkitBlock.getChunk()).getHandle(); + final Chunk chunk = ((CraftChunk) world.getChunkAt(x >> 4, z >> 4)).getHandle(); final net.minecraft.server.v1_12_R1.Block block = CraftMagicNumbers.getBlock(material); final IBlockData blockData = block.fromLegacyData(data); chunk.a(position, blockData); } @Override - public void updateLighting(Block bukkitBlock) { - final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + public void updateLighting(final org.bukkit.World world, final int x, final int y, final int z) { final BlockPosition position = new BlockPosition(x, y, z); - final World world = ((CraftWorld) bukkitBlock.getWorld()).getHandle(); - world.c(EnumSkyBlock.BLOCK, position); + final World nmsWorld = ((CraftWorld) world).getHandle(); + nmsWorld.c(EnumSkyBlock.BLOCK, position); } } 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 1099018..28d54cc 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 @@ -7,8 +7,6 @@ import net.minecraft.server.v1_14_R1.PacketPlayOutMapChunk; import net.minecraft.server.v1_14_R1.World; import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.craftbukkit.v1_14_R1.CraftChunk; import org.bukkit.craftbukkit.v1_14_R1.CraftWorld; import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer; @@ -23,20 +21,18 @@ public void sendChunkUpdate(final Player player, final org.bukkit.Chunk chunk) { } @Override - public void setBlockFast(final Block bukkitBlock, final Material material, final int data) { - final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + public void setBlockFast(final org.bukkit.World world, final int x, final int y, final int z, final int data, final Material material) { final BlockPosition position = new BlockPosition(x, y, z); - final Chunk chunk = ((CraftChunk) bukkitBlock.getChunk()).getHandle(); + final Chunk chunk = ((CraftChunk) world.getChunkAt(x >> 4, z >> 4)).getHandle(); final net.minecraft.server.v1_14_R1.Block block = CraftMagicNumbers.getBlock(material); final IBlockData blockData = block.getBlockData(); chunk.setType(position, blockData, true); } @Override - public void updateLighting(Block bukkitBlock) { - final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + public void updateLighting(final org.bukkit.World world, final int x, final int y, final int z) { final BlockPosition position = new BlockPosition(x, y, z); - final World world = ((CraftWorld) bukkitBlock.getWorld()).getHandle(); - world.getChunkProvider().getLightEngine().a(position); + final World nmsWorld = ((CraftWorld) world).getHandle(); + nmsWorld.getChunkProvider().getLightEngine().a(position); } } 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 aad172c..a3bfbad 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 @@ -7,8 +7,6 @@ import net.minecraft.server.v1_15_R1.PacketPlayOutMapChunk; import net.minecraft.server.v1_15_R1.World; import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.craftbukkit.v1_15_R1.CraftChunk; import org.bukkit.craftbukkit.v1_15_R1.CraftWorld; import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; @@ -23,20 +21,18 @@ public void sendChunkUpdate(final Player player, final org.bukkit.Chunk chunk) { } @Override - public void setBlockFast(final Block bukkitBlock, final Material material, final int data) { - final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + public void setBlockFast(final org.bukkit.World world, final int x, final int y, final int z, final int data, final Material material) { final BlockPosition position = new BlockPosition(x, y, z); - final Chunk chunk = ((CraftChunk) bukkitBlock.getChunk()).getHandle(); + final Chunk chunk = ((CraftChunk) world.getChunkAt(x >> 4, z >> 4)).getHandle(); final net.minecraft.server.v1_15_R1.Block block = CraftMagicNumbers.getBlock(material); final IBlockData blockData = block.getBlockData(); chunk.setType(position, blockData, true); } @Override - public void updateLighting(Block bukkitBlock) { - final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + public void updateLighting(final org.bukkit.World world, final int x, final int y, final int z) { final BlockPosition position = new BlockPosition(x, y, z); - final World world = ((CraftWorld) bukkitBlock.getWorld()).getHandle(); - world.getChunkProvider().getLightEngine().a(position); + final World nmsWorld = ((CraftWorld) world).getHandle(); + nmsWorld.getChunkProvider().getLightEngine().a(position); } } 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 864d562..ab53d91 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 @@ -7,8 +7,6 @@ import net.minecraft.server.v1_16_R3.PacketPlayOutMapChunk; import net.minecraft.server.v1_16_R3.World; import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.craftbukkit.v1_16_R3.CraftChunk; import org.bukkit.craftbukkit.v1_16_R3.CraftWorld; import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer; @@ -23,20 +21,18 @@ public void sendChunkUpdate(final Player player, final org.bukkit.Chunk chunk) { } @Override - public void setBlockFast(final Block bukkitBlock, final Material material, final int data) { - final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + public void setBlockFast(final org.bukkit.World world, final int x, final int y, final int z, final int data, final Material material) { final BlockPosition position = new BlockPosition(x, y, z); - final Chunk chunk = ((CraftChunk) bukkitBlock.getChunk()).getHandle(); + final Chunk chunk = ((CraftChunk) world.getChunkAt(x >> 4, z >> 4)).getHandle(); final net.minecraft.server.v1_16_R3.Block block = CraftMagicNumbers.getBlock(material); final IBlockData blockData = block.getBlockData(); chunk.setType(position, blockData, true); } @Override - public void updateLighting(Block bukkitBlock) { - final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + public void updateLighting(final org.bukkit.World world, final int x, final int y, final int z) { final BlockPosition position = new BlockPosition(x, y, z); - final World world = ((CraftWorld) bukkitBlock.getWorld()).getHandle(); - world.getChunkProvider().getLightEngine().a(position); + final World nmsWorld = ((CraftWorld) world).getHandle(); + nmsWorld.getChunkProvider().getLightEngine().a(position); } } 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 b2bcb2e..7a778f6 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 @@ -7,8 +7,6 @@ import net.minecraft.world.level.block.state.IBlockData; import net.minecraft.world.level.chunk.Chunk; import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.craftbukkit.v1_17_R1.CraftChunk; import org.bukkit.craftbukkit.v1_17_R1.CraftWorld; import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; @@ -23,20 +21,18 @@ public void sendChunkUpdate(final Player player, final org.bukkit.Chunk chunk) { } @Override - public void setBlockFast(final Block bukkitBlock, final Material material, final int data) { - final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + public void setBlockFast(final org.bukkit.World world, final int x, final int y, final int z, final int data, final Material material) { final BlockPosition position = new BlockPosition(x, y, z); - final Chunk chunk = ((CraftChunk) bukkitBlock.getChunk()).getHandle(); + final Chunk chunk = ((CraftChunk) world.getChunkAt(x >> 4, z >> 4)).getHandle(); final net.minecraft.world.level.block.Block block = CraftMagicNumbers.getBlock(material); final IBlockData blockData = block.getBlockData(); chunk.setType(position, blockData, true); } @Override - public void updateLighting(Block bukkitBlock) { - final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + public void updateLighting(final org.bukkit.World world, final int x, final int y, final int z) { final BlockPosition position = new BlockPosition(x, y, z); - final World world = ((CraftWorld) bukkitBlock.getWorld()).getHandle(); - world.getChunkProvider().getLightEngine().a(position); + final World nmsWorld = ((CraftWorld) world).getHandle(); + nmsWorld.getChunkProvider().getLightEngine().a(position); } } 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 b02cf81..c06d4df 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 @@ -7,7 +7,6 @@ import net.minecraft.world.level.block.state.IBlockData; import net.minecraft.world.level.chunk.Chunk; import org.bukkit.Material; -import org.bukkit.block.Block; 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; @@ -23,20 +22,18 @@ public void sendChunkUpdate(final Player player, final org.bukkit.Chunk chunk) { } @Override - public void setBlockFast(final Block bukkitBlock, final Material material, final int data) { - final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + public void setBlockFast(final org.bukkit.World world, final int x, final int y, final int z, final int data, final Material material) { final BlockPosition position = new BlockPosition(x, y, z); - final Chunk chunk = ((CraftChunk) bukkitBlock.getChunk()).getHandle(); + final Chunk chunk = ((CraftChunk) world.getChunkAt(x >> 4, z >> 4)).getHandle(); final net.minecraft.world.level.block.Block block = CraftMagicNumbers.getBlock(material); final IBlockData blockData = block.n(); chunk.a(position, blockData, true); } @Override - public void updateLighting(Block bukkitBlock) { - final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + public void updateLighting(final org.bukkit.World world, final int x, final int y, final int z) { final BlockPosition position = new BlockPosition(x, y, z); - final World world = ((CraftWorld) bukkitBlock.getWorld()).getHandle(); - world.L().m().a(position); + final World nmsWorld = ((CraftWorld) world).getHandle(); + nmsWorld.L().m().a(position); } } diff --git a/v1_18_R2/src/main/java/me/realized/de/arenaregen/nms/v1_18_R2/NMSHandler.java b/v1_18_R2/src/main/java/me/realized/de/arenaregen/nms/v1_18_R2/NMSHandler.java index e7edd06..91a94c3 100644 --- a/v1_18_R2/src/main/java/me/realized/de/arenaregen/nms/v1_18_R2/NMSHandler.java +++ b/v1_18_R2/src/main/java/me/realized/de/arenaregen/nms/v1_18_R2/NMSHandler.java @@ -7,7 +7,6 @@ import net.minecraft.world.level.block.state.IBlockData; import net.minecraft.world.level.chunk.Chunk; import org.bukkit.Material; -import org.bukkit.block.Block; import org.bukkit.craftbukkit.v1_18_R2.CraftChunk; import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer; @@ -23,20 +22,18 @@ public void sendChunkUpdate(final Player player, final org.bukkit.Chunk chunk) { } @Override - public void setBlockFast(final Block bukkitBlock, final Material material, final int data) { - final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + public void setBlockFast(final org.bukkit.World world, final int x, final int y, final int z, final int data, final Material material) { final BlockPosition position = new BlockPosition(x, y, z); - final Chunk chunk = ((CraftChunk) bukkitBlock.getChunk()).getHandle(); + final Chunk chunk = ((CraftChunk) world.getChunkAt(x >> 4, z >> 4)).getHandle(); final net.minecraft.world.level.block.Block block = CraftMagicNumbers.getBlock(material); final IBlockData blockData = block.n(); chunk.a(position, blockData, true); } @Override - public void updateLighting(Block bukkitBlock) { - final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + public void updateLighting(final org.bukkit.World world, final int x, final int y, final int z) { final BlockPosition position = new BlockPosition(x, y, z); - final World world = ((CraftWorld) bukkitBlock.getWorld()).getHandle(); - world.K().n().a(position); + final World nmsWorld = ((CraftWorld) world).getHandle(); + nmsWorld.K().n().a(position); } } diff --git a/v1_19_R1/build.gradle b/v1_19_R1/build.gradle new file mode 100644 index 0000000..a0f9450 --- /dev/null +++ b/v1_19_R1/build.gradle @@ -0,0 +1,4 @@ +dependencies { + implementation 'org.spigotmc:spigot:1.19.2-R0.1-SNAPSHOT' + implementation project(':nms') +} \ No newline at end of file diff --git a/v1_19_R1/src/main/java/me/realized/de/arenaregen/nms/v1_19_R1/NMSHandler.java b/v1_19_R1/src/main/java/me/realized/de/arenaregen/nms/v1_19_R1/NMSHandler.java new file mode 100644 index 0000000..fc0dffc --- /dev/null +++ b/v1_19_R1/src/main/java/me/realized/de/arenaregen/nms/v1_19_R1/NMSHandler.java @@ -0,0 +1,39 @@ +package me.realized.de.arenaregen.nms.v1_19_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.Material; +import org.bukkit.craftbukkit.v1_19_R1.CraftChunk; +import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_19_R1.util.CraftMagicNumbers; +import org.bukkit.entity.Player; + +public class NMSHandler implements NMS { + + @Override + public void sendChunkUpdate(final Player player, final org.bukkit.Chunk chunk) { + final Chunk nmsChunk = ((CraftChunk) chunk).getHandle(); + ((CraftPlayer) player).getHandle().b.a(new ClientboundLevelChunkWithLightPacket(nmsChunk, nmsChunk.q.l_(), null, null, true)); + } + + @Override + public void setBlockFast(final org.bukkit.World world, final int x, final int y, final int z, final int data, final Material material) { + final BlockPosition position = new BlockPosition(x, y, z); + final Chunk chunk = ((CraftChunk) world.getChunkAt(x >> 4, z >> 4)).getHandle(); + final net.minecraft.world.level.block.Block block = CraftMagicNumbers.getBlock(material); + final IBlockData blockData = block.m(); + chunk.a(position, blockData, true); + } + + @Override + public void updateLighting(final org.bukkit.World world, final int x, final int y, final int z) { + final BlockPosition position = new BlockPosition(x, y, z); + final World nmsWorld = ((CraftWorld) world).getHandle(); + nmsWorld.I().o().a(position); + } +} 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 fb0b804..6e3526a 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 @@ -8,8 +8,6 @@ import net.minecraft.server.v1_8_R3.IBlockData; import net.minecraft.server.v1_8_R3.World; import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.craftbukkit.v1_8_R3.CraftChunk; import org.bukkit.craftbukkit.v1_8_R3.CraftWorld; import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; @@ -24,20 +22,18 @@ public void sendChunkUpdate(final Player player, final org.bukkit.Chunk chunk) { } @Override - public void setBlockFast(final Block bukkitBlock, final Material material, final int data) { - final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + public void setBlockFast(final org.bukkit.World world, final int x, final int y, final int z, final int data, final Material material) { final BlockPosition position = new BlockPosition(x, y, z); - final Chunk chunk = ((CraftChunk) bukkitBlock.getChunk()).getHandle(); + final Chunk chunk = ((CraftChunk) world.getChunkAt(x >> 4, z >> 4)).getHandle(); final net.minecraft.server.v1_8_R3.Block block = CraftMagicNumbers.getBlock(material); final IBlockData blockData = block.fromLegacyData(data); chunk.a(position, blockData); } @Override - public void updateLighting(Block bukkitBlock) { - final World world = ((CraftWorld) bukkitBlock.getWorld()).getHandle(); - final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + public void updateLighting(final org.bukkit.World world, final int x, final int y, final int z) { final BlockPosition position = new BlockPosition(x, y, z); - world.c(EnumSkyBlock.BLOCK, position); + final World nmsWorld = ((CraftWorld) world).getHandle(); + nmsWorld.c(EnumSkyBlock.BLOCK, position); } } 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 9219ef2..910bd19 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 @@ -8,8 +8,6 @@ import net.minecraft.server.v1_8_R3.IBlockData; import net.minecraft.server.v1_8_R3.World; import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.craftbukkit.v1_8_R3.CraftChunk; import org.bukkit.craftbukkit.v1_8_R3.CraftWorld; import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; @@ -24,21 +22,18 @@ public void sendChunkUpdate(final Player player, final org.bukkit.Chunk chunk) { } @Override - public void setBlockFast(final Block bukkitBlock, final Material material, final int data) { - final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + public void setBlockFast(final org.bukkit.World world, final int x, final int y, final int z, final int data, final Material material) { final BlockPosition position = new BlockPosition(x, y, z); - final Chunk chunk = ((CraftChunk) bukkitBlock.getChunk()).getHandle(); + final Chunk chunk = ((CraftChunk) world.getChunkAt(x >> 4, z >> 4)).getHandle(); final net.minecraft.server.v1_8_R3.Block block = CraftMagicNumbers.getBlock(material); final IBlockData blockData = block.fromLegacyData(data); chunk.a(position, blockData); } @Override - public void updateLighting(Block bukkitBlock) { - final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + public void updateLighting(final org.bukkit.World world, final int x, final int y, final int z) { final BlockPosition position = new BlockPosition(x, y, z); - final World world = ((CraftWorld) bukkitBlock.getWorld()).getHandle(); - world.updateLight(EnumSkyBlock.BLOCK, position); - + final World nmsWorld = ((CraftWorld) world).getHandle(); + nmsWorld.updateLight(EnumSkyBlock.BLOCK, position); } }