Как реализовать эту функцию? Я хотел добавить функцию сохранения инвентаря для игроков с привилегиями. Нам нужен код для плагина. Я пытаюсь писать самостоятельно, но все равно не могу сделать рабочую версию.
Предотвратить/отменить дропы и передать их прямо мертвому игроку, он будет клонирован их инвентарь при респауне. Хэш-карта не требуется.
Если вам нужна дополнительная помощь, покажите нам, что вы пробовали.
Это правильная проверка здоровья игрока?
if (player.getHealthData (). health (). exists ()) {
…
}
И я делаю не понимаю, как вернуть игроку его инвентарь. Даже если я отменю выбрасывание вещей, то при смерти они все равно выпадут.
- Вы в курсе
/gamerule keepInventory true
- Я ожидал
@Listener public void onDestructEntityDeath (последнее событие DropItemEvent.Destruct, @ Корневой игрок player) {event.filterEntities ((e) -> true); }
для работы,
Также это
@Listener public void onDestructEntityDeath (последнее событие DropItemEvent.Destruct, @Root Player player) {event.setCancelled (true); }
Мне не нужно хранить инвентарь для всех игроков. Игроки без привилегий должны терять предметы, как и раньше. Я пытаюсь создать плагин, похожий на этот.
Затем добавьте логику проверки разрешений перед изменением события.
Всегда хранит инвентарь игрока, даже если у него нет привилегии.
Вы предлагаете мне очистить инвентарь от игроков без привилегии? Меня этот вариант не устраивает. В случае смерти игрока без привилегий его предметы должны упасть на землю.
Нет, я просто пытался убедиться, что вы в курсе.
Сначала я не понял, что вы имели в виду под привилегиями.
Я также не понимаю, почему вы проверяли состояние здоровья.
Было ли выполнено одно из два сэмпла слушателя у меня работают? Можете ли вы показать нам, что вы пробовали?
Я могу сохранить инвентарь игрока с помощью этого кода. Но еще нужно добавить тест на здоровье игрока. Проблема, с которой я столкнулся, заключается в том, что я пытаюсь загрузить инвентарь, или ничего не происходит, или я получаю сообщение об ошибке в консоли, а игрок не получает свои предметы.
static HashMap inv = new HashMap ();
@Listenerpublic void onDestructEntityDeath (последнее событие DropItemEvent.Pre, @Root Player player) {if (player.hasPermission ("inventory.save")) {event.setCancelled (true); inv.put (игрок, player.getInventory ()); }}
Подскажите, как отдать игроку его вещи. Не понимаю как. Вот мой код.
@Listener public void onPlayerRespawn (событие RespawnPlayerEvent, @Root Player player) {if (player.hasPermission ("inventory.save")) {player. getInventory (). равно (инв.); }}
Прежде всего: equals ()
проверяет , если два объекта равны, и не делает их равными. Это основной метод в Java, и позвольте мне сказать вам: будет действительно сложно работать с губкой, не понимая, например, разницы между equals ()
, ==
и =
.
Теперь к вашей проблеме: вместо (Edit: Нет , я неправильно понял sth., это не сработает xd) equals ()
вы могли бы используйте player.getInventory (). put (inv);
для восстановления, но я сомневаюсь, что это действительно то, что вы хотите сделать…
Вместо всего этого вы должны просто прислушаться к предложению @ ryantheleach и — вместо сохранения и восстановления — просто предотвратить сброс элемента.
Я уже сделал, чтобы предотвратить потерю элемента путем изменения правила игры. Хотя это решение не совсем правильное, оно должно помочь.
Я имел в виду не его предложение изменить правила игры, а его функцию:
@Listenerpublic void onDestructEntityDeath (последнее событие DropItemEvent.Destruct, @Root Player player) {if (player.hasPermission ("inventory.save")) {event.setCancelled (true); }}
Я даже добавил для вас проверку разрешений
Я упростил задачу с помощью DestructEntityEvent.Death и RespawnPlayerEvent. Я также использовал таймеры, чтобы предотвратить возможные неисправности.
Тогда в чем ваша проблема?
Проблема была вчера, сегодня я нашел решение.
Мне кажется, что использование таймеров подвержено ошибкам…
Вы должны иметь возможность давать/отменять сброс инвентаря прямо обратно в мертвый игрок. инвентарь копируется при возрождении мертвого игрока, просто он обычно уже очищается.
В любом случае, если у вас есть решение, я бы хотел его увидеть.
Я использовал события смерти сущности и возрождения игрока.
Когда игрок умирает с правом на сохранение, этот код активируется.
if (player.hasPermission ("beancore.inventory.save")) {world.getProperties (). setGameRule ("keepInventory", "true"); player.sendMessage (Text.of (префикс, invsave)); Sponge.getServer (). GetConsole (). SendMessage (Text.of (префикс, invsave, "", player.getName ())); }
Когда игрок возрождается, используется следующий код.
if (player.hasPermission ("beancore.inventory .save ")) {world.getProperties (). setGameRule (" keepInventory "," true "); попробуйте {Thread.sleep (10L); } catch (InterruptedException, т.е.) {} world.getProperties (). setGameRule ("keepInventory", "false"); } else {world.getProperties (). setGameRule ("keepInventory", "ложь"); }
Я использую таймер для предотвращения сбоев.
Нет! Нет нет нет! Это абсолютно ужасная идея! Вызов Thread.sleep
в потоке основного сервера приведет к зависанию всего сервера, и это то, что никогда не следует предпринимать. Установка такого правила игры также действительно плохая идея, поскольку она подвержена всевозможным ошибкам — например, что произойдет, если два игрока умрут одновременно?
Уже было сказано, что вы должны работать непосредственно с инвентарем игрока и дропами в результате смерти игрока. Я думаю, вы сможете сделать это, работая только с событием смерти, поэтому используйте предложения, данные выше другими.
Когда я пытаюсь заблокировать потерю вещей из инвентаря игрока, в зависимости от выбранного события, либо нет сдачи, либо игрок вообще не может бросить предмет. А при респауне инвентарь все равно убирается. С такой небольшой задержкой у меня нет никаких проблем, к тому же она сводит к минимуму вероятность появления различных багов. Ошибка может возникнуть только в том случае, если 2 разных игрока умирают и возрождаются одновременно, и вероятность такого события практически равна нулю.
При необходимости задержку можно уменьшить или использовать другой метод. используется для восстановления параметра правила игры по умолчанию, над чем я сейчас работаю. Я пытался сохранить инвентарь игрока, когда здесь умер в HashMap, но после этого не могу загрузить его.
Прошу прощения за мой английский, я использую переводчик Google.
Используя методы Java, вы можете создать отдельный поток и выполнить код, который я написал выше, лично я уже использую один такой метод.