Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Доступ к API из асинхронного потока или IllegalStateException: Asynchronous entity add!

Статус
Закрыто для дальнейших ответов.

ql_Nik_lp

Старожил
Девелопер
Пользователь
Баллы
173
Имя в Minecraft
ql_Nik_lp
Всем доброго времени суток, дорогие друзья!
Пишу свой плагин-гейммод, и поскольку еще приступая знал что придется производить много просчетов и вычислений, а лаги и провисания не допустимы, устроил все так, что грубо говоря вся работа плагина выполняется на отдельном потоке, и все было хорошо, ровно до того момента как я принялся за работу с миром, а именно моей задачей было выбросить предметы из инвентаря игрока, и как результат:
Код:
17:20:45 [SEVERE] java.lang.IllegalStateException: Asynchronous entity add!
17:20:45 [SEVERE]      at net.minecraft.server.v1_6_R2.World.addEntity(World.ja
va:930)
17:20:45 [SEVERE]      at net.minecraft.server.v1_6_R2.World.addEntity(World.ja
va:926)
17:20:45 [SEVERE]      at org.bukkit.craftbukkit.v1_6_R2.CraftWorld.dropItem(Cr
aftWorld.java:302)
17:20:45 [SEVERE]      at org.bukkit.craftbukkit.v1_6_R2.CraftWorld.dropItemNat
urally(CraftWorld.java:316)

Погуглив я нашел вот такую информацию:
3PqB8.png

Вопрос - как быть?
У меня ощущение что ответ на самом деле прост, но я все же его не вижу :C
Заранее благодарю
 
no-eto-uzhe-sovsem-drugaya-istoriya_25625580_orig_.jpeg


Если у кого будет подобная проблема - в личку.
 
Ну а чего тут не отписаться? Жалко что ли?
 
Ну а чего тут не отписаться? Жалко что ли?

Можно и отписаться :)
Проблему решил так:
Создал отдельный BukkitTask и все необходимые действия прописал в нем, и просто вызываю его из потока.

Таск:
Код:
public class DropItemsTask extends BukkitRunnable {
 
public Player player;
 
public DropItemsTask(Player player) {
this.player = player;
}
 
public void run() {
for (ItemStack is : player.getInventory().getContents()) {
player.getWorld().dropItemNaturally(player.getLocation(), is);
player.getInventory().remove(is);
}
}
}
Его вызов:
Код:
new DropItemsTask(player).runTask(GameActions.plugin);
 
Класс, я бы так красиво не посоветовал бы :)
 
Статус
Закрыто для дальнейших ответов.

Поделиться этой страницей

Назад
Верх