Помогите Призыв кастомных мобов.

  • Автор темы Автор темы iD3LSY
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

iD3LSY

Активный участник
Пользователь
Баллы
76
Нужно заспавнить кастом моба. Создавал примерно по туториалу (тот же принцип).

На методе (как мне кажется) происходит ошибка.
Java:
public static void spawnEntity(Entity entity, Location loc) {
    entity.setLocation(loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch());
    ((CraftWorld)loc.getWorld()).getHandle().addEntity(entity);
}

Моб просто не появляется. Ошибок нигде нету.

В чем проблема? Как пофиксить?
 
Почему бы не воспользоваться методом World.spawnEntity(Location, EntityType)?
Если не подходит, опишите вашу задачу, что нужно реализовать
 
Почему бы не воспользоваться методом World.spawnEntity(Location, EntityType)?
Используется система спавна мобов (боссов) - Spawner, которые имеют при себе методы спавна, смерти, регистрации и т.д. Босс спавниться со своим интервалом. У него разумеется есть свои PathfinderGoal-ы, ибо агриться может не на тех мобов, дистанция не та, и опять же т.д.

Это не реализовать через
World.spawnEntity(Location, EntityType)
 
Почему бы не воспользоваться методом World.spawnEntity(Location, EntityType)?
Если не подходит, опишите вашу задачу, что нужно реализовать
Это кастумный моб...
Нужно сначала зарегистрировать этого самого Entity.
Java:
       try {
            List<Map<?, ?>> dataMaps = new ArrayList<Map<?, ?>>();
            for (Field f : EntityTypes.class.getDeclaredFields())
                if (f.getType().getSimpleName().equals(Map.class.getSimpleName())) {
                    f.setAccessible(true);
                    dataMaps.add((Map<?, ?>) f.get(null));
               }
            ((Map<Class<? extends EntityInsentient>, String>) dataMaps.get(1)).put(customClass, имя моба);
            ((Map<Class<? extends EntityInsentient>, Integer>) dataMaps.get(3)).put(customClass, айди);
        } catch (Throwable t) {
            t.printStackTrace();
        }
 
Это кастумный моб...
Нужно сначала зарегистрировать этого самого Entity.
Java:
       try {
            List<Map<?, ?>> dataMaps = new ArrayList<Map<?, ?>>();
            for (Field f : EntityTypes.class.getDeclaredFields())
                if (f.getType().getSimpleName().equals(Map.class.getSimpleName())) {
                    f.setAccessible(true);
                    dataMaps.add((Map<?, ?>) f.get(null));
               }
            ((Map<Class<? extends EntityInsentient>, String>) dataMaps.get(1)).put(customClass, имя моба);
            ((Map<Class<? extends EntityInsentient>, Integer>) dataMaps.get(3)).put(customClass, айди);
        } catch (Throwable t) {
            t.printStackTrace();
        }
Java:
public static Object getPrivateField(String fieldName, Class<?> clazz, PathfinderGoalSelector object) {
    Object o = null;

    try {
        Field field = clazz.getDeclaredField(fieldName);
        field.setAccessible(true);
        o = field.get(object);
    } catch (NoSuchFieldException | IllegalAccessException ex) {
        ex.printStackTrace();
    }

    return o;
}

@SuppressWarnings({ "unchecked", "rawtypes" })
private static void addToMaps(EntityTypes type) {
    ((Map) getPrivateField("d", net.minecraft.server.v1_8_R3.EntityTypes.class, null)).put(type.custom, type.name);
    ((Map) getPrivateField("f", net.minecraft.server.v1_8_R3.EntityTypes.class, null)).put(type.custom, type.id);
}
Вроде как регистрируется...
 
Java:
@SuppressWarnings({ "unchecked", "rawtypes" })
private static void addToMaps(EntityTypes type) {
    ((Map) getPrivateField("d", net.minecraft.server.v1_8_R3.EntityTypes.class, null)).put(type.custom, type.name);
    ((Map) getPrivateField("f", net.minecraft.server.v1_8_R3.EntityTypes.class, null)).put(type.custom, type.id);
}
Вроде как регистрируется...
А ты этот метод - то вызываешь?
 
Java:
public static Object getPrivateField(String fieldName, Class<?> clazz, PathfinderGoalSelector object) {
    Object o = null;

    try {
        Field field = clazz.getDeclaredField(fieldName);
        field.setAccessible(true);
        o = field.get(object);
    } catch (NoSuchFieldException | IllegalAccessException ex) {
        ex.printStackTrace();
    }

    return o;
}

@SuppressWarnings({ "unchecked", "rawtypes" })
private static void addToMaps(EntityTypes type) {
    ((Map) getPrivateField("d", net.minecraft.server.v1_8_R3.EntityTypes.class, null)).put(type.custom, type.name);
    ((Map) getPrivateField("f", net.minecraft.server.v1_8_R3.EntityTypes.class, null)).put(type.custom, type.id);
}
Вроде как регистрируется...
Лол, што? Ну получил ты мапу и шо дальше? Всунуть то обратно надо ее с твоим ентити уже.

Код:
@SuppressWarnings({ "unchecked", "rawtypes" })
private static void addToMaps(EntityTypes type) {
    Class entityTypes = net.minecraft.server.v1_8_R3.EntityTypes.class;
    Field field = entityTypes.getDeclaredField("d");
    field.setAccessible(true);
    Map m = (Map) field.get(new Object[0]);
    m.put(type.custom, type.name);
    field.set(m);
   
    field = entityTypes.getDeclaredField("f");
    field.setAccessible(true);
    m = (Map) field.get(new Object[0]);
    m.put(type.custom, type.id);
    field.set(m);
}

Это я просто добавил установление мапы в переменную. Возможно там еще надо объект передавать или что-то такое, но то уже твой косяк.
 
Java:
@SuppressWarnings({ "unchecked", "rawtypes" })
private static void addToMaps(EntityTypes type) {
    Class entityTypes = net.minecraft.server.v1_8_R3.EntityTypes.class;
    Field field = entityTypes.getDeclaredField("d");
    field.setAccessible(true);
    Map m = (Map) field.get(new Object[0]);
    m.put(type.custom, type.name);
    field.set(m);
  
    field = entityTypes.getDeclaredField("f");
    field.setAccessible(true);
    m = (Map) field.get(new Object[0]);
    m.put(type.custom, type.id);
    field.set(m);
}
Проблему решил. Может и частично, но код Qmaks помог. Спасибо <3
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх