Помогите NMS Entity

DarklingCodex

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

Если хочешь помощи по проблеме - уточняй версию и давай код.
 
Метод как ты его спавнишь для начала. Ну и handle тоже можно. (не знаю по какому именно ты туториалу делал)
Никакому. Сам пытался сделать. Скинь мне какой-то туториал, по которому можно сделать и где будет метод handle (то есть получение энтити), чтобы я мог делать определенного энтити со своим именем, броней и так далее, и вызывать кастомизированного энтити с пассфайндерами.
 
Никакому. Сам пытался сделать. Скинь мне какой-то туториал, по которому можно сделать и где будет метод handle (то есть получение энтити), чтобы я мог делать определенного энтити со своим именем, броней и так далее, и вызывать кастомизированного энтити с пассфайндерами.
Есть хороший туториал, только он под 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/
 
Есть хороший туториал, только он под 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/
Хорошо, допустим, какой-то из способов мне подойдет, но, например, во втором способе используется такой метод спавна:
EntityTypes.spawnEntity(new CustomZombie(Bukkit.getWorld("world")), new Location(Bukkit.getWorld("world"), 100, 100, 100));
Я не думаю, что он бы подошел под моих измененных энтити, поскольку тут идет спавн по new CustomZombie(), если так идет, то мне придется брать тип своего энтити в switch-case, где я буду вызывать этот метод (EntityTypes.spawnEntity) для каждого своего моба. Так ведь?
 
Я не думаю, что он бы подошел под моих измененных энтити, поскольку тут идет спавн по new CustomZombie(), если так идет, то мне придется брать тип своего энтити в switch-case, где я буду вызывать этот метод (EntityTypes.spawnEntity) для каждого своего моба. Так ведь?
Приведи пример. Если ты говоришь о том, о чём думаю я, то можно легко упростить код.
 
Я думаю, что он бы подошел под моих измененных энтити, поскольку тут идет спавн по new CustomZombie(), если так идет, то мне придется брать тип своего энтити в switch-case, где я буду вызывать этот метод (EntityTypes.spawnEntity) для каждого своего моба. Так ведь?
Верно. Крафтбаккт спаунит именно такимт образом. Можно применить рефлексию, но скорость пострадает.

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

Если по сабжу, то без конкретного кода вряд ли кто поможет.
Единственное предложение - выполни телепортацию на уровне баккита.
Скорее всего, выброситься исключение, и станет понятно, в чём же проблема
А, я понял о чём он. Вот даже этот кусок кода где Bukkit создаёт ентити.
https://hub.spigotmc.org/stash/proj...a/org/bukkit/craftbukkit/CraftWorld.java#1022
 
Приведи пример. Если ты говоришь о том, о чём думаю я, то можно легко упростить код.
Это в методе спавне кастомного энтити с армором, неймом и всем.
Код:
        switch (entity.getType()) {
           case ZOMBIE: {
               EntityTypes.spawnEntity(new CustomZombie(entity.getWorld()));
           }
           default:
            break;
        }
 
Скинь код, тебе уже сказали, тут никто без кода не поймет что у тебя не так
Код:
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());
}
 
Код:
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());
}
У меня где-то валяется код где я заменял AI всех коров на AI зомби под 1.12. Могу скинуть.
Делал по этому туториалу, у меня работало.
 
Код:
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());
}
Ты не скинул метод реги ентити
 
У меня где-то валяется код где я заменял AI всех коров на AI зомби под 1.12. Могу скинуть.
Делал по этому туториалу, у меня работало.
Тот же вопрос -- он подойдет под мой метод spawn?
Если да, скидывайте, попробую изменить, чтобы мобы спавнились в зависимости от типа, который указан в конфиге.
 
Назад
Верх