Войти или зарегистрироваться

Помогите Ошибка в потоке

kirill2011s

Старожил
Пользователь
Баллы
103
Здравствуйте, уважаемые форумчане!

У меня есть плагин который должен спавнить моба в потоке.

При запуске этого плагина на bukkit, у меня все работает, мобы спавнятся, ну вообщем все хорошо.
Когда я запускаю плагин на Spigot, происходит ошибка:
21:25:22 [SEVERE] Exception in thread "Thread-8"
21:25:23 [SEVERE] java.lang.IllegalStateException: Asynchronous entity add!
21:25:23 [SEVERE] at net.minecraft.server.v1_5_R3.World.addEntity(World.java:931)
21:25:23 [SEVERE] at org.bukkit.craftbukkit.v1_5_R3.CraftWorld.spawn(CraftWorld.java:1011)
21:25:23 [SEVERE] at org.bukkit.craftbukkit.v1_5_R3.CraftWorld.spawn(CraftWorld.java:785)
21:25:23 [SEVERE] at org.bukkit.craftbukkit.v1_5_R3.CraftWorld.spawnEntity(CraftWorld.java:342)
21:25:23 [SEVERE] at org.bukkit.craftbukkit.v1_5_R3.CraftWorld.spawnCreature(CraftWorld.java:338)
21:25:23 [SEVERE] at org.polushin.AtomickBomb.AtomickBomb$SpawnThread.run(AtomickBomb.java:61)
21:25:23 [SEVERE] at java.lang.Thread.run(Thread.java:744)

Вот кусочек кода в котором ошибка:

Код:
Bukkit.getWorld(world).spawnCreature(loc, EntityType.ZOMBIE);

world - название мира
loc - место для спавна моба

Так-же эклипс говорит что этот метод устарел. Может как-раз дело в устаревшем методе?
Подскажите, пожалуйста, новый метод для спавна, или объясните как решить эту ошибку.
 
Код:
loc.getWorld().spawnEntity(loc, EntityType.ZOMBIE);
 
При запуске этого плагина на bukkit, у меня все работает, мобы спавнятся, ну вообщем все хорошо.
Когда я запускаю плагин на Spigot, происходит ошибка:
В спиготе многое делается в отдельных потоках. Это послужило причиной ошибки. Исправление(хотя я сам не знаю) - вывести это действие в главный поток =\
 
Можно попробовать все действия спрятать в runnable и вызвать через шедуллер - должно помочь с проблемой потока.
 
В спиготе многое делается в отдельных потоках. Это послужило причиной ошибки. Исправление(хотя я сам не знаю) - вывести это действие в главный поток =\

Я не очень понимаю как спавнить мобов в главном потоке? Ведь мне нужно чтобы мобы спавнились через определенный промежуток времени.

Можно попробовать все действия спрятать в runnable и вызвать через шедуллер - должно помочь с проблемой потока.

Ээээ, а по подробнее?
 
Я не очень понимаю как спавнить мобов в главном потоке? Ведь мне нужно чтобы мобы спавнились через определенный промежуток времени.



Ээээ, а по подробнее?
Что поподробнее? Нужные действия выполняешь в планировщике потоков через минимальное количество тиков (хоть ноль поставь) - это должно гарантировать, что действия будут выполнены в главном потоке.
 
Твоя проблема вызвана тем что ты пытаешься взаимодействовать с непосредственно сервером из асинхронного потока. Это запрещено.
Как и сказали выше - используй Task'и
http://wiki.bukkit.org/Scheduler_Programming
 
В спиготе многое делается в отдельных потоках. Это послужило причиной ошибки. Исправление(хотя я сам не знаю) - вывести это действие в главный поток =\
Причиной ошибки послучило что автор не прочитал предепрежедение о том что использовать большую часть BukkitAPI не в главном потоке нельзя, так как это может вызвать краш сервера.
И в отличии от баккита спайгот валидирует такие вещи.
 
Назад
Верх