1.7.10 Радиус действия зелья, как у маяка

В общем из названия все ясно, хочу сделать, чтобы когда отлетаешь например на 15 блоков от блока эффект снимался, вообще не знаю как это сделать, вот что намудрил, просьба не смеятся:

package assets.armorness.src.blocks;

import java.util.Random;

import assets.armorness.src.armorness;
import assets.armorness.src.renderblock.TileEntityObsidianObelisk;
import assets.armorness.src.renderblock.TileEntityObsidianObelisk;
import net.minecraft.block.Block;
import net.minecraft.block.ITileEntityProvider;
import net.minecraft.block.material.Material;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.PotionEffect;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;

public class ObsidianObelisk extends Block implements ITileEntityProvider {

    public ObsidianObelisk() {
        super(Material.piston);
        this.setHardness(2.0F);
        this.setBlockTextureName("iron_block");
        this.setCreativeTab(armorness.armornesstab);
        this.setBlockBounds(0, 0, 0, 1.0F, 2F, 1.0F);
    }
   
    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_)
    {
        if(player.getCurrentEquippedItem() == null){
            if(world.getBlock(x+2, y, z) != null && world.getBlock(x+2, y, z) == armorness.ObsidianShard &&
               world.getBlock(x-2, y, z) != null && world.getBlock(x-2, y, z) == armorness.ObsidianShard &&
               world.getBlock(x, y, z+2) != null && world.getBlock(x, y, z+2) == armorness.ObsidianShard &&
               world.getBlock(x, y, z-2) != null && world.getBlock(x, y, z-2) == armorness.ObsidianShard){
                player.addPotionEffect(new PotionEffect(armorness.Fly.id, 20*30, 0));
            }
        }
        return false;
    }
   
    public void onUpdate(ItemStack is, World world, Entity entity, int p_77663_4_, boolean p_77663_5_) {
        if(entity instanceof EntityPlayer) {
            EntityPlayer player = (EntityPlayer) entity;
            int x = (int) Math.round(player.posX +- 15f);
            int y = (int) Math.round(player.posY +- 30f);
            int z = (int) Math.round(player.posZ +- 15f);
                if(world.getBlock(x, y, z) != armorness.ObsidianObelisk){
                        player.removePotionEffect(armorness.Fly.id);
                    }
            }
    }
   
    @Override
    public Item getItemDropped(int par1, Random par2Random, int par3)
    {
        return armorness.RedDiamond;
    }
   
    @Override
    public TileEntity createNewTileEntity(World world, int metadata) {
        return new TileEntityObsidianObelisk();
    }

    public int getRenderType() {
        return -1;
    }

    public boolean isOpaqueCube() {
        return false;
    }

    public boolean renderAsNormalBlock() {
        return false;
    }
   
}
 
Всё и проще и сложнее. Надо лишь:
1. Расширить область самого блока, используя AxisAlignedBB.getBoundingBox() и .expand().
2. Потом сделать список this.worldObj.getEntitiesWithinAABB(Entity.class, axisalignedbb).
3. Перебрать его итератором while(iterator.hasNext()).
4. Дальше проверять, что энтити - это игрок, - entity instanceof EntityPlayer
5. И накладывать нужный эффект player.addPotionEffect на 1 секунду (или сколько тебе нужно чтобы эффект держался после выхода из зоны)
6. ???????
7. PROFIT
Надеюсь, помог :D
P.S. Код был нагло украден позаимствован из урока Timaxa007 про AABB.
 
Вот только давайте без итераторов и while. for-циклы для кого придумали?
 
Назад
Сверху