From e63ac83c177c3e759437fe3eebc9f249f5eacb41 Mon Sep 17 00:00:00 2001 From: hdvt Date: Sat, 28 Jun 2025 00:36:06 +0300 Subject: [PATCH] idk some "cool" stuff --- .gitignore | 3 + .gradle/8.8/checksums/md5-checksums.bin | Bin 19547 -> 23647 bytes .idea/modules.xml | 1 + .../hdvtdev/blockAndSeek/BlockAndSeek.java | 5 + .../blockAndSeek/BlockAndSeekGame.java | 35 +++- .../hdvtdev/blockAndSeek/BlockAndSeekMap.java | 8 +- .../hdvtdev/blockAndSeek/CommandListener.java | 70 +++++-- .../hdvtdev/blockAndSeek/EventListener.java | 132 +++----------- .../hdvtdev/blockAndSeek/GamesManager.java | 106 ----------- .../hdvtdev/blockAndSeek/Localization.java | 36 +++- .../{ => managers}/ConfigManager.java | 102 +++++++---- .../blockAndSeek/managers/FreezeManager.java | 92 ++++++++++ .../blockAndSeek/managers/GamesManager.java | 171 ++++++++++++++++++ .../blockAndSeek/managers/MapsManager.java | 11 ++ .../roulette/RouletteCreator.java | 14 +- .../roulette/RouletteGenerator.java | 10 +- src/main/resources/localization.yml | 15 +- 17 files changed, 499 insertions(+), 312 deletions(-) create mode 100644 .gitignore delete mode 100644 src/main/java/hdvtdev/blockAndSeek/GamesManager.java rename src/main/java/hdvtdev/blockAndSeek/{ => managers}/ConfigManager.java (70%) create mode 100644 src/main/java/hdvtdev/blockAndSeek/managers/FreezeManager.java create mode 100644 src/main/java/hdvtdev/blockAndSeek/managers/GamesManager.java create mode 100644 src/main/java/hdvtdev/blockAndSeek/managers/MapsManager.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f5580ba --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/.gradle/ +/gradle/ +/bin/ diff --git a/.gradle/8.8/checksums/md5-checksums.bin b/.gradle/8.8/checksums/md5-checksums.bin index ce209b4345a30046967db5296aa48bfb97e7ea71..9770ed1f0d07efe77e6a99a0860db7c2ab77d9e8 100644 GIT binary patch literal 23647 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 + diff --git a/src/main/java/hdvtdev/blockAndSeek/BlockAndSeek.java b/src/main/java/hdvtdev/blockAndSeek/BlockAndSeek.java index de409f0..f2cab4a 100644 --- a/src/main/java/hdvtdev/blockAndSeek/BlockAndSeek.java +++ b/src/main/java/hdvtdev/blockAndSeek/BlockAndSeek.java @@ -1,5 +1,6 @@ package hdvtdev.blockAndSeek; +import hdvtdev.blockAndSeek.managers.ConfigManager; import me.libraryaddict.disguise.LibsDisguises; import org.bukkit.Bukkit; import org.bukkit.command.CommandExecutor; @@ -24,6 +25,10 @@ public class BlockAndSeek extends JavaPlugin implements CommandExecutor { return javaPlugin.getDataFolder(); } + public static File getServerDataFolder() { + return javaPlugin.getServer().getPluginsFolder().getParentFile(); + } + public static InputStream getPluginResource(String resource) { return javaPlugin.getResource(resource); } diff --git a/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekGame.java b/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekGame.java index a9beda5..b32195f 100644 --- a/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekGame.java +++ b/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekGame.java @@ -1,12 +1,15 @@ package hdvtdev.blockAndSeek; import me.libraryaddict.disguise.DisguiseAPI; +import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.persistence.PersistentDataType; import java.security.SecureRandom; +import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; @@ -15,24 +18,32 @@ public class BlockAndSeekGame { private final ConcurrentHashMap players = new ConcurrentHashMap<>(); - private AtomicBoolean started = new AtomicBoolean(false); + private final AtomicBoolean started = new AtomicBoolean(false); private final String name; + private final int maxPlayers; - public BlockAndSeekGame(String name) { + + public BlockAndSeekGame(String name, int maxPlayers) { this.name = name; + this.maxPlayers = maxPlayers; + } + + public List getHiders() { + return players.entrySet().stream().filter(e -> Objects.equals(e.getValue(), PlayerType.HIDER)).map(Map.Entry::getKey).toList(); } public void end() { for (Player player : players.keySet()) { - EventListener.unfreezePlayer(player); + //EventListener.unfreezePlayer(player); TODO player.getPersistentDataContainer().remove(BlockAndSeekContainer.PLAYER); player.sendBlockChange(player.getLocation(), Material.AIR.createBlockData()); + player.setGameMode(GameMode.SURVIVAL); DisguiseAPI.undisguiseToAll(player); } } public boolean addPlayer(Player player) { - if (started.get()) { + if (started.get() || playerCount() + 1 > maxPlayers) { return false; } player.getPersistentDataContainer().set(BlockAndSeekContainer.PLAYER, PersistentDataType.STRING, name); @@ -44,6 +55,11 @@ public class BlockAndSeekGame { players.remove(player); } + public void setSpectator(Player player) { + players.put(player, PlayerType.SPECTATOR); + player.setGameMode(GameMode.SPECTATOR); + } + public Set getPlayers() { return players.keySet(); } @@ -59,7 +75,7 @@ public class BlockAndSeekGame { return (int) players.values().stream().filter(f -> f.equals(PlayerType.SEEKER)).count(); } - public int hidersCound() { + public int hidersCount() { return (int) players.values().stream().filter(f -> f.equals(PlayerType.HIDER)).count(); } @@ -80,14 +96,19 @@ public class BlockAndSeekGame { int i = 0; int randomNum = random.nextInt(0, players.size()); for (Player player : players.keySet()) { - if (i == randomNum) return player; + if (i == randomNum) { + players.put(player, PlayerType.SEEKER); + return player; + } + i++; } return null; } private enum PlayerType { SEEKER, - HIDER + HIDER, + SPECTATOR } diff --git a/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekMap.java b/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekMap.java index c78844b..a2a2a41 100644 --- a/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekMap.java +++ b/src/main/java/hdvtdev/blockAndSeek/BlockAndSeekMap.java @@ -1,13 +1,17 @@ package hdvtdev.blockAndSeek; + import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; import java.util.List; -public record BlockAndSeekMap(List spawn, List lobby, int duration, List blocks) { +public record BlockAndSeekMap(List spawn, List lobby, int duration, int minPlayers, int maxPlayers, + List blocks) { + + public record Block(@NotNull ItemStack block, int chance) { - public record Block(ItemStack block, int chance) { } } diff --git a/src/main/java/hdvtdev/blockAndSeek/CommandListener.java b/src/main/java/hdvtdev/blockAndSeek/CommandListener.java index cf72e20..0a2a51c 100644 --- a/src/main/java/hdvtdev/blockAndSeek/CommandListener.java +++ b/src/main/java/hdvtdev/blockAndSeek/CommandListener.java @@ -1,7 +1,10 @@ package hdvtdev.blockAndSeek; -import hdvtdev.blockAndSeek.roulette.RouletteCreator; +import hdvtdev.blockAndSeek.managers.ConfigManager; +import hdvtdev.blockAndSeek.managers.FreezeManager; +import hdvtdev.blockAndSeek.managers.GamesManager; import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -36,8 +39,20 @@ public class CommandListener implements CommandExecutor, TabCompleter { switch (args[0]) { case "test" -> { + switch (GamesManager.createGame("dust2")) { + case 1 -> { + sender.sendMessage("Game already exist"); + GamesManager.get("dust2").addPlayer((Player) sender); + } + case 2 -> sender.sendMessage("Could not find world"); + default -> GamesManager.get("dust2").addPlayer((Player) sender); + } + + } + case "locale" -> { if (sender instanceof Player player) { - RouletteCreator.createRoulette(player, null, true); + player.sendMessage(player.locale().toLanguageTag()); + player.sendMessage("eq: " + player.locale().toLanguageTag().equals("en-US")); } } case "freeze" -> { @@ -50,6 +65,12 @@ public class CommandListener implements CommandExecutor, TabCompleter { player.getInventory().addItem(foo); } } + case "f" -> { + if (sender instanceof Player player) { + FreezeManager.freeze(player, Material.TARGET); + } + } + case "foo" -> { if (sender instanceof Player player) { ItemStack foo = new ItemStack(Material.BROWN_DYE); @@ -86,10 +107,11 @@ public class CommandListener implements CommandExecutor, TabCompleter { switch (args[1]) { case "localization" -> { try { + ConfigManager.load("localization.yml"); - sender.sendMessage(Localization.getPrefix().append(Localization.getComponent("successful-reload", "{config}", "localization.yml"))); + sender.sendMessage(Localization.getComponentWithPrefix("successful-reload", "{config}", "localization.yml")); } catch (IOException e) { - sender.sendMessage(Localization.getComponent("failed-reload", "{config}", "localization.yml", "{e}", e.getMessage())); + sender.sendMessage(Localization.getComponentWithPrefix("failed-reload", "{config}", "localization.yml", "{e}", e.getMessage())); } } @@ -120,29 +142,28 @@ public class CommandListener implements CommandExecutor, TabCompleter { @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - sender.sendActionBar(MiniMessage.miniMessage().deserialize("" + args.length)); + boolean hasPermission = sender.hasPermission("blockandseek.manage"); return switch (args.length) { case 1 -> { - if (sender.hasPermission("blockandseek.manage")) { - yield List.of("reload", "help", "map", "join"); - } else yield List.of("help", "join"); + if (hasPermission) { + yield List.of("reload", "help", "map"); + } else yield List.of("help"); } case 2 -> switch (args[0]) { case "map" -> { List scmds = new ArrayList<>(); - /* - if (sender.hasPermission("blockandseek.manage")) { + + if (hasPermission) { scmds.addAll(List.of("create", "list")); - scmds.addAll(ConfigManager.createdMaps()); + scmds.addAll(ConfigManager.getAllMaps()); } - */ + yield scmds; } - case "join" -> List.of("test"); //TODO case "reload" -> { - if (sender.hasPermission("blockandseek.manage")) { - yield List.of("messages", "maps"); + if (hasPermission) { + yield List.of("localization", "config"); } else yield List.of(); } default -> List.of(); @@ -150,15 +171,24 @@ public class CommandListener implements CommandExecutor, TabCompleter { case 3 -> switch (args[1]) { case "create", "list" -> List.of(); default -> { - /* - if (ConfigManager.createdMaps().contains(args[1]) && sender.hasPermission("blockandseek.manage")) { - yield List.of("setspawn", "setlobby", "setduration"); + + if (ConfigManager.getAllMaps().contains(args[1]) && hasPermission) { + yield List.of("setspawn", "setlobby", "setduration", "setmaxplayers", "setminplayers", "status", "remove"); } else yield List.of(); - */ - yield List.of(); } }; + case 4 -> switch (args[2]) { + case "setspawn", "setlobby" -> { + if (hasPermission && sender instanceof Player player) { + Location location = player.getLocation(); + yield List.of(String.format("%.1f %.0f %.1f", location.getX(), location.getY(), location.getZ())); + } else yield List.of(); + } + default -> List.of(); + }; + + default -> List.of(); }; } diff --git a/src/main/java/hdvtdev/blockAndSeek/EventListener.java b/src/main/java/hdvtdev/blockAndSeek/EventListener.java index 7d7e77b..2427dca 100644 --- a/src/main/java/hdvtdev/blockAndSeek/EventListener.java +++ b/src/main/java/hdvtdev/blockAndSeek/EventListener.java @@ -1,25 +1,26 @@ package hdvtdev.blockAndSeek; +import hdvtdev.blockAndSeek.managers.FreezeManager; +import hdvtdev.blockAndSeek.managers.GamesManager; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.disguisetypes.DisguiseType; import me.libraryaddict.disguise.disguisetypes.MiscDisguise; -import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.Bukkit; -import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.Sound; -import org.bukkit.block.Block; +import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; import org.bukkit.potion.PotionEffect; @@ -34,7 +35,7 @@ public class EventListener implements Listener { private static final ConcurrentHashMap tasks = new ConcurrentHashMap<>(); private static final ConcurrentHashMap soundCoolDown = new ConcurrentHashMap<>(); - private static final ConcurrentHashMap frozenPlayers = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap frozenPlayers = new ConcurrentHashMap<>(); private static final Vector ZERO_VELOCITY = new Vector(0, 0, 0); private static final PotionEffect INVISIBILITY = new PotionEffect(PotionEffectType.INVISIBILITY, PotionEffect.INFINITE_DURATION, 2, false, false); @@ -52,9 +53,7 @@ public class EventListener implements Listener { public void onPlayerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); PersistentDataContainer container = player.getPersistentDataContainer(); - if (frozenPlayers.remove(player) != null) { - unfreezePlayer(player); - } + String arena = container.get(BlockAndSeekContainer.PLAYER, PersistentDataType.STRING); if (arena != null) { container.remove(BlockAndSeekContainer.PLAYER); @@ -62,118 +61,31 @@ public class EventListener implements Listener { } } + @EventHandler + public void onPlayerDeath(PlayerDeathEvent event) { + + } + + @EventHandler public void onDamage(EntityDamageByEntityEvent event) { - if (event.getEntity() instanceof Player victim) { - PersistentDataContainer container = victim.getPersistentDataContainer(); - if (event.getDamager() instanceof Player && container.has(BlockAndSeekContainer.FROZEN_PLAYER)) { - BlockAndSeekGame game = GamesManager.get(container.get(BlockAndSeekContainer.PLAYER, PersistentDataType.STRING)); - for (Player player : game.getPlayers()) { - player.sendBlockChange(frozenPlayers.get(victim), Material.AIR.createBlockData()); - } - unfreezePlayer(victim); - } - } + } @EventHandler public void onRightClick(PlayerInteractEvent event) { - Player player = event.getPlayer(); - ItemStack item = player.getInventory().getItemInMainHand(); - ItemMeta itemMeta = item.getItemMeta(); - if (itemMeta != null) { - - PersistentDataContainer data = itemMeta.getPersistentDataContainer(); - PersistentDataContainer playerData = player.getPersistentDataContainer(); - - if (data.has(BlockAndSeekContainer.SOUND_ITEM)) { - Long time = soundCoolDown.get(player); - if (time != null) { - long diff = System.currentTimeMillis() - time; - if (diff > 3000) { - soundCoolDown.remove(player); - } else { - player.sendActionBar(MiniMessage.miniMessage().deserialize("Подождите немного перед следующим использованием")); - return; - } - } - Location location = player.getLocation(); - for (Player p : Bukkit.getOnlinePlayers()) { - p.playSound(location, Sound.ENTITY_CHICKEN_AMBIENT, 2f, 1.5f); - } - soundCoolDown.put(player, System.currentTimeMillis()); + if (event.getHand() != EquipmentSlot.HAND) return; + Action action = event.getAction(); + if (action == Action.RIGHT_CLICK_BLOCK || action == Action.RIGHT_CLICK_AIR) { + Player player = event.getPlayer(); + if (player.getInventory().getItemInMainHand().equals(new ItemStack(Material.HEART_OF_THE_SEA))) { + FreezeManager.freeze(player, Material.TARGET); } - - if (data.has(BlockAndSeekContainer.FREEZE_ITEM)) { - - String arena = playerData.get(BlockAndSeekContainer.PLAYER, PersistentDataType.STRING); - if (arena != null) { - BlockAndSeekGame game = GamesManager.get(arena); - if (frozenPlayers.remove(player) != null) { - for (Player p : game.getPlayers()) { - p.sendBlockChange(player.getLocation(), Material.AIR.createBlockData()); - } - unfreezePlayer(player); - } else { - if (game.isStarted()) { - Location playerLocation = player.getLocation(); - Block block = playerLocation.getBlock(); - Block upperBlock = player.getLocation().getBlock(); - if (!upperBlock.isSolid()) { - - Location blockLocation = block.getLocation(); - blockLocation.setX(blockLocation.getX() + 0.5); - double y = Math.round(blockLocation.getY()); - blockLocation.setY(block.isSolid() ? y + 1 : y); - blockLocation.setZ(blockLocation.getZ() + 0.5); - blockLocation.setPitch(playerLocation.getPitch()); - blockLocation.setYaw(playerLocation.getYaw()); - - player.getPersistentDataContainer().set(BlockAndSeekContainer.FROZEN_PLAYER, PersistentDataType.BOOLEAN, true); - - player.setWalkSpeed(0); - player.setFreezeTicks(40); - player.setVelocity(ZERO_VELOCITY); - player.setFlySpeed(0); - player.setAllowFlight(true); - player.setFlying(true); - player.setGravity(false); - player.addPotionEffect(INVISIBILITY); - BlockAndSeekContainer.NO_COLLIDE_TEAM.addEntry(player.getName()); - - for (Player p : Bukkit.getOnlinePlayers()) { - p.sendBlockChange(blockLocation, Material.CHORUS_PLANT.createBlockData()); - } - - player.teleport(blockLocation); - frozenPlayers.put(player, blockLocation); - } else - player.sendActionBar(MiniMessage.miniMessage().deserialize(" Could not freeze here!")); - - } else - player.sendActionBar(MiniMessage.miniMessage().deserialize(" Could not freeze now!")); - - } - } else player.sendActionBar(MiniMessage.miniMessage().deserialize(" Could not freeze now!")); - } - - - } + } else event.getPlayer().sendMessage(action.toString()); } - public static void unfreezePlayer(Player player) { - player.getPersistentDataContainer().remove(BlockAndSeekContainer.FROZEN_PLAYER); - player.setFlySpeed(0.2f); - player.setWalkSpeed(0.2f); - player.setAllowFlight(false); - player.setFlying(false); - BlockAndSeekContainer.NO_COLLIDE_TEAM.removeEntry(player.getName()); - player.setGravity(true); - player.setFreezeTicks(0); - player.removePotionEffect(PotionEffectType.INVISIBILITY); - } @EventHandler public void onClick(InventoryClickEvent event) { diff --git a/src/main/java/hdvtdev/blockAndSeek/GamesManager.java b/src/main/java/hdvtdev/blockAndSeek/GamesManager.java deleted file mode 100644 index 3e0b13d..0000000 --- a/src/main/java/hdvtdev/blockAndSeek/GamesManager.java +++ /dev/null @@ -1,106 +0,0 @@ -package hdvtdev.blockAndSeek; - -import hdvtdev.blockAndSeek.roulette.RouletteCreator; -import net.kyori.adventure.text.Component; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -public class GamesManager { - - private static final ConcurrentHashMap games = new ConcurrentHashMap<>(); - - public static boolean isExist(String name) { - return games.containsKey(name); - } - - public static Set getAvailableGames() { - return games.keySet(); - } - - public static int createGame(String name) { - if (games.containsKey(name)) return 1; - if (Bukkit.getWorld(name) == null) return 2; - BlockAndSeekGame game = new BlockAndSeekGame(name); - games.put(name, game); - - new BukkitRunnable() { - - int duration = 30; - int waitTime = 10; - - - @Override - public void run() { - - if (!game.isStarted()) { - int playerCount = game.playerCount(); - - for (Player player : game.getPlayers()) { - player.sendActionBar(Component.text("Игроков " + playerCount + "/12")); - } - - if (playerCount > 1) { - - if (waitTime == 0) { - game.start(); - for (Player player : game.getPlayers()) { - RouletteCreator.createRoulette(player, null, true); - } - } else { - for (Player player : game.getPlayers()) { - player.sendMessage(Component.text("Осталось: " + waitTime)); - } - waitTime--; - } - - } else waitTime = 10; - - } else { - - if (game.hidersCound() == 0) { - - for (Player player : game.getPlayers()) { - player.sendActionBar(Component.text("Сикеры победили!")); - //TODO - } - - game.end(); - games.remove(name); - this.cancel(); - } - - for (Player player : game.getPlayers()) { - player.sendActionBar(Component.text("Осталось: " + duration)); - } - - if (duration == 0) { - for (Player player : game.getPlayers()) { - player.sendActionBar(Component.text("Хайдеры победили!")); - } - game.end(); - games.remove(name); - this.cancel(); - } else duration--; - - - } - - - } - - - }.runTaskTimer(BlockAndSeek.getInstance(), 0L, 20L); - - - return 0; - } - - public static BlockAndSeekGame get(String name) { - return games.get(name); - } - -} diff --git a/src/main/java/hdvtdev/blockAndSeek/Localization.java b/src/main/java/hdvtdev/blockAndSeek/Localization.java index 5ea65f6..7d58076 100644 --- a/src/main/java/hdvtdev/blockAndSeek/Localization.java +++ b/src/main/java/hdvtdev/blockAndSeek/Localization.java @@ -1,26 +1,33 @@ package hdvtdev.blockAndSeek; +import hdvtdev.blockAndSeek.managers.ConfigManager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import java.util.Collections; import java.util.Map; public class Localization { - private static volatile Map localization = ConfigManager.getLocalization(); + private static volatile Map> localization = Collections.unmodifiableMap(ConfigManager.getLocalization()); private static final MiniMessage miniMessage = MiniMessage.miniMessage(); private static final Component prefix = miniMessage.deserialize("[BlockAndSeek] "); - public static Component getPrefix() { - return prefix; - } - public static void update() { - localization = ConfigManager.getLocalization(); + localization = Collections.unmodifiableMap(ConfigManager.getLocalization()); } - public static String get(String key, String... replacements) { - String s = localization.get(key); + public static String get(@NotNull String key, String... replacements) { + return getLang(null, key, replacements); + } + + public static String getLang(@Nullable String lang, @NotNull String key, String... replacements) { + lang = lang == null || !localization.containsKey(lang) ? "en-US" : lang; + + + String s = localization.get(lang).get(key); if (s != null) { for (int i = 0; i < replacements.length; i += 2) { s = s.replace(replacements[i], replacements[i + 1]); @@ -30,8 +37,19 @@ public class Localization { } public static Component getComponent(String key, String... replacements) { - return miniMessage.deserialize(get(key, replacements)); + return getLangComponent(null, key, replacements); } + public static Component getLangComponent(String lang, String key, String... replacements) { + return miniMessage.deserialize(getLang(lang, key, replacements)); + } + + public static Component getLangComponentWithPrefix(String lang, String key, String... replacements) { + return prefix.append(getLangComponent(lang, key, replacements)); + } + + public static Component getComponentWithPrefix(String key, String... replacements) { + return prefix.append(getLangComponent(null, key, replacements)); + } } diff --git a/src/main/java/hdvtdev/blockAndSeek/ConfigManager.java b/src/main/java/hdvtdev/blockAndSeek/managers/ConfigManager.java similarity index 70% rename from src/main/java/hdvtdev/blockAndSeek/ConfigManager.java rename to src/main/java/hdvtdev/blockAndSeek/managers/ConfigManager.java index dbd4884..bc84c32 100644 --- a/src/main/java/hdvtdev/blockAndSeek/ConfigManager.java +++ b/src/main/java/hdvtdev/blockAndSeek/managers/ConfigManager.java @@ -1,5 +1,8 @@ -package hdvtdev.blockAndSeek; +package hdvtdev.blockAndSeek.managers; +import hdvtdev.blockAndSeek.BlockAndSeek; +import hdvtdev.blockAndSeek.BlockAndSeekMap; +import hdvtdev.blockAndSeek.Localization; import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; @@ -9,20 +12,21 @@ import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; public class ConfigManager { - private static volatile ConcurrentHashMap localization = new ConcurrentHashMap<>(); - private static volatile ConcurrentHashMap config = new ConcurrentHashMap<>(); - private static volatile ConcurrentHashMap maps = new ConcurrentHashMap<>(); + private static volatile Map> localization; + private static volatile Map config; + private static Map maps = new ConcurrentHashMap<>(); private static final File mapsFile = new File(BlockAndSeek.getPluginDataFolder(), "maps.yml"); + public static BlockAndSeekMap getMap(String name) { + return maps.get(name); + } + public static Set getAllMaps() { return YamlConfiguration.loadConfiguration(mapsFile).getKeys(false); } @@ -31,7 +35,9 @@ public class ConfigManager { SPAWN_REQUIRED, LOBBY_REQUIRED, DURATION_REQUIRED, - BLOCKS_REQUIRED + BLOCKS_REQUIRED, + MIN_PLAYERS_REQUIRED, + MAX_PLAYERS_REQUIRED } public static Set getReadyMaps() { @@ -52,6 +58,10 @@ public class ConfigManager { if (lobby.size() != 3) status.add(MapStatus.LOBBY_REQUIRED); int duration = section.getInt("duration"); if (duration <= 0) status.add(MapStatus.DURATION_REQUIRED); + int minPlayers = section.getInt("min-players"); + if (minPlayers <= 0) status.add(MapStatus.MIN_PLAYERS_REQUIRED); + int maxPlayers = section.getInt("max-players"); + if (maxPlayers <= 0) status.add(MapStatus.MAX_PLAYERS_REQUIRED); List blocks = section.getMapList("blocks").stream().map( block -> { try { @@ -67,7 +77,8 @@ public class ConfigManager { ).toList(); if (blocks.isEmpty() || new HashSet<>(blocks).size() == 1) status.add(MapStatus.BLOCKS_REQUIRED); - if (status.isEmpty()) maps.put(name, new BlockAndSeekMap(spawn, lobby, duration, blocks)); + if (status.isEmpty()) + maps.put(name, new BlockAndSeekMap(spawn, lobby, duration, minPlayers, maxPlayers, blocks)); } else return null; @@ -84,6 +95,8 @@ public class ConfigManager { section.set("spawn", List.of()); section.set("lobby", List.of()); section.set("duration", 0); + section.set("min-players", 0); + section.set("max-players", 0); section.set("blocks", List.of(Map.of())); try { @@ -127,19 +140,22 @@ public class ConfigManager { if (!conf.exists()) { BlockAndSeek.saveResource(file); - ConcurrentHashMap confMap = new ConcurrentHashMap<>(); switch (file) { case "config.yml" -> { + Map confMap = new HashMap<>(); for (String key : defaultConfiguration.getKeys(false)) { confMap.put(key, defaultConfiguration.getString(key, "NULL")); } config = confMap; } case "localization.yml" -> { - for (String key : defaultConfiguration.getConfigurationSection("en_US").getKeys(false)) { - confMap.put(key, defaultConfiguration.getString(key, "NULL")); + Map> confMap = new HashMap<>(); + Map lang = new HashMap<>(); + for (String key : defaultConfiguration.getConfigurationSection("en-US").getKeys(false)) { + lang.put(key, defaultConfiguration.getString(key, "NULL")); } + confMap.put("en-US", lang); localization = confMap; Localization.update(); } @@ -158,7 +174,7 @@ public class ConfigManager { } private static void loadMaps(File configurationFile) throws IOException { - ConcurrentHashMap confMap = new ConcurrentHashMap<>(); + Map confMap = new ConcurrentHashMap<>(); YamlConfiguration configuration = YamlConfiguration.loadConfiguration(configurationFile); for (String map : configuration.getKeys(false)) { @@ -167,24 +183,28 @@ public class ConfigManager { List spawn = section.getIntegerList("spawn"); List lobby = section.getIntegerList("lobby"); int duration = section.getInt("duration"); + int minPlayers = section.getInt("min-players"); + int maxPlayers = section.getInt("max-players"); List blocks = section.getMapList("blocks").stream().map( block -> { try { return new BlockAndSeekMap.Block( - new ItemStack(Material.valueOf(((String) block.get("name")).toUpperCase())), + new ItemStack(Material.valueOf(((String) block.get("block")).toUpperCase())), (int) block.get("chance") ); } catch (IllegalArgumentException | ClassCastException | NullPointerException ignored) { return null; + } } - ).toList(); + ).filter(Objects::nonNull).toList(); - if (!spawn.isEmpty() && !lobby.isEmpty() && duration != 0 && !blocks.isEmpty()) { - confMap.put(map, new BlockAndSeekMap(spawn, lobby, duration, blocks)); + if (!spawn.isEmpty() && !lobby.isEmpty() && duration > 0 && !blocks.isEmpty() && minPlayers > 0 && maxPlayers > 0) { + confMap.put(map, new BlockAndSeekMap(spawn, lobby, duration, minPlayers, maxPlayers, blocks)); } } + maps = confMap; } @@ -212,40 +232,44 @@ public class ConfigManager { private static void loadLocalization(File configurationFile, YamlConfiguration defaultConfiguration) throws IOException { - ConcurrentHashMap confMap = new ConcurrentHashMap<>(); + Map> confMap = new HashMap<>(); YamlConfiguration configuration = YamlConfiguration.loadConfiguration(configurationFile); - String language = config.get("language"); - ConfigurationSection defaultSection = defaultConfiguration.getConfigurationSection("en_US"); - ConfigurationSection configSection = configuration.getConfigurationSection(language); + ConfigurationSection defaultSection = defaultConfiguration.getConfigurationSection("en-US"); + + for (String langKey : configuration.getKeys(false)) { + ConfigurationSection configSection = configuration.getConfigurationSection(langKey); + Map langMap = new HashMap<>(); + + if (configSection != null) { + for (String key : defaultSection.getKeys(false)) { + if (configSection.contains(key)) { + langMap.put(key, configSection.getString(key, defaultSection.getString(key, "NULL"))); + } else { + String value = defaultSection.getString(key, "NULL"); + configSection.set(key, value); + langMap.put(key, value); + } - if (configSection != null) { - for (String key : defaultSection.getKeys(false)) { - if (configSection.contains(key)) { - confMap.put(key, configSection.getString(key, defaultSection.getString(key, "NULL"))); - } else { - String value = defaultSection.getString(key, "NULL"); - configSection.set(key, value); - confMap.put(key, value); } + } else { + BlockAndSeek.getPluginLogger().warning("No any language found in the configuration! Using default en-US."); + for (String key : defaultSection.getKeys(false)) { + langMap.put(key, defaultSection.getString(key, "NULL")); + } + } - } - } else { - BlockAndSeek.getPluginLogger().warning(String.format("Language \"%s\" does not exist in localization.yml! Using default language en_US.", language)); - for (String key : defaultSection.getKeys(false)) { - confMap.put(key, defaultSection.getString(key, "NULL")); - } + confMap.put(langKey, langMap); } + configuration.save(configurationFile); localization = confMap; - - } - public static ConcurrentHashMap getLocalization() { + public static Map> getLocalization() { return localization; } diff --git a/src/main/java/hdvtdev/blockAndSeek/managers/FreezeManager.java b/src/main/java/hdvtdev/blockAndSeek/managers/FreezeManager.java new file mode 100644 index 0000000..cf67491 --- /dev/null +++ b/src/main/java/hdvtdev/blockAndSeek/managers/FreezeManager.java @@ -0,0 +1,92 @@ +package hdvtdev.blockAndSeek.managers; + +import hdvtdev.blockAndSeek.BlockAndSeekContainer; +import me.libraryaddict.disguise.DisguiseAPI; +import me.libraryaddict.disguise.disguisetypes.Disguise; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class FreezeManager { + + private static final Map frozenPlayers = new ConcurrentHashMap<>(); + + private static final Vector velocity = new Vector(0, 0, 0); + + public static boolean freeze(Player player, Material material) { + Location location = player.getLocation(); + if (frozenPlayers.containsKey(player)) { + FreezeData data = frozenPlayers.remove(player); + Location blockLocation = location.getBlock().getLocation(); + for (Player p : Bukkit.getOnlinePlayers()) { + p.sendBlockChange(blockLocation, data.blockData); + } + ArmorStand armorStand = data.armorStand; + armorStand.removePassenger(player); + armorStand.remove(); + player.setInvulnerable(false); + + BlockAndSeekContainer.NO_COLLIDE_TEAM.removeEntry(player.getName()); + + if (data.disguise() != null) DisguiseAPI.disguiseToAll(player, data.disguise); + + } else { + + Block block = location.getBlock(); + BlockData blockData = block.getBlockData(); + Location blockLocation = block.getLocation(); + Location centerLocation = blockLocation.toCenterLocation(); + Location upperBlockLocation = centerLocation.clone(); + upperBlockLocation.setY(upperBlockLocation.getY() + 1); + + if (!upperBlockLocation.getBlock().isSolid() && !blockLocation.getBlock().isSolid()) { + + for (Player p : Bukkit.getOnlinePlayers()) { + p.sendBlockChange(blockLocation, material.createBlockData()); + } + + + centerLocation.setY(centerLocation.getY() - 0.5); + + player.setVelocity(velocity); + player.setInvulnerable(true); + BlockAndSeekContainer.NO_COLLIDE_TEAM.addEntry(player.getName()); + + + ArmorStand armorStand = location.getWorld().spawn(centerLocation, ArmorStand.class); + armorStand.setInvulnerable(true); + armorStand.setSmall(true); + armorStand.setGravity(true); + armorStand.setCanMove(false); + armorStand.setInvisible(true); + armorStand.setCollidable(false); + armorStand.addPassenger(player); + + + Disguise disguise = DisguiseAPI.getDisguise(player); + + DisguiseAPI.undisguiseToAll(player); + + + frozenPlayers.put(player, new FreezeData(armorStand, blockData, disguise)); + } else return false; + + + } + return true; + } + + + private record FreezeData(ArmorStand armorStand, BlockData blockData, Disguise disguise) { + } + + +} diff --git a/src/main/java/hdvtdev/blockAndSeek/managers/GamesManager.java b/src/main/java/hdvtdev/blockAndSeek/managers/GamesManager.java new file mode 100644 index 0000000..b3c0a6d --- /dev/null +++ b/src/main/java/hdvtdev/blockAndSeek/managers/GamesManager.java @@ -0,0 +1,171 @@ +package hdvtdev.blockAndSeek.managers; + +import hdvtdev.blockAndSeek.BlockAndSeek; +import hdvtdev.blockAndSeek.BlockAndSeekGame; +import hdvtdev.blockAndSeek.BlockAndSeekMap; +import hdvtdev.blockAndSeek.Localization; +import hdvtdev.blockAndSeek.roulette.RouletteCreator; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.title.Title; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.WorldCreator; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scoreboard.Criteria; +import org.bukkit.scoreboard.DisplaySlot; +import org.bukkit.scoreboard.Objective; +import org.bukkit.scoreboard.Scoreboard; + +import java.io.File; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +public class GamesManager { + + private static final ConcurrentHashMap games = new ConcurrentHashMap<>(); + + public static boolean isExist(String name) { + return games.containsKey(name); + } + + public static Set getAvailableGames() { + return games.keySet(); + } + + public static int createGame(String name) { + if (games.containsKey(name)) return 1; + + if (Bukkit.getWorld(name) == null) { + if (new File(BlockAndSeek.getServerDataFolder(), name).exists()) { + Bukkit.createWorld(new WorldCreator(name)); + } else return 2; + } + + BlockAndSeekMap map = ConfigManager.getMap(name); + BlockAndSeekGame game = new BlockAndSeekGame(name, map.maxPlayers()); + List spawnCords = map.spawn(); + List lobbyCords = map.lobby(); + games.put(name, game); + + new BukkitRunnable() { + + int duration = map.duration(); + int waitTime = 30; + final Location spawn = new Location(Bukkit.getWorld(name), spawnCords.getFirst(), spawnCords.get(1), spawnCords.get(2)); + final Location lobby = new Location(Bukkit.getWorld(name), lobbyCords.getFirst(), lobbyCords.get(1), lobbyCords.get(2)); + + + @Override + public void run() { + + if (!game.isStarted()) { + int playerCount = game.playerCount(); + + for (Player player : game.getPlayers()) { + player.sendActionBar(Component.text("Игроков " + playerCount + "/12")); //TODO! + } + + if (playerCount >= map.minPlayers()) { + + if (waitTime == 0 || playerCount == map.maxPlayers()) { + game.start(); + Player seeker = game.selectRandomSeeker(); + seeker.teleport(spawn); + for (Player player : game.getHiders()) { + player.teleport(spawn); + RouletteCreator.createRoulette(player, null, true, map.blocks()); + } + + } else { + if (waitTime < 5 || waitTime % 5 == 0) { + for (Player player : game.getPlayers()) { + player.sendMessage(Localization.getLangComponentWithPrefix(player.locale().toLanguageTag(), "wait-time-left", "{time}", String.valueOf(waitTime))); + } + } + waitTime--; + } + + } else waitTime = 10; + + } else { + + if (game.hidersCount() == 0) { + + for (Player player : game.getPlayers()) { + player.showTitle(Title.title(Localization.getComponent("seekers-won"), Component.text(""))); + } + + game.end(); + games.remove(name); + this.cancel(); + } + + for (Player player : game.getPlayers()) { + player.sendActionBar(Localization.getComponent("game-time-left", "{time}", String.valueOf(duration))); + } + + if (duration == 0) { + if (game.hidersCount() == 1) { + for (Player player : game.getPlayers()) { + player.showTitle(Title.title(Localization.getComponent("hiders-solo-win", "{player}", player.getName()), Component.text(""))); + } + } else { + for (Player player : game.getPlayers()) { + player.showTitle(Title.title(Localization.getComponent("hiders-won"), Component.text(""))); + } + } + + game.end(); + games.remove(name); + this.cancel(); + } else duration--; + + + } + + + } + + + }.runTaskTimer(BlockAndSeek.getInstance(), 0L, 20L); + + + return 0; + } + + public static BlockAndSeekGame get(String name) { + return games.get(name); + } + + private static Scoreboard updateScoreboard(Scoreboard scoreboard, int players, int maxPlayers) { + Objective objective = scoreboard.getObjective(DisplaySlot.SIDEBAR); + for (String o : scoreboard.getEntries()) { + scoreboard.resetScores(o); + } + + + objective.getScore(" ").setScore(3); + objective.getScore(Localization.getComponent("game-players-count", "{players}", String.valueOf(players), "{max-players}", String.valueOf(maxPlayers)).toString()).setScore(2); + objective.getScore(" ").setScore(1); + objective.getScore(Localization.getComponent("wait-time-left", "{time}", String.valueOf(30)).toString()).setScore(0); + + return scoreboard; + } + + private static Scoreboard newLobbyScoreboard(String name, int players, int maxPlayers) { + Scoreboard scoreboard = Bukkit.getScoreboardManager().getNewScoreboard(); + Objective objective = scoreboard.registerNewObjective(name, Criteria.DUMMY, Localization.getComponent(" game-title", "{title}", name)); + objective.setDisplaySlot(DisplaySlot.SIDEBAR); + + objective.getScore(" ").setScore(3); + objective.getScore(Localization.getComponent("game-players-count", "{players}", String.valueOf(players), "{max-players}", String.valueOf(maxPlayers)).toString()).setScore(2); + objective.getScore(" ").setScore(1); + objective.getScore(Localization.getComponent("wait-time-left", "{time}", String.valueOf(30)).toString()).setScore(0); + + + return scoreboard; + } + +} diff --git a/src/main/java/hdvtdev/blockAndSeek/managers/MapsManager.java b/src/main/java/hdvtdev/blockAndSeek/managers/MapsManager.java new file mode 100644 index 0000000..de1ba2e --- /dev/null +++ b/src/main/java/hdvtdev/blockAndSeek/managers/MapsManager.java @@ -0,0 +1,11 @@ +package hdvtdev.blockAndSeek.managers; + +import hdvtdev.blockAndSeek.BlockAndSeekMap; + +import java.util.Map; + +public class MapsManager { + + private static final Map maps = null; + +} diff --git a/src/main/java/hdvtdev/blockAndSeek/roulette/RouletteCreator.java b/src/main/java/hdvtdev/blockAndSeek/roulette/RouletteCreator.java index 347f836..fb81d50 100644 --- a/src/main/java/hdvtdev/blockAndSeek/roulette/RouletteCreator.java +++ b/src/main/java/hdvtdev/blockAndSeek/roulette/RouletteCreator.java @@ -1,6 +1,7 @@ package hdvtdev.blockAndSeek.roulette; import hdvtdev.blockAndSeek.BlockAndSeek; +import hdvtdev.blockAndSeek.BlockAndSeekMap; import hdvtdev.blockAndSeek.EventListener; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.disguisetypes.DisguiseType; @@ -23,11 +24,8 @@ import java.util.List; public class RouletteCreator implements InventoryHolder { - private static final int[] filledSlots = { - }; - - public static void createRoulette(Player player, Inventory inventory, boolean openInventory) { + public static void createRoulette(Player player, Inventory inventory, boolean openInventory, List blocks) { Inventory gui = inventory == null ? new RouletteCreator().getInventory() : inventory; @@ -35,13 +33,7 @@ public class RouletteCreator implements InventoryHolder { EventListener.createTask(player, new BukkitRunnable() { int i = 0; - final RouletteGenerator rouletteGenerator = new RouletteGenerator(List.of( - new RouletteGenerator.Block(new ItemStack(Material.FLOWER_POT), 55), - new RouletteGenerator.Block(new ItemStack(Material.GOLD_BLOCK), 25), - new RouletteGenerator.Block(new ItemStack(Material.EMERALD_BLOCK), 10), - new RouletteGenerator.Block(new ItemStack(Material.DIAMOND_BLOCK), 6), - new RouletteGenerator.Block(new ItemStack(Material.NETHERITE_BLOCK), 4) - )); + final RouletteGenerator rouletteGenerator = new RouletteGenerator(blocks); final List> rows = List.of( new RouletteList<>(rouletteGenerator.getRandomRow(15)), diff --git a/src/main/java/hdvtdev/blockAndSeek/roulette/RouletteGenerator.java b/src/main/java/hdvtdev/blockAndSeek/roulette/RouletteGenerator.java index d73c724..70063af 100644 --- a/src/main/java/hdvtdev/blockAndSeek/roulette/RouletteGenerator.java +++ b/src/main/java/hdvtdev/blockAndSeek/roulette/RouletteGenerator.java @@ -1,6 +1,7 @@ package hdvtdev.blockAndSeek.roulette; import com.lewdev.probabilitylib.ProbabilityCollection; +import hdvtdev.blockAndSeek.BlockAndSeekMap; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; @@ -11,9 +12,9 @@ public class RouletteGenerator { private final ProbabilityCollection probabilityCollection = new ProbabilityCollection<>(); - public RouletteGenerator(List blocks) { - for (Block block : blocks) { - probabilityCollection.add(block.itemStack, block.chance); + public RouletteGenerator(List blocks) { + for (BlockAndSeekMap.Block block : blocks) { + probabilityCollection.add(block.block(), block.chance()); } } @@ -23,8 +24,5 @@ public class RouletteGenerator { return items; } - public record Block(ItemStack itemStack, int chance) { - } - } diff --git a/src/main/resources/localization.yml b/src/main/resources/localization.yml index 73dba61..1f032f2 100644 --- a/src/main/resources/localization.yml +++ b/src/main/resources/localization.yml @@ -1,10 +1,21 @@ -en_US: +en-US: #Maps maps-available: "Available maps: " maps-available-element: "- {color-status}{map}" + map-lobby-sidebar: "{map}" not-enough-permissions: "You do not have permission to run this command." not-enough-arguments: "Too few arguments to run command {command}. Arguments example: {help}" successful-reload: "Successfully reloaded {config}." - failed-reload: "Failed to reload {config}. Error: {e}" \ No newline at end of file + failed-reload: "Failed to reload {config}. Error: {e}" + + seekers-won: "Seekers won!" + hiders-won: "Seekers won!" + hiders-solo-win: "{player} won this game!" + + game-time-left: "Time left: {time}s" + game-players-count: "{players} of {max-players}" + game-title: "{title}" + + wait-time-left: "Game starts in: {time}s" \ No newline at end of file