diff --git a/pom.xml b/pom.xml index 5bb0446..fa203cc 100644 --- a/pom.xml +++ b/pom.xml @@ -86,5 +86,13 @@ 7.3.9 provided + + + com.fastasyncworldedit + FastAsyncWorldEdit-Bukkit + 2.13.0 + provided + + diff --git a/src/main/java/hu/jgj52/wolfFFA/Commands/EditKitCommand.java b/src/main/java/hu/jgj52/wolfFFA/Commands/EditKitCommand.java index 2a70313..8999793 100644 --- a/src/main/java/hu/jgj52/wolfFFA/Commands/EditKitCommand.java +++ b/src/main/java/hu/jgj52/wolfFFA/Commands/EditKitCommand.java @@ -3,14 +3,20 @@ package hu.jgj52.wolfFFA.Commands; import hu.jgj52.wolfFFA.Main; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.block.BlockState; +import org.bukkit.block.Container; +import org.bukkit.block.ShulkerBox; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Item; import org.bukkit.entity.Player; +import org.bukkit.entity.Shulker; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BlockStateMeta; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.potion.PotionEffect; @@ -210,6 +216,8 @@ public class EditKitCommand implements CommandExecutor, TabCompleter { ItemStack crossbow = new ItemStack(Material.CROSSBOW); ItemStack flintandsteel = new ItemStack(Material.FLINT_AND_STEEL); ItemStack totem = new ItemStack(Material.TOTEM_OF_UNDYING); + ItemStack pickaxe = new ItemStack(Material.NETHERITE_PICKAXE); + ItemStack shulker = new ItemStack(Material.RED_SHULKER_BOX); sword.addEnchantment(Enchantment.SHARPNESS, 5); sword.addEnchantment(Enchantment.SWEEPING_EDGE, 3); @@ -234,6 +242,9 @@ public class EditKitCommand implements CommandExecutor, TabCompleter { flintandsteel.addEnchantment(Enchantment.MENDING, 1); shield.addEnchantment(Enchantment.UNBREAKING, 3); shield.addEnchantment(Enchantment.MENDING, 1); + pickaxe.addEnchantment(Enchantment.UNBREAKING, 3); + pickaxe.addEnchantment(Enchantment.MENDING, 1); + pickaxe.addEnchantment(Enchantment.EFFICIENCY, 5); PotionMeta fireresistancemeta = (PotionMeta) fireresistance.getItemMeta(); fireresistancemeta.addCustomEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE, 9600, 0), true); @@ -248,6 +259,15 @@ public class EditKitCommand implements CommandExecutor, TabCompleter { speedmeta.setDisplayName("§fSplash Potion of Swiftness"); speed.setItemMeta(speedmeta); + BlockStateMeta shulkermeta = (BlockStateMeta) shulker.getItemMeta(); + ShulkerBox shulkerbox = (ShulkerBox) shulkermeta.getBlockState(); + Inventory shulkerinv = shulkerbox.getInventory(); + for (int i = 0; i < 27; i++) { + shulkerinv.setItem(i, new ItemStack(Material.TNT_MINECART)); + } + shulkermeta.setBlockState(shulkerbox); + shulker.setItemMeta(shulkermeta); + inv.setItem(getItemSlot("axe", "boxcart", player), axe); inv.setItem(getItemSlot("sword", "boxcart", player), sword); for (int slot : getItemSlotArray("enderpearl", "boxcart", player)) { @@ -274,6 +294,8 @@ public class EditKitCommand implements CommandExecutor, TabCompleter { inv.setItem(getItemSlot("cherrylog", "boxcart", player), cherrylog); inv.setItem(getItemSlot("crossbow", "boxcart", player), crossbow); inv.setItem(getItemSlot("flintandsteel", "boxcart", player), flintandsteel); + inv.setItem(getItemSlot("pickaxe", "boxcart", player), pickaxe); + inv.setItem(getItemSlot("shulker", "boxcart", player), shulker); inv.setItem(getItemSlot("totem", "boxcart", player), totem); infoMeta.setDisplayName("§fBoxCart Kit"); diff --git a/src/main/java/hu/jgj52/wolfFFA/Commands/LeaveCommand.java b/src/main/java/hu/jgj52/wolfFFA/Commands/LeaveCommand.java new file mode 100644 index 0000000..e53c11b --- /dev/null +++ b/src/main/java/hu/jgj52/wolfFFA/Commands/LeaveCommand.java @@ -0,0 +1,53 @@ +package hu.jgj52.wolfFFA.Commands; + +import hu.jgj52.wolfFFA.Main; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffect; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class LeaveCommand implements CommandExecutor, TabCompleter { + + private final Main plugin; + + public LeaveCommand(Main plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(@NotNull CommandSender cmds, @NotNull Command command, @NotNull String s, @NotNull String[] args) { + if (cmds.hasPermission("wolfffa.command.leave")) { + if (cmds instanceof Player player) { + Player dameger = plugin.getPlayers().get(player); + if (dameger != null) { + player.setKiller(plugin.getPlayers().get(player)); + plugin.getPlayers().remove(player); + player.setHealth(0); + } else { + player.teleport(new Location(Bukkit.getWorld("world"), 0.5, 1, 0.5)); + player.getInventory().clear(); + player.setHealth(20D); + player.setFoodLevel(20); + player.setSaturation(5); + for (PotionEffect potionEffect : player.getActivePotionEffects()) { + player.removePotionEffect(potionEffect.getType()); + } + } + } + } + return true; + } + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender cmds, @NotNull Command command, @NotNull String s, @NotNull String[] args) { + return List.of(); + } +} diff --git a/src/main/java/hu/jgj52/wolfFFA/Commands/TpToFfaCommand.java b/src/main/java/hu/jgj52/wolfFFA/Commands/TpToFfaCommand.java index 0c4b9f7..034abf9 100644 --- a/src/main/java/hu/jgj52/wolfFFA/Commands/TpToFfaCommand.java +++ b/src/main/java/hu/jgj52/wolfFFA/Commands/TpToFfaCommand.java @@ -5,13 +5,16 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; +import org.bukkit.block.ShulkerBox; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BlockStateMeta; import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; @@ -188,6 +191,8 @@ public class TpToFfaCommand implements CommandExecutor, TabCompleter { ItemStack crossbow = new ItemStack(Material.CROSSBOW); ItemStack flintandsteel = new ItemStack(Material.FLINT_AND_STEEL); ItemStack totem = new ItemStack(Material.TOTEM_OF_UNDYING); + ItemStack pickaxe = new ItemStack(Material.NETHERITE_PICKAXE); + ItemStack shulker = new ItemStack(Material.RED_SHULKER_BOX); helmet.addEnchantment(Enchantment.PROTECTION, 4); helmet.addEnchantment(Enchantment.RESPIRATION, 3); @@ -199,6 +204,7 @@ public class TpToFfaCommand implements CommandExecutor, TabCompleter { leggings.addEnchantment(Enchantment.BLAST_PROTECTION, 4); leggings.addEnchantment(Enchantment.UNBREAKING, 3); leggings.addEnchantment(Enchantment.MENDING, 1); + boots.addEnchantment(Enchantment.FEATHER_FALLING, 4); boots.addEnchantment(Enchantment.PROTECTION, 4); boots.addEnchantment(Enchantment.UNBREAKING,3); boots.addEnchantment(Enchantment.MENDING, 1); @@ -225,6 +231,9 @@ public class TpToFfaCommand implements CommandExecutor, TabCompleter { flintandsteel.addEnchantment(Enchantment.MENDING, 1); shield.addEnchantment(Enchantment.UNBREAKING, 3); shield.addEnchantment(Enchantment.MENDING, 1); + pickaxe.addEnchantment(Enchantment.UNBREAKING, 3); + pickaxe.addEnchantment(Enchantment.MENDING, 1); + pickaxe.addEnchantment(Enchantment.EFFICIENCY, 5); PotionMeta fireresistancemeta = (PotionMeta) fireresistance.getItemMeta(); fireresistancemeta.addCustomEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE, 9600, 0), true); @@ -239,6 +248,15 @@ public class TpToFfaCommand implements CommandExecutor, TabCompleter { speedmeta.setDisplayName("§fSplash Potion of Swiftness"); speed.setItemMeta(speedmeta); + BlockStateMeta shulkermeta = (BlockStateMeta) shulker.getItemMeta(); + ShulkerBox shulkerbox = (ShulkerBox) shulkermeta.getBlockState(); + Inventory shulkerinv = shulkerbox.getInventory(); + for (int i = 0; i < 27; i++) { + shulkerinv.setItem(i, new ItemStack(Material.TNT_MINECART)); + } + shulkermeta.setBlockState(shulkerbox); + shulker.setItemMeta(shulkermeta); + player.getInventory().setArmorContents(new ItemStack[]{boots, leggings, chestplate, helmet}); player.getInventory().setItem(getItemSlot("axe", "boxcart", player), axe); player.getInventory().setItem(getItemSlot("sword", "boxcart", player), sword); @@ -267,6 +285,8 @@ public class TpToFfaCommand implements CommandExecutor, TabCompleter { player.getInventory().setItem(getItemSlot("crossbow", "boxcart", player), crossbow); player.getInventory().setItem(getItemSlot("flintandsteel", "boxcart", player), flintandsteel); player.getInventory().setItem(getItemSlot("totem", "boxcart", player), totem); + player.getInventory().setItem(getItemSlot("pickaxe", "boxcart", player), pickaxe); + player.getInventory().setItem(getItemSlot("shulker", "boxcart", player), shulker); World world = Bukkit.getWorld("world"); double x = -1000.5; diff --git a/src/main/java/hu/jgj52/wolfFFA/Listeners/BlockBreakListener.java b/src/main/java/hu/jgj52/wolfFFA/Listeners/BlockBreakListener.java new file mode 100644 index 0000000..b6c1ce5 --- /dev/null +++ b/src/main/java/hu/jgj52/wolfFFA/Listeners/BlockBreakListener.java @@ -0,0 +1,24 @@ +package hu.jgj52.wolfFFA.Listeners; + +import hu.jgj52.wolfFFA.Main; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; + +public class BlockBreakListener implements Listener { + private final Main plugin; + + public BlockBreakListener(Main plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onBlockBreak(BlockBreakEvent event) { + if (!event.getPlayer().hasPermission("wolfffa.admin.bypass.netheriteblockbreak")) { + if (event.getBlock().getType() == Material.NETHERITE_BLOCK) { + event.setCancelled(true); + } + } + } +} diff --git a/src/main/java/hu/jgj52/wolfFFA/Listeners/KitListener.java b/src/main/java/hu/jgj52/wolfFFA/Listeners/KitListener.java index be9d59c..fe0c9bf 100644 --- a/src/main/java/hu/jgj52/wolfFFA/Listeners/KitListener.java +++ b/src/main/java/hu/jgj52/wolfFFA/Listeners/KitListener.java @@ -60,8 +60,8 @@ public class KitListener implements Listener { Map boxcartKit = new HashMap<>(); int[] boxcartstrenght = new int[]{16, 25, 34}; int[] boxcartspeed = new int[]{17, 26, 35}; - int[] boxcartfireresistance = new int[]{18, 27}; - int[] boxcartcart = new int[]{4, 12, 21, 30, 13, 22, 31, 14, 23, 32, 15, 24, 33}; + int[] boxcartfireresistance = new int[]{24, 33}; + int[] boxcartcart = new int[]{4, 12, 21, 30, 13, 22, 31, 14, 23, 32, 15}; int[] boxcartenderpearl = new int[]{2, 11, 20, 29}; boxcartKit.put("axe", 0); boxcartKit.put("sword", 1); @@ -77,7 +77,9 @@ public class KitListener implements Listener { boxcartKit.put("speed", boxcartspeed); boxcartKit.put("fireresistance", boxcartfireresistance); boxcartKit.put("cherrylog", 10); + boxcartKit.put("pickaxe", 18); boxcartKit.put("crossbow", 19); + boxcartKit.put("shulker", 27); boxcartKit.put("flintandsteel", 28); boxcartKit.put("totem", 40); plugin.getConfig().set("kits.boxcart." + player.getUniqueId(), boxcartKit); diff --git a/src/main/java/hu/jgj52/wolfFFA/Listeners/PlayerDamegeListener.java b/src/main/java/hu/jgj52/wolfFFA/Listeners/PlayerDamegeListener.java new file mode 100644 index 0000000..ea62a8d --- /dev/null +++ b/src/main/java/hu/jgj52/wolfFFA/Listeners/PlayerDamegeListener.java @@ -0,0 +1,22 @@ +package hu.jgj52.wolfFFA.Listeners; + +import hu.jgj52.wolfFFA.Main; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; + +public class PlayerDamegeListener implements Listener { + private final Main plugin; + + public PlayerDamegeListener(Main plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onDamage(EntityDamageByEntityEvent e) { + if (e.getEntity() instanceof Player player && e.getDamager() instanceof Player damager) { + plugin.getPlayers().put(player, damager); + } + } +} diff --git a/src/main/java/hu/jgj52/wolfFFA/Main.java b/src/main/java/hu/jgj52/wolfFFA/Main.java index 3fae19e..f1ac05e 100644 --- a/src/main/java/hu/jgj52/wolfFFA/Main.java +++ b/src/main/java/hu/jgj52/wolfFFA/Main.java @@ -1,14 +1,22 @@ package hu.jgj52.wolfFFA; import hu.jgj52.wolfFFA.Commands.EditKitCommand; +import hu.jgj52.wolfFFA.Commands.LeaveCommand; import hu.jgj52.wolfFFA.Commands.TpToFfaCommand; +import hu.jgj52.wolfFFA.Listeners.BlockBreakListener; import hu.jgj52.wolfFFA.Listeners.KitListener; +import hu.jgj52.wolfFFA.Listeners.PlayerDamegeListener; import hu.jgj52.wolfFFA.Utils.MapReset; +import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; +import java.util.HashMap; +import java.util.Map; + public final class Main extends JavaPlugin { private MapReset mapReset; + private final Map players = new HashMap<>(); @Override public void onEnable() { @@ -18,8 +26,11 @@ public final class Main extends JavaPlugin { getCommand("tptoffa").setExecutor(new TpToFfaCommand(this)); getCommand("editkit").setExecutor(new EditKitCommand(this)); + getCommand("leave").setExecutor(new LeaveCommand(this)); getServer().getPluginManager().registerEvents(new KitListener(this), this); + getServer().getPluginManager().registerEvents(new BlockBreakListener(this), this); + getServer().getPluginManager().registerEvents(new PlayerDamegeListener(this), this); this.mapReset = new MapReset(this); } @@ -27,6 +38,7 @@ public final class Main extends JavaPlugin { @Override public void onDisable() { // Plugin shutdown logic + players.clear(); } public static Main getInstance() { @@ -36,4 +48,8 @@ public final class Main extends JavaPlugin { public MapReset getMapResetManager() { return this.mapReset; } + + public Map getPlayers() { + return this.players; + } } diff --git a/src/main/java/hu/jgj52/wolfFFA/Utils/MapReset.java b/src/main/java/hu/jgj52/wolfFFA/Utils/MapReset.java index 96faaec..a9aa310 100644 --- a/src/main/java/hu/jgj52/wolfFFA/Utils/MapReset.java +++ b/src/main/java/hu/jgj52/wolfFFA/Utils/MapReset.java @@ -1,14 +1,16 @@ package hu.jgj52.wolfFFA.Utils; -import com.fastasyncworldedit.core.FaweAPI; -import com.fastasyncworldedit.core.extent.clipboard.io.ClipboardFormat; -import com.fastasyncworldedit.core.extent.clipboard.io.ClipboardFormats; -import com.fastasyncworldedit.core.extent.clipboard.io.ClipboardReader; -import com.fastasyncworldedit.core.function.operation.Operation; -import com.fastasyncworldedit.core.function.operation.Operations; -import com.fastasyncworldedit.core.worldedit.EditSession; -import com.fastasyncworldedit.core.worldedit.session.ClipboardHolder; -import com.fastasyncworldedit.core.worldedit.math.BlockVector3; +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardReader; +import com.sk89q.worldedit.function.operation.Operation; +import com.sk89q.worldedit.function.operation.Operations; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.session.ClipboardHolder; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; @@ -22,16 +24,30 @@ import org.bukkit.scheduler.BukkitTask; import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.util.ArrayList; +import java.util.Arrays; +import java.util.EnumSet; import java.util.List; +import java.util.Set; public class MapReset { private final JavaPlugin plugin; private BukkitTask resetTask; + private static final long RESET_INTERVAL = 12000L; + private static final int COUNTDOWN_SECONDS = 5; + private static final long SCHEMATIC_PLACEMENT_DELAY = 60L; + private static final Set ENTITIES_TO_REMOVE = EnumSet.of( + EntityType.TNT_MINECART, + EntityType.END_CRYSTAL + ); + + private static final List SCHEMATICS = Arrays.asList( + new SchematicPlacement("world", -76, 91, -1076, "uhc"), + new SchematicPlacement("world", -924, 84, 1081, "boxcart") + ); public MapReset(JavaPlugin plugin) { this.plugin = plugin; - mapResetRunnable(); + startMapResetScheduler(); } public boolean placeSchematic(World world, int x, int y, int z, String schematicName) { @@ -48,30 +64,32 @@ public class MapReset { return false; } - try (ClipboardReader reader = format.getReader(new FileInputStream(schematicFile))) { - ClipboardHolder clipboard = new ClipboardHolder(reader.read()); + try (FileInputStream fis = new FileInputStream(schematicFile); + ClipboardReader reader = format.getReader(fis)) { - EditSession editSession = FaweAPI.getWorld(world.getName()).getEditSession(); - editSession.setFastMode(true); // Optimize for FAWE + Clipboard clipboard = reader.read(); + com.sk89q.worldedit.world.World weWorld = BukkitAdapter.adapt(world); - Operation operation = clipboard - .createPaste(editSession) - .to(BlockVector3.at(x, y, z)) - .ignoreAirBlocks(false) - .build(); + try (EditSession editSession = WorldEdit.getInstance().newEditSession(weWorld)) { + Operation operation = new ClipboardHolder(clipboard) + .createPaste(editSession) + .to(BlockVector3.at(x, y, z)) + .ignoreAirBlocks(false) + .build(); - Operations.complete(operation); - editSession.flushSession(); - return true; + Operations.complete(operation); + editSession.flushSession(); + return true; + } } catch (IOException e) { plugin.getLogger().severe("Error reading schematic file: " + e.getMessage()); e.printStackTrace(); - return false; } catch (Exception e) { plugin.getLogger().severe("Error placing schematic: " + e.getMessage()); e.printStackTrace(); - return false; } + + return false; } public boolean placeSchematic(Location location, String schematicName) { @@ -85,110 +103,100 @@ public class MapReset { } public void placeSchematicsSequentially() { - class SchematicPlacement { - final World world; - final int x, y, z; - final String name; - - SchematicPlacement(World world, int x, int y, int z, String name) { - this.world = world; - this.x = x; - this.y = y; - this.z = z; - this.name = name; - } - } - - List schematics = new ArrayList<>(); - schematics.add(new SchematicPlacement(Bukkit.getWorld("world"), -76, 91, -1076, "uhc")); - schematics.add(new SchematicPlacement(Bukkit.getWorld("world"), -1078, 87, 1076, "boxcart")); - new BukkitRunnable() { int index = 0; @Override public void run() { - if (index < schematics.size()) { - SchematicPlacement placement = schematics.get(index); - for (Player player : Bukkit.getOnlinePlayers()) { - player.sendMessage("§ePlacing schematic " + placement.name + "..."); + if (index < SCHEMATICS.size()) { + SchematicPlacement placement = SCHEMATICS.get(index); + + World world = Bukkit.getWorld(placement.worldName); + if (world == null) { + index++; + return; } boolean success = placeSchematic( - placement.world, + world, placement.x, placement.y, placement.z, placement.name ); - if (success) { - for (Player player : Bukkit.getOnlinePlayers()) { - player.sendMessage("§aSchematic " + placement.name + " placed successfully!"); - } - } else { - for (Player player : Bukkit.getOnlinePlayers()) { - player.sendMessage("§cFailed to place schematic " + placement.name); - } - } - index++; } else { removeEntities(); - for (Player player : Bukkit.getOnlinePlayers()) { - player.sendMessage("§cA mapok resetelve lettek!"); - } + broadcastMessage("§cA mapok resetelve lettek!"); this.cancel(); } } - }.runTaskTimer(plugin, 0L, 20L); + }.runTaskTimer(plugin, 0L, SCHEMATIC_PLACEMENT_DELAY); } private void removeEntities() { for (World world : Bukkit.getWorlds()) { for (Entity entity : world.getEntities()) { - if (entity.getType() == EntityType.TNT_MINECART || - entity.getType() == EntityType.END_CRYSTAL) { + if (ENTITIES_TO_REMOVE.contains(entity.getType())) { entity.remove(); } } } } - public void mapResetRunnable() { - if (resetTask != null && !resetTask.isCancelled()) { - resetTask.cancel(); - } + public void startMapResetScheduler() { + stopScheduler(); resetTask = new BukkitRunnable() { @Override public void run() { - new BukkitRunnable() { - int countdown = 5; - - @Override - public void run() { - if (countdown > 0) { - for (Player player : Bukkit.getOnlinePlayers()) { - player.sendMessage("§cA mapok resetelődnek " + countdown + " másodperc múlva!"); - } - countdown--; - } else { - // Start sequential schematic placement - placeSchematicsSequentially(); - this.cancel(); - } - } - }.runTaskTimer(plugin, 0L, 20L); + startCountdown(); } - }.runTaskTimer(plugin, 0L, 12000L); + }.runTaskTimer(plugin, 0L, RESET_INTERVAL); + } + + private void startCountdown() { + new BukkitRunnable() { + int countdown = COUNTDOWN_SECONDS; + + @Override + public void run() { + if (countdown > 0) { + broadcastMessage("§cA mapok resetelődnek " + countdown + " másodperc múlva!"); + countdown--; + } else { + placeSchematicsSequentially(); + this.cancel(); + } + } + }.runTaskTimer(plugin, 0L, 20L); + } + + private void broadcastMessage(String message) { + for (Player player : Bukkit.getOnlinePlayers()) { + player.sendMessage(message); + } } - // Method to stop the scheduler (call this in onDisable) public void stopScheduler() { if (resetTask != null && !resetTask.isCancelled()) { resetTask.cancel(); resetTask = null; } } -} + + private static class SchematicPlacement { + final String worldName; + final int x, y, z; + final String name; + + SchematicPlacement(String worldName, int x, int y, int z, String name) { + this.worldName = worldName; + this.x = x; + this.y = y; + this.z = z; + this.name = name; + } + } +} \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index b8dbc1b..24488d5 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -8,4 +8,7 @@ commands: usage: /tptoffa editkit: permission: wolfffa.command.editkit - usage: /editkit \ No newline at end of file + usage: /editkit + leave: + permission: wolfffa.command.leave + usage: /leave \ No newline at end of file