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

Помогите Удаление живности при загрузке и выгрузке чанков.

Тема в разделе "Разработка плагинов для новичков", создана пользователем Exception_Prototype, 20 фев 2017.

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

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

    Баллы:
    46
    Делаю плагин в плане контроля определённого кол-ва живности в чанках.
    Проблема в том, что согласно коду каждый загруженный\выгруженный чанк проверяется на живность и в случае превышения допустимого кол-ва - удаляется лишние. НО! Почему то ни при выгрузке ни при загрузке живность не удаляется. Хотя если я подлечу в чанку с живностью и введу команду с точно таким же алгоритмом работы (не считая, что там чанк получаю через эвент, а там через корды моей локации), то всё прекрасно работает. Собственно вот такая проблема. Я чего то не знаю про работу с чанками? Просветите...
     
  2. Хостинг MineCraft
    <
  3. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Код:
        @EventHandler
        public void ChunkLoadEvent(ChunkLoadEvent event) {
    
            chunkLoad = event.getChunk();
            enLoad = chunkLoad.getEntities();
            int pig = 0, cow = 0, sheep = 0, chicken = 0;
    
            for (Entity entity : enLoad) {
                entityLoadType = entity.getType();
                switch (entityLoadType) {
                    case PIG:
                        pig++;
                        break;
                    case SHEEP:
                        sheep++;
                        break;
                    case COW:
                        cow++;
                        break;
                    case CHICKEN:
                        chicken++;
                        break;
                }
            }
    
            int result = pig + cow + sheep + chicken;
    
            if (result > MAX_LIVESTOCK_IN_CHUNK) {
                int must_be_removed = result - MAX_LIVESTOCK_IN_CHUNK;
    
                for (Entity entity : enLoad) {
                    entityLoadType = entity.getType();
                    if (must_be_removed > 0) {
    
                        switch (entityLoadType) {
                            case PIG:
                                if (pig > 2) {
                                    entity.remove();
                                    pig--;
                                    must_be_removed--;
                                }
                                break;
                            case SHEEP:
                                if (sheep > 2) {
                                    entity.remove();
                                    sheep--;
                                    must_be_removed--;
                                }
                                break;
                            case COW:
                                if (cow > 2) {
                                    entity.remove();
                                    cow--;
                                    must_be_removed--;
                                }
                                break;
                            case CHICKEN:
                                if (chicken > 2) {
                                    entity.remove();
                                    chicken--;
                                    must_be_removed--;
                                }
                                break;
                        }
                    } else {
                        break;
                    }
                }
            }
    
        }
    
    [DOUBLEPOST=1487588762,1487588449][/DOUBLEPOST]Тот же код, только чанк получаю так (по тест команде) :
    Код:
    Chunk chunk = p.getWorld().getChunkAt(p.getLocation());
    
    и всё работает.[DOUBLEPOST=1487594592][/DOUBLEPOST]Ещё проводил эксперимент.
    При загрузке и выгрузке чанка выводил кол-во живности из чанка.
    Так вот максимум показывала при загрузке или выгрузки 1-2 живности. Но как?! Там минимум 20 существ.
    Где событие, которое должно вывести тот самый чанк, где моя живность сидит? Он что не выгружается когда я отлетаю?
     
    Последнее редактирование: 20 фев 2017
  4. Blc_Dragon

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    Я новичок, так что могу быть и не прав, но где то в коде сначала будет вызван евент, благодаря вызову сработают все EventHandler с этим ивентом, и только потом выполнится непосредственно код.

    т.е. сначала ивент вызвался, потом сработал твой хандлер, и только ПОСЛЕ этого прошелся сам код. т.е. в теории чанк еще не прогружен на момент ивента

    Опять же повторюсь: могу быть не прав
     
  5. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Допустим твой мысль. Но это только при загрузке, но ТОЖЕ самое и при выгрузке. Это тогда как объяснить?[DOUBLEPOST=1487595685,1487595076][/DOUBLEPOST]@AtomicInteger @alexandrage @xDark help...
     
  6. Blc_Dragon

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    Тогда вообще без идей.
    Вот еще @Dereku
     
  7. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    runTaskLater?
     
  8. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Мммм....[DOUBLEPOST=1487603835,1487602911][/DOUBLEPOST]
    А на сколько поставить задержку?
    И... а как он поможет? Если когда я вручную удаляю, то всё нормально.
    Ща всё равно попробую.[DOUBLEPOST=1487604661][/DOUBLEPOST]Да как бы не помогло... удалял с задержкой.
    Вот у меня есть такая строка:
    Код:
    Bukkit.broadcastMessage(CHAT_PREFIX + "Какой-то чанк загружен. В нём живности: " + enLoad.length);
    
    Такая же и есть и на выгрузку. enLoad - массив живности полученной с чанка.
    Странность в том, что я стоял афк и ничего не делал. Находился далеко от той самой проверяемой живности (иногда подлетая и отлетая к тому чанку) и я не видел в чате, чтобы сработала выгрузка\загрузка чанка, где было 20 живности. Почему так? Он что вообще с тем чанком работать перестал? С чего бы? Или из-за того, что я 1 на серваке и нагрузки нет сервер его не выгружает?
     
    Последнее редактирование: 20 фев 2017
  9. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    На котле чунк лоад ивент коряво работает, точнее местами да, местами нет.
     
  10. AtomicInteger

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

    Баллы:
    46
    Я на чистом спайготе проверил, не работает.
     
  11. Автор темы
    Exception_Prototype

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

    Баллы:
    46
    Капец. И что делать?[DOUBLEPOST=1487611301,1487610978][/DOUBLEPOST]
    Да я как пример чанк лоад привёл, там то у меня и при выгрузке чанка и при загрузке.
     

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