diff --git a/arenaregen/build.gradle b/arenaregen/build.gradle index c81aa3e..3c38b87 100644 --- a/arenaregen/build.gradle +++ b/arenaregen/build.gradle @@ -1,15 +1,12 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.apache.tools.ant.filters.ReplaceTokens clean.doFirst { delete "$rootDir/out/" } -tasks.withType(ShadowJar) { - destinationDir = file("$rootDir/out/") -} - processResources { + duplicatesStrategy = DuplicatesStrategy.INCLUDE + from(sourceSets.main.resources.srcDirs) { include '**/*.yml' filter(ReplaceTokens, tokens: [VERSION: project.version]) @@ -17,20 +14,26 @@ processResources { } dependencies { - compile 'org.projectlombok:lombok:1.16.20' - compile 'org.spigotmc:spigot-api:1.13-R0.1-SNAPSHOT' - compile 'com.github.Realizedd.Duels:duels-api:3.4.1' - compile project(':nms') - compile project(':v1_8_R3') - compile project(':v1_8_R3_paper') - compile project(':v1_12_R1') - compile project(':v1_14_R1') - compile project(':v1_15_R1') - compile project(':v1_16_R3') + compileOnly 'org.projectlombok:lombok:1.18.22' + annotationProcessor 'org.projectlombok:lombok:1.18.22' + implementation 'org.spigotmc:spigot-api:1.13-R0.1-SNAPSHOT' + implementation 'com.github.Realizedd.Duels:duels-api:3.4.1' + implementation project(':nms') + implementation project(':v1_8_R3') + implementation project(':v1_8_R3_paper') + implementation project(':v1_12_R1') + implementation project(':v1_14_R1') + implementation project(':v1_15_R1') + implementation project(':v1_16_R3') + implementation project(':v1_17_R1') + implementation project(':v1_18_R1') } shadowJar { - archiveName = parent.name.replace("Parent", "") + '-' + project.version + '.jar' + getDestinationDirectory().set(file("$rootDir/out/")) + + final String archiveName = parent.name.replace("Parent", "") + '-' + project.version + '.jar' + getArchiveFileName().set(archiveName) dependencies { include(dependency(':nms')) @@ -40,7 +43,12 @@ shadowJar { include(dependency(':v1_14_R1')) include(dependency(':v1_15_R1')) include(dependency(':v1_16_R3')) + include(dependency(':v1_17_R1')) + include(dependency(':v1_18_R1')) } } -build.dependsOn(shadowJar) \ No newline at end of file +// To build extension jar, run './gradlew clean build'. +build { + dependsOn(shadowJar) +} \ No newline at end of file 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 e741140..420efb2 100644 --- a/arenaregen/src/main/java/me/realized/de/arenaregen/ArenaRegen.java +++ b/arenaregen/src/main/java/me/realized/de/arenaregen/ArenaRegen.java @@ -29,9 +29,27 @@ public class ArenaRegen extends DuelsExtension { public void onEnable() { this.configuration = new Config(this); this.lang = new Lang(this); + this.handler = findHandler(); + info("NMSHandler: Using " + handler.getClass().getName()); + + this.selectionManager = new SelectionManager(this, api); + this.zoneManager = new ResetZoneManager(this, api); + api.registerSubCommand("duels", new ArenaregenCommand(this, api)); + } + + private NMS findHandler() { + final String handlerVersion = configuration.getBlockResetHandlerVersion(); final String packageName = api.getServer().getClass().getPackage().getName(); - final String version = packageName.substring(packageName.lastIndexOf('.') + 1); + String version = packageName.substring(packageName.lastIndexOf('.') + 1); + + if (!handlerVersion.equalsIgnoreCase("auto")) { + if (handlerVersion.equalsIgnoreCase("fallback")) { + return new NMSHandler(); + } + + version = handlerVersion; + } try { Class clazz = null; @@ -41,19 +59,13 @@ public void onEnable() { } if (clazz == null) { - clazz = Class.forName("me.realized.de.arenaregen.nms." + version + ".NMSHandler"); + clazz = ReflectionUtil.getClassUnsafe("me.realized.de.arenaregen.nms." + version + ".NMSHandler"); } - this.handler = NMS.class.isAssignableFrom(clazz) ? (NMS) clazz.newInstance() : new NMSHandler(); - } catch (ClassNotFoundException | IllegalAccessException | InstantiationException ex) { - this.handler = new NMSHandler(); + return clazz != null && NMS.class.isAssignableFrom(clazz) ? (NMS) clazz.newInstance() : new NMSHandler(); + } catch (IllegalAccessException | InstantiationException ex) { + return new NMSHandler(); } - - info("NMSHandler: Using " + handler.getClass().getName()); - - this.selectionManager = new SelectionManager(this, api); - this.zoneManager = new ResetZoneManager(this, api); - api.registerSubCommand("duels", new ArenaregenCommand(this, api)); } @Override @@ -63,7 +75,7 @@ public void onDisable() { @Override public String getRequiredVersion() { - return "3.4.1"; + return "3.5.0"; } public void info(final String 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 cf5dd1e..7811baa 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 @@ -7,7 +7,6 @@ import me.realized.duels.api.arena.Arena; import org.apache.commons.lang.StringUtils; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; public class ResetCommand extends ARCommand { @@ -34,10 +33,6 @@ public void execute(final CommandSender sender, final String label, final String lang.sendMessage(sender, "COMMAND.arenaregen.reset.start", "name", name); zone.reset(() -> { - if (sender instanceof Player) { - zone.refreshChunks((Player) sender); - } - lang.sendMessage(sender, "COMMAND.arenaregen.reset.end", "name", name); }); } diff --git a/arenaregen/src/main/java/me/realized/de/arenaregen/config/Config.java b/arenaregen/src/main/java/me/realized/de/arenaregen/config/Config.java index 46390d2..db72e36 100644 --- a/arenaregen/src/main/java/me/realized/de/arenaregen/config/Config.java +++ b/arenaregen/src/main/java/me/realized/de/arenaregen/config/Config.java @@ -1,5 +1,7 @@ package me.realized.de.arenaregen.config; +import java.util.Collections; +import java.util.List; import lombok.Getter; import me.realized.de.arenaregen.ArenaRegen; import org.bukkit.Material; @@ -14,8 +16,12 @@ public class Config { @Getter private final boolean allowArenaBlockBreak; @Getter + private final String blockResetHandlerVersion; + @Getter private final boolean removeDroppedItems; @Getter + private final List removeEntities; + @Getter private final boolean preventBlockBurn; @Getter private final boolean preventBlockMelt; @@ -31,7 +37,9 @@ public Config(final ArenaRegen extension) { this.selectingTool = Material.getMaterial(config.getString("selecting-tool", "IRON_AXE")); this.allowArenaBlockBreak = config.getBoolean("allow-arena-block-break", false); this.blocksPerTick = config.getInt("blocks-per-tick", 25); + blockResetHandlerVersion = config.getString("block-reset-handler-version", "auto"); this.removeDroppedItems = config.getBoolean("remove-dropped-items", true); + this.removeEntities = config.isList("remove-entities") ? config.getStringList("remove-entities") : Collections.emptyList(); this.preventBlockBurn = config.getBoolean("prevent-block-burn", true); this.preventBlockMelt = config.getBoolean("prevent-block-melt", true); this.preventBlockExplode = config.getBoolean("prevent-block-explode", true); 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 88cd621..a0f4233 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 @@ -1,163 +1,33 @@ package me.realized.de.arenaregen.nms.fallback; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import me.realized.de.arenaregen.nms.NMS; -import me.realized.de.arenaregen.util.CompatUtil; 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.block.BlockFace; import org.bukkit.entity.Player; public class NMSHandler implements NMS { - private Constructor BLOCK_POS_CONSTRUCTOR; - private Object BLOCK_ENUM; - private Method WORLD_GET_HANDLE; - private Method WORLD_C; - private Method WORLD_UPDATE_LIGHTING; - private Method CHUNK_GET_HANDLE; - private Method BLOCK_FROM_LEGACY_DATA; - private Method BLOCK_GET_DATA; - private Method MAGIC_GET_BLOCK; - private Method CHUNK_SET_BLOCK_12; - private Method CHUNK_SET_BLOCK; - - private Method GET_CHUNK_PROVIDER; - private Method GET_LIGHT_ENGINE; - private Method LIGHT_ENGINE_A; - - private Method GET_HANDLE; - private Field PLAYER_CONNECTION; - private Method SEND_PACKET; - - private Constructor PACKET_MAP_CHUNK_CONSTRUCTOR; + private Method SET_DATA; public NMSHandler() { - try { - final Class BLOCK_POS = ReflectionUtil.getNMSClass("BlockPosition"); - BLOCK_POS_CONSTRUCTOR = ReflectionUtil.getConstructor(BLOCK_POS, Double.TYPE, Double.TYPE, Double.TYPE); - WORLD_GET_HANDLE = ReflectionUtil.getMethod(ReflectionUtil.getCBClass("CraftWorld"), "getHandle"); - final Class WORLD = ReflectionUtil.getNMSClass("World"); - final Class ENUM_SKY_BLOCK = ReflectionUtil.getNMSClass("EnumSkyBlock"); - WORLD_C = ReflectionUtil.getMethod(WORLD, "c", ENUM_SKY_BLOCK, BLOCK_POS); - GET_CHUNK_PROVIDER = ReflectionUtil.getMethod(WORLD, "getChunkProvider"); - final Class CHUNK_PROVIDER = ReflectionUtil.getNMSClass("IChunkProvider"); - GET_LIGHT_ENGINE = ReflectionUtil.getMethod(CHUNK_PROVIDER, "getLightEngine"); - final Class LIGHT_ENGINE = ReflectionUtil.getNMSClass("LightEngine"); - LIGHT_ENGINE_A = ReflectionUtil.getMethod(LIGHT_ENGINE, "a", BLOCK_POS); - - if (CompatUtil.isPaper()) { - WORLD_UPDATE_LIGHTING = ReflectionUtil.getMethod(WORLD, "updateLight", ENUM_SKY_BLOCK, BLOCK_POS); - } - - BLOCK_ENUM = ReflectionUtil.getEnumConstant(ENUM_SKY_BLOCK, 1); - CHUNK_GET_HANDLE = ReflectionUtil.getMethod(ReflectionUtil.getCBClass("CraftChunk"), "getHandle"); - final Class BLOCK = ReflectionUtil.getNMSClass("Block"); - BLOCK_FROM_LEGACY_DATA = ReflectionUtil.getMethod(BLOCK, "fromLegacyData", Integer.TYPE); - BLOCK_GET_DATA = ReflectionUtil.getMethod(BLOCK, "getBlockData"); - MAGIC_GET_BLOCK = ReflectionUtil.getMethod(ReflectionUtil.getCBClass("util.CraftMagicNumbers"), "getBlock", Material.class); - final Class CHUNK = ReflectionUtil.getNMSClass("Chunk"); - final Class BLOCK_DATA = ReflectionUtil.getNMSClass("IBlockData"); - CHUNK_SET_BLOCK_12 = ReflectionUtil.getMethod(CHUNK, "a", BLOCK_POS, BLOCK_DATA); - CHUNK_SET_BLOCK = ReflectionUtil.getMethod(CHUNK, "a", BLOCK_POS, BLOCK_DATA, Boolean.TYPE); - - if (CHUNK_SET_BLOCK == null) { - CHUNK_SET_BLOCK = ReflectionUtil.getMethod(CHUNK, "setType", BLOCK_POS, BLOCK_DATA, Boolean.TYPE); - } - - final Class CB_PLAYER = ReflectionUtil.getCBClass("entity.CraftPlayer"); - GET_HANDLE = ReflectionUtil.getMethod(CB_PLAYER, "getHandle"); - - final Class NMS_PLAYER = ReflectionUtil.getNMSClass("EntityPlayer"); - PLAYER_CONNECTION = ReflectionUtil.getField(NMS_PLAYER, "playerConnection"); - SEND_PACKET = ReflectionUtil.getMethod(ReflectionUtil.getNMSClass("PlayerConnection"), "sendPacket", ReflectionUtil.getNMSClass("Packet")); - - final Class PACKET_MAP_CHUNK = ReflectionUtil.getNMSClass("PacketPlayOutMapChunk"); - PACKET_MAP_CHUNK_CONSTRUCTOR = ReflectionUtil.getConstructor(PACKET_MAP_CHUNK, CHUNK, boolean.class, int.class); - - if (PACKET_MAP_CHUNK_CONSTRUCTOR == null) { - PACKET_MAP_CHUNK_CONSTRUCTOR = ReflectionUtil.getConstructor(PACKET_MAP_CHUNK, CHUNK, int.class); - } - } catch (Throwable ex) { - ex.printStackTrace(); - } + SET_DATA = ReflectionUtil.getMethod(Block.class, "setData", byte.class); } @Override - public void sendChunkUpdate(final Player player, final Chunk chunk) { - try { - final Object chunkHandle = CHUNK_GET_HANDLE.invoke(chunk); - final Object connection = PLAYER_CONNECTION.get(GET_HANDLE.invoke(player)); - - if (CompatUtil.isPre1_12()) { - SEND_PACKET.invoke(connection, PACKET_MAP_CHUNK_CONSTRUCTOR.newInstance(chunkHandle, true, 65535)); - } else { - SEND_PACKET.invoke(connection, PACKET_MAP_CHUNK_CONSTRUCTOR.newInstance(chunkHandle, 65535)); - } - } catch (IllegalAccessException | InvocationTargetException | InstantiationException ex) { - ex.printStackTrace(); - } - } + public void sendChunkUpdate(final Player player, final Chunk chunk) {} @Override public void setBlockFast(final Block block, final Material material, final int data) { - final Chunk chunk = block.getChunk(); - final int x = block.getX(); - final int y = block.getY(); - final int z = block.getZ(); - - try { - final Object chunkHandle = CHUNK_GET_HANDLE.invoke(chunk); - Object nmsBlock = MAGIC_GET_BLOCK.invoke(null, material); - - final Object blockPos = BLOCK_POS_CONSTRUCTOR.newInstance(x, y, z); + block.setType(material); - if (CompatUtil.isPre1_13()) { - nmsBlock = BLOCK_FROM_LEGACY_DATA.invoke(nmsBlock, data); - CHUNK_SET_BLOCK_12.invoke(chunkHandle, blockPos, nmsBlock); - } else { - CHUNK_SET_BLOCK.invoke(chunkHandle, blockPos, BLOCK_GET_DATA.invoke(nmsBlock), true); - } - - if (block.getType() == Material.AIR || isSurrounded(block.getWorld(), x, y, z)) { - return; - } - - final Object worldHandle = WORLD_GET_HANDLE.invoke(block.getWorld()); - - if (CompatUtil.isPre1_14()) { - if (CompatUtil.isPaper() && WORLD_UPDATE_LIGHTING != null) { - WORLD_UPDATE_LIGHTING.invoke(worldHandle, BLOCK_ENUM, blockPos); - } else { - WORLD_C.invoke(worldHandle, BLOCK_ENUM, blockPos); - } - } else { - LIGHT_ENGINE_A.invoke(GET_LIGHT_ENGINE.invoke(GET_CHUNK_PROVIDER.invoke(worldHandle)), blockPos); - } - } catch (Throwable ex) { - ex.printStackTrace(); + if (SET_DATA != null) { + try { + SET_DATA.invoke(block, (byte) data); + } catch (IllegalAccessException | InvocationTargetException ignored) {} } } - - private static boolean isSurrounded(final World world, final int x, final int y, final int z) { - final Block base = world.getBlockAt(x, y, z); - final Block east = base.getRelative(BlockFace.EAST); - final Block west = base.getRelative(BlockFace.WEST); - final Block south = base.getRelative(BlockFace.SOUTH); - final Block north = base.getRelative(BlockFace.NORTH); - final Block up = base.getRelative(BlockFace.UP); - final Block down = base.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/arenaregen/src/main/java/me/realized/de/arenaregen/zone/ResetZone.java b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/ResetZone.java index 582aad2..6ec1711 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 @@ -31,7 +31,6 @@ import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Entity; import org.bukkit.entity.Item; -import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; public class ResetZone { @@ -151,20 +150,6 @@ void loadBlocks() { }); } - public void refreshChunks(final Player... players) { - chunks.forEach(chunkLoc -> { - final Chunk chunk = min.getWorld().getChunkAt(chunkLoc.x, chunkLoc.z); - - if (!chunk.isLoaded()) { - return; - } - - for (final Player player : players) { - handler.sendChunkUpdate(player, chunk); - } - }); - } - public boolean isResetting() { return task != null; } @@ -223,6 +208,10 @@ boolean isCached(final Block block) { return contains(block.getLocation()) && blocks.containsKey(new Position(block)); } + boolean isCached(final Chunk chunk) { + return chunks.contains(new ChunkLoc(chunk)); + } + private static class ChunkLoc { private final int x, z; @@ -318,20 +307,29 @@ public void run() { } cancel(); - arena.setDisabled(false); task = null; + chunks.forEach(chunkLoc -> { + final Chunk chunk = min.getWorld().getChunkAt(chunkLoc.x, chunkLoc.z); - if (config.isRemoveDroppedItems()) { - chunks.forEach(chunkLoc -> { - final Chunk chunk = min.getWorld().getChunkAt(chunkLoc.x, chunkLoc.z); + if (!chunk.isLoaded()) { + return; + } - for (final Entity entity : chunk.getEntities()) { - if (entity instanceof Item) { - entity.remove(); - } + api.getServer().getOnlinePlayers().forEach(online -> handler.sendChunkUpdate(online, chunk)); + + for (final Entity entity : chunk.getEntities()) { + if (config.isRemoveDroppedItems() && entity instanceof Item) { + entity.remove(); + continue; } - }); - } + + if (config.getRemoveEntities().stream().anyMatch(type -> entity.getType().name().equalsIgnoreCase(type))) { + entity.remove(); + } + } + }); + + arena.setDisabled(false); if (onDone != null) { onDone.call(); diff --git a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/ResetZoneManager.java b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/ResetZoneManager.java index f7c4347..896e909 100644 --- a/arenaregen/src/main/java/me/realized/de/arenaregen/zone/ResetZoneManager.java +++ b/arenaregen/src/main/java/me/realized/de/arenaregen/zone/ResetZoneManager.java @@ -15,8 +15,6 @@ import me.realized.duels.api.arena.ArenaManager; import me.realized.duels.api.event.arena.ArenaRemoveEvent; import me.realized.duels.api.event.match.MatchEndEvent; -import me.realized.duels.api.event.match.MatchStartEvent; -import me.realized.duels.api.event.spectate.SpectateStartEvent; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -30,6 +28,7 @@ import org.bukkit.event.block.BlockIgniteEvent.IgniteCause; import org.bukkit.event.block.LeavesDecayEvent; import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.event.world.ChunkUnloadEvent; public class ResetZoneManager { @@ -128,28 +127,11 @@ public Collection getZones() { private class ResetZoneListener implements Listener { - @EventHandler - public void on(final MatchStartEvent event) { - final Arena arena = event.getMatch().getArena(); - final ResetZone zone = get(arena.getName()); - - if (zone == null) { - return; - } - - zone.refreshChunks(event.getPlayers()); - } - - @EventHandler - public void on(final SpectateStartEvent event) { - final Arena arena = event.getSpectator().getArena(); - final ResetZone zone = get(arena.getName()); - - if (zone == null) { - return; + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void on(final ChunkUnloadEvent event) { + if (zones.values().stream().anyMatch(zone -> zone.isResetting() && zone.isCached(event.getChunk()))) { + event.setCancelled(true); } - - zone.refreshChunks(api.getServer().getPlayer(event.getSpectator().getUuid())); } @EventHandler @@ -180,7 +162,7 @@ public void on(final BlockBreakEvent event) { } event.setCancelled(true); - lang.sendMessage(player, "ERROR.prevent.arena-block-break"); + lang.sendMessage(player, "ERROR.cancel-arena-block-break"); } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) diff --git a/arenaregen/src/main/resources/config.yml b/arenaregen/src/main/resources/config.yml index aa62d7f..c402a9c 100644 --- a/arenaregen/src/main/resources/config.yml +++ b/arenaregen/src/main/resources/config.yml @@ -9,10 +9,19 @@ blocks-per-tick: 25 # default: false allow-arena-block-break: false +# Allow breaking blocks in the reset zone that is not placed by a player in match. +# default: auto +# available: [auto, fallback, v1_8_R3, v1_8_R3_paper, v1_12_R1, v1_14_R1, v1_15_R1, v1_16_R3, v1_17_R1, v1_18_R1] +block-reset-handler-version: auto + # Remove dropped items in the reset zone when the match ends. # default: true remove-dropped-items: true +# Remove entities in the reset zone when the match ends. +# default: [ENDER_CRYSTAL] +remove-entities: [ENDER_CRYSTAL] + # Prevent blocks in the reset zone from burning. # default: true prevent-block-burn: true diff --git a/arenaregen/src/main/resources/lang.yml b/arenaregen/src/main/resources/lang.yml index bae2076..8d70bcb 100644 --- a/arenaregen/src/main/resources/lang.yml +++ b/arenaregen/src/main/resources/lang.yml @@ -7,7 +7,7 @@ STRINGS: ERROR: invalid-sub-command: '{PREFIX} &c''%argument%'' is not a valid command. Please type ''/%command%'' for help.' - no-selection: '{PREFIX} &cYou must select two points with an iron axe to create a reset zone.' + no-selection: '{PREFIX} &cYou must select two points with an iron hoe to create a reset zone.' cancel-arena-block-break: '{PREFIX} &cCannot destroy the arena.' already-exists: '{PREFIX} &cArena ''%name%'' already has a reset zone. To delete, use the command ''/ds ar delete %name%''' arena-not-found: '{PREFIX} &c''%name%'' is not an existing arena.' @@ -27,8 +27,8 @@ COMMAND: create: '{PREFIX} &7Reset zone created! Arena &f%name% &7will now reset automatically when a duel ends.' delete: '{PREFIX} &7Reset zone has been deleted for &f%name%&7.' reset: - start: '{PREFIX} &7Resetting &f%name&7...' - end: '{PREFIX} &7Reset complete for &f%name&7.' + start: '{PREFIX} &7Resetting &f%name%&7...' + end: '{PREFIX} &7Reset complete for &f%name%&7.' list: header: '{PREFIX} &7List of &fReset Zones &9-' format: '&bArena: &c%name% &7- &bMin: &c%min_pos% &7- &bMax: &c%max_pos% &7- &bBlocks: &c%blocks_count%' diff --git a/build.gradle b/build.gradle index 1e54ef9..f1f8473 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,7 @@ buildscript { repositories { - jcenter() + mavenCentral() + gradlePluginPortal() } dependencies { @@ -10,15 +11,16 @@ buildscript { allprojects { group 'me.realized.de' - version '1.0.5' + version '1.0.6-SNAPSHOT' } subprojects { apply plugin: 'java' + apply plugin: 'java-library' apply plugin: 'com.github.johnrengelman.shadow' - sourceCompatibility = 1.8 - targetCompatibility = 1.8 + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 repositories { mavenLocal() diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 933b647..6b7fd26 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip diff --git a/nms/build.gradle b/nms/build.gradle index 513c461..ed3a718 100644 --- a/nms/build.gradle +++ b/nms/build.gradle @@ -1,3 +1,3 @@ dependencies { - compile 'org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT' + implementation 'org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT' } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index c3f28c9..0444c3f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,4 +7,6 @@ include 'v1_12_R1' include 'v1_14_R1' include 'v1_15_R1' include 'v1_16_R3' +include 'v1_17_R1' +include 'v1_18_R1' diff --git a/v1_12_R1/build.gradle b/v1_12_R1/build.gradle index 1b3964c..3571a85 100644 --- a/v1_12_R1/build.gradle +++ b/v1_12_R1/build.gradle @@ -1,4 +1,4 @@ dependencies { - compile 'org.spigotmc:spigot:1.12.2-R0.1-SNAPSHOT' - compile project(':nms') + implementation 'org.spigotmc:spigot:1.12.2-R0.1-SNAPSHOT' + implementation project(':nms') } \ No newline at end of file diff --git a/v1_14_R1/build.gradle b/v1_14_R1/build.gradle index f60ad5a..37ce5bc 100644 --- a/v1_14_R1/build.gradle +++ b/v1_14_R1/build.gradle @@ -1,4 +1,4 @@ dependencies { - compile 'org.spigotmc:spigot:1.14.4-R0.1-SNAPSHOT' - compile project(':nms') + implementation 'org.spigotmc:spigot:1.14.4-R0.1-SNAPSHOT' + implementation project(':nms') } \ No newline at end of file diff --git a/v1_15_R1/build.gradle b/v1_15_R1/build.gradle index 886322e..31f5c49 100644 --- a/v1_15_R1/build.gradle +++ b/v1_15_R1/build.gradle @@ -1,4 +1,4 @@ dependencies { - compile 'org.spigotmc:spigot:1.15.2-R0.1-SNAPSHOT' - compile project(':nms') + implementation 'org.spigotmc:spigot:1.15.2-R0.1-SNAPSHOT' + implementation project(':nms') } \ No newline at end of file diff --git a/v1_16_R3/build.gradle b/v1_16_R3/build.gradle index 57f822d..0470fcd 100644 --- a/v1_16_R3/build.gradle +++ b/v1_16_R3/build.gradle @@ -1,4 +1,4 @@ dependencies { - compile 'org.spigotmc:spigot:1.16.4-R0.1-SNAPSHOT' - compile project(':nms') + implementation 'org.spigotmc:spigot:1.16.4-R0.1-SNAPSHOT' + implementation project(':nms') } \ No newline at end of file diff --git a/v1_17_R1/build.gradle b/v1_17_R1/build.gradle new file mode 100644 index 0000000..551a9cf --- /dev/null +++ b/v1_17_R1/build.gradle @@ -0,0 +1,4 @@ +dependencies { + implementation 'org.spigotmc:spigot:1.17.1-R0.1-SNAPSHOT' + implementation project(':nms') +} \ No newline at end of file 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 new file mode 100644 index 0000000..6cd72f7 --- /dev/null +++ b/v1_17_R1/src/main/java/me/realized/de/arenaregen/nms/v1_17_R1/NMSHandler.java @@ -0,0 +1,56 @@ +package me.realized.de.arenaregen.nms.v1_17_R1; + +import me.realized.de.arenaregen.nms.NMS; +import net.minecraft.core.BlockPosition; +import net.minecraft.network.protocol.game.PacketPlayOutMapChunk; +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.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; +import org.bukkit.craftbukkit.v1_17_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) { + ((CraftPlayer) player).getHandle().b.sendPacket(new PacketPlayOutMapChunk(((CraftChunk) chunk).getHandle())); + } + + @Override + public void setBlockFast(final Block bukkitBlock, final Material material, final int data) { + final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + final BlockPosition position = new BlockPosition(x, y, z); + final Chunk chunk = ((CraftChunk) bukkitBlock.getChunk()).getHandle(); + 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; + } + + 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/build.gradle b/v1_18_R1/build.gradle new file mode 100644 index 0000000..eb98315 --- /dev/null +++ b/v1_18_R1/build.gradle @@ -0,0 +1,4 @@ +dependencies { + implementation 'org.spigotmc:spigot:1.18.1-R0.1-SNAPSHOT' + implementation project(':nms') +} \ No newline at end of file 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 new file mode 100644 index 0000000..0d89a0f --- /dev/null +++ b/v1_18_R1/src/main/java/me/realized/de/arenaregen/nms/v1_18_R1/NMSHandler.java @@ -0,0 +1,57 @@ +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.Material; +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; + +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 Block bukkitBlock, final Material material, final int data) { + final int x = bukkitBlock.getX(), y = bukkitBlock.getY(), z = bukkitBlock.getZ(); + final BlockPosition position = new BlockPosition(x, y, z); + final Chunk chunk = ((CraftChunk) bukkitBlock.getChunk()).getHandle(); + 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; + } + + 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/build.gradle b/v1_8_R3/build.gradle index df6af85..06fecbe 100644 --- a/v1_8_R3/build.gradle +++ b/v1_8_R3/build.gradle @@ -1,4 +1,4 @@ dependencies { - compile 'org.spigotmc:spigot:1.8.8-R0.1-SNAPSHOT' - compile project(':nms') + implementation 'org.spigotmc:spigot:1.8.8-R0.1-SNAPSHOT' + implementation project(':nms') } \ No newline at end of file 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 4068693..10ac9fd 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 @@ -3,9 +3,9 @@ import me.realized.de.arenaregen.nms.NMS; import net.minecraft.server.v1_8_R3.BlockPosition; import net.minecraft.server.v1_8_R3.Chunk; +import net.minecraft.server.v1_8_R3.ChunkCoordIntPair; import net.minecraft.server.v1_8_R3.EnumSkyBlock; import net.minecraft.server.v1_8_R3.IBlockData; -import net.minecraft.server.v1_8_R3.PacketPlayOutMapChunk; import net.minecraft.server.v1_8_R3.World; import org.bukkit.Material; import org.bukkit.block.Block; @@ -20,7 +20,7 @@ public class NMSHandler implements NMS { @Override public void sendChunkUpdate(final Player player, final org.bukkit.Chunk chunk) { - ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutMapChunk(((CraftChunk) chunk).getHandle(), true, 65535)); + ((CraftPlayer) player).getHandle().chunkCoordIntPairQueue.add(new ChunkCoordIntPair(chunk.getX(), chunk.getZ())); } @Override diff --git a/v1_8_R3_paper/build.gradle b/v1_8_R3_paper/build.gradle index 09261c1..28e51ec 100644 --- a/v1_8_R3_paper/build.gradle +++ b/v1_8_R3_paper/build.gradle @@ -1,4 +1,4 @@ dependencies { - compile 'io.papermc:paper:1.8.8-R0.1-SNAPSHOT' - compile project(':nms') + implementation 'io.papermc:paper:1.8.8-R0.1-SNAPSHOT' + implementation project(':nms') } \ No newline at end of file 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 17b3981..1df7c2a 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 @@ -3,9 +3,9 @@ import me.realized.de.arenaregen.nms.NMS; import net.minecraft.server.v1_8_R3.BlockPosition; import net.minecraft.server.v1_8_R3.Chunk; +import net.minecraft.server.v1_8_R3.ChunkCoordIntPair; import net.minecraft.server.v1_8_R3.EnumSkyBlock; import net.minecraft.server.v1_8_R3.IBlockData; -import net.minecraft.server.v1_8_R3.PacketPlayOutMapChunk; import net.minecraft.server.v1_8_R3.World; import org.bukkit.Material; import org.bukkit.block.Block; @@ -20,7 +20,7 @@ public class NMSHandler implements NMS { @Override public void sendChunkUpdate(final Player player, final org.bukkit.Chunk chunk) { - ((CraftPlayer) player).getHandle().playerConnection.sendPacket(new PacketPlayOutMapChunk(((CraftChunk) chunk).getHandle(), true, 65535)); + ((CraftPlayer) player).getHandle().chunkCoordIntPairQueue.add(new ChunkCoordIntPair(chunk.getX(), chunk.getZ())); } @Override