Опять это пуля [RayTrace]

svk

1,185
3
Баг #10000000026

Есть обычный EntityTrowable, у него такой кодец на поиск блоков и энтити перед ним:
Код:
         Vec3 vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ);
         Vec3 vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
         MovingObjectPosition movingobjectposition = this.worldObj.rayTraceBlocks(vec3, vec31);
         vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ);
         vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);

         if (movingobjectposition != null)
         {
             vec31 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, movingobjectposition.hitVec.zCoord);
         }

         Entity entity = null;
         List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.addCoord(this.motionX, this.motionY, this.motionZ).expand(2.0D, 2.0D, 2.0D));
         double d0 = 0.0D;
         EntityLivingBase entitylivingbase = this.getThrower();

         for (int j = 0; j < list.size(); ++j)
         {
             Entity entity1 = (Entity)list.get(j);

             if (entity1.canBeCollidedWith() && (entity1 != entitylivingbase || this.ticksInAir >= 5))
             {
                 float f = 0.3F + addSize*2;
                 AxisAlignedBB axisalignedbb = entity1.boundingBox.expand((double)f, (double)f, (double)f);
                 MovingObjectPosition movingobjectposition1 = axisalignedbb.calculateIntercept(vec3, vec31);

                 if (movingobjectposition1 != null)
                 {
                     double d1 = vec3.distanceTo(movingobjectposition1.hitVec);

                     if (d1 < d0 || d0 == 0.0D)
                     {
                         entity = entity1;
                         d0 = d1;
                     }
                 }
             }
         }

         if (entity != null)
         {
             movingobjectposition = new MovingObjectPosition(entity);
         }

         if (movingobjectposition != null)
         {
             if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK && this.worldObj.getBlock(movingobjectposition.blockX, movingobjectposition.blockY, movingobjectposition.blockZ) == Blocks.portal)
             {
                 this.setInPortal();
             }
             else
             {
                 this.onImpact(movingobjectposition);
             }
         }

Судя по нему, первоначальным должно быть энтити, но если на "шаге (от предыдущей позиции до следующей)" сначала идёт забор, а потом энтити, то почему-то всё летит на хрен!

Старт поиска | забор | энтити | конец поиска

В итоге энтити не надохит, но если между забором и энтити достаточное пространство, то всё работает прекрасно (Видимо из-за того, что это в разных "шагах")

Судя по этому кусочку, всё должно же работать правильно...
Код:
         if (entity != null)
         {
             movingobjectposition = new MovingObjectPosition(entity);
         }
[merge_posts_bbcode]Добавлено: 22.09.2015 08:01:40[/merge_posts_bbcode]

Может кто нить поделится адекватной пулей, которую он сам использует и доволен ей, ну поззя :D
[merge_posts_bbcode]Добавлено: 22.09.2015 08:02:38[/merge_posts_bbcode]

Вот так проверяю стоит ли убивать энтити при соприкосновении с блоком:
Код:
        if(mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && mop.entityHit != null && !(mop.entityHit instanceof EntityBulletShell))
        {
            mop.entityHit.hurtResistantTime = 0;
            if(mop.entityHit instanceof EntityPlayer)
            {
                EntityPlayer player = (EntityPlayer) mop.entityHit;                
                mop.entityHit.attackEntityFrom(DamageSource.causePlayerDamage((EntityPlayer) this.getThrower()), CommonProxy.getDamageBulletPlayer(damage, 1, player));
            }
            else
            {
                mop.entityHit.attackEntityFrom(DamageSource.causePlayerDamage((EntityPlayer) this.getThrower()), damage);
            }
            this.setDead();
        }
        
        if(mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK)
        {
            Block block = this.worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ);
            if(block != Blocks.leaves && block != Blocks.leaves2 && !(block instanceof BlockFence) && !(block instanceof BlockPane) && block != Blocks.tallgrass && block != Blocks.double_plant)
            {
                this.setDead();
            }
        }

[merge_posts_bbcode]Добавлено: 22.09.2015 08:03:52[/merge_posts_bbcode]

Это ещё и прутьев с травой касается, не знаю на счёт остальных блоков, но наверняка и с ними беда.
 
Назад
Сверху