.

Статус
Закрыто для дальнейших ответов.
То что на скрине можно назвать иерархией вызова вашего метода. Самой ошибки нет.
 
event.getLocation()? разве нужно не event.getEntity().getLocation()?
И как ты вообще спавнишь энтити из евента? У тебя идёт бесконечный спавн мобов, который ты отменяешь.
Java:
    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());
    }
пробуй.
 
Упс, да, до меня дошло..
Типо когда я спавню энтити, метод вызывается заново и так до бесконочности...
Ладно, я тогда напишу чего я хотел сделать этим методом..
Я хотел что-бы в аду, всегда спавнились хардкорные мобы!
Но проблема в том что там спавняться только свино-зомби, гасты. и пару других мобов...
В общем можно ли сделать это как-то менее костыльно чем делаю я?
P.S. Код выше сейчас протестирую, но так как я понял свою ошибку, почти уверен что он будет работать, поэтому вопрос только в том, можно ли сделать это менее костыльно..
 
Упс, да, до меня дошло..
Типо когда я спавню энтити, метод вызывается заново и так до бесконочности...
Ладно, я тогда напишу чего я хотел сделать этим методом..
Я хотел что-бы в аду, всегда спавнились хардкорные мобы!
Но проблема в том что там спавняться только свино-зомби, гасты. и пару других мобов...
В общем можно ли сделать это как-то менее костыльно чем делаю я?
P.S. Код выше сейчас протестирую, но так как я понял свою ошибку, почти уверен что он будет работать, поэтому вопрос только в том, можно ли сделать это менее костыльно..
Ну а разве мой код очень костыльный? У меня даже идей нету как по другому сделать.
И скорее всего нужно сначала проверить находитьсч ли моб в аду, а потом уже отменять евент и спавнить мобов.
 
Ну а разве мой код очень костыльный? У меня даже идей нету как по другому сделать.
И скорее всего нужно сначала проверить находитьсч ли моб в аду, а потом уже отменять евент и спавнить мобов.
Не очень костыльно, но так по моему лучше)
Код:
    @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);

А впрочем не важно, это тоже не работает :D
Хотя сейчас я не понимаю, ведь метод не должен вызыватся овер мильйон раз?
Я же устанавливаю ему ник, а потом если ник такой - то return делаю..
Код:
    @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);
 
Не очень костыльно, но так по моему лучше)
Код:
    @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);

А впрочем не важно, это тоже не работает :D
Хотя сейчас я не понимаю, ведь метод не должен вызыватся овер мильйон раз?
Я же устанавливаю ему ник, а потом если ник такой - то return делаю..
Код:
    @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);
Потому что поидее сначало энтити спавниться, а потом ее изменяет. Попробуй в System.out выводить ее харки во время спавна моба.
 
Потому что поидее сначало энтити спавниться, а потом ее изменяет. Попробуй в System.out выводить ее харки во время спавна моба.
Проблема в том, что ошибка сыпется раз 100 в секунду, поэтому выводить чет в консоль - бессмысленно, я это врядли вижу...
Но попытаюсь..
И я не совсем понял какие именно характеристики выводить..
Попробовал выводить имя, получаю кучу строк name=null
Код:
    @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);
            }
        }
    }

Стоп я тут подумал...
А что если, когда я вызываю метод spawnEntity моментально создается новый CreatureSpawnEvent и мое имя не успевает присвоится?
 
Проблема в том, что ошибка сыпется раз 100 в секунду, поэтому выводить чет в консоль - бессмысленно, я это врядли вижу...
Но попытаюсь..
И я не совсем понял какие именно характеристики выводить..
Попробовал выводить имя, получаю кучу строк name=null
Код:
    @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);
            }
        }
    }

Стоп я тут подумал...
А что если, когда я вызываю метод spawnEntity моментально создается новый CreatureSpawnEvent и мое имя не успевает присвоится?
Я же так и написал. Что сначало спавнится моб, а потом изменяется
 
В чём проблема юзать лист с локацией, которую всёравно удаляешь оттуда сразу?
 
В чём проблема юзать лист с локацией, которую всёравно удаляешь оттуда сразу?
Да я вообще не люблю хранить локацию энтитей..
У меня можно так сказать фобия этого))
Но ладно, как я вижу, других вариантов нет...
Ну да ладно, сделал с локацией, все зароботало!
 
Не локацию лучше в лист, а UUID энтити. Это куда лучше.
 
Так её не получить ДО спавна ведь. А если получить после спавна моба, то тупо опять пойдёт бесконечный спавн мобов.
Вполне таки можно получить, ибо сначала создаётся Entity, а потом только вызывается эвент.
 
Да ладно, работает и работает...
У меня теперь другой вопрос (дабы не плодить темы) как загрузить мир с именем String name;
при условии что он находится там же где и все остальные миры (т.е. в папке сервера).
Именно не сгенерировать и т.д., мир полностью готов, надо только загрузить!
 
Вполне таки можно получить, ибо сначала создаётся Entity, а потом только вызывается эвент.
Не получается. Там моментально кастуется спавн евент. Тоесть не успевает добавиться uuid в лист, чтобы проверить потом.
http://pastebin.com/DrXZi9kb

Java:
    @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" нету.
Да ладно, работает и работает...
У меня теперь другой вопрос (дабы не плодить темы) как загрузить мир с именем String name;
при условии что он находится там же где и все остальные миры (т.е. в папке сервера).
Именно не сгенерировать и т.д., мир полностью готов, надо только загрузить!
Код:
WorldCreator wc = new WorldCreator("asd");
World w = Bukkit.createWorld(wc);
Если мир есть, то его поидее должно тупо загрузить.
 
Не получается. Там моментально кастуется спавн евент. Тоесть не успевает добавиться uuid в лист, чтобы проверить потом.
http://pastebin.com/DrXZi9kb

Java:
    @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" нету.

Код:
WorldCreator wc = new WorldCreator("asd");
World w = Bukkit.createWorld(wc);
Если мир есть, то его поидее должно тупо загрузить.
asd - имя мира?
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх