[Решено] Как сохранить инвентарь игрока при смерти в HashMap и загрузить его при возрождении?

Как реализовать эту функцию? Я хотел добавить функцию сохранения инвентаря для игроков с привилегиями. Нам нужен код для плагина. Я пытаюсь писать самостоятельно, но все равно не могу сделать рабочую версию.


Предотвратить/отменить дропы и передать их прямо мертвому игроку, он будет клонирован их инвентарь при респауне. Хэш-карта не требуется.

Если вам нужна дополнительная помощь, покажите нам, что вы пробовали.


Это правильная проверка здоровья игрока?

if (player.getHealthData (). health (). exists ()) {

}

И я делаю не понимаю, как вернуть игроку его инвентарь. Даже если я отменю выбрасывание вещей, то при смерти они все равно выпадут.


  1. Вы в курсе /gamerule keepInventory true
  2. Я ожидал
  @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 () , == и = .

Теперь к вашей проблеме: вместо equals () вы могли бы используйте player.getInventory (). put (inv); для восстановления, но я сомневаюсь, что это действительно то, что вы хотите сделать… (Edit: Нет , я неправильно понял sth., это не сработает xd)
Вместо всего этого вы должны просто прислушаться к предложению @ 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, вы можете создать отдельный поток и выполнить код, который я написал выше, лично я уже использую один такой метод.

Оцените статью
Gamicon.ru
Добавить комментарий