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

Создать переменную boolean для экземпляра, сделать переменную со значением false. Проверять является эта переменная false. Если да, то дать task и сделать boolean переменную true.
Код:
if (event.entityLiving instanceof EntityCreature) {
    LivingFeedAI lf = LivingFeedAI.get(event.entityLiving);
    if (lf != null && !lf.isAIfeed()) {
        EntityCreature creature = (EntityCreature)event.entityLiving;
        System.out.println(EntityList.getEntityString(creature));
        if (EntityList.getEntityString(creature).equals("Cow")) {
            creature.tasks.addTask(4, new EntityAITempt(creature, 1.25D, Items.water_bucket, false));
            lf.setTrueAIfeed();
            return;
        }
        if (EntityList.getEntityString(creature).equals("MushroomCow")) {
            creature.tasks.addTask(4, new EntityAITempt(creature, 1.25D, Items.mushroom_stew, false));
            lf.setTrueAIfeed();
            return;
        }
    }
}
LivingFeedAI - это мой класс с IExtendedEntityProperties.
[youtube]qz6WdfS6zPA[/youtube]
 
Не трудно.
Код:
public class LivingFeedAI implements IExtendedEntityProperties {

    public static final String SMT_PHY_LivingFeedAI = "SMT_PHY_LivingFeedAI";

    private boolean isAIfeed = false;

    @Override
    public void init(Entity entity, World world) {

    }

    public LivingFeedAI() {
    }

    public static void reg(EntityLivingBase player) {
        player.registerExtendedProperties(SMT_PHY_LivingFeedAI, new LivingFeedAI());
    }

    public static LivingFeedAI get(EntityLivingBase player) {
        return (LivingFeedAI)player.getExtendedProperties(SMT_PHY_LivingFeedAI);
    }

    public void setTrueAIfeed() {
        isAIfeed = true;
    }

    public boolean isAIfeed() {
        return isAIfeed;
    }

    @Override
    public void saveNBTData(NBTTagCompound nbt) {
        NBTTagCompound nbt_tag = new NBTTagCompound();
        //nbt_tag.setBoolean("isAIfeed", isAIfeed);
        nbt.setTag(SMT_PHY_LivingFeedAI, nbt_tag);
    }

    @Override
    public void loadNBTData(NBTTagCompound nbt) {
        NBTTagCompound nbt_tag = (NBTTagCompound)nbt.getTag(SMT_PHY_LivingFeedAI);
        //isAIfeed = nbt_tag.getBoolean("isAIfeed");
    }

}
Извиняюсь за не точность, IExtendedEntityProperties в данном случаи не обязателен, просто мне так удобнее.
Я его просто в дальнейшем буду использовать для других целей, давать к EntityLivingBase требование к жидкости и к пище, боссы могут быть исключением к этим требованием.
 
Эм... То есть ты у каждой сущности создаёшь НБТ и туда прописываешь назначен ли таск?

И те же самые методы можно прописать в EntityJoinWorldEvent?
[merge_posts_bbcode]Добавлено: 30.03.2016 02:43:11[/merge_posts_bbcode]

Хм... Но вот я тут подумал... Ведь таски нужно назначать всем каждый раз, когда заходишь в игру.
А сохранённая НБТ как раз и не даст назначить таск заново, потому что будет говорить, что он уже назначен.
Или я не прав?
 
Нет, я не создаю NBT для этих переменных.
И лучше использовать LivingUpdateEvent.
Код:
    @SubscribeEvent
    public void addEntityConstructing(EntityEvent.EntityConstructing event) {
        if (event.entity instanceof EntityLivingBase)
            if (LivingFeedAI.get((EntityLivingBase)event.entity) == null)
                LivingFeedAI.reg((EntityLivingBase)event.entity);
    }

    @SubscribeEvent
    public void followedFeed(LivingUpdateEvent event) {
        if (event.entityLiving instanceof EntityCreature) {
            LivingFeedAI lf = LivingFeedAI.get(event.entityLiving);
            if (lf != null && !lf.isAIfeed()) {
                EntityCreature creature = (EntityCreature)event.entityLiving;
                System.out.println(EntityList.getEntityString(creature));
                if (EntityList.getEntityString(creature).equals("Cow")) {
                    creature.tasks.addTask(4, new EntityAITempt(creature, 1.25D, Items.water_bucket, false));
                    lf.setTrueAIfeed();
                    return;
                }
                if (EntityList.getEntityString(creature).equals("MushroomCow")) {
                    creature.tasks.addTask(4, new EntityAITempt(creature, 1.25D, Items.mushroom_stew, false));
                    lf.setTrueAIfeed();
                    return;
                }
            }
        }
    }
 
Тимаха!
Я тут подумал: в жизни только раз бывает 18 лет и решил задачу так:
Код:
@SubscribeEvent
public void addTempt(LivingUpdateEvent event)
{
    if (event.getEntity() instanceof EntityAnimal)
    {
        EntityAnimal animal = (EntityAnimal)event.getEntity();

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

Вроде, работает... Но, например, с лошадьми не со всеми...
Этот тикер может проскальзывать где-то? Или в цифровом мире это невозможно?
 
Liahim написал(а):
Этот тикер может проскальзывать где-то?
Я не знаю, что такое "тикер".

Liahim написал(а):
Но, например, с лошадьми не со всеми...
Не знаю в чём может быть проблема.
[merge_posts_bbcode]Добавлено: 30.03.2016 09:53:17[/merge_posts_bbcode]

Ну у меня только детёныши лошадей не следовали.
 
Ну, я тупо добавил проверку на возраст ентити.
Код:
animal.ticksExisted == 100

Появляются в мире и только на сотом тике даётся таск один раз... Без всяких дополнительных баз данных.
Это я и называю тикер )))

Однако с некоторыми лошадьми это как-то не очень работало...
 
Agravaine написал(а):
Извиняюсь, я ошибся с другим эвентом. Да, возможно он как раз подойдёт. Место LivingUpdateEvent, если не надо какие-то особые условия (, а я буду использовать особые условия). Это эвент срабатывает при спавне Entity в мире и в случаи перезахода в мир применяется повторно к запасенным Entity (на счёт сервера не знаю).
[merge_posts_bbcode]Добавлено: 30.03.2016 10:41:52[/merge_posts_bbcode]

Liahim написал(а):
Беда какая...
Оказывается, в 1.9 EntityJoinWorldEvent не работает при новом запуске игры с уже загруженными животными...
Да, наверное это очень плохо. Наверное.
 
Ладно...
Спасибо всем ) Пока остановлюсь для 1.9 на варианте с тикером.
Возможно, в будущем это исправят... Всё-таки фордж пока бэта.
Для всего остального использую EntityJoinWorldEvent.

У меня тут ещё задачка:
Пытаюсь сделать звук съедания предмета при тыке на лошадь.
Код:
        if (entity instanceof EntityHorse)
        {
            EntityHorse horse = (EntityHorse)entity;
            boolean flag = false;
            
            if(horse.getHealth() < horse.getMaxHealth())
            {horse.heal(2.0F); flag = true;}
            
            if(!horse.isAdultHorse())
            {horse.addGrowth(10); flag = true;}
            
            if (flag)
            {
                horse.worldObj.playSoundAtEntity(horse, "eating", 1.0F, 1.0F + (new Random().nextFloat() - new Random().nextFloat()) * 0.2F); //Вот тут
                --stack.stackSize;
                return true;
            }
            
            return false;
        }

Однако, работает это только в версии 1.9 :D
При этом код тупо скопирован с исходников... и, вы будите смеяться, если кормить лошадь тем же сахаром, ЗВУКА ТОЖЕ НЕ СЛЫШНО! )))
Это глюк разрабов или нет?

Ещё есть желание заставить лошадь открывать рот при съедании, но почему-то все методы, отвечающие за это, приватные ((( Но это так, лирика...
 
Liahim, я не успел, так как желания на после 1.7.10 версии не хотел работать. Попробовал, эвент EntityJoinWorldEvent, он наСпамил сообщениями.
Код:
...
[01:40:46] [Server thread/INFO] [STDOUT]: [com.example.examplemod.EventsForge:entityJoinWorld:10]: EntityJoinWorldEvent = EntityFallingBlock['Falling Block'/1535, l='New World', x=131,50, y=13,01, z=102,50]
[01:40:46] [Server thread/INFO] [STDOUT]: [com.example.examplemod.EventsForge:entityJoinWorld:10]: EntityJoinWorldEvent = EntityFallingBlock['Falling Block'/1536, l='New World', x=130,50, y=13,01, z=103,50]
[01:40:46] [Client thread/INFO]: Warning: Clientside chunk ticking took 155 ms
[01:40:47] [Server thread/INFO] [STDOUT]: [com.example.examplemod.EventsForge:entityJoinWorld:10]: EntityJoinWorldEvent = EntityBat['Bat'/1575, l='New World', x=59,50, y=27,00, z=147,50]
[01:40:47] [Server thread/INFO] [STDOUT]: [com.example.examplemod.EventsForge:entityJoinWorld:10]: EntityJoinWorldEvent = EntityZombie['Zombie'/1601, l='New World', x=77,50, y=29,00, z=138,50]
[01:40:47] [Server thread/INFO] [STDOUT]: [com.example.examplemod.EventsForge:entityJoinWorld:10]: EntityJoinWorldEvent = EntityZombie['Zombie'/1611, l='New World', x=26,50, y=19,00, z=142,50]
[01:40:47] [Server thread/INFO] [STDOUT]: [com.example.examplemod.EventsForge:entityJoinWorld:10]: EntityJoinWorldEvent = EntityBat['Bat'/1620, l='New World', x=91,50, y=15,00, z=56,50]
[01:40:47] [Server thread/INFO] [STDOUT]: [com.example.examplemod.EventsForge:entityJoinWorld:10]: EntityJoinWorldEvent = EntitySquid['Squid'/1621, l='New World', x=62,50, y=61,00, z=151,50]
[01:40:47] [Server thread/INFO] [STDOUT]: [com.example.examplemod.EventsForge:entityJoinWorld:10]: EntityJoinWorldEvent = EntitySquid['Squid'/1653, l='New World', x=86,50, y=61,00, z=153,50]
...
Так что, я не знаю почему у тебя не работают эвенты.
 
Назад
Сверху