Определение моба

4,167
68
693
Здравствуйте всем!
Есть задача определить, какой именно моб в данный момент соприкасается с блоком.
Никак не могу найти, что писать вместо "???"
Код:
    public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity)
    {
        if (entity. ??? )
        {                
        entity.attackEntityFrom(DamageSource.cactus, 1.0F);
        }
    }

Подскажите, пожалуйста.
 
Код:
if (entity instanceof IMob)
Код:
if (entity instanceof EntityLivingBase)
и т.п.
 
Ага... Помогло ) Спасибо!
А теперь следующий вопрос:
Для того, чтобы действовал метод onEntityCollidedWithBlock, необходимо сперва эту коллизию блоку задать?
Код:
    public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z)
    {
        float f = 0.0625F;
        return AxisAlignedBB.getBoundingBox((double)((float)x + f), (double)y, (double)((float)z + f), (double)((float)(x + 1) - f), (double)((float)(y + 1) - f), (double)((float)(z + 1) - f));
    }

Это код от того же кактуса.
НО! В этом случае размер блока как бы уменьшается и мобы ступая на него немного опускаются...
Как от этого избавится?

Если я ставлю f = 0F, коллизия не действует вообще. Если делаю f = 0.01F, всё работает, но мобы начинают просто проваливаться сквозь блок.

Что я делаю не так и можно ли иными способами задать блоку коллизию?

Спасибо )
 
Тебе скорее всего нужно сделать, что-то подобия коллизии для определения, кто находиться в этой области.
Код:
double d0 = 1.0D;
AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox((double)x, (double)y, (double)z, (double)(x + 1), (double)(y + 1), (double)(z + 1)).expand(d0, d0, d0);
List list = world.getEntitiesWithinAABB(Entity.class, axisalignedbb);
Iterator iterator = list.iterator();
Entity entity;

while(iterator.hasNext()) {
    entity = (Entity)iterator.next();

if (entity instanceof EntityLivingBase) {

}

}
[merge_posts_bbcode]Добавлено: 26.04.2015 12:44:25[/merge_posts_bbcode]

Немного изменил свой пост.
 
О-ёй. Что-то слишком умное для меня )))
Попробую разобраться.

Пока что остановился на размере f = 0.03125F.
Видимо, это и есть та самая проходимость, равная половине пикселя (если я тебя правильно понял).

Это более-менее приемлемый результат, до того момента, пока не разберусь с твоим кодом )))
Спасибо )
 
Пожалуйста.
А кстати, у тебя есть это в конструкторе?
Код:
setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
 
timaxa007 написал(а):
Тебе скорее всего нужно сделать, что-то подобия коллизии для определения, кто находиться в этой области.
Вроде как засекает, но ничего не происходит.

Можешь проверить, что не так?
Код:
public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity)
{
if (!world.isRemote)
{
double d0 = 1.0D;
AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox((double)x, (double)y, (double)z, (double)(x + 1), (double)(y + 1), (double)(z + 1)).expand(d0, d0, d0);
List list = (List) world.getEntitiesWithinAABB(EntitySlime.class, axisalignedbb);
Iterator iterator = ((java.util.List) list).iterator();
EntitySlime entitySlime;

while(iterator.hasNext()) {
entitySlime = (EntitySlime)iterator.next();

if (entitySlime instanceof EntitySlime)
{
entitySlime.attackEntityFrom(DamageSource.cactus, 1.0F);
}
}
}
}

Спасибо )
 
В метод update'а блока думаю лучше кинуть.
 
Эм... Чё, серьёзно? Он же не быстрый.

Ща попробую, конечно... Но не понял, если честно... Это слизень подполз, постоял и уполз... И потом только блок обновляется... А никого уже нет.
[merge_posts_bbcode]Добавлено: 02.05.2015 00:56:13[/merge_posts_bbcode]

Эх... Вылетает. Всмысле, сперва немножко поработал, а потом, видимо, обновился и вылетел...

Слушайте, а нельзя ли в методе onEntityCollidedWithBlock, используя world, узнать пересекается ли моб не с данным блоком, а с блоком выше или сбоку?

Вон, нашёл такую штуку:
world.checkNoEntityCollision(AxisAlignedBB p_72917_1_, Entity p_72917_2_).

Может оно? Только как с этим работать?
 
Эх... Со всех сторон окружили.
Сделал через тайл согласно 4-му ответу в этой теме:
Код:
package ru.liahim.testmod.tileentity;

import java.util.Iterator;
import java.util.List;

import net.minecraft.entity.Entity;
import net.minecraft.entity.monster.EntitySlime;
import net.minecraft.entity.monster.EntityWitch;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.DamageSource;


public class TestTileEntity extends TileEntity {
    
    public void updateEntity() {

        double d0 = 0.0625D;
        AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox((double)xCoord, (double)yCoord, (double)zCoord, (double)(xCoord + 1), (double)(yCoord + 1), (double)(zCoord + 1)).expand(d0, d0, d0);
        List list = worldObj.getEntitiesWithinAABB(Entity.class, axisalignedbb);
        Iterator iterator = list.iterator();
        Entity entity;

        while(iterator.hasNext()) {
            entity = (Entity)iterator.next();

        if (entity instanceof EntitySlime || entity instanceof EntityWitch) {
            entity.attackEntityFrom(DamageSource.cactus, 1.0F);
        }
        }
        
    }
       
}

Всё работает отлично!
НО! Большое жирное НО... Ведь поршни-то не могут двигать блок с тайлом (((
Или можно им это разрешить?
Потому как без тайла блок получается уж очень кривым (
А возможность двигать его поршнем жизненно необходима.

В общем, снова хелп!
 
Народ, чо-та я уже извращаться начал.
Дошёл до такого :D
Код:
public void onEntityWalking(World world, int x, int y, int z, Entity entity)
{
  world.scheduleBlockUpdate(x, y, z, this, 5);
}

public void updateTick(World world, int x, int y, int z, Random rand)
{
  double d0 = 0.0625D;
  AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox((double)x, (double)y, (double)z, (double)(x + 1), (double)(y + 1), (double)(z + 1)).expand(d0, d0, d0);
  List list = world.getEntitiesWithinAABB(Entity.class, axisalignedbb);
  Iterator iterator = list.iterator();
  Entity entity;

  while(iterator.hasNext()) {
    entity = (Entity)iterator.next();

    if (entity instanceof EntitySlime || entity instanceof EntityWitch) {
      entity.attackEntityFrom(DamageSource.cactus, 1.0F);
      world.scheduleBlockUpdate(x, y, z, this, 5);
    }
  }
}

Но это жесть какая-то. Не хочется всё же прям так вот...

Я тут подумал, если есть метод onEntityWalking, реагирующий на хождение энтити по блоку, значит можно найти/написать самому и метод, реагирующий просто на стояние на блоке.

Отсюда вопрос: сложно ли написать свой метод?
Или, возможно, проще, например, просто поймать событие стояния на блоке? ))) С событиями вообще дела не имел, поэтому не сердитесь, могу нести полную ахинею...
 
А если блок сбоку от сущности, или сущность двигается вверх?..
 
Назад
Сверху