Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Свои NPC.

Тема в разделе "Разработка плагинов для новичков", создана пользователем Mr_RoboMan, 2 май 2016.

Статус темы:
Закрыта.
  1. Автор темы
    Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    Хочу сделать что-то вроде своих NPC, этим NPC может быть любой моб, он должен стоять всегда на своем месте, и т.д.
    И в принципе у меня все получилось, когда "спавню" бота вручную - все работает бота нельзя трогать, он стоит себе спокойно, его никто не трогает и т.д.
    Но, не работает после запуска сервера заново!
    Боты просто не спавняться (вставлял дебаг - метод отрабатывает, ошибок нет).
    Ну а вручную их опять таки заспавнить можно..
    Код:
    public class Bot implements Listener {
    
        private Bot() {
    
        }
    
        private static Bot instance = new Bot();
    
        public static Bot getInstance() {
            return instance;
        }
    
        //Все боты
        public static HashSet<LivingEntity> botsEntity = new HashSet();
    
        //Получаю дозуя ошибок IllegalStateException: Asynchronous entity add
        @EventHandler
        public void testPlant(AsyncPlayerChatEvent event) {
            if (event.getMessage().equalsIgnoreCase("СТАРТ")) LoadAllBots();
        }
    
        //Вызывается при запуске сервера - должно спавнить ботов - не спавнит...
        public static void LoadAllBots() {
            for (ServerFile bF : ServerFile.allSF.get(ServerFile.ServerFileType.BOT)) {
                if (IsAllParamsSet(bF)) {
                    Main.bot.spawn(bF.name);
                }
            }
        }
    
    
        //Вызывается при остановке сервера
        public static void killBots() {
            for (LivingEntity entity : botsEntity)
                entity.remove();
        }
    
        //Ну.. Просто проверка на то все ли параметра бота указаны в конфиге
        static boolean IsAllParamsSet(ServerFile bF) {
            return bF.isSet("DISPLAY_NAME") && bF.isSet("LOCATION") && bF.isSet("ENTITY_TYPE");
        }
    
        //Это и еще 3 метода ниже - конфигурация бота (некрасивая - но работает)
        public void addBot(String name) {
            try {
                ServerFile.getInstance(name, ServerFile.ServerFileType.BOT);
            } catch (Exception e) {
                Main.standardCatchException(e);
            }
        }
    
        public void setDisplayName(String name, String displaName) {
            try {
                ServerFile botFile = ServerFile.getInstance(name, ServerFile.ServerFileType.BOT);
                botFile.set("DISPLAY_NAME", displaName);
            } catch (Exception e) {
                Main.standardCatchException(e);
            }
        }
    
        public void setLocation(String name, Location location) {
            try {
                ServerFile botFile = ServerFile.getInstance(name, ServerFile.ServerFileType.BOT);
                botFile.set("LOCATION", Main.textLocation.format(location, false, false));
            } catch (Exception e) {
                Main.standardCatchException(e);
            }
        }
    
        public void setType(String name, EntityType type) {
            try {
                ServerFile botFile = ServerFile.getInstance(name, ServerFile.ServerFileType.BOT);
                botFile.set("ENTITY_TYPE", type.toString());
            } catch (Exception e) {
                Main.standardCatchException(e);
            }
        }
    
        //Спавн бота.
        public void spawn(String name) {
            try {
                ServerFile botFile = ServerFile.getInstance(name, ServerFile.ServerFileType.BOT);
                Location location = Main.textLocation.parse(botFile.getString("LOCATION"));
                EntityType type = EntityType.valueOf(botFile.getString("ENTITY_TYPE"));
                LivingEntity entity = (LivingEntity) location.getWorld().spawnEntity(location, type);
                String displayName = botFile.getString("DISPLAY_NAME");
                entity.setCustomName(ChatColor.translateAlternateColorCodes('&', displayName));
                entity.setCustomNameVisible(true);
                entity.setCollidable(false);
                entity.setAI(false);
                botsEntity.add(entity);
            } catch (Exception e) {
                Main.standardCatchException(e);
            }
        }
    
        //Запрет бить бота
        @EventHandler
        public void onDamage(EntityDamageByEntityEvent event) {
            if (botsEntity.contains(event.getEntity()))
                event.setCancelled(true);
        }
    
        //Запрет "охотится" на бота
        @EventHandler
        public void onTarget(EntityTargetLivingEntityEvent event) {
            if (event.getTarget() != null && botsEntity.contains(event.getTarget()))
                event.setCancelled(true);
        }
    
        //Запрет гореть ботам
        @EventHandler
        public void onCombust(EntityCombustEvent event) {
            if (botsEntity.contains(event.getEntity()))
                event.setCancelled(true);
        }
    }
     
  2. Хостинг MineCraft
    <
  3. Rfg0

    Rfg0 Активный участник Пользователь

    Баллы:
    46
    Имя в Minecraft:
    Rfg0
    Кинь дебаг сюда
     
  4. Автор темы
    Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    Ну... Сама ошибка вот:
    Все остальное в консоли - мусор
    Код:
    [10:06:22] [Async Chat Thread - #0/WARN]: [NEVENDAAR] IllegalStateException в плагине NEVENDAAR!! GWM разберись!
    [10:06:22] [Async Chat Thread - #0/WARN]: java.lang.IllegalStateException: Asynchronous entity add!
    [10:06:22] [Async Chat Thread - #0/WARN]:     at org.spigotmc.AsyncCatcher.catchOp(AsyncCatcher.java:14)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at net.minecraft.server.v1_9_R1.World.addEntity(World.java:940)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at org.bukkit.craftbukkit.v1_9_R1.CraftWorld.addEntity(CraftWorld.java:1185)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at org.bukkit.craftbukkit.v1_9_R1.CraftWorld.spawn(CraftWorld.java:1192)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at org.bukkit.craftbukkit.v1_9_R1.CraftWorld.spawn(CraftWorld.java:896)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at org.bukkit.craftbukkit.v1_9_R1.CraftWorld.spawnEntity(CraftWorld.java:400)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at ua.gwm.BukkitPlugin.NEVENDAAR.Bot.spawn(Bot.java:91)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at ua.gwm.BukkitPlugin.NEVENDAAR.Bot$SpawnBotsTask.run(Bot.java:134)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at ua.gwm.BukkitPlugin.NEVENDAAR.Bot$SpawnBotsTask.<init>(Bot.java:127)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at ua.gwm.BukkitPlugin.NEVENDAAR.Bot.testPlant(Bot.java:35)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at java.lang.reflect.Method.invoke(Unknown Source)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:484)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at net.minecraft.server.v1_9_R1.PlayerConnection.chat(PlayerConnection.java:1272)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at net.minecraft.server.v1_9_R1.PlayerConnection.a(PlayerConnection.java:1210)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at net.minecraft.server.v1_9_R1.PacketPlayInChat$1.run(PacketPlayInChat.java:39)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at java.util.concurrent.FutureTask.run(Unknown Source)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    [10:06:22] [Async Chat Thread - #0/WARN]:     at java.lang.Thread.run(Unknown Source)
    [DOUBLEPOST=1462187382,1462180074][/DOUBLEPOST]Так что, какие есть варианты? Попытавшись что-то нагуглить, я понял только точто ошибка выскакивает кгда пытаешся цеплять Bukkit API из другого потока (?)..
    Но это мне мало что дало..
    нашел @ql_Nik_lp тему 2013-14 года, с похожей проблемой, но решение не подошло - ошибка все-равно сралась в консоль..
     
  5. slavik123123123

    slavik123123123 Старожил Пользователь

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    используй

    Код:
            Bukkit.getScheduler().runTask(this, new Runnable() {
                @Override
                public void run() {
                    // код
                }
            });
     
  6. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Вы плохо делаете( Не делайте так
     
  7. slavik123123123

    slavik123123123 Старожил Пользователь

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Кто именно? Я или ТС?
     
  8. ql_Nik_lp

    ql_Nik_lp Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    ТС.
     
  9. Автор темы
    Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    Так я тут затем чтоб узнать то, как правильно..[DOUBLEPOST=1462263601,1462205078][/DOUBLEPOST]
    Сделал. Теперь когда пишу "СТАРТ" то боты спавняться без ошибок, но такое чувство что спавнится 2 зомби.
    http://s018.radikal.ru/i508/1605/c2/80c405770b95.png
    Но, автоматически (при запуске сервера) все-равно не спавнятся... В чем может быть проблема?(
     
  10. slavik123123123

    slavik123123123 Старожил Пользователь

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Кинь весь код
     
  11. Автор темы
    Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    Вообще весь? Не влезет :D
    Сейчас скину весь код класса, ну и заскриню док-ва того что методы вызываются при запуске/остановке сервера.[DOUBLEPOST=1462265971,1462265908][/DOUBLEPOST]
    Код:
    package ua.gwm.BukkitPlugin.NEVENDAAR;
    
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Location;
    import org.bukkit.entity.EntityType;
    import org.bukkit.entity.LivingEntity;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.entity.EntityCombustEvent;
    import org.bukkit.event.entity.EntityDamageByEntityEvent;
    import org.bukkit.event.entity.EntityTargetLivingEntityEvent;
    import org.bukkit.event.player.AsyncPlayerChatEvent;
    
    import java.util.HashSet;
    
    public class Bot implements Listener {
    
        private Bot() {
    
        }
    
        private static Bot instance = new Bot();
    
        public static Bot getInstance() {
            return instance;
        }
    
        public static HashSet<LivingEntity> botsEntity = new HashSet();
    
        @EventHandler
        public void testPlant(AsyncPlayerChatEvent event) {
            if (event.getMessage().equalsIgnoreCase("СТАРТ")) LoadAllBots();
        }
    
    
        public static void LoadAllBots() {
            for (ServerFile bF : ServerFile.allSF.get(ServerFile.ServerFileType.BOT)) {
                if (IsAllParamsSet(bF)) {
                    Main.bot.spawn(bF.name);
                }
            }
        }
    
        public static void killBots() {
            for (LivingEntity entity : botsEntity)
                entity.remove();
        }
    
        static boolean IsAllParamsSet(ServerFile bF) {
            return bF.isSet("DISPLAY_NAME") && bF.isSet("LOCATION") && bF.isSet("ENTITY_TYPE");
        }
    
        public void addBot(String name) {
            try {
                ServerFile.getInstance(name, ServerFile.ServerFileType.BOT);
            } catch (Exception e) {
                Main.standardCatchException(e);
            }
        }
    
        public void setDisplayName(String name, String displaName) {
            try {
                ServerFile botFile = ServerFile.getInstance(name, ServerFile.ServerFileType.BOT);
                botFile.set("DISPLAY_NAME", displaName);
            } catch (Exception e) {
                Main.standardCatchException(e);
            }
        }
    
        public void setLocation(String name, Location location) {
            try {
                ServerFile botFile = ServerFile.getInstance(name, ServerFile.ServerFileType.BOT);
                botFile.set("LOCATION", Main.textLocation.format(location, false, false));
            } catch (Exception e) {
                Main.standardCatchException(e);
            }
        }
    
        public void setType(String name, EntityType type) {
            try {
                ServerFile botFile = ServerFile.getInstance(name, ServerFile.ServerFileType.BOT);
                botFile.set("ENTITY_TYPE", type.toString());
            } catch (Exception e) {
                Main.standardCatchException(e);
            }
        }
    
        public void spawn(String name) {
            Bukkit.getScheduler().runTask(Main.JP, () -> {
                try {
                    ServerFile botFile = ServerFile.getInstance(name, ServerFile.ServerFileType.BOT);
                    Location location = Main.textLocation.parse(botFile.getString("LOCATION"));
                    EntityType type = EntityType.valueOf(botFile.getString("ENTITY_TYPE"));
                    LivingEntity entity = (LivingEntity) location.getWorld().spawnEntity(location, type);
                    String displayName = botFile.getString("DISPLAY_NAME");
                    entity.setCustomName(ChatColor.translateAlternateColorCodes('&', displayName));
                    entity.setCustomNameVisible(true);
                    entity.setCollidable(false);
                    entity.setAI(false);
                    entity.setCanPickupItems(false);
                    botsEntity.add(entity);
                } catch (Exception e) {
                    Main.standardCatchException(e);
                }
            });
        }
    
        @EventHandler
        public void onDamage(EntityDamageByEntityEvent event) {
            if (botsEntity.contains(event.getEntity()))
                event.setCancelled(true);
        }
    
        @EventHandler
        public void onTarget(EntityTargetLivingEntityEvent event) {
            if (event.getTarget() != null && botsEntity.contains(event.getTarget()))
                event.setCancelled(true);
        }
    
        @EventHandler
        public void onCombust(EntityCombustEvent event) {
            if (botsEntity.contains(event.getEntity()))
                event.setCancelled(true);
        }
    }
    
    [DOUBLEPOST=1462266084][/DOUBLEPOST][​IMG] [​IMG][DOUBLEPOST=1462266165][/DOUBLEPOST]P.S. ServerFile - конфиг, немножко доделанный.
    Как-то так..)
     
  12. slavik123123123

    slavik123123123 Старожил Пользователь

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Попробуй так в onEnable
    Код:
            for (World w : Bukkit.getWorlds()) {
                if (w.getName().equalsIgnoreCase("World")) {
                    int X = 100;
                    int Z = 100;
                    w.loadChunk(X,Z);
                    for (LivingEntity ent : Bukkit.getWorld("World").getLivingEntities()) {
                        if (ent.getCustomName() != null && ent.getCustomName().equalsIgnoreCase("testmob")) {
                            ent.remove();
                            //Твой метод для спавнв мобов
                            spawnmob();
                    }
                }
            }
    [DOUBLEPOST=1462266621,1462266577][/DOUBLEPOST]И сделай загрузку плагина после загрузки мира в plugin.yml
     
  13. Автор темы
    Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    В plugin.yml итак сделано:
    load: POSTWORLD
    А вот с таким кодом.. Хм, попытаюсь.. И как я понял, убивать мобов после остановки сервера с таким кодом не надо..[DOUBLEPOST=1462269529][/DOUBLEPOST]
    Хотя я тут посмотрел на этот код.. И подумал.. А может лучше будет просто "искать" ботов при запуске сервера (не удалять при остановке) и просто заново с ними делать что надо.. Ведь у меня есть координаты каждого бота в конфиге!
    Мне кажется так намного экономнее будет, я прав?
     
  14. slavik123123123

    slavik123123123 Старожил Пользователь

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Как я понял, то loadChunk должен загружать чанк на координатах в указанных коде. После этого ищи моба с нужым именем, и добавляй его в HashMap
     
  15. Автор темы
    Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    Уже немного пригорает честно говоря...
    Уже и чанки прогружал, и чего только не делал, я тупо никак не могу найти эту долбаную энтити...
    И заспавнить автоматически тоже не получается..
    Неужели так все не продумано в Bukkit?!![DOUBLEPOST=1462283054,1462274723][/DOUBLEPOST]Ребят, неужели нет тех кто работал с Entity?
    Как вы справлялись с перезапуском сервера, спавнили заново, или как-то пытались доставать уже существующие Entity? =(
     
  16. Rfg0

    Rfg0 Активный участник Пользователь

    Баллы:
    46
    Имя в Minecraft:
    Rfg0
    Скорее всего через базу нпс брали их, а потом спавнили.
     
  17. Автор темы
    Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    Не понял..(
     
  18. Rfg0

    Rfg0 Активный участник Пользователь

    Баллы:
    46
    Имя в Minecraft:
    Rfg0
  19. Автор темы
    Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    Конечно спасибо, я попытаюсь что-то взять оттуда, но...
    Я состарюсь быстрее чем пойму что там к чему..))
     
  20. slavik123123123

    slavik123123123 Старожил Пользователь

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    кинь полностью исходник. папку src, plugin.yml, config.yml
     
  21. Автор темы
    Mr_RoboMan

    Mr_RoboMan Старожил Пользователь

    Баллы:
    123
    Только осторожнее, слишком много говнокода..
    https://github.com/nkGWM/NEVENDAAR
    P.S. Там какой-то один из вариантов автоматического создания ботов, но остальные тоже пробовал - не работает..
     
Статус темы:
Закрыта.

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