fix: move example config to resources, simplify WG to block-break only, fix teleport for stuck players only, add messages.yml

This commit is contained in:
loki5512344 2026-06-01 11:46:28 +02:00
parent f2be6d6ece
commit b80fefa6a4
6 changed files with 206 additions and 38 deletions

View file

@ -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<String> 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);
}
}

View file

@ -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();
}
}

View file

@ -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<String> owners,
List<String> members,
List<String> 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<String> owners = List.of();
private List<String> members = List.of();
private List<String> 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<String> 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);
}
}
}

View file

@ -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

View file

@ -0,0 +1,123 @@
# ============================================
# LoMines - Сообщения плагина
# ============================================
# Поддержка цветов: &#RRGGBB (HEX), &a..&f, <color>
# Плейсхолдеры: {player}, {mine}, {percent}, {time}, {blocks}
# ============================================
# УВЕДОМЛЕНИЯ О СБРОСЕ ШАХТ
# ============================================
# Когда шахта сброшена автоматически (по времени или проценту)
mine-reset-auto:
# Тип уведомления: CHAT, ACTIONBAR, TITLE, BOSSBAR, NONE
type: CHAT
# Дистанция от центра шахты (-1 = все игроки на сервере)
range: -1
# Сообщение (для CHAT и ACTIONBAR)
message: "&#00FF00[Шахты] &#FFFF00{mine} &#00FF00сброшена!"
# Для TITLE (оставить пустым если не нужно)
title: "&#FFFF00{mine}"
subtitle: "&#00FF00Сброшена!"
# Для 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: "&#00FF00[Шахты] &#FFFF00{mine} &#00FF00сброшена администратором!"
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: "&#00FF00Шахта &#FFFF00{mine} &#00FF00успешно создана!"
mine-create-error: "&#FF0000Ошибка при создании шахты: {error}"
# Удаление шахты
mine-deleted: "&#00FF00Шахта &#FFFF00{mine} &#00FF00удалена!"
mine-delete-error: "&#FF0000Ошибка при удалении шахты: {error}"
# Перезагрузка шахты
mine-reloaded: "&#00FF00Шахта &#FFFF00{mine} &#00FF00перезагружена!"
mine-reload-error: "&#FF0000Ошибка при перезагрузке шахты: {error}"
# Перезагрузка всех шахт
mines-reloaded: "&#00FF00Все шахты перезагружены! ({count} штук)"
# Телепортация к шахте
mine-teleport: "&#00FF00Телепортировано к шахте &#FFFF00{mine}"
mine-teleport-no-location: "&#FF0000У шахты нет настроенной точки телепорта!"
# Информация о шахте
mine-info-header: "&#888888========== &#FFD700{mine} &#888888=========="
mine-info-blocks: "&#AAAAAAБлоков: &#FFFFFF{blocks}&#AAAAAA/&#FFFFFF{total} &#AAAAAA(&#FFFFFF{percent}%&#AAAAAA)"
mine-info-reset: "&#AAAAAAСледующий сброс через: &#FFFFFF{time}"
mine-info-footer: "&#888888=============================="
# ============================================
# СООБЩЕНИЯ ИГРОКАМ
# ============================================
# Когда игрок ломает блок в шахте
block-break-reward: "&#00FF00+&#FFD700{amount} &#AAAAAAза добычу блока!"
# Когда игрок получает награду из random-rewards
reward-received: "&#00FF00Вы получили награду за добычу!"
# ============================================
# ОШИБКИ
# ============================================
no-permission: "&#FF0000У вас нет прав для этой команды!"
player-only: "&#FF0000Эта команда только для игроков!"
mine-not-found: "&#FF0000Шахта не найдена: &#FFFF00{mine}"
invalid-arguments: "&#FF0000Неверные аргументы команды!"
no-selection: "&#FF0000Выделите регион палочкой! ЛКМ - 1-я точка, ПКМ - 2-я точка"
wand-given: "&#00FF00Вы получили палочку для выделения шахты!"
# ============================================
# СТАТИСТИКА
# ============================================
stats-header: "&#888888========== &#FFD700Статистика {player} &#888888=========="
stats-blocks: "&#AAAAAAБлоков добыто: &#FFFFFF{blocks}"
stats-resets: "&#AAAAAAШахт сброшено: &#FFFFFF{resets}"
stats-playtime: "&#AAAAAAВремя игры: &#FFFFFF{time}"
stats-rank: "&#AAAAAAПозиция в топе: &#FFFFFF#{rank}"
stats-footer: "&#888888======================================"
# ============================================
# ТОП ИГРОКОВ
# ============================================
top-header: "&#888888========== &#FFD700Топ по добыче &#888888=========="
top-entry: "&#FFD700#{rank} &#AAAAAA| &#FFFFFF{player} &#AAAAAA| &#FFD700{blocks} блоков"
top-footer: "&#888888======================================"
top-empty: "&#AAAAAAТоп пуст - начните добывать блоки!"

View file

@ -0,0 +1,189 @@
# ============================================
# LoMines - Пример конфигурации шахты
# ============================================
# Название шахты (для отображения в сообщениях и голограммах)
# Поддерживает цвета в формате &#RRGGBB (HEX)
# Пример: &#FF0000Красная &#00FF00шахта
name: "&#FFD700Золотая шахта&#FFFFFF"
# ============================================
# РЕГИОНЫ (области спавна блоков)
# ============================================
# Можно указать несколько регионов (до 10 точек = 5 регионов)
# Каждый регион = пара точек (от угла до угла)
# Все регионы должны быть в ОДНОМ мире
#
# Формат: мир;x;y;z;yaw;pitch
# yaw/pitch можно опустить (будет 0;0)
region:
selection:
'1': "world;-100.0;64.0;-100.0"
'2': "world;-90.0;74.0;-90.0"
# Можно добавить больше регионов:
# '3': "world;-80.0;64.0;-100.0"
# '4': "world;-70.0;74.0;-90.0"
# ============================================
# БЛОКИ И ШАНСЫ
# ============================================
# Шансы суммируются и нормализуются автоматически
# Можно использовать материалы из Minecraft
# Для Oraxen: oraxen:id_предмета
# Для ItemsAdder: ia:id_предмета
blocks:
contents:
stone: 50.0
coal_ore: 20.0
iron_ore: 15.0
gold_ore: 10.0
diamond_ore: 4.0
emerald_ore: 1.0
# Режим заполнения:
# - cuboid: заполнить весь кубоид блоками
# - mask: только определённые позиции (см. ниже)
fill-mode: cuboid
# Для режима mask (опционально):
# mask:
# marker: pink_concrete # Блок-маркер для позиций
# positions: [] # Позиции будут заполнены при сканировании
# ============================================
# СБРОС ШАХТЫ
# ============================================
reset:
# Интервал сброса
# Форматы: 30s (секунды), 5m (минуты), 2h (часы), 1d (дни)
interval: "10m"
# Процентный триггер (сброс при % заполненности)
# -1 или 0 = отключено
percent-trigger: -1.0
percent-enabled: false
# Сообщение при сбросе (пусто = стандартное)
# Поддерживает плейсхолдеры: {mine}, {time}
broadcast: "&#00FF00Шахта &#FFFF00{mine} &#00FF00сброшена!"
# Команды при сбросе (опционально)
commands: []
# - "eco give <player> 100"
# - "broadcast Шахта {mine} сброшена!"
# ============================================
# ТЕЛЕПОРТАЦИЯ ПРИ СБРОСЕ
# ============================================
# ИГРОКИ ТЕЛЕПОРТИРУЮТСЯ ТОЛЬКО ЕСЛИ ЗАСТРЯЛИ В БЛОКАХ!
#
# Точка телепорта - куда телепортировать при сбросе шахты
# (только если игрок оказался внутри блока после сброса)
teleport:
enabled: false
location: "" # Формат: мир;x;y;z;yaw;pitch
# Точка спавна для "застрявших" игроков
# (если игрок оказался внутри блока после сброса)
# Если не задано - используется teleport.location
spawn:
enabled: false
location: "" # Формат: мир;x;y;z;yaw;pitch
# ============================================
# НАГРАДЫ ПРИ ДОБЫЧЕ
# ============================================
# Выдаются с определённым шансом при ломании блоков
rewards: []
# Пример награды:
# - chance: 0.001 # 0.1% шанс
# prevent-drops: false # Отменить дроп блока?
# blocks: # На каких блоках работает
# - diamond_ore
# - emerald_ore
# items: # Предметы (опционально)
# - type: diamond
# amount: 1
# name: "&#00FFFFРедкий алмаз"
# commands: # Команды (опционально)
# - "eco give <player> 1000"
# ============================================
# ИНТЕРФЕЙС (UI)
# ============================================
ui:
# ActionBar (полоска над хотбаром)
actionbar:
enabled: true
# Дистанция показа (в блоках)
range: 50.0
# Формат строки
# Плейсхолдеры: {mine}, {percent}, {time}, {blocks}, {total}
format: "&#FFD700{mine} &#AAAAAA| &#00FF00{percent}% &#AAAAAA| &#FFFF00{time}"
# Голограмма над шахтой (требует HolographicDisplays или DecentHolograms)
hologram:
enabled: false
# Высота голограммы от центра региона
height: 3.0
format:
- "&#FFD700★ {mine} ★"
- "&#AAAAAAЗаполнено: &#00FF00{percent}%"
- "&#AAAAAAСброс через: &#FFFF00{time}"
# Формат времени для плейсхолдеров
# 1 = HH:MM:SS (01:25:35)
# 2 = короткий (25m 35s)
# 3 = текстовый (1ч 25м 35с)
timer-format: 2
# ============================================
# WORLDGUARD ИНТЕГРАЦИЯ (опционально)
# ============================================
# Создаёт регион для защиты шахты
# Только флаг на разрушение блоков (игроки могут ломать, гриферы - нет)
worldguard:
enabled: false
# Шаблон названия региона
# {mine_name} = название шахты
# {random_4} = 4 случайных символа
region-template: "mine_{mine_name}_{random_4}"
# Владельцы региона (uuid:xxx или имя)
owners: []
# Участники региона
members: []
# Только флаг block-break - кто может ломать блоки в шахте
# allow - все могут ломать
# deny - никто не может ломать
# -g non_members - только владельцы/участники
block-break: "allow"
# ============================================
# ДОПОЛНИТЕЛЬНЫЕ НАСТРОЙКИ
# ============================================
# Задержка между установкой блоков (в тиках, 20 тиков = 1 сек)
# 0 = мгновенно (может лагать на больших шахтах)
# Больше = плавнее, но медленнее
block-place-delay: 0
# Тип установки блоков:
# - fast: быстрый (рекомендуется)
# - bukkit: стандартный (медленнее, но стабильнее)
# - parallel: параллельный (экспериментально)
setter: fast
# Разрешить физику блоков (песок, гравий падают)?
block-physics: false
# Разрешить спавн сущностей в шахте?
entity-spawning: false
# Разрешить течение жидкостей?
liquid-flow: false