Compare commits

..

12 commits
master ... vc

13 changed files with 383 additions and 200 deletions

View file

@ -1,202 +1,202 @@
# CoreProtect Language File (ru)
ACTION_NOT_SUPPORTED: "Данное действие не поддерживается этой командой."
ACTION_NOT_SUPPORTED: "<red>Данное действие не поддерживается этой командой"
AMOUNT_BLOCK: "{0} {блок|блоков}"
AMOUNT_CHUNK: "{0} {чанк|чанков}"
AMOUNT_ENTITY: "{0} {существо|существ}"
AMOUNT_ITEM: "{0} {предмет|предметов}"
API_TEST: "Тест API прошёл успешно!"
CACHE_ERROR: "ВНИМАНИЕ: Ошибка при проверке кеша {0}."
CACHE_RELOAD: "Принудительная перезагрузка кеша {отображения|мира} из базы данных."
CHECK_CONFIG: "Пожалуйста, проверьте config.yml"
COMMAND_CONSOLE: "Пожалуйста, запустите команду из консоли."
COMMAND_NOT_FOUND: "Команда «{0}» не найдена."
COMMAND_THROTTLED: "Подождите немного и попробуйте еще раз."
CONSUMER_ERROR: "Обработка потребительской очереди уже {приостановлено|возобновлено}."
CONSUMER_TOGGLED: "Обработка очереди потребителей была {приостановлено|возобновлено}."
API_TEST: "<green>Тест API прошёл успешно!"
CACHE_ERROR: "<red>ВНИМАНИЕ: Ошибка при проверке кеша {0}"
CACHE_RELOAD: "Принудительная перезагрузка кеша {отображения|мира} из базы данных"
CHECK_CONFIG: "<red>Пожалуйста, проверьте config.yml"
COMMAND_CONSOLE: "<red>Пожалуйста, запустите команду из консоли"
COMMAND_NOT_FOUND: "<red>Команда «{0}» не найдена"
COMMAND_THROTTLED: "<red>Подождите немного и попробуйте еще раз"
CONSUMER_ERROR: "<red>Обработка потребительской очереди уже {приостановлено|возобновлено}"
CONSUMER_TOGGLED: "Обработка очереди потребителей {<gray>приостановлена</gray>|<green>возобновлена</green>}"
CONTAINER_HEADER: "Контейнерные транзакции"
DATABASE_BUSY: "База данных занята. Пожалуйста, повторите попытку позже."
DATABASE_INDEX_ERROR: "Невозможно проверить индексы базы данных."
DATABASE_LOCKED_1: "База данных заблокирована. Подождите около 15 секунд..."
DATABASE_LOCKED_2: "База данных уже используется. Пожалуйста, попробуйте еще раз."
DATABASE_LOCKED_3: "Чтобы отключить блокировку базы данных, установите «database-lock: false»."
DATABASE_LOCKED_4: "Отключение блокировки базы данных может привести к повреждению данных."
DATABASE_UNREACHABLE: "База данных недоступна. Удаление данных и завершение работы."
DEVELOPMENT_BRANCH: "Обнаружена ветвь разработки, скрипты исправлений пропущены."
DIRT_BLOCK: "Под вами установлен блок грязи."
DATABASE_BUSY: "<red>База данных занята, повторите попытку позже"
DATABASE_INDEX_ERROR: "<red>Невозможно проверить индексы базы данных"
DATABASE_LOCKED_1: "<red>База данных заблокирована, подождите около 15 секунд..."
DATABASE_LOCKED_2: "<red>База данных уже используется, попробуйте еще раз"
DATABASE_LOCKED_3: "Чтобы отключить блокировку базы данных, установите «database-lock: false»"
DATABASE_LOCKED_4: "Отключение блокировки базы данных может привести к повреждению данных"
DATABASE_UNREACHABLE: "<red>База данных недоступна. Удаление данных и завершение работы"
DEVELOPMENT_BRANCH: "Обнаружена ветвь разработки, скрипты исправлений пропущены"
DIRT_BLOCK: "<gold>Под вами установлен блок грязи"
DISABLE_SUCCESS: "{0} был успешно отключён!"
ENABLE_FAILED: "{0} не удалось запустить."
ENABLE_FAILED: "<red>{0} не удалось запустить"
ENABLE_SUCCESS: "{0} был успешно запущен!"
ENJOY_COREPROTECT: "Нравится {0}? Присоединяйтесь к нашему Discord!"
FINISHING_CONVERSION: "Завершение преобразования данных. Пожалуйста, подождите..."
FINISHING_LOGGING: "Завершение регистрации данных. Пожалуйста, подождите..."
FINISHING_CONVERSION: "<gray><italic>Завершение преобразования данных. Пожалуйста, подождите..."
FINISHING_LOGGING: "<gray><italic>Завершение регистрации данных. Пожалуйста, подождите..."
FIRST_VERSION: "Исходная БД: {0}"
GLOBAL_LOOKUP: "Не указывайте радиус для глобального поиска."
GLOBAL_ROLLBACK: "Используйте «{0}», чтобы сделать {откат|восстановление} глобально"
HELP_ACTION_1: "Ограничьте поиск определенным действием."
GLOBAL_LOOKUP: "<red>Радиус для глобального поиска не требуется"
GLOBAL_ROLLBACK: "<yellow>Используйте «{0}», чтобы сделать {откат|восстановление} глобально"
HELP_ACTION_1: "Ограничьте поиск определенным действием"
HELP_ACTION_2: "Например: [a:block], [a:+block], [a:-block] [a:click], [a:container], [a:inventory], [a:item], [a:kill], [a:chat], [a:command], [a:sign], [a:session], [a:username]"
HELP_COMMAND: "Показать дополнительную информацию."
HELP_EXCLUDE_1: "Исключите блоки/пользователей."
HELP_COMMAND: "Показать дополнительную информацию"
HELP_EXCLUDE_1: "Исключите блоки/пользователей"
HELP_EXCLUDE_2: "Например: [e:stone], [e:Notch], [e:stone,Notch]"
HELP_HEADER: "{0} Помощь"
HELP_INCLUDE_1: "Включите определенные блоки/сущности."
HELP_HEADER: "<yellow>Помощь по командам (<gray>отслеживание действий<yellow>)"
HELP_INCLUDE_1: "Включите определенные блоки/сущности"
HELP_INCLUDE_2: "Например: [i:stone], [i:zombie], [i:stone,wood,bedrock]"
HELP_INSPECT_1: "С включенным режимом инспектора вы можете сделать следующее:"
HELP_INSPECT_2: "Щелкните левой кнопкой мыши по блоку, чтобы увидеть, кто разместил этот блок.."
HELP_INSPECT_3: "Щелкните блок правой кнопкой мыши, чтобы увидеть, какой соседний блок был сломан.."
HELP_INSPECT_4: "Поместите блок, чтобы увидеть, какой блок был сломан в этом месте."
HELP_INSPECT_5: "Поместите блок в жидкость (и т.п.), чтобы увидеть, кто его поместил."
HELP_INSPECT_6: "Щелкните правой кнопкой мыши дверь, сундук и т.д., чтобы узнать, кто последний использовал их."
HELP_INSPECT_7: "Подсказка: Вы можете использовать «/co i» для быстрого переключения режима инспектора."
HELP_INSPECT_COMMAND: "Включает или выключает режим инспектора блоков."
HELP_LIST: "Отображает список всех команд."
HELP_LOOKUP_1: "Команда быстрого доступа."
HELP_LOOKUP_2: "Используйте после проверки блока для просмотра журналов."
HELP_LOOKUP_COMMAND: "Глобальный поиск данных блоков."
HELP_NO_INFO: "Информация о команде «{0}» не найдена."
HELP_PARAMETER: "Пожалуйста, просмотрите «{0}» для получения подробной информации о параметрах."
HELP_PARAMS_1: "Выполните {поиск|откат|восстановление}."
HELP_PARAMS_2: "Укажите пользователей для {поиска|отката|восстановления}."
HELP_PARAMS_3: "Укажите время для {поиска|отката|восстановления}."
HELP_PARAMS_4: "Укажите область радиуса, чтобы ограничить {поиск|откат|восстановление}."
HELP_PARAMS_5: "Ограничьте {поиск|откат|восстановление} определенным действием."
HELP_PARAMS_6: "Включите определенные блоки/объекты в {поиск|откат|восстановление}."
HELP_PARAMS_7: "Исключите блоки/пользователей из {поиска|отката|восстановления}."
HELP_PURGE_1: "Удалить данные старше указанного времени."
HELP_PURGE_2: "Например, «{0}» удалит все данные старше одного месяца и сохранит данные только за последние 30 дней."
HELP_PURGE_COMMAND: "Удалит старые данные блока."
HELP_RADIUS_1: "Укажите радиус области."
HELP_INSPECT_1: "С включенным режимом CHECKER вы можете сделать следующее:"
HELP_INSPECT_2: "Щелкните левой кнопкой мыши по блоку, чтобы увидеть, кто разместил этот блок"
HELP_INSPECT_3: "Щелкните блок правой кнопкой мыши, чтобы увидеть, какой соседний блок был сломан"
HELP_INSPECT_4: "Поместите блок, чтобы увидеть, какой блок был сломан в этом месте"
HELP_INSPECT_5: "Поместите блок в жидкость (и т.п.), чтобы увидеть, кто его поместил"
HELP_INSPECT_6: "Щелкните правой кнопкой мыши дверь, сундук и т.д., чтобы узнать, кто последний использовал их"
HELP_INSPECT_7: "Подсказка: Вы можете использовать «/co i» для быстрого переключения режима CHECKER"
HELP_INSPECT_COMMAND: "Включает или выключает режим проверки логов (CHECKER)"
HELP_LIST: "Отображает список всех команд"
HELP_LOOKUP_1: "Команда быстрого доступа"
HELP_LOOKUP_2: "Используйте после проверки блока для просмотра журналов"
HELP_LOOKUP_COMMAND: "Глобальный поиск данных блоков"
HELP_NO_INFO: "<red>Информация о команде «{0}» не найдена"
HELP_PARAMETER: "Пожалуйста, просмотрите «{0}» для получения подробной информации о параметрах"
HELP_PARAMS_1: "Выполните {поиск|откат|восстановление}"
HELP_PARAMS_2: "Укажите пользователей для {поиска|отката|восстановления}"
HELP_PARAMS_3: "Укажите время для {поиска|отката|восстановления}"
HELP_PARAMS_4: "Укажите область радиуса, чтобы ограничить {поиск|откат|восстановление}"
HELP_PARAMS_5: "Ограничьте {поиск|откат|восстановление} определенным действием"
HELP_PARAMS_6: "Включите определенные блоки/объекты в {поиск|откат|восстановление}"
HELP_PARAMS_7: "Исключите блоки/пользователей из {поиска|отката|восстановления}"
HELP_PURGE_1: "Удалить данные старше указанного времени"
HELP_PURGE_2: "Например, «{0}» удалит все данные старше одного месяца и сохранит данные только за последние 30 дней"
HELP_PURGE_COMMAND: "Удалит старые данные блока"
HELP_RADIUS_1: "Укажите радиус области"
HELP_RADIUS_2: "Например: [r:10] (Внесёт изменения только в пределах 10 блоков от вас)"
HELP_RELOAD_COMMAND: "Перезагружает файл конфигурации."
HELP_RESTORE_COMMAND: "Восстановит данные блока."
HELP_ROLLBACK_COMMAND: "Откатит данные блока."
HELP_STATUS: "Просмотр статуса плагина и информации о версии."
HELP_STATUS_COMMAND: "Отображает статус плагина."
HELP_TELEPORT: "Телепорт в локацию."
HELP_TIME_1: "Укажите время поиска."
HELP_RELOAD_COMMAND: "Перезагружает файл конфигурации"
HELP_RESTORE_COMMAND: "Отмена отката действий"
HELP_ROLLBACK_COMMAND: "Откат действий"
HELP_STATUS: "Просмотр статуса плагина и информации о версии"
HELP_STATUS_COMMAND: "Отображает статус плагина"
HELP_TELEPORT: "Телепорт в локацию"
HELP_TIME_1: "Укажите время поиска"
HELP_TIME_2: "Например: [t:2w,5d,7h,2m,10s], [t:5d2h], [t:2.50h]"
HELP_USER_1: "Укажите пользовател(я/ей) для поиска."
HELP_USER_1: "Укажите пользовател(я/ей) для поиска"
HELP_USER_2: "Например: [u:Notch], [u:Notch,#enderman]"
INCOMPATIBLE_ACTION: "«{0}» нельзя использовать с этим действием."
INSPECTOR_ERROR: "Режим инспектора уже {включён|выключен}."
INSPECTOR_TOGGLED: "Режим инспектора теперь {включён|выключен}."
INTEGRATION_ERROR: "Невозможно {инициализировать|отключить} регистрацию {0}."
INTEGRATION_SUCCESS: "{0} регистрация успешно {инициализирована|отключена}."
INTEGRATION_VERSION: "Обнаружена недопустимая версия {0}."
INCOMPATIBLE_ACTION: "<red>«{0}» нельзя использовать с этим действием"
INSPECTOR_ERROR: "<red>Режим CHECKER уже {включён|выключен}"
INSPECTOR_TOGGLED: "Режим <gray>CHECKER {<green>включён|<red>выключен}"
INTEGRATION_ERROR: "<red>Невозможно {инициализировать|отключить} регистрацию {0}"
INTEGRATION_SUCCESS: "{0} регистрация успешно {<green>инициализирована|<red>отключена}"
INTEGRATION_VERSION: "<red>Обнаружена недопустимая версия {0}"
INTERACTIONS_HEADER: "Взаимодействие с игроками"
INVALID_ACTION: "Это недопустимое действие."
INVALID_BRANCH_1: "Неверная версия плагина (ветка не задана)."
INVALID_BRANCH_2: "Чтобы продолжить, установите ветку проекта на «development»."
INVALID_BRANCH_3: "Запуск кода который находится в разработке может привести к повреждению данных."
INVALID_CONTAINER: "Пожалуйста, сначала проверьте действующий контейнер."
INVALID_DONATION_KEY: "Недействительный ключ пожертвования."
INVALID_INCLUDE: "«{0}» неверное имя блока/сущности."
INVALID_INCLUDE_COMBO: "Это недопустимая комбинация блока/сущности."
INVALID_RADIUS: "Пожалуйста, введите допустимый радиус."
INVALID_SELECTION: "Выбор {0} не найден."
INVALID_USERNAME: "«{0}» неверное имя пользователя."
INVALID_WORLD: "Укажите действительный мир."
INVALID_ACTION: "<red>Это недопустимое действие"
INVALID_BRANCH_1: "<red>Неверная версия плагина (ветка не задана)"
INVALID_BRANCH_2: "<yellow>Чтобы продолжить, установите ветку проекта на «development»"
INVALID_BRANCH_3: "<gold>Запуск кода который находится в разработке может привести к повреждению данных"
INVALID_CONTAINER: "<red>Пожалуйста, сначала проверьте действующий контейнер"
INVALID_DONATION_KEY: "<red>Недействительный ключ пожертвования"
INVALID_INCLUDE: "<red>«{0}» неверное имя блока/сущности"
INVALID_INCLUDE_COMBO: "<red>Недопустимая комбинация блока/сущности"
INVALID_RADIUS: "<red>Пожалуйста, введите допустимый радиус."
INVALID_SELECTION: "<red>Выбор {0} не найден"
INVALID_USERNAME: "<red>«{0}» неверное имя пользователя."
INVALID_WORLD: "<red>Укажите действительный мир"
LATEST_VERSION: "Последняя версия: {0}"
LINK_DISCORD: "Discord: {0}"
LINK_DOWNLOAD: "Загрузить: {0}"
LINK_PATREON: "Patreon: {0}"
LINK_WIKI_BLOCK: "Названия блоков: {0}"
LINK_WIKI_ENTITY: "Названия сущностей: {0}"
LOGGING_ITEMS: "{0} предметы регистрируются. Пожалуйста, подождите..."
LOGGING_TIME_LIMIT: "Достигнуто ограничение по времени регистрации. Удаление данных и завершение работы."
LOOKUP_BLOCK: "{0} {поставил|сломал} {1}."
LOOKUP_CONTAINER: "{0} {добавил|забрал} {1} {2}."
LOGGING_ITEMS: "<gray><italic>{0} предметы регистрируются. Пожалуйста, подождите..."
LOGGING_TIME_LIMIT: "<red>Достигнуто ограничение по времени регистрации. Удаление данных и завершение работы"
LOOKUP_BLOCK: "{0} {<green>поставил|<red>сломал} {1}"
LOOKUP_CONTAINER: "{0} {<green>положил|<red>забрал} {1} {2}"
LOOKUP_HEADER: "{0} Результаты поиска"
LOOKUP_INTERACTION: "{0} {нажал|убил} {1}."
LOOKUP_ITEM: "{0} {подобрал|выкинул} {1} {2}."
LOOKUP_LOGIN: "{0} {вошёл|вышел}."
LOOKUP_INTERACTION: "{0} {<green>нажал|<red>убил} {1}"
LOOKUP_ITEM: "{0} {<green>подобрал|<red>выкинул} {1} {2}"
LOOKUP_LOGIN: "{0} {<green>вошёл|<red>вышел}"
LOOKUP_PAGE: "Страница {0}"
LOOKUP_PROJECTILE: "{0} {бросил|выстрелил} {1} {2}."
LOOKUP_ROWS_FOUND: "{0} {строка|строк} найдено."
LOOKUP_SEARCHING: "Ведётся поиск. Пожалуйста подождите..."
LOOKUP_STORAGE: "{0} {положил|забрал} {1} {2}."
LOOKUP_TIME: "{0} назад"
LOOKUP_USERNAME: "{0} зарегистрирован как {1}."
MAXIMUM_RADIUS: "Максимальный радиус для {поиска|отката|восстановления} - {0}."
MISSING_ACTION_USER: "Чтобы использовать это действие, укажите пользователя."
MISSING_LOOKUP_TIME: "Пожалуйста, укажите количество времени, чтобы использовать {поиск|откат|восстановление}."
MISSING_LOOKUP_USER: "Укажите пользователя или {блок|радиус} для поиска."
MISSING_PARAMETERS: "Пожалуйста используйте «{0}»."
MISSING_ROLLBACK_RADIUS: "Вы не указали радиус {отката|восстановления}."
MISSING_ROLLBACK_USER: "Вы не указали пользователя для {отката|восстановления}."
MYSQL_UNAVAILABLE: "Невозможно подключиться к серверу MySQL."
NO_DATA: "Данные не найдены в {0}."
NO_DATA_LOCATION: "В этом месте {данные|транзакции|взаимодействия|сообщения} не обнаружены.."
NO_PERMISSION: "У вас нет прав чтобы сделать это."
NO_RESULTS: "Результаты не найдены."
NO_RESULTS_PAGE: "Для этой страницы {результатов|данных} не найдено."
NO_ROLLBACK: "{Ожидаемый|Предыдущий} откат/восстановление не найдены."
PATCH_INTERRUPTED: "Обновление прервано. Попробую снова при перезапуске."
PATCH_OUTDATED_1: "Невозможно обновить базы данных старше {0}."
PATCH_OUTDATED_2: "Пожалуйста, обновите поддерживаемую версию CoreProtect."
PATCH_PROCESSING: "Обработка новых данных. Пожалуйста, подождите..."
PATCH_SKIP_UPDATE: "{Пропущена таблица|Пропущен индекс} {обновление|создание|удаление} в {0}."
PATCH_STARTED: "Выполняется обновление {0}. Пожалуйста, подождите..."
PATCH_SUCCESS: "Успешно обновлен до {0}."
PATCH_UPGRADING: "Выполняется обновление базы данных. Пожалуйста, подождите..."
PLEASE_SELECT: "Пожалуйста выберите: «{0}» или «{1}»."
PREVIEW_CANCELLED: "Предварительный просмотр отменен."
PREVIEW_CANCELLING: "Отмена предварительного просмотра..."
PREVIEW_IN_GAME: "Предварительный просмотр откатов доступен только в игре."
PREVIEW_TRANSACTION: "Вы не можете просмотреть {контейнер|инвентарь} транзакции."
PURGE_ABORTED: "Очистка не удалась. База данных может быть повреждена."
PURGE_ERROR: "Невозможно обработать данные {0}!"
PURGE_FAILED: "Очистка не удалась. Пожалуйста, повторите попытку позже."
PURGE_IN_PROGRESS: "Выполняется чистка. Пожалуйста, повторите попытку позже."
PURGE_MINIMUM_TIME: "Удалить можно только данные старше {0} {дней|часов}."
PURGE_NOTICE_1: "Учтите, что это может занять некоторое время."
PURGE_NOTICE_2: "Не перезагружайте сервер до завершения."
PURGE_OPTIMIZING: "Оптимизация базы данных. Пожалуйста, подождите..."
PURGE_PROCESSING: "Обработка данных {0}..."
PURGE_REPAIRING: "Попытка исправления. Это может занять некоторое время..."
PURGE_ROWS: "{0} {строка|строки} данных очищены."
PURGE_STARTED: "Очистка данных началась «{0}»."
PURGE_SUCCESS: "Очистка данных прошла успешно."
RELOAD_STARTED: "Перезагрузка конфигурации - подождите."
RELOAD_SUCCESS: "Конфигурация успешно перезагружена."
ROLLBACK_ABORTED: "Откат или восстановление прерваны."
ROLLBACK_CHUNKS_FOUND: "Найдено {0} {чанк|чанков} для изменения."
ROLLBACK_CHUNKS_MODIFIED: "Изменено {0}/{1} {чанк|чанков}."
ROLLBACK_COMPLETED: "{Откат|Восстановление|Предварительный просмотр} завершен для «{0}»."
ROLLBACK_EXCLUDED_USERS: "{Исключен пользователь|Исключены пользователи}: «{0}»."
ROLLBACK_INCLUDE: "{Включён|Исключён} {блок|сущность|цель} {типа|типов}: «{0}»."
ROLLBACK_IN_PROGRESS: "Откат/восстановление уже выполняется."
ROLLBACK_LENGTH: "Заняло времени: {0} {секунду|секунд}."
ROLLBACK_MODIFIED: "{Изменено|Изменены} {0}."
ROLLBACK_RADIUS: "Радиус: {0} {блок|блоков}."
ROLLBACK_SELECTION: "Радиус установлен «{0}»."
ROLLBACK_STARTED: "{Откат|Восстановление|Предварительный просмотр} начат «{0}»."
ROLLBACK_TIME: "Временной интервал: {0}."
ROLLBACK_WORLD_ACTION: "Только {мир|действие} «{0}»."
LOOKUP_PROJECTILE: "{0} {<red>бросил|<red>выстрелил} {1} {2}"
LOOKUP_ROWS_FOUND: "{0} {строка|строк} найдено"
LOOKUP_SEARCHING: "<gray><italic>Поиск данных, подождите..."
LOOKUP_STORAGE: "{0} {<green>положил|<red>забрал} {1} {2}"
LOOKUP_TIME: "<yellow>{0} назад"
LOOKUP_USERNAME: "{0} зарегистрирован как {1}"
MAXIMUM_RADIUS: "<red>Максимальный радиус для {поиска|отката|восстановления} - {0}"
MISSING_ACTION_USER: "<red>Чтобы использовать это действие, укажите пользователя"
MISSING_LOOKUP_TIME: "<red>Пожалуйста, укажите количество времени, чтобы использовать {поиск|откат|восстановление}"
MISSING_LOOKUP_USER: "<red>Укажите пользователя или {блок|радиус} для поиска"
MISSING_PARAMETERS: "<red>Пожалуйста используйте «{0}»"
MISSING_ROLLBACK_RADIUS: "<red>Вы не указали радиус {отката|восстановления}"
MISSING_ROLLBACK_USER: "<red>Вы не указали пользователя для {отката|восстановления}"
MYSQL_UNAVAILABLE: "<red>Невозможно подключиться к серверу MySQL"
NO_DATA: "<red>Данные не найдены в {0}"
NO_DATA_LOCATION: "<red>В этом месте {данные|транзакции|взаимодействия|сообщения} не обнаружены"
NO_PERMISSION: "<red>Нет доступа!"
NO_RESULTS: "<red>Результаты не найдены"
NO_RESULTS_PAGE: "<red>Для этой страницы {результатов|данных} не найдено"
NO_ROLLBACK: "<red>{Ожидаемый|Предыдущий} откат/восстановление не найдены"
PATCH_INTERRUPTED: "Обновление прервано. Попробую снова при перезапуске..."
PATCH_OUTDATED_1: "<red>Невозможно обновить базы данных старше {0}"
PATCH_OUTDATED_2: "Пожалуйста, обновите поддерживаемую версию Griefus"
PATCH_PROCESSING: "<gray><italic>Обработка новых данных. Пожалуйста, подождите..."
PATCH_SKIP_UPDATE: "{Пропущена таблица|Пропущен индекс} {обновление|создание|удаление} в {0}"
PATCH_STARTED: "<gray><italic>Выполняется обновление {0}. Пожалуйста, подождите..."
PATCH_SUCCESS: "<green>Успешно обновлен до {0}"
PATCH_UPGRADING: "<gray><italic>Выполняется обновление базы данных. Пожалуйста, подождите..."
PLEASE_SELECT: "<red>Пожалуйста выберите: «{0}» или «{1}»"
PREVIEW_CANCELLED: "<gray>Предварительный просмотр отменен"
PREVIEW_CANCELLING: "<gray><italic>Отмена предварительного просмотра..."
PREVIEW_IN_GAME: "<red>Предварительный просмотр откатов доступен только в игре"
PREVIEW_TRANSACTION: "<red>Вы не можете просмотреть {контейнер|инвентарь} транзакции"
PURGE_ABORTED: "<red>Очистка не удалась. База данных может быть повреждена"
PURGE_ERROR: "<red>Невозможно обработать данные {0}!"
PURGE_FAILED: "<red>Очистка не удалась. Пожалуйста, повторите попытку позже"
PURGE_IN_PROGRESS: "<red>Выполняется чистка. Пожалуйста, повторите попытку позже"
PURGE_MINIMUM_TIME: "<red>Удалить можно только данные старше {0} {дней|часов}"
PURGE_NOTICE_1: "<yellow>Учтите, что это может занять некоторое время"
PURGE_NOTICE_2: "<gold>Не перезагружайте сервер до завершения"
PURGE_OPTIMIZING: "<gray><italic>Оптимизация базы данных. Пожалуйста, подождите..."
PURGE_PROCESSING: "<gray><italic>Обработка данных {0}..."
PURGE_REPAIRING: "<gray><italic>Попытка исправления. Это может занять некоторое время..."
PURGE_ROWS: "<green>{0} {строка|строки} данных очищены"
PURGE_STARTED: "<gray>Очистка данных началась «{0}»"
PURGE_SUCCESS: "<green>Очистка данных прошла успешно"
RELOAD_STARTED: "<gray><italic>Перезагрузка конфигурации, подождите..."
RELOAD_SUCCESS: "<green>Конфигурация успешно перезагружена"
ROLLBACK_ABORTED: "<red>Откат или восстановление прерваны"
ROLLBACK_CHUNKS_FOUND: "<gray>Найдено {0} {чанк|чанков} для изменения"
ROLLBACK_CHUNKS_MODIFIED: "<gray>Изменено {0}/{1} {чанк|чанков}"
ROLLBACK_COMPLETED: "<gray>{Откат|Восстановление|Предварительный просмотр} завершен для «{0}»"
ROLLBACK_EXCLUDED_USERS: "<gray>{Исключен пользователь|Исключены пользователи}: «{0}»"
ROLLBACK_INCLUDE: "<gray>{Включён|Исключён} {блок|сущность|цель} {типа|типов}: «{0}»"
ROLLBACK_IN_PROGRESS: "<red>Откат/восстановление уже выполняется"
ROLLBACK_LENGTH: "<gray>Заняло времени: {0} {секунду|секунд}"
ROLLBACK_MODIFIED: "<gray>{Изменено|Изменены} {0}"
ROLLBACK_RADIUS: "<gray>Радиус: {0} {блок|блоков}"
ROLLBACK_SELECTION: "<gray>Радиус установлен «{0}»"
ROLLBACK_STARTED: "<gray>{Откат|Восстановление|Предварительный просмотр} начат «{0}»"
ROLLBACK_TIME: "<gray>Временной интервал: {0}"
ROLLBACK_WORLD_ACTION: "<gray>Только {мир|действие} «{0}»"
SIGN_HEADER: "Сообщения на табличке"
STATUS_CONSUMER: "Потребитель: {0} {предмет|предметы} в очереди."
STATUS_CONSUMER: "Потребитель: {0} {предмет|предметы} в очереди"
STATUS_DATABASE: "База данных: Использует {0}."
STATUS_INTEGRATION: "{0}: Интеграция {включена|отключена}."
STATUS_INTEGRATION: "{0}: Интеграция {включена|отключена}"
STATUS_LICENSE: "Лицензия: {0}"
STATUS_VERSION: "Версия: {0}"
TELEPORTED: "Телепортирование в {0}."
TELEPORTED_SAFETY: "Телепортируем вас в безопасное место."
TELEPORT_PLAYERS: "Команду телепортации могут использовать только игроки."
TELEPORTED: "<gray><italic>Телепортирование в {0}..."
TELEPORTED_SAFETY: "<yellow>Телепортируем вас в безопасное место"
TELEPORT_PLAYERS: "<red>Команду телепортации могут использовать только игроки"
TIME_DAYS: "{0} {дня|дней}"
TIME_HOURS: "{0} {час|часов}"
TIME_MINUTES: "{0} {минута|минут}"
TIME_SECONDS: "{0} {секунда|секунд}"
TIME_UNITS: "{/m|/h|/d}"
TIME_UNITS: "{ мин.| ч.| д.}"
TIME_WEEKS: "{0} {неделя|недель}"
UPDATE_ERROR: "Произошла ошибка при проверке обновлений."
UPDATE_ERROR: "<red>Произошла ошибка при проверке обновлений"
UPDATE_HEADER: "{0} Обновление"
UPDATE_NOTICE: "Примечание: теперь доступен {0}."
UPGRADE_IN_PROGRESS: "Выполняется обновление. Пожалуйста, повторите попытку позже."
USER_NOT_FOUND: "Пользователь «{0}» не найден."
USER_OFFLINE: "Пользователь \"{0}\" не в сети."
USING_MYSQL: "Для хранения данных используется MySQL."
USING_SQLITE: "Для хранения данных используется SQLite."
VALID_DONATION_KEY: "Действующий ключ пожертвования."
UPDATE_NOTICE: "Примечание: теперь доступен {0}"
UPGRADE_IN_PROGRESS: "<red>Выполняется обновление. Пожалуйста, повторите попытку позже"
USER_NOT_FOUND: "<red>Пользователь «{0}» не найден"
USER_OFFLINE: "<red>Пользователь \"{0}\" не в сети"
USING_MYSQL: "Для хранения данных используется MySQL"
USING_SQLITE: "Для хранения данных используется SQLite"
VALID_DONATION_KEY: "Действующий ключ пожертвования"
VERSION_NOTICE: "Версия {0} уже доступна!"
VERSION_REQUIRED: "{0} {1} или выше требуется."
WORLD_NOT_FOUND: "Мир «{0}» не найден."
VERSION_REQUIRED: "<red>{0} {1} или выше требуется"
WORLD_NOT_FOUND: "<red>Мир «{0}» не найден"

View file

@ -7,6 +7,11 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.sk89q.worldedit.util.formatting.text.serializer.plain.PlainComponentSerializer;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.serializer.json.JSONComponentSerializer;
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
@ -14,6 +19,7 @@ import org.bukkit.Server;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.data.BlockData;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
@ -215,15 +221,19 @@ public class CoreProtectAPI extends Queue {
/**
* Logs a chat message for a player.
*
* @param player
* @param sender
* The player who sent the message
* @param message
* The chat message
* @return True if the message was logged
*/
public boolean logChat(Player player, String message) {
if (!isEnabledForPlayer(player) || !Config.getConfig(player.getWorld()).PLAYER_MESSAGES) {
return false;
public boolean logChat(CommandSender sender, String message) {
Player player = null;
if (sender instanceof Player) {
player = (Player) sender;
if (!isEnabledForPlayer(player) || !Config.getConfig(player.getWorld()).PLAYER_MESSAGES) {
return false;
}
}
if (message == null || message.isEmpty() || message.startsWith("/")) {
@ -231,10 +241,32 @@ public class CoreProtectAPI extends Queue {
}
long timestamp = System.currentTimeMillis() / 1000L;
Queue.queuePlayerChat(player, message, timestamp);
if(player == null) Queue.queueChat(sender, message, timestamp);
else Queue.queuePlayerChat(player, message, timestamp);
return true;
}
/**
* Logs a componentized chat message for a player.
*
* @param sender
* The player who sent the message
* @param component
* The chat message
* @return True if the message was logged
*/
public boolean logChat(CommandSender sender, Component component) {
return logChat(sender, MiniMessage.miniMessage().serialize(component));
}
// API Stub
public boolean logChat(Player sender, String message) {
return logChat((CommandSender) sender, message);
}
// API Stub
public boolean logChat(Player sender, Component component) {
return logChat(sender, MiniMessage.miniMessage().serialize(component));
}
/**
* Logs a command executed by a player.
*

View file

@ -25,6 +25,14 @@ public class CommandHandler implements CommandExecutor {
public boolean onCommand(CommandSender user, Command command, String commandLabel, String[] argumentArray) {
String commandName = command.getName().toLowerCase(Locale.ROOT);
// Griefus begin
if (commandName.equals("coi") || commandName.equals("gusi")) {
boolean permission = user.hasPermission("coreprotect.inspect");
InspectCommand.runCommand(user, permission, argumentArray);
return true;
}
// Griefus end
if (commandName.equals("core") || commandName.equals("coreprotect") || commandName.equals("co") || commandName.equals("griefus") || commandName.equals("gus")) {
int resultc = argumentArray.length;
if (resultc > -1) {

View file

@ -109,6 +109,8 @@ public class StandardLookupThread implements Runnable {
ConfigHandler.lookupAlist.put(player.getName(), actions);
ConfigHandler.lookupRadius.put(player.getName(), radius);
String separator = Color.DARK_GREY + '-';
if (connection != null) {
Statement statement = connection.createStatement();
String baduser = "";
@ -195,14 +197,15 @@ public class StandardLookupThread implements Runnable {
else if (pageStart < rows) {
List<String[]> lookupList = Lookup.performPartialLookup(statement, player, uuidList, userList, blockList, excludedBlocks, excludedUsers, actions, finalLocation, radius, rowData, timeStart, timeEnd, (int) pageStart, displayResults, restrict_world, true);
Chat.sendMessage(player, Color.WHITE + "----- " + Color.DARK_AQUA + Phrase.build(Phrase.LOOKUP_HEADER, "Griefus" + Color.WHITE + " | " + Color.DARK_AQUA) + Color.WHITE + " -----");
// Chat.sendMessage(player, Color.WHITE + "----- " + Color.DARK_AQUA + Phrase.build(Phrase.LOOKUP_HEADER, "Griefus" + Color.WHITE + " | " + Color.DARK_AQUA) + Color.WHITE + " -----");
Chat.sendComponent(player, StringUtils.makeHeader("LOGS"));
if (actions.contains(6) || actions.contains(7)) { // Chat/command
for (String[] data : lookupList) {
String time = data[0];
String dplayer = data[1];
String message = data[2];
String timeago = ChatUtils.getTimeSince(Integer.parseInt(time), unixtimestamp, true);
Chat.sendComponent(player, timeago + " " + Color.WHITE + "- " + Color.DARK_AQUA + dplayer + ": " + Color.WHITE, message);
Chat.sendComponent(player, "<dark_gray><bold>|<reset> " + timeago + " " + Color.WHITE + "- " + message);
if (PluginChannelHandshakeListener.getInstance().isPluginChannelPlayer(player)) {
int wid = Integer.parseInt(data[3]);
int dataX = Integer.parseInt(data[4]);
@ -232,7 +235,7 @@ public class StandardLookupThread implements Runnable {
}
String tag = (action != 0 ? Color.GREEN + "+" : Color.RED + "-");
Chat.sendComponent(player, timeago + " " + tag + " " + Color.DARK_AQUA + Phrase.build(Phrase.LOOKUP_LOGIN, Color.DARK_AQUA + dplayer + Color.WHITE, (action != 0 ? Selector.FIRST : Selector.SECOND)));
Chat.sendComponent(player, "<dark_gray><bold>|<reset> " + timeago + " " + tag + " " + Color.DARK_AQUA + Phrase.build(Phrase.LOOKUP_LOGIN, Color.DARK_AQUA + dplayer + Color.WHITE, (action != 0 ? Selector.FIRST : Selector.SECOND)));
Chat.sendComponent(player, Color.WHITE + leftPadding + Color.GREY + "^ " + ChatUtils.getCoordinates(command.getName(), wid, dataX, dataY, dataZ, true, true) + "");
PluginChannelListener.getInstance().sendInfoData(player, Integer.parseInt(time), Phrase.LOOKUP_LOGIN, (action != 0 ? Selector.FIRST : Selector.SECOND), dplayer, -1, dataX, dataY, dataZ, wid);
}
@ -266,8 +269,8 @@ public class StandardLookupThread implements Runnable {
leftPadding = leftPadding + Color.WHITE + Strings.padStart("", (timeLength - 50) / 4, ' ');
}
Chat.sendComponent(player, timeago + " " + Color.WHITE + "- " + Color.DARK_AQUA + dplayer + ": " + Color.WHITE, message);
Chat.sendComponent(player, Color.WHITE + leftPadding + Color.GREY + "^ " + ChatUtils.getCoordinates(command.getName(), wid, dataX, dataY, dataZ, true, true) + "");
Chat.sendComponent(player,"<dark_gray><bold>|<reset> " + timeago + " " + Color.WHITE + "- " + Color.DARK_AQUA + dplayer + ": " + Color.WHITE, message);
Chat.sendComponent(player, Color.RESET + leftPadding + ChatUtils.getShowCoordinatesButton(dataX, dataY, dataZ) + " " + ChatUtils.getTeleportButton(wid, dataX, dataY, dataZ));
PluginChannelListener.getInstance().sendMessageData(player, Integer.parseInt(time), dplayer, message, true, dataX, dataY, dataZ, wid);
}
}
@ -286,7 +289,11 @@ public class StandardLookupThread implements Runnable {
String rbd = ((Integer.parseInt(data[8]) == 2 || Integer.parseInt(data[8]) == 3) ? Color.STRIKETHROUGH : "");
String timeago = ChatUtils.getTimeSince(Integer.parseInt(time), unixtimestamp, true);
Material blockType = ItemUtils.itemFilter(MaterialUtils.getType(dtype), (Integer.parseInt(data[13]) == 0));
String dname = StringUtils.nameFilter(blockType.name().toLowerCase(Locale.ROOT), ddata);
// Griefus begin
//String dname = StringUtils.nameFilter(blockType.name().toLowerCase(Locale.ROOT), ddata);
String dname = MaterialUtils.asTranslatable(blockType);
// Griefus end
byte[] metadata = data[11] == null ? null : data[11].getBytes(StandardCharsets.ISO_8859_1);
String tooltip = ItemUtils.getEnchantments(metadata, dtype, amount);
@ -317,7 +324,7 @@ public class StandardLookupThread implements Runnable {
tag = (daction == 0 ? Color.GREEN + "+" : Color.RED + "-");
}
Chat.sendComponent(player, timeago + " " + tag + " " + Phrase.build(Phrase.LOOKUP_CONTAINER, Color.DARK_AQUA + rbd + dplayer + Color.WHITE + rbd, "x" + amount, ChatUtils.createTooltip(Color.DARK_AQUA + rbd + dname, tooltip) + Color.WHITE, selector));
Chat.sendComponent(player, "<dark_gray><bold>|<reset> " + timeago + " " + separator + " " + Phrase.build(Phrase.LOOKUP_CONTAINER, Color.WHITE + Color.BOLD + rbd + dplayer + Color.RESET + rbd, "x" + amount, ChatUtils.createTooltip(Color.GOLD + rbd + dname, tooltip) + Color.WHITE, selector));
PluginChannelListener.getInstance().sendData(player, Integer.parseInt(time), Phrase.LOOKUP_CONTAINER, selector, dplayer, dname, amount, dataX, dataY, dataZ, wid, rbd, true, tag.contains("+"));
}
}
@ -362,13 +369,19 @@ public class StandardLookupThread implements Runnable {
isPlayer = true;
}
else {
dname = EntityUtils.getEntityType(dtype).name();
// Griefus begin
// dname = EntityUtils.getEntityType(dtype).name();
dname = EntityUtils.asTranslatable(EntityUtils.getEntityType(dtype));
// Griefus end
}
}
else {
dname = MaterialUtils.getType(dtype).name().toLowerCase(Locale.ROOT);
dname = StringUtils.nameFilter(dname, ddata);
// Griefus begin
//dname = MaterialUtils.getType(dtype).name().toLowerCase(Locale.ROOT);
//dname = StringUtils.nameFilter(dname, ddata);
dname = MaterialUtils.asTranslatable(MaterialUtils.getType(dtype));
}
/*
if (dname.length() > 0 && !isPlayer) {
dname = "minecraft:" + dname.toLowerCase(Locale.ROOT) + "";
}
@ -378,6 +391,8 @@ public class StandardLookupThread implements Runnable {
String[] blockNameSplit = dname.split(":");
dname = blockNameSplit[1];
}
*/
// Griefus end
// Functions.sendMessage(player2, timeago+" " + ChatColors.WHITE + "- " + ChatColors.DARK_AQUA+rbd+""+dplayer+" " + ChatColors.WHITE+rbd+""+a+" " + ChatColors.DARK_AQUA+rbd+"#"+dtype+ChatColors.WHITE + ". " + ChatColors.GREY + "(x"+x+"/y"+y+"/z"+z+")");
@ -413,7 +428,7 @@ public class StandardLookupThread implements Runnable {
action = "a:container";
}
Chat.sendComponent(player, timeago + " " + tag + " " + Phrase.build(phrase, Color.DARK_AQUA + rbd + dplayer + Color.WHITE + rbd, "x" + amount, ChatUtils.createTooltip(Color.DARK_AQUA + rbd + dname, tooltip) + Color.WHITE, selector));
Chat.sendComponent(player, "<dark_gray><bold>|<reset>" + timeago + " " + separator + " " + Phrase.build(phrase, Color.WHITE + Color.BOLD + rbd + dplayer + Color.RESET + rbd, "x" + amount, ChatUtils.createTooltip(Color.GOLD + rbd + dname, tooltip) + Color.WHITE, selector));
PluginChannelListener.getInstance().sendData(player, Integer.parseInt(time), phrase, selector, dplayer, dname, (tag.contains("+") ? 1 : -1), dataX, dataY, dataZ, wid, rbd, action.contains("container"), tag.contains("+"));
}
else {
@ -429,20 +444,20 @@ public class StandardLookupThread implements Runnable {
tag = (daction != 0 ? Color.GREEN + "+" : Color.RED + "-");
}
Chat.sendComponent(player, timeago + " " + tag + " " + Phrase.build(phrase, Color.DARK_AQUA + rbd + dplayer + Color.WHITE + rbd, Color.DARK_AQUA + rbd + dname + Color.WHITE, selector));
Chat.sendComponent(player, timeago + " " + separator + " " + Phrase.build(phrase, Color.WHITE + Color.BOLD + rbd + dplayer + Color.RESET + rbd, Color.GOLD + rbd + dname + Color.WHITE, selector));
PluginChannelListener.getInstance().sendData(player, Integer.parseInt(time), phrase, selector, dplayer, dname, (tag.contains("+") ? 1 : -1), dataX, dataY, dataZ, wid, rbd, false, tag.contains("+"));
}
action = (actions.size() == 0 ? " (" + action + ")" : "");
Chat.sendComponent(player, Color.WHITE + leftPadding + Color.GREY + "^ " + ChatUtils.getCoordinates(command.getName(), wid, dataX, dataY, dataZ, true, true) + Color.GREY + Color.ITALIC + action);
Chat.sendComponent(player, Color.RESET + leftPadding + ChatUtils.getShowCoordinatesButton(dataX, dataY, dataZ) + " " + ChatUtils.getTeleportButton(wid, dataX, dataY, dataZ));
}
}
if (rows > displayResults) {
int total_pages = (int) Math.ceil(rows / (displayResults + 0.0));
if (actions.contains(6) || actions.contains(7) || actions.contains(9) || (actions.contains(4) && actions.contains(11))) {
/* if (actions.contains(6) || actions.contains(7) || actions.contains(9) || (actions.contains(4) && actions.contains(11))) {
Chat.sendMessage(player, "-----");
}
Chat.sendComponent(player, ChatUtils.getPageNavigation(command.getName(), page, total_pages));
} */
Chat.sendComponent(player, ChatUtils.getPageNavigationVC(command.getName(), page, total_pages));
}
}
else if (rows > 0) {

View file

@ -13,6 +13,7 @@ import org.bukkit.block.data.Bisected;
import org.bukkit.block.data.Bisected.Half;
import org.bukkit.block.data.type.Bed;
import org.bukkit.block.data.type.Bed.Part;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
@ -303,6 +304,14 @@ public class Queue {
queueStandardData(consumerId, currentConsumer, new String[] { player.getName(), null }, new Object[] { timestamp, player.getLocation().clone() });
}
protected static void queueChat(CommandSender sender, String message, long timestamp) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(currentConsumer, new Object[] { consumerId, Process.PLAYER_CHAT, null, 0, null, 0, 0, null });
Consumer.consumerStrings.get(currentConsumer).put(consumerId, message);
queueStandardData(consumerId, currentConsumer, new String[] { sender.getName(), null }, new Object[] { timestamp, null });
}
protected static void queuePlayerCommand(Player player, String message, long timestamp) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);

View file

@ -84,13 +84,19 @@ public class BlockLookup {
String timeAgo = ChatUtils.getTimeSince(resultTime, time, true);
if (!found) {
resultTextBuilder = new StringBuilder(Color.WHITE + "----- " + Color.DARK_AQUA + "Griefus " + Color.WHITE + "----- " + ChatUtils.getCoordinates(command, worldId, x, y, z, false, false) + "\n");
// resultTextBuilder = new StringBuilder(Color.WHITE + "----- " + Color.DARK_AQUA + "Griefus " + Color.WHITE + "----- " + ChatUtils.getCoordinates(command, worldId, x, y, z, false, false) + "\n");
// Lookup/Checker header
resultTextBuilder = new StringBuilder(StringUtils.makeHeader("CHECKER") +
" " + ChatUtils.getShowCoordinatesButton(x, y, z) +
(commandSender.hasPermission("coreprotect.teleport") ? " " + // TODO: change teleport permission key
ChatUtils.getTeleportButton(worldId, x, y, z) : "") + "\n");
}
found = true;
Phrase phrase = Phrase.LOOKUP_BLOCK;
String selector = Selector.FIRST;
String tag = Color.WHITE + "-";
String separator = Color.DARK_GREY + "-";
if (resultAction == 2 || resultAction == 3) {
phrase = Phrase.LOOKUP_INTERACTION; // {clicked|killed}
selector = (resultAction != 3 ? Selector.FIRST : Selector.SECOND);
@ -109,26 +115,32 @@ public class BlockLookup {
String target;
if (resultAction == 3) {
target = EntityUtils.getEntityType(resultType).name();
// Griefus begin
//target = EntityUtils.getEntityType(resultType).name();
target = EntityUtils.asTranslatable(EntityUtils.getEntityType(resultType));
// Griefus end
}
else {
Material resultMaterial = MaterialUtils.getType(resultType);
if (resultMaterial == null) {
resultMaterial = Material.AIR;
}
target = StringUtils.nameFilter(resultMaterial.name().toLowerCase(Locale.ROOT), resultData);
target = "minecraft:" + target.toLowerCase(Locale.ROOT);
// Griefus begin
//target = StringUtils.nameFilter(resultMaterial.name().toLowerCase(Locale.ROOT), resultData);
//target = "minecraft:" + target.toLowerCase(Locale.ROOT);
target = MaterialUtils.asTranslatable(resultMaterial);
}
if (target.length() > 0) {
/*if (target.length() > 0) {
target = "" + target + "";
}
}*/
// Hide "minecraft:" for now.
if (target.startsWith("minecraft:")) {
// Hide "minecraft:" for now. - do not!!
/*if (target.startsWith("minecraft:")) {
target = target.split(":")[1];
}
} */
// Griefus end
resultTextBuilder.append(timeAgo + " " + tag + " ").append(Phrase.build(phrase, Color.DARK_AQUA + rbFormat + resultUser + Color.WHITE + rbFormat, Color.DARK_AQUA + rbFormat + target + Color.WHITE, selector)).append("\n");
resultTextBuilder.append(timeAgo + " " + separator + " ").append(Phrase.build(phrase, Color.WHITE + Color.BOLD + rbFormat + resultUser + Color.RESET + rbFormat, Color.GOLD + rbFormat + target + Color.WHITE, selector)).append("\n");
PluginChannelListener.getInstance().sendData(commandSender, resultTime, phrase, selector, resultUser, target, -1, x, y, z, worldId, rbFormat, false, tag.contains("+"));
}
@ -137,9 +149,8 @@ public class BlockLookup {
if (found) {
if (count > limit) {
String pageInfo = Color.WHITE + "-----\n";
pageInfo = pageInfo + ChatUtils.getPageNavigation(command, page, totalPages) + "\n";
resultText = resultText + pageInfo;
// String pageInfo = Color.WHITE + "-----\n";
resultText = resultText + ChatUtils.getPageNavigationVC(command, page, totalPages) + "\n";
}
}
else {
@ -150,7 +161,10 @@ public class BlockLookup {
// resultText = Color.WHITE + "No block data found at " + Color.ITALIC + "x" + x + "/y" + y + "/z" + z + ".";
resultText = Phrase.build(Phrase.NO_DATA_LOCATION, Selector.FIRST);
if (!blockName.equals("air") && !blockName.equals("cave_air")) {
resultText = Phrase.build(Phrase.NO_DATA, Color.ITALIC + block.getType().name().toLowerCase(Locale.ROOT) + Color.WHITE) + "\n";
// Griefus begin
//resultText = Phrase.build(Phrase.NO_DATA, Color.ITALIC + block.getType().name().toLowerCase(Locale.ROOT) + Color.WHITE) + "\n";
resultText = Phrase.build(Phrase.NO_DATA, Color.ITALIC + MaterialUtils.asTranslatable(block.getType()) + Color.WHITE) + "\n";
// Griefus end
}
}
}

View file

@ -112,6 +112,9 @@ public class ChestTransactionLookup {
if (resultMaterial == null) {
resultMaterial = Material.AIR;
}
// Griefus begin
String target = MaterialUtils.asTranslatable(resultMaterial);
/*
String target = resultMaterial.name().toLowerCase(Locale.ROOT);
target = StringUtils.nameFilter(target, resultData);
if (target.length() > 0) {
@ -122,6 +125,8 @@ public class ChestTransactionLookup {
if (target.startsWith("minecraft:")) {
target = target.split(":")[1];
}
*/
// Griefus end
result.add(new StringBuilder(timeAgo + " " + tag + " " + Phrase.build(Phrase.LOOKUP_CONTAINER, Color.DARK_AQUA + rbFormat + resultUser + Color.WHITE + rbFormat, "x" + resultAmount, ChatUtils.createTooltip(Color.DARK_AQUA + rbFormat + target, tooltip) + Color.WHITE, selector)).toString());
PluginChannelListener.getInstance().sendData(commandSender, resultTime, Phrase.LOOKUP_CONTAINER, selector, resultUser, target, resultAmount, x, y, z, worldId, rbFormat, true, tag.contains("+"));

View file

@ -100,6 +100,9 @@ public class InteractionLookup {
if (resultMaterial == null) {
resultMaterial = Material.AIR;
}
// Griefus begin
String target = MaterialUtils.asTranslatable(resultMaterial);
/*
String target = resultMaterial.name().toLowerCase(Locale.ROOT);
target = StringUtils.nameFilter(target, resultData);
if (target.length() > 0) {
@ -110,6 +113,8 @@ public class InteractionLookup {
if (target.startsWith("minecraft:")) {
target = target.split(":")[1];
}
*/
// Griefus end
resultBuilder.append(timeAgo + " " + Color.WHITE + "- ").append(Phrase.build(Phrase.LOOKUP_INTERACTION, Color.DARK_AQUA + rbFormat + resultUser + Color.WHITE + rbFormat, Color.DARK_AQUA + rbFormat + target + Color.WHITE, Selector.FIRST)).append("\n");
PluginChannelListener.getInstance().sendData(commandSender, resultTime, Phrase.LOOKUP_INTERACTION, Selector.FIRST, resultUser, target, -1, x, y, z, worldId, rbFormat, false, false);

View file

@ -2,7 +2,13 @@ package net.coreprotect.utility;
import net.coreprotect.language.Phrase;
import net.coreprotect.language.Selector;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.event.HoverEvent;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextDecoration;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.Bukkit;
import org.bukkit.command.ConsoleCommandSender;
import java.text.DecimalFormat;
@ -42,6 +48,19 @@ public class ChatUtils {
return message.append("</hover></click>").toString(); // griefus
}
public static String getShowCoordinatesButton(int x, int y, int z) {
return "<dark_gray><hover:show_text:\"" +
"X: <yellow>" + x + "</yellow> " +
"Y: <yellow>" + y + "</yellow> " +
"Z: <yellow>" + z + "</yellow> " +
"\">[координаты]</hover></dark_gray>";
}
public static String getTeleportButton(int worldId, int x, int y, int z) {
// May break if worldId index is outdated
return "<dark_gray><click:run_command:/tppos " + x + " " + y + " " + z + " " + Bukkit.getWorlds().get(worldId).getName() +
">[телепортироваться]</click></dark_gray>";
}
public static String getPageNavigation(String command, int page, int totalPages) {
StringBuilder message = new StringBuilder();
@ -143,6 +162,57 @@ public class ChatUtils {
return message.append(Color.WHITE + backArrow + Color.DARK_AQUA + Phrase.build(Phrase.LOOKUP_PAGE, Color.WHITE + page + "/" + totalPages) + nextArrow + pagination).toString();
}
public static String getPageNavigationVC(String command, int page, int totalPages) {
if (totalPages < 1)
return "";
Component separator = Component.text(" | ", NamedTextColor.DARK_GRAY, TextDecoration.BOLD);
String backButtonText = "[назад]";
String nextButtonText = "[далее]";
HoverEvent<Component> backButtonHover = HoverEvent
.showText(Component.text("Нажмите, чтобы перейти на предыдущую страницу", NamedTextColor.RED));
HoverEvent<Component> nextButtonHover = HoverEvent
.showText(Component.text("Нажмите, чтобы перейти на следующую страницу", NamedTextColor.GREEN));
ClickEvent backButtonClick = ClickEvent.runCommand("/" + command + " l " + (page - 1));
ClickEvent nextButtonClick = ClickEvent.runCommand("/" + command + " l " + (page + 1));
Component backButton;
if (page > 1) {
backButton = Component.text(backButtonText)
.color(NamedTextColor.RED)
.hoverEvent(backButtonHover)
.clickEvent(backButtonClick);
} else {
backButton = Component.text(backButtonText)
.color(NamedTextColor.GRAY)
.decorate(TextDecoration.ITALIC);
}
Component nextButton;
if (page < totalPages) {
nextButton = Component.text(nextButtonText)
.color(NamedTextColor.GREEN)
.hoverEvent(nextButtonHover)
.clickEvent(nextButtonClick);
} else {
nextButton = Component.text(nextButtonText)
.color(NamedTextColor.GRAY)
.decorate(TextDecoration.ITALIC);
}
Component pageCounter = Component.text(page + "/" + totalPages, NamedTextColor.GRAY);
Component navigation = Component.empty()
.append(backButton)
.append(separator)
.append(pageCounter)
.append(separator)
.append(nextButton);
return MiniMessage.miniMessage().serialize(navigation);
}
public static String getTimeSince(long resultTime, long currentTime, boolean component) {
StringBuilder message = new StringBuilder();
double timeSince = currentTime - (resultTime + 0.00);

View file

@ -137,4 +137,8 @@ public class EntityUtils extends Queue {
return result;
}
public static String asTranslatable(EntityType type){
return "<lang:" + type.translationKey() + ">";
}
}

View file

@ -3,6 +3,7 @@ package net.coreprotect.utility;
import java.util.Locale;
import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import net.coreprotect.config.ConfigHandler;
@ -213,4 +214,9 @@ public class MaterialUtils extends Queue {
return isInventory ? 2 : 1;
}
}
// Griefus
public static String asTranslatable(Material material) {
return "<lang:" + material.translationKey() + ">";
}
}

View file

@ -135,4 +135,9 @@ public class StringUtils {
}
return list.toArray(new Integer[list.size()]);
}
// VanillaCrafts
public static String makeHeader(String header) {
return "<gray>=============== </gray><red><bold>" + header + "</bold></red><gray> ===============</gray>";
}
}

View file

@ -35,6 +35,16 @@ commands:
permission: coreprotect.griefus
permission-message: §3Griefus §f- You do not have permission to do that.
usage: /<command> <params>
coi:
description: Inspector mode shortcut
permission: coreprotect.inspect
permission-message: §3Griefus §f- You do not have permission to do that.
usage: /<command> <params>
gusi:
description: Inspector mode shortcut
permission: coreprotect.inspect
permission-message: §3Griefus §f- You do not have permission to do that.
usage: /<command> <params>
permissions:
coreprotect.*:
description: Gives access to all Griefus actions and commands