- Вариант 1. Отключить PvP для всех на сервере
- Вариант 2. Отключить удары только для части игроков через “флаг” предметом
- Вариант 3. Разрешить PvP по правилам групп: scoreboard teams friendlyfire false
- Вариант 4. На Forge/модах: отменять события нападения на серверной стороне
- Типичные ошибки, из-за которых “не получается”
- Как выбрать лучший способ
- Полезные ссылки
Задача простая: нужно заблокировать урон между игроками. Делать это можно разными способами в зависимости от того, что у вас за сервер и как вы хотите управлять правилом.
Ниже - практичные варианты, от самых быстрых до более гибких.
Вариант 1. Отключить PvP для всех на сервере
Если вам нужно, чтобы в игре вообще никто никого не бил, проще всего выключить PvP целиком. Обычно это настраивается плагином или правилами сервера.
Как правило, логика такая:
- при попытке нанести урон возникает событие
- обработчик отменяет урон, если условие не выполняется
Этот подход обсуждают в сообществах для серверов на Bukkit/Spigot, где правило часто переключают через переменную (например, pvp со значениями on/off).
Вариант 2. Отключить удары только для части игроков через “флаг” предметом
Если нужно, чтобы “свои” не били друг друга, а также можно было включать/выключать правило на лету, обычно делают так:
- игрокам выдают предмет-команду
- пока игрок держит этот предмет, урон по игрокам отменяется
- при попытке атаки срабатывает событие “получил урон”, и его отменяют
Смысл из примера с форумов такой: обработчик проверяет условие, и если оно верное, отменяет событие и отправляет сообщение атакующему.
Важно
- предмет команды должен выдаваться сервером
- отмена делается на стороне сервера, а не на клиенте
Если пытаться “обмануть” клиент, сервер все равно получает пакеты о ударах и продолжит считать атаки, как в случаях с modding-темами: клиентская отмена часто не срабатывает надежно.
Вариант 3. Разрешить PvP по правилам групп: scoreboard teams friendlyfire false
Когда требуется управлять PvP по группам, удобнее использовать scoreboard teams.
Идея такая:
- вы создаете команду в scoreboard
- добавляете в нее нужных игроков
- включаете опцию дружеского огня false, чтобы игроки внутри команды не били друг друга
Пример команд (формат зависит от версии, но общая схема такая):
| Задача | Команда |
|---|---|
| Создать команду | /scoreboard teams add pvp |
| Добавить игрока в команду | /scoreboard teams join pvp Ник_игрока |
| Запретить friendlyfire внутри команды | /scoreboard teams option pvp friendlyfire false |
После этого урон между игроками одной команды не проходит.
Плюсы
- работает без плагинов
- правило прозрачно и управляется командами
Минусы
- сложнее настроить частые “переключения” без скриптов или плагина
Вариант 4. На Forge/модах: отменять события нападения на серверной стороне
Для модов на Forge встречается подход, где отменяют эвенты атак. Например, в темах про отмену LivingAttackEvent или близких событий.
Но критично:
- логика должна выполняться на сервере
- обработчик должен быть зарегистрирован в нужном bus, иначе отмена не срабатывает
Если вы отрабатываете отмену только на клиенте, сервер все равно получит действие и продолжит обработку атаки, даже если “визуально” атака не прошла.
Типичные ошибки, из-за которых “не получается”
1) Отменяют только урон на клиенте
Сервер все равно принимает попытку атаки. Итог - пакеты проходят, правило не работает надежно.
2) Неправильно зарегистрирован обработчик события
Событие должно быть подписано и зарегистрировано на нужной стороне и в нужном event bus.
3) Проверяют условие не в том месте
Отмена должна быть там, где реально решается исход атаки. Если вы отменяете не то событие или не в том порядке, удар все равно проходит.
4) Смешивают разные механики PvP
Например, вы отключили PvP в одном месте, но остались другие правила, которые разрешают friendlyfire или боевую механику в регионе/сценарии.
Как выбрать лучший способ
| Ситуация | Что сделать |
|---|---|
| Нужно запретить удары полностью всем | Отключить PvP целиком (на уровне сервера/плагина) |
| Нужно запретить удары только “своим” или по условию | scoreboard teams friendlyfire false |
| Нужны быстрые переключения “в игре сейчас можно/нельзя” | плагин с переменной (on/off) или предметом команды |
| Делаете мод на Forge | отмена эвентов на серверной стороне и корректная регистрация |
Полезные ссылки
- https://ruforum.mineland.net/threads/kak-sdelat-tak-chto-by-igroki-s-1-komandy-ne-mogli-bit-drug-druga.7594/
- https://ru-minecraft.ru/forum/showtopic-16498/
- https://forum.mcmodding.ru/threads/zapret-udara-po-suschnosti-na-kliente.27664/
- https://minecraft.net/ru-ru/article/parental-controls