diff --git a/src/main/java/dev/loki/lomines/data/config/loader/region/WorldGuardConfigLoader.java b/src/main/java/dev/loki/lomines/data/config/loader/region/WorldGuardConfigLoader.java index 021da2b..cfe442d 100644 --- a/src/main/java/dev/loki/lomines/data/config/loader/region/WorldGuardConfigLoader.java +++ b/src/main/java/dev/loki/lomines/data/config/loader/region/WorldGuardConfigLoader.java @@ -23,6 +23,7 @@ public final class WorldGuardConfigLoader { /** * Parses WorldGuard configuration from YAML. + * Simplified: only block-break flag. */ public WorldGuardConfig parse(YamlConfiguration yaml) { ConfigurationSection wgSection = yaml.getConfigurationSection("worldguard"); @@ -54,13 +55,10 @@ public final class WorldGuardConfigLoader { members = defaults.getStringList("worldguard.members"); } - List flags = yaml.getStringList("worldguard.flags"); - if (flags.isEmpty()) { - flags = defaults.getStringList("worldguard.flags"); - } - if (flags.isEmpty()) { - flags = List.of("passthrough=deny", "build=allow"); - } + // Simplified: only block-break flag + // allow = все могут ломать, deny = никто не может, -g non_members = только владельцы + String blockBreak = yaml.getString("worldguard.block-break", + defaults.getString("worldguard.block-break", "allow")); boolean protect = yaml.getBoolean("worldguard.protect-on-create", defaults.getBoolean("worldguard.protect-on-create", true)); @@ -70,7 +68,7 @@ public final class WorldGuardConfigLoader { .template(template) .owners(owners) .members(members) - .flags(flags) + .blockBreak(blockBreak) .protectOnCreate(protect) .build(); } @@ -85,20 +83,21 @@ public final class WorldGuardConfigLoader { yaml.set("worldguard.region-template", config.regionNameTemplate()); yaml.set("worldguard.owners", config.owners()); yaml.set("worldguard.members", config.members()); - yaml.set("worldguard.flags", config.flags()); + yaml.set("worldguard.block-break", config.blockBreak()); yaml.set("worldguard.protect-on-create", config.protectOnCreate()); } } /** * Sets default values for WorldGuard configuration. + * Simplified: only block-break flag. */ public void setDefaults(YamlConfiguration yaml) { yaml.set("worldguard.enabled", false); yaml.set("worldguard.region-template", "{mine_name}_{random_4}"); yaml.set("worldguard.owners", List.of()); yaml.set("worldguard.members", List.of()); - yaml.set("worldguard.flags", List.of("passthrough=deny", "build=allow")); + yaml.set("worldguard.block-break", "allow"); // allow = все могут ломать yaml.set("worldguard.protect-on-create", true); } } diff --git a/src/main/java/dev/loki/lomines/handler/MineResetHandler.java b/src/main/java/dev/loki/lomines/handler/MineResetHandler.java index ca7c6c4..a945888 100644 --- a/src/main/java/dev/loki/lomines/handler/MineResetHandler.java +++ b/src/main/java/dev/loki/lomines/handler/MineResetHandler.java @@ -171,9 +171,9 @@ public final class MineResetHandler { } /** - * Teleports players standing inside the mine to a safe location. + * Teleports ONLY stuck players (those inside solid blocks) to a safe location. * Uses player-spawn location if configured, otherwise uses teleport location. - * Prevents players from suffocating in blocks by finding a safe teleport spot. + * Only teleports if player is suffocating in a block, not all players in mine! */ private void teleportPlayers() { // Get spawn location for stuck players (player-spawn config) or fall back to teleport location @@ -190,9 +190,20 @@ public final class MineResetHandler { Location safeDest = BlockUpdateUtil.findSafeTeleportLocation(dest, 3); for (Player p : dest.getWorld().getPlayers()) { - if (mine.contains(p.getLocation())) { + // Only teleport if player is INSIDE the mine AND is suffocating in a solid block + if (mine.contains(p.getLocation()) && isPlayerStuckInBlock(p)) { p.teleport(safeDest); } } } + + /** + * Checks if player is stuck inside a solid block (suffocating). + */ + private boolean isPlayerStuckInBlock(Player player) { + Location loc = player.getLocation(); + var block = loc.getBlock(); + // Check if block at player position is solid (not air/liquid) + return block.getType().isSolid() && !block.isLiquid(); + } } diff --git a/src/main/java/dev/loki/lomines/integration/worldguard/WorldGuardConfig.java b/src/main/java/dev/loki/lomines/integration/worldguard/WorldGuardConfig.java index 6a96631..f44a4df 100644 --- a/src/main/java/dev/loki/lomines/integration/worldguard/WorldGuardConfig.java +++ b/src/main/java/dev/loki/lomines/integration/worldguard/WorldGuardConfig.java @@ -6,13 +6,14 @@ import java.util.Random; /** * Configuration for WorldGuard auto-region creation. + * Simplified: only controls who can break blocks in the mine. */ public record WorldGuardConfig( boolean enabled, String regionNameTemplate, List owners, List members, - List flags, + String blockBreak, boolean protectOnCreate ) { @@ -26,10 +27,8 @@ public record WorldGuardConfig( : DEFAULT_TEMPLATE; owners = owners != null ? List.copyOf(owners) : List.of(); members = members != null ? List.copyOf(members) : List.of(); - flags = flags != null ? List.copyOf(flags) : List.of( - "passthrough=deny", - "build=allow" - ); + // block-break: allow = все могут ломать, deny = никто не может, -g non_members = только владельцы + blockBreak = blockBreak != null && !blockBreak.isBlank() ? blockBreak : "allow"; protectOnCreate = protectOnCreate; } @@ -77,6 +76,7 @@ public record WorldGuardConfig( /** * Default configuration with auto-region enabled. + * Everyone can break blocks (allow). */ public static WorldGuardConfig defaults() { return new WorldGuardConfig( @@ -84,7 +84,7 @@ public record WorldGuardConfig( DEFAULT_TEMPLATE, List.of(), List.of(), - List.of("passthrough=deny", "build=allow"), + "allow", // allow = все могут ломать true ); } @@ -98,7 +98,7 @@ public record WorldGuardConfig( DEFAULT_TEMPLATE, List.of(), List.of(), - List.of(), + "allow", false ); } @@ -115,7 +115,7 @@ public record WorldGuardConfig( private String template = DEFAULT_TEMPLATE; private List owners = List.of(); private List members = List.of(); - private List flags = List.of("passthrough=deny", "build=allow"); + private String blockBreak = "allow"; private boolean protectOnCreate = true; public Builder enabled(boolean enabled) { @@ -138,8 +138,8 @@ public record WorldGuardConfig( return this; } - public Builder flags(List flags) { - this.flags = flags; + public Builder blockBreak(String blockBreak) { + this.blockBreak = blockBreak; return this; } @@ -149,7 +149,6 @@ public record WorldGuardConfig( } public WorldGuardConfig build() { - return new WorldGuardConfig(enabled, template, owners, members, flags, protectOnCreate); + return new WorldGuardConfig(enabled, template, owners, members, blockBreak, protectOnCreate); } } -} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 4878d37..c471c06 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,13 +1,42 @@ -# LoMines Configuration +# ============================================ +# LoMines - Основная конфигурация +# ============================================ -# Enable statistics tracking for players +# Включить статистику игроков statistics-enabled: true -# Enable debug logging +# Включить отладочный лог debug: false -# WorldGuard Integration Settings -worldguard: +# ============================================ +# УВЕДОМЛЕНИЯ О СБРОСЕ ШАХТ +# ============================================ +# Здесь можно настроить глобальные уведомления +# Детальная настройка в messages.yml + +reset-notifications: + # Уведомлять о сбросе шахты enabled: true - auto-create-regions: false + # Тип уведомления: CHAT, ACTIONBAR, TITLE, BOSSBAR, NONE + type: CHAT + # Всем игрокам на сервере (true) или только рядом с шахтой (false) + broadcast-global: false + # Дистанция от шахты если broadcast-global: false + range: 100 + # Предупреждать перед сбросом + warnings: + enabled: true + # За сколько секунд до сброса предупреждать + seconds-before: + - 60 + - 30 + - 10 + +# ============================================ +# WORLDGUARD ИНТЕГРАЦИЯ +# ============================================ +worldguard: + # Автоматически создавать регионы для шахт + enabled: false + # Приоритет региона (выше = приоритетнее) region-priority: 10 diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml new file mode 100644 index 0000000..18f2344 --- /dev/null +++ b/src/main/resources/messages.yml @@ -0,0 +1,123 @@ +# ============================================ +# LoMines - Сообщения плагина +# ============================================ +# Поддержка цветов: &#RRGGBB (HEX), &a..&f, +# Плейсхолдеры: {player}, {mine}, {percent}, {time}, {blocks} + +# ============================================ +# УВЕДОМЛЕНИЯ О СБРОСЕ ШАХТ +# ============================================ + +# Когда шахта сброшена автоматически (по времени или проценту) +mine-reset-auto: + # Тип уведомления: CHAT, ACTIONBAR, TITLE, BOSSBAR, NONE + type: CHAT + # Дистанция от центра шахты (-1 = все игроки на сервере) + range: -1 + # Сообщение (для CHAT и ACTIONBAR) + message: "�FF00[Шахты] &#FFFF00{mine} �FF00сброшена!" + # Для TITLE (оставить пустым если не нужно) + title: "&#FFFF00{mine}" + subtitle: "�FF00Сброшена!" + # Для BOSSBAR (оставить пустым если не нужно) + bossbar: "&#FFFF00{mine} &#AAAAAA| Сброшена" + bossbar-color: GREEN + bossbar-style: SOLID + # Длительность в тиках (20 = 1 секунда, только для TITLE и BOSSBAR) + duration: 60 + +# Когда шахта сброшена вручную командой +mine-reset-manual: + type: CHAT + range: -1 + message: "�FF00[Шахты] &#FFFF00{mine} �FF00сброшена администратором!" + title: "" + subtitle: "" + bossbar: "" + bossbar-color: GREEN + bossbar-style: SOLID + duration: 60 + +# Предупреждение перед сбросом (за 60, 30, 10 секунд) +mine-reset-warning: + enabled: true + # За сколько секунд до сброса предупреждать + warnings: + - 60 + - 30 + - 10 + type: CHAT + range: 100 + message: "&#FFAA00[Шахты] &#FFFF00{mine} &#FFAA00сбросится через &#FF0000{time}" + title: "" + subtitle: "" + +# ============================================ +# СООБЩЕНИЯ КОМАНД +# ============================================ + +# Создание шахты +mine-created: "�FF00Шахта &#FFFF00{mine} �FF00успешно создана!" +mine-create-error: "&#FF0000Ошибка при создании шахты: {error}" + +# Удаление шахты +mine-deleted: "�FF00Шахта &#FFFF00{mine} �FF00удалена!" +mine-delete-error: "&#FF0000Ошибка при удалении шахты: {error}" + +# Перезагрузка шахты +mine-reloaded: "�FF00Шахта &#FFFF00{mine} �FF00перезагружена!" +mine-reload-error: "&#FF0000Ошибка при перезагрузке шахты: {error}" + +# Перезагрузка всех шахт +mines-reloaded: "�FF00Все шахты перезагружены! ({count} штук)" + +# Телепортация к шахте +mine-teleport: "�FF00Телепортировано к шахте &#FFFF00{mine}" +mine-teleport-no-location: "&#FF0000У шахты нет настроенной точки телепорта!" + +# Информация о шахте +mine-info-header: "󙀸========== &#FFD700{mine} 󙀸==========" +mine-info-blocks: "&#AAAAAAБлоков: &#FFFFFF{blocks}&#AAAAAA/&#FFFFFF{total} &#AAAAAA(&#FFFFFF{percent}%&#AAAAAA)" +mine-info-reset: "&#AAAAAAСледующий сброс через: &#FFFFFF{time}" +mine-info-footer: "󙀸==============================" + +# ============================================ +# СООБЩЕНИЯ ИГРОКАМ +# ============================================ + +# Когда игрок ломает блок в шахте +block-break-reward: "�FF00+&#FFD700{amount} &#AAAAAAза добычу блока!" + +# Когда игрок получает награду из random-rewards +reward-received: "�FF00Вы получили награду за добычу!" + +# ============================================ +# ОШИБКИ +# ============================================ + +no-permission: "&#FF0000У вас нет прав для этой команды!" +player-only: "&#FF0000Эта команда только для игроков!" +mine-not-found: "&#FF0000Шахта не найдена: &#FFFF00{mine}" +invalid-arguments: "&#FF0000Неверные аргументы команды!" +no-selection: "&#FF0000Выделите регион палочкой! ЛКМ - 1-я точка, ПКМ - 2-я точка" +wand-given: "�FF00Вы получили палочку для выделения шахты!" + +# ============================================ +# СТАТИСТИКА +# ============================================ + +stats-header: "󙀸========== &#FFD700Статистика {player} 󙀸==========" +stats-blocks: "&#AAAAAAБлоков добыто: &#FFFFFF{blocks}" +stats-resets: "&#AAAAAAШахт сброшено: &#FFFFFF{resets}" +stats-playtime: "&#AAAAAAВремя игры: &#FFFFFF{time}" +stats-rank: "&#AAAAAAПозиция в топе: &#FFFFFF#{rank}" +stats-footer: "󙀸======================================" + +# ============================================ +# ТОП ИГРОКОВ +# ============================================ + +top-header: "󙀸========== &#FFD700Топ по добыче 󙀸==========" +top-entry: "&#FFD700#{rank} &#AAAAAA| &#FFFFFF{player} &#AAAAAA| &#FFD700{blocks} блоков" +top-footer: "󙀸======================================" +top-empty: "&#AAAAAAТоп пуст - начните добывать блоки!" diff --git a/mines/example_mine.yml b/src/main/resources/mines/example_mine.yml similarity index 87% rename from mines/example_mine.yml rename to src/main/resources/mines/example_mine.yml index 72ff312..d2b05fe 100644 --- a/mines/example_mine.yml +++ b/src/main/resources/mines/example_mine.yml @@ -10,7 +10,7 @@ name: "&#FFD700Золотая шахта&#FFFFFF" # ============================================ # РЕГИОНЫ (области спавна блоков) # ============================================ -# Можно указать несколько регионов (до 100) +# Можно указать несколько регионов (до 10 точек = 5 регионов) # Каждый регион = пара точек (от угла до угла) # Все регионы должны быть в ОДНОМ мире # @@ -77,15 +77,20 @@ reset: # ============================================ # ТЕЛЕПОРТАЦИЯ ПРИ СБРОСЕ # ============================================ +# ИГРОКИ ТЕЛЕПОРТИРУЮТСЯ ТОЛЬКО ЕСЛИ ЗАСТРЯЛИ В БЛОКАХ! +# +# Точка телепорта - куда телепортировать при сбросе шахты +# (только если игрок оказался внутри блока после сброса) teleport: enabled: false location: "" # Формат: мир;x;y;z;yaw;pitch # Точка спавна для "застрявших" игроков # (если игрок оказался внутри блока после сброса) + # Если не задано - используется teleport.location spawn: enabled: false - location: "" # Если не задано - используется teleport.location + location: "" # Формат: мир;x;y;z;yaw;pitch # ============================================ # НАГРАДЫ ПРИ ДОБЫЧЕ @@ -138,6 +143,8 @@ ui: # ============================================ # WORLDGUARD ИНТЕГРАЦИЯ (опционально) # ============================================ +# Создаёт регион для защиты шахты +# Только флаг на разрушение блоков (игроки могут ломать, гриферы - нет) worldguard: enabled: false # Шаблон названия региона @@ -151,11 +158,11 @@ worldguard: # Участники региона members: [] - # Флаги WorldGuard - flags: - - "passthrough deny" - - "build -g members allow" - - "pvp deny" + # Только флаг block-break - кто может ломать блоки в шахте + # allow - все могут ломать + # deny - никто не может ломать + # -g non_members - только владельцы/участники + block-break: "allow" # ============================================ # ДОПОЛНИТЕЛЬНЫЕ НАСТРОЙКИ