Сделать Свинозомби агрессивными

Версия Minecraft
1.12.2
API
Forge
41
3
3
Продолжаю делать спавн мобов из блока по кд, хочу сделать так, чтобы появляющиеся свинозомби становились агрессивными с игроку. У меня получилось сделать это при ломании блока, а вот при простом обновлении блока мне нужно достать самого этого игрока. Как это можно сделать? (Спавн моба происходит при обновлении тайла)
при обновлении в тайле спавнится моб:
    @Override
    public void update() {
        
        this.count++;
        if (this.count >=200)
        {
            this.count=0;
            if (!world.isRemote)
            {
                EntityPigZombie zombie= new EntityPigZombie(world);
                if (zombie != null)
                {
                    zombie.setLocationAndAngles(pos.getX(), pos.getY(), pos.getZ(), world.rand.nextFloat() * 360F, 0.0F);
                    zombie.setAttackTarget(player);
                    zombie.setHeldItem(zombie.getActiveHand(), new ItemStack(Items.GOLDEN_SWORD,(int)(1)));
                    world.spawnEntity(zombie);
                }
            }
        }
        
    }
 
Решение
ну как бы да, только вот саму цель надо обозначить как player, а задать этот самый player не получается
А, сори, прошляпил.

Ну смотри. Можно заменить свинозомбей на своих, у которых будет нормальный (нужный) AI, и просто подменять его при JoinEvent.

Либо, например, сканить игроков в радиусе, и кидать zombie.setAttackTarget() уже на этого игрока.

Самый банальный пример сканирования..

Java:
/* Брал код с 1.7.10, переписывал прям сейчас на коленке, где-то мог ошибиться */

// Это радиус области сканирования:
int radiusLvl = 10;
// Это сам физический сектор
// xCoord, yCoord, zCoord = можешь взять с тайла или ещё откуда, любые координаты
// Можешь задать его как x1,y1,z1 и x2,y2,z2. В данном варианте он по одной точке (центр) +...
7,099
324
1,510
Посмотри код свинозомби: когда игрок акатует одного, все в радиусе тоже агрятся
~~~
Java:
EntityPigZombie zombie = ...;

zombie.angerLevel = 800; // у свинозомби эта переменная приватная, нужно применить АТ или рефлексию
zombie.setRevengeTarget(player);
 
Последнее редактирование:
41
3
3
Посмотри код свинозомби: когда игрок акатует одного, все в радиусе тоже агрятся
~~~
Java:
EntityPigZombie zombie = ...;

zombie.angerLevel = 800; // у свинозомби эта переменная приватная, нужно применить АТ или рефлексию
zombie.setRevengeTarget(player);
но мне нужно чтобы оно уже спавнилось агрессивным. Мне нужно переменную player задать, а как? EntityPlayer player = new EntityPlayer(world) уже пробовал, не работает
 

VeniVidiVici

Санта Барбарис
327
15
198
ну как бы да, только вот саму цель надо обозначить как player, а задать этот самый player не получается
А, сори, прошляпил.

Ну смотри. Можно заменить свинозомбей на своих, у которых будет нормальный (нужный) AI, и просто подменять его при JoinEvent.

Либо, например, сканить игроков в радиусе, и кидать zombie.setAttackTarget() уже на этого игрока.

Самый банальный пример сканирования..

Java:
/* Брал код с 1.7.10, переписывал прям сейчас на коленке, где-то мог ошибиться */

// Это радиус области сканирования:
int radiusLvl = 10;
// Это сам физический сектор
// xCoord, yCoord, zCoord = можешь взять с тайла или ещё откуда, любые координаты
// Можешь задать его как x1,y1,z1 и x2,y2,z2. В данном варианте он по одной точке (центр) + радиус
AxisAlignedBB axisalignedbb = new AxisAlignedBB((double)(xCoord - radiusLvl), (double)(yCoord - radiusLvl), (double)(zCoord - radiusLvl), (double)(xCoord + radiusLvl), (double)(yCoord + radiusLvl), (double)(zCoord + radiusLvl)).expand(radiusLvl, radiusLvl, radiusLvl);
// Это было с оригинальным кодом, не знаю, актуально ли в 1.12 и в данной ситуации (ограничивает сектор по высоте, по идее тебе это тут не надо, но для общего развития оставлю)
axisalignedbb.maxY = (double)worldObj.getHeight();
// Получаем игроков в лист
List list = worldObj.getEntitiesWithinAABB(EntityPlayer.class, axisalignedbb);
Iterator iterator = list.iterator();
EntityPlayer player;
while(iterator.hasNext()){
    // По одному выхватываем гадов, но тебе по идее один только нужен первый
    player = (EntityPlayer)iterator.next();
    // Поэтому можешь смело пихать break; после получения игрока, и пусть они у тебя всё время убивают первого)
}

За основу сгодится
 
Последнее редактирование:
7,099
324
1,510
41
3
3
А, сори, прошляпил.

Ну смотри. Можно заменить свинозомбей на своих, у которых будет нормальный (нужный) AI, и просто подменять его при JoinEvent.

Либо, например, сканить игроков в радиусе, и кидать zombie.setAttackTarget() уже на этого игрока.

Самый банальный пример сканирования..

Java:
/* Брал код с 1.7.10, переписывал прям сейчас на коленке, где-то мог ошибиться */

// Это радиус области сканирования:
int radiusLvl = 10;
// Это сам физический сектор
// xCoord, yCoord, zCoord = можешь взять с тайла или ещё откуда, любые координаты
// Можешь задать его как x1,y1,z1 и x2,y2,z2. В данном варианте он по одной точке (центр) + радиус
AxisAlignedBB axisalignedbb = new AxisAlignedBB((double)(xCoord - radiusLvl), (double)(yCoord - radiusLvl), (double)(zCoord - radiusLvl), (double)(xCoord + radiusLvl), (double)(yCoord + radiusLvl), (double)(zCoord + radiusLvl)).expand(radiusLvl, radiusLvl, radiusLvl);
// Это было с оригинальным кодом, не знаю, актуально ли в 1.12 и в данной ситуации (ограничивает сектор по высоте, по идее тебе это тут не надо, но для общего развития оставлю)
axisalignedbb.maxY = (double)worldObj.getHeight();
// Получаем игроков в лист
List list = worldObj.getEntitiesWithinAABB(EntityPlayer.class, axisalignedbb);
Iterator iterator = list.iterator();
EntityPlayer player;
while(iterator.hasNext()){
    // По одному выхватываем гадов, но тебе по идее один только нужен первый
    player = (EntityPlayer)iterator.next();
    // Поэтому можешь смело пихать break; после получения игрока, и пусть они у тебя всё время убивают первого)
}

За основу сгодится
Я тут подумал, а нельзя просто заспавнить пигмана с nbt тэгом Anger:100? Вроде как если прописать коммандой в игре, то он агрится
 
Сверху