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

Помогите Ащипка при спавне энтити в CreatureSpawnEvent...

Discussion in 'Разработка плагинов для новичков' started by Mr_RoboMan, Jun 25, 2016.

  1. Автор темы
    Mr_RoboMan

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

    Trophy Points:
    123
    [​IMG]
    Code:
    public class HardcoreMobManager implements Listener {
    
        public ArrayList<EntityType> entities = new ArrayList(){{
            add(EntityType.CAVE_SPIDER);
            add(EntityType.SPIDER);
            add(EntityType.ENDERMAN);
            add(EntityType.CREEPER);
            add(EntityType.BLAZE);
            add(EntityType.SKELETON);
            add(EntityType.ZOMBIE);
            add(EntityType.PIG_ZOMBIE);
            add(EntityType.MAGMA_CUBE);
            add(EntityType.SLIME);
            add(EntityType.WITCH);
        }};
    
        public ArrayList<EntityType> entities2 = new ArrayList(){{
            add(EntityType.SKELETON);
            add(EntityType.ZOMBIE);
            add(EntityType.PIG_ZOMBIE);
        }};
    
        @EventHandler
        public void HARDCORIZE(CreatureSpawnEvent event) {
            LivingEntity entity = (LivingEntity)
                    event.
                            getLocation().
                            getWorld().
                            spawnEntity(//49 строка...
                            event.getLocation(),
                            entities.get(new Random().nextInt(entities.size())));
            event.setCancelled(true);
            if (event.getLocation().getBlock().getBiome() == Biome.HELL) {
                entity.setCustomName(ChatColor.translateAlternateColorCodes('&', "&cHARDCORE &2MOB"));
                entity.setCustomNameVisible(true);
                entity.setMaxHealth(60);
                if (entities2.contains(entity.getType())) {
                    entity.getEquipment().setHelmet(new ItemStack(Material.DIAMOND_HELMET));
                    entity.getEquipment().setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE));
                    entity.getEquipment().setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS));
                    entity.getEquipment().setBoots(new ItemStack(Material.DIAMOND_BOOTS));
                    entity.getEquipment().setItemInMainHand(new ItemStack(Material.DIAMOND_SWORD));
                }
            }
        }
    
     
  2. Хостинг MineCraft
    <
  3. fall.us

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

    Trophy Points:
    76
    Имя в Minecraft:
    fallus
    То что на скрине можно назвать иерархией вызова вашего метода. Самой ошибки нет.
     
  4. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    event.getLocation()? разве нужно не event.getEntity().getLocation()?[DOUBLEPOST=1466877826,1466877543][/DOUBLEPOST]И как ты вообще спавнишь энтити из евента? У тебя идёт бесконечный спавн мобов, который ты отменяешь.[DOUBLEPOST=1466878880][/DOUBLEPOST]
    Code:
        public ArrayList<Location> loc = new ArrayList<Location>();
        public ArrayList<EntityType> entities = new ArrayList<EntityType>(){{
            add(EntityType.CAVE_SPIDER);
            add(EntityType.SPIDER);
            add(EntityType.ENDERMAN);
            add(EntityType.CREEPER);
            add(EntityType.BLAZE);
            add(EntityType.SKELETON);
            add(EntityType.ZOMBIE);
            add(EntityType.PIG_ZOMBIE);
            add(EntityType.MAGMA_CUBE);
            add(EntityType.SLIME);
            add(EntityType.WITCH);
        }};
        public ArrayList<EntityType> entities2 = new ArrayList<EntityType>(){{
            add(EntityType.SKELETON);
            add(EntityType.ZOMBIE);
            add(EntityType.PIG_ZOMBIE);
        }};
        @EventHandler
        public void HARDCORIZE(CreatureSpawnEvent event) {
            if (loc.contains(event.getLocation())) return;
            event.setCancelled(true);
            loc.add(event.getLocation());
            LivingEntity entity = (LivingEntity)event.getLocation().getWorld().spawnEntity(event.getLocation(),entities.get(new Random().nextInt(entities.size())));
            if (event.getLocation().getBlock().getBiome() == Biome.HELL) {
                entity.setCustomName(ChatColor.translateAlternateColorCodes('&', "&cHARDCORE &2MOB"));
                entity.setCustomNameVisible(true);
                entity.setMaxHealth(60);
                if (entities2.contains(entity.getType())) {
                    entity.getEquipment().setHelmet(new ItemStack(Material.DIAMOND_HELMET));
                    entity.getEquipment().setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE));
                    entity.getEquipment().setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS));
                    entity.getEquipment().setBoots(new ItemStack(Material.DIAMOND_BOOTS));
                    entity.getEquipment().setItemInMainHand(new ItemStack(Material.DIAMOND_SWORD));
                }
            }
            loc.remove(event.getLocation());
        }
    
    пробуй.
     
  5. Автор темы
    Mr_RoboMan

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

    Trophy Points:
    123
    Упс, да, до меня дошло..
    Типо когда я спавню энтити, метод вызывается заново и так до бесконочности...
    Ладно, я тогда напишу чего я хотел сделать этим методом..
    Я хотел что-бы в аду, всегда спавнились хардкорные мобы!
    Но проблема в том что там спавняться только свино-зомби, гасты. и пару других мобов...
    В общем можно ли сделать это как-то менее костыльно чем делаю я?
    P.S. Код выше сейчас протестирую, но так как я понял свою ошибку, почти уверен что он будет работать, поэтому вопрос только в том, можно ли сделать это менее костыльно..
     
  6. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Ну а разве мой код очень костыльный? У меня даже идей нету как по другому сделать.[DOUBLEPOST=1466920471,1466920089][/DOUBLEPOST]И скорее всего нужно сначала проверить находитьсч ли моб в аду, а потом уже отменять евент и спавнить мобов.
     
  7. Автор темы
    Mr_RoboMan

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

    Trophy Points:
    123
    Не очень костыльно, но так по моему лучше)
    Code:
        @EventHandler
        public void HARDCORIZE(CreatureSpawnEvent event) {
            if (event.getEntity().getCustomName() != null && event.getEntity().getCustomName().equalsIgnoreCase(CUSTOM_NAME)) return;
            if (event.getEntity().getLocation().getBlock().getBiome() == Biome.HELL) {
                event.setCancelled(true);
    
    [DOUBLEPOST=1466920784][/DOUBLEPOST]А впрочем не важно, это тоже не работает :D[DOUBLEPOST=1466920860][/DOUBLEPOST]Хотя сейчас я не понимаю, ведь метод не должен вызыватся овер мильйон раз?
    Я же устанавливаю ему ник, а потом если ник такой - то return делаю..
    Code:
        @EventHandler
        public void HARDCORIZE(CreatureSpawnEvent event) {
            if (event.getEntity().getCustomName() != null && event.getEntity().getCustomName().equals(CUSTOM_NAME)) return;
            if (event.getEntity().getLocation().getBlock().getBiome() == Biome.HELL) {
                event.setCancelled(true);
                LivingEntity entity = (LivingEntity)
                        event.getLocation().getWorld().spawnEntity(event.getLocation(), entities.get(new Random().nextInt(entities.size())));
                entity.setCustomName(CUSTOM_NAME);
                entity.setCustomNameVisible(true);
    
     
  8. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Потому что поидее сначало энтити спавниться, а потом ее изменяет. Попробуй в System.out выводить ее харки во время спавна моба.
     
  9. Автор темы
    Mr_RoboMan

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

    Trophy Points:
    123
    Проблема в том, что ошибка сыпется раз 100 в секунду, поэтому выводить чет в консоль - бессмысленно, я это врядли вижу...
    Но попытаюсь..[DOUBLEPOST=1466921546,1466921350][/DOUBLEPOST]И я не совсем понял какие именно характеристики выводить..
    Попробовал выводить имя, получаю кучу строк name=null
    Code:
        @EventHandler
        public void HARDCORIZE(CreatureSpawnEvent event) {
            if (event.getEntity().getCustomName() != null && event.getEntity().getCustomName().equals(CUSTOM_NAME)) return;
            if (event.getEntity().getLocation().getBlock().getBiome() == Biome.HELL) {
                System.out.println("name=" + event.getEntity().getCustomName());
                event.setCancelled(true);
                LivingEntity entity = (LivingEntity)
                        event.getLocation().getWorld().spawnEntity(event.getLocation(), entities.get(new Random().nextInt(entities.size())));
                entity.setCustomName(CUSTOM_NAME);
                entity.setCustomNameVisible(true);
                entity.setMaxHealth(60);
                entity.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 40, 1));
                if (entities2.contains(entity.getType())) {
                    entity.getEquipment().setHelmet(HELMET);
                    entity.getEquipment().setChestplate(CHESTPLATE);
                    entity.getEquipment().setLeggings(LEGGINGS);
                    entity.getEquipment().setBoots(BOOTS);
                    entity.getEquipment().setItemInMainHand(SWORD);
                }
                if (entities3.contains(entity.getType())) {
                    entity.getEquipment().setItemInMainHand(BOW);
                }
            }
        }
    
    [DOUBLEPOST=1466921652][/DOUBLEPOST]Стоп я тут подумал...
    А что если, когда я вызываю метод spawnEntity моментально создается новый CreatureSpawnEvent и мое имя не успевает присвоится?
     
  10. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Я же так и написал. Что сначало спавнится моб, а потом изменяется
     
  11. Автор темы
    Mr_RoboMan

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

    Trophy Points:
    123
    А тьху, не понял сразу...
    Блин, так это очень плохо...
     
  12. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    В чём проблема юзать лист с локацией, которую всёравно удаляешь оттуда сразу?
     
  13. Автор темы
    Mr_RoboMan

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

    Trophy Points:
    123
    Да я вообще не люблю хранить локацию энтитей..
    У меня можно так сказать фобия этого))
    Но ладно, как я вижу, других вариантов нет...[DOUBLEPOST=1466922535,1466922231][/DOUBLEPOST]Ну да ладно, сделал с локацией, все зароботало!
     
  14. Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Не локацию лучше в лист, а UUID энтити. Это куда лучше.
     
  15. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Так её не получить ДО спавна ведь. А если получить после спавна моба, то тупо опять пойдёт бесконечный спавн мобов.
     
  16. Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Вполне таки можно получить, ибо сначала создаётся Entity, а потом только вызывается эвент.
     
  17. Автор темы
    Mr_RoboMan

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

    Trophy Points:
    123
    Да ладно, работает и работает...
    У меня теперь другой вопрос (дабы не плодить темы) как загрузить мир с именем String name;
    при условии что он находится там же где и все остальные миры (т.е. в папке сервера).
    Именно не сгенерировать и т.д., мир полностью готов, надо только загрузить!
     
  18. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Не получается. Там моментально кастуется спавн евент. Тоесть не успевает добавиться uuid в лист, чтобы проверить потом.
    http://pastebin.com/DrXZi9kb

    Code:
        @EventHandler
        public void HARDCORIZE(CreatureSpawnEvent event) {
            event.setCancelled(true);
            System.out.print("Event: " + event.getEntity().getUniqueId());
            if (loc.contains(event.getEntity().getUniqueId())) {
                System.out.print("AA");
                return;
            }
            LivingEntity entity = (LivingEntity)event.getLocation().getWorld().spawnEntity(event.getLocation(),entities.get(new Random().nextInt(entities.size())));
            System.out.print("Entity: "+entity.getUniqueId());
            loc.add(entity.getUniqueId());
        }
    Ниодного "AA" нету.[DOUBLEPOST=1466930937,1466930686][/DOUBLEPOST]
    Code:
    WorldCreator wc = new WorldCreator("asd");
    World w = Bukkit.createWorld(wc);
    Если мир есть, то его поидее должно тупо загрузить.
     
  19. Автор темы
    Mr_RoboMan

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

    Trophy Points:
    123
    asd - имя мира?
     
  20. slavik123123123

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

    Trophy Points:
    143
    Имя в Minecraft:
    Leymooooooooooo
    da
     
  21. Dereku

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    А это странно. Хотя, хрен его знает как оно будет работать.
     

Share This Page