Про пчёлок и цветочки (-1.8+)

4,167
68
693
Народ, подскажите, плиз, реально ли с кастомным предметом приманивать и размножать животных?
Как это делается и где про это почитать?

С мобами ещё не работал ни разу... Для меня это тёмный лес.

P.S. Интересуют версии 1.7.10 - 1.9.
Спс...
 
Размножать животных можно с помощью предмета с примерно таким кодом для 1.7.10:
Код:
@Override
public boolean itemInteractionForEntity(ItemStack is, EntityPlayer player, EntityLivingBase entity) {
    if (entity instanceof EntityAnimal) {
        ((EntityAnimal)entity).func_146082_f(player);
        return true;
    }
    return false;
}
(Проверено на коровах, работает.)
---
На счёт привлечение, это надо активировать логику хождение в сторону любимой еды. А это вроде рефлексией делается, наверно, точно не знаю.
[merge_posts_bbcode]Добавлено: 28.03.2016 19:10:57[/merge_posts_bbcode]

Возможно, размножать животных можно с помощью предмета с примерно таким кодом для 1.8.9:
Код:
@Override
public boolean itemInteractionForEntity(ItemStack is, EntityPlayer player, EntityLivingBase entity) {
    if (entity instanceof EntityAnimal) {
        ((EntityAnimal)entity).setInLove(player);
        return true;
    }
    return false;
}
(Данный код не проверялся.)
 
Вспомнил мод "Villagers Need Emeralds" от anti344. Там жители шли за изумрудом.
Если не ошибаюсь, то там через эвент LivingUpdateEvent давалась AI чтобы жители шли за изумрудом.
 
Agravaine, каждый может по своему использовать. По идеи можно использовать.
Но главное, чтобы не каждый раз срабатывало добавление в EntityAITasks новой AI. Т.е. нужно чтобы оно сработало добавление нашего AI один раз и оставалось. Или иначе будет в список логики добавляться одна и та-же AI, забивая список AI.
Но я точно не знаю, я ещё не по-экспериментировал как надо.
 
Код:
entity_animal.tasks.addTask(4, new EntityAITempt(entity_animal, 1.25D, SMTPhytology.item.itemFeed, false));
Где "entity_animal" это наш Entity с родителем EntityLiving.
Где "4" - это приоритет к AI исполнению.
Где "1.25D" - дистанция срабатывания нашего предмета для привлечения и следом за этим предметом.
Где "SMTPhytology.item.itemFeed" - это наш предмет.
Где "false" не знаю что это. но переводиться примерно "Напугается моб, если игрок сдвинулся с места.".
[merge_posts_bbcode]Добавлено: 28.03.2016 22:47:59[/merge_posts_bbcode]

Для этого я использовал IExtendedEntityProperties, без использования NBT. Да, возможно затратно использовать для этого IEEP, чтобы использовать переменную и сохранять значения при изменении, но в дальнейшем IEEP, буду использовать и для другого.
[youtube]HxW6y3_PdkI[/youtube]
 
О! Круто! Спасибо огромное!
А приоритет "4" сам сдвигает все имеющиеся приоритеты ниже или заменяет 4-й номер или встаёт рядом? У коровы, например, их там штук 10, вроде...

И ещё раз уточню, EntityJoinWorldEvent подразумевает, что таски мне надо добавлять только один раз только конкретным сущностям, только в самом начале?
Вроде, понял...
Попробую )
 
Нет, приоритет не сдвигается и не заменяется - да, встаёт рядом.
Нет, EntityJoinWorldEvent не подразумевает, что он сработает один раз, оно будет срабатывать столько раз, сколько войдут игроков. Надо создать для каждой сущности своё условие, что было добавлено один новый наш task. И не обязательно добавлять в самом начале. В любое время можно добавить, главное для нас чтобы добавилось, до того как мы будем приманивать животное.
 
А существует проверка на активные условия у сущностей? Или тупо собственную переменную ввести?
[merge_posts_bbcode]Добавлено: 29.03.2016 11:58:21[/merge_posts_bbcode]

Я вот к чему... Например, добавляю я задания коровам и грибным коровам... Однако грибная корова расширена от обычной... И получается, если я дам им обеим задания, то эти задания будут дублироваться... Или я ошибаюсь?
 
К сожалению я не нашёл стандартной проверки, есть нужный AI в этом списке. У меня тупо использую для этого переменную boolean.
 
Если ты имеешь виду давать свои, не прописывая в самом классе Entity, то даётся каждому экземпляру Entity, по идеи, может быть я ошибаюсь.
 
Так, ясно... Протестил... Если первой появляется обычная корова, то на грибной изменения отражаются... а вот если наоборот... Хз... Ща ещё попробую.
[merge_posts_bbcode]Добавлено: 29.03.2016 12:17:39[/merge_posts_bbcode]

Ну и с грибной вначале тоже работает ))) Хотя проверка стоит по имени )
 
Беда какая...
Оказывается, в 1.9 EntityJoinWorldEvent не работает при новом запуске игры с уже загруженными животными...
Он оказывает влияние только на вновь появившихся.
То ли это глюк форджа, то ли так и задумано...
В общем, пришлось таки использовать LivingUpdateEvent.
Но я не уверен, что я каждый тик не назначаю им таски.
Можете меня проконтролировать?
Код:
@SubscribeEvent
public void addTempt(LivingUpdateEvent  event)
{
    boolean cow = true;
    boolean horse = true;

    if (event.getEntity() instanceof EntityAnimal)
    {
        EntityAnimal animal = (EntityAnimal)event.getEntity();
            
        if (cow && animal instanceof EntityCow)
        {
            animal.tasks.addTask(3, new EntityAITempt(animal, 1.25D, ModItems.item, false));
            cow = false;                        
        }

        if (horse && animal instanceof EntityHorse)
        {
            animal.tasks.addTask(3, new EntityAITempt(animal, 1.25D, ModItems.item, false));
            horse = false;
        }
    }    
}


По ходу так, каждый тик (
---------------------------------

Слушайте, а не реально добавлять таски где-нибудь в postInit в сам исходный класс животных, а не в его экземпляры?
 
Потому-что перемененные в методе, а их нужно вынести из метода и поставить в классе. И boolean должно применяется только к одному экземпляру Entity. Хотя у меня в эксперименте, то что применяется к корове, то и применялось к грибной корове, я уже не уверен в правильности использовании, что-либо.
 
Да вот понимаешь в чём вся фигня...
По ходу, таски даются не классу, а отдельным экземплярам...
И получалось, что у меня две коровы (одна имеющаяся, вторая только что заспауменная) вели себя по разному...
 
Liahim, нужно давать каждому Entity свою переменную. И всё-же у меня получилось сделать, так что грибная корова и грибная корова получили разные task'и, по "EntityList.getEntityString(entityLiving)" делал проверку.
 
Назад
Сверху