1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите NMS Entity

Тема в разделе "Разработка плагинов для новичков", создана пользователем DarklingCodex, 17 янв 2019.

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

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

    Баллы:
    61
    Здравствуйте, мне нужно кастомизировать баккитовских энтити с помощью NMS. Я делаю так очень просто, как по мне, но это не работает: создаю класс MyZombie extends EntityZombie implements MyEntityClass, регистрирую под айди 54 в onEnable(), при спавне моба (кастомизированного, то есть с определенным customName и тд) вызываю метод handle(), который возвращает bukkitEntity. Но это не работает, ошибок никаких нет. Что делать?
     
    Последнее редактирование: 17 янв 2019
  2. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    С кастомными мобами всегда свистопляски. От версии к версии постоянно что-то меняют.

    Если хочешь помощи по проблеме - уточняй версию и давай код.
     
  3. Автор темы
    DarklingCodex

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

    Баллы:
    61
    1.8.8
    Какой код кидать? Наверное, хватит одного метода handle?
     
  4. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Метод как ты его спавнишь для начала. Ну и handle тоже можно. (не знаю по какому именно ты туториалу делал)
     
  5. Автор темы
    DarklingCodex

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

    Баллы:
    61
    Никакому. Сам пытался сделать. Скинь мне какой-то туториал, по которому можно сделать и где будет метод handle (то есть получение энтити), чтобы я мог делать определенного энтити со своим именем, броней и так далее, и вызывать кастомизированного энтити с пассфайндерами.
     
  6. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Есть хороший туториал, только он под 1.11. Возможно регистрация entity не будет работать на 1.8.
    https://www.spigotmc.org/threads/nms-tutorials-2-custom-nms-entities-1-11.205192/

    Туториал с Pathfinder'ами (1.7.10 или 1.8, не уверен)
    https://www.spigotmc.org/threads/tutorial-creating-custom-entities-with-pathfindergoals.18519/
     
  7. Автор темы
    DarklingCodex

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

    Баллы:
    61
    Хорошо, допустим, какой-то из способов мне подойдет, но, например, во втором способе используется такой метод спавна:
    EntityTypes.spawnEntity(new CustomZombie(Bukkit.getWorld("world")), new Location(Bukkit.getWorld("world"), 100, 100, 100));
    Я не думаю, что он бы подошел под моих измененных энтити, поскольку тут идет спавн по new CustomZombie(), если так идет, то мне придется брать тип своего энтити в switch-case, где я буду вызывать этот метод (EntityTypes.spawnEntity) для каждого своего моба. Так ведь?
     
  8. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Приведи пример. Если ты говоришь о том, о чём думаю я, то можно легко упростить код.
     
  9. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Верно. Крафтбаккт спаунит именно такимт образом. Можно применить рефлексию, но скорость пострадает.

    Если по сабжу, то без конкретного кода вряд ли кто поможет.
    Единственное предложение - выполни телепортацию на уровне баккита.
    Скорее всего, выброситься исключение, и станет понятно, в чём же проблема
     
  10. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    А, я понял о чём он. Вот даже этот кусок кода где Bukkit создаёт ентити.
    https://hub.spigotmc.org/stash/proj...a/org/bukkit/craftbukkit/CraftWorld.java#1022
     
  11. Автор темы
    DarklingCodex

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

    Баллы:
    61
    Это в методе спавне кастомного энтити с армором, неймом и всем.
    Код:
            switch (entity.getType()) {
               case ZOMBIE: {
                   EntityTypes.spawnEntity(new CustomZombie(entity.getWorld()));
               }
               default:
                break;
            }
    
     
  12. Автор темы
    DarklingCodex

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

    Баллы:
    61
    В общем, мой код, который я привёл сверху будет работать?
     
  13. DeethzzCoder

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

    Баллы:
    76
    А проверить не судьба?
     
  14. Автор темы
    DarklingCodex

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

    Баллы:
    61
    Видимо, нет, поэтому написал, поскольку не за компьютером. Как буду -- сразу проверю и напишу.
     
  15. Автор темы
    DarklingCodex

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

    Баллы:
    61
  16. hyndorik

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

    Баллы:
    98
    Имя в Minecraft:
    hyndo
  17. Автор темы
    DarklingCodex

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

    Баллы:
    61
    Код:
    public static Entity handle(Entity e, EntityType type, Location l, World world) {
            net.minecraft.server.v1_8_R3.Entity myEntity = null;
            WorldServer w = ((CraftWorld) world).getHandle();
            switch (type) {
                case ZOMBIE: {
                    myEntity = new MyZombie(world);
                    break;
                }
                default: {
                    return e;
                }
            }
            myEntity.setPosition(l.getX(), l.getY(), l.getZ());
            w.removeEntity(((CraftEntity) e).getHandle());
            w.addEntity(myEntity, CreatureSpawnEvent.SpawnReason.CUSTOM);
            e = (myEntity).getBukkitEntity();
            return e;
        }
    Код:
    public class MyZombie extends EntityZombie{
    
        public MyZombie(World world) {
            super(world);
            this.goalSelector.a(2, new PathfinderGoalMeleeAttack(this, EntityHuman.class, 1.0, false));
        }
    
        public MyZombie(org.bukkit.World world) {
            this(((CraftWorld) world).getHandle());
        }
    }
    Метод handle используется мной при создании своего энтити, который спавнится по команде.
    Код:
    public void spawn(Location l) {
    EntityType type;
    Entity entity =  location.getWorld().spawnEntity(l, type);
    entity = CustomEntities.handle(entity, type, l, l.getWorld());
    }
    
     
  18. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    У меня где-то валяется код где я заменял AI всех коров на AI зомби под 1.12. Могу скинуть.
    Делал по этому туториалу, у меня работало.
     
  19. hyndorik

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

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Ты не скинул метод реги ентити
     
  20. Автор темы
    DarklingCodex

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

    Баллы:
    61
    Тот же вопрос -- он подойдет под мой метод spawn?
    Если да, скидывайте, попробую изменить, чтобы мобы спавнились в зависимости от типа, который указан в конфиге.
     

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