    001    package net.minecraft.src;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.SideOnly;
    005    import java.util.Iterator;
    006    import java.util.List;
    007
    008    public class TileEntityBeacon extends TileEntity implements IInventory
    009    {
    010        public static final Potion[][] field_82139_a = new Potion[][] {{Potion.moveSpeed, Potion.digSpeed}, {Potion.resistance, Potion.jump}, {Potion.damageBoost}, {Potion.regeneration}};
    011        @SideOnly(Side.CLIENT)
    012        private long field_82137_b;
    013        @SideOnly(Side.CLIENT)
    014        private float field_82138_c;
    015        private boolean field_82135_d;
    016        private int field_82136_e = -1;
    017        private int field_82133_f;
    018        private int field_82134_g;
    019        private ItemStack field_82140_h;
    020
    021        /**
    022         * Allows the entity to update its state. Overridden in most subclasses, e.g. the mob spawner uses this to count
    023         * ticks and creates a new spawn inside its implementation.
    024         */
    025        public void updateEntity()
    026        {
    027            if (this.worldObj.func_82737_E() % 80L == 0L)
    028            {
    029                this.func_82131_u();
    030                this.func_82124_t();
    031            }
    032        }
    033
    034        private void func_82124_t()
    035        {
    036            if (this.field_82135_d && this.field_82136_e > 0 && !this.worldObj.isRemote && this.field_82133_f > 0)
    037            {
    038                double var1 = (double)(this.field_82136_e * 8 + 8);
    039                byte var3 = 0;
    040
    041                if (this.field_82136_e >= 4 && this.field_82133_f == this.field_82134_g)
    042                {
    043                    var3 = 1;
    044                }
    045
    046                AxisAlignedBB var4 = AxisAlignedBB.getAABBPool().addOrModifyAABBInPool((double)this.xCoord, (double)this.yCoord, (double)this.zCoord, (double)(this.xCoord + 1), (double)(this.yCoord + 1), (double)(this.zCoord + 1)).expand(var1, var1, var1);
    047                List var5 = this.worldObj.getEntitiesWithinAABB(EntityPlayer.class, var4);
    048                Iterator var6 = var5.iterator();
    049                EntityPlayer var7;
    050
    051                while (var6.hasNext())
    052                {
    053                    var7 = (EntityPlayer)var6.next();
    054                    var7.addPotionEffect(new PotionEffect(this.field_82133_f, 180, var3, true));
    055                }
    056
    057                if (this.field_82136_e >= 4 && this.field_82133_f != this.field_82134_g && this.field_82134_g > 0)
    058                {
    059                    var6 = var5.iterator();
    060
    061                    while (var6.hasNext())
    062                    {
    063                        var7 = (EntityPlayer)var6.next();
    064                        var7.addPotionEffect(new PotionEffect(this.field_82134_g, 180, 0, true));
    065                    }
    066                }
    067            }
    068        }
    069
    070        private void func_82131_u()
    071        {
    072            if (!this.worldObj.canBlockSeeTheSky(this.xCoord, this.yCoord + 1, this.zCoord))
    073            {
    074                this.field_82135_d = false;
    075                this.field_82136_e = 0;
    076            }
    077            else
    078            {
    079                this.field_82135_d = true;
    080                this.field_82136_e = 0;
    081
    082                for (int var1 = 1; var1 <= 4; this.field_82136_e = var1++)
    083                {
    084                    int var2 = this.yCoord - var1;
    085
    086                    if (var2 < 1)
    087                    {
    088                        break;
    089                    }
    090
    091                    boolean var3 = true;
    092
    093                    for (int var4 = this.xCoord - var1; var4 <= this.xCoord + var1 && var3; ++var4)
    094                    {
    095                        for (int var5 = this.zCoord - var1; var5 <= this.zCoord + var1; ++var5)
    096                        {
    097                            int var6 = this.worldObj.getBlockId(var4, var2, var5);
    098
    099                            if (var6 != Block.blockEmerald.blockID && var6 != Block.blockGold.blockID && var6 != Block.blockDiamond.blockID && var6 != Block.blockSteel.blockID)
    100                            {
    101                                var3 = false;
    102                                break;
    103                            }
    104                        }
    105                    }
    106
    107                    if (!var3)
    108                    {
    109                        break;
    110                    }
    111                }
    112
    113                if (this.field_82136_e == 0)
    114                {
    115                    this.field_82135_d = false;
    116                }
    117            }
    118        }
    119
    120        @SideOnly(Side.CLIENT)
    121        public float func_82125_v_()
    122        {
    123            if (!this.field_82135_d)
    124            {
    125                return 0.0F;
    126            }
    127            else
    128            {
    129                int var1 = (int)(this.worldObj.func_82737_E() - this.field_82137_b);
    130                this.field_82137_b = this.worldObj.func_82737_E();
    131
    132                if (var1 > 1)
    133                {
    134                    this.field_82138_c -= (float)var1 / 40.0F;
    135
    136                    if (this.field_82138_c < 0.0F)
    137                    {
    138                        this.field_82138_c = 0.0F;
    139                    }
    140                }
    141
    142                this.field_82138_c += 0.025F;
    143
    144                if (this.field_82138_c > 1.0F)
    145                {
    146                    this.field_82138_c = 1.0F;
    147                }
    148
    149                return this.field_82138_c;
    150            }
    151        }
    152
    153        public int func_82126_i()
    154        {
    155            return this.field_82133_f;
    156        }
    157
    158        public int func_82132_j()
    159        {
    160            return this.field_82134_g;
    161        }
    162
    163        public int func_82130_k()
    164        {
    165            return this.field_82136_e;
    166        }
    167
    168        @SideOnly(Side.CLIENT)
    169        public void func_82129_c(int par1)
    170        {
    171            this.field_82136_e = par1;
    172        }
    173
    174        public void func_82128_d(int par1)
    175        {
    176            this.field_82133_f = 0;
    177
    178            for (int var2 = 0; var2 < this.field_82136_e && var2 < 3; ++var2)
    179            {
    180                Potion[] var3 = field_82139_a[var2];
    181                int var4 = var3.length;
    182
    183                for (int var5 = 0; var5 < var4; ++var5)
    184                {
    185                    Potion var6 = var3[var5];
    186
    187                    if (var6.id == par1)
    188                    {
    189                        this.field_82133_f = par1;
    190                        return;
    191                    }
    192                }
    193            }
    194        }
    195
    196        public void func_82127_e(int par1)
    197        {
    198            this.field_82134_g = 0;
    199
    200            if (this.field_82136_e >= 4)
    201            {
    202                for (int var2 = 0; var2 < 4; ++var2)
    203                {
    204                    Potion[] var3 = field_82139_a[var2];
    205                    int var4 = var3.length;
    206
    207                    for (int var5 = 0; var5 < var4; ++var5)
    208                    {
    209                        Potion var6 = var3[var5];
    210
    211                        if (var6.id == par1)
    212                        {
    213                            this.field_82134_g = par1;
    214                            return;
    215                        }
    216                    }
    217                }
    218            }
    219        }
    220
    221        /**
    222         * Overriden in a sign to provide the text.
    223         */
    224        public Packet getDescriptionPacket()
    225        {
    226            NBTTagCompound var1 = new NBTTagCompound();
    227            this.writeToNBT(var1);
    228            return new Packet132TileEntityData(this.xCoord, this.yCoord, this.zCoord, 3, var1);
    229        }
    230
    231        @SideOnly(Side.CLIENT)
    232        public double func_82115_m()
    233        {
    234            return 65536.0D;
    235        }
    236
    237        /**
    238         * Reads a tile entity from NBT.
    239         */
    240        public void readFromNBT(NBTTagCompound par1NBTTagCompound)
    241        {
    242            super.readFromNBT(par1NBTTagCompound);
    243            this.field_82133_f = par1NBTTagCompound.getInteger("Primary");
    244            this.field_82134_g = par1NBTTagCompound.getInteger("Secondary");
    245            this.field_82136_e = par1NBTTagCompound.getInteger("Levels");
    246        }
    247
    248        /**
    249         * Writes a tile entity to NBT.
    250         */
    251        public void writeToNBT(NBTTagCompound par1NBTTagCompound)
    252        {
    253            super.writeToNBT(par1NBTTagCompound);
    254            par1NBTTagCompound.setInteger("Primary", this.field_82133_f);
    255            par1NBTTagCompound.setInteger("Secondary", this.field_82134_g);
    256            par1NBTTagCompound.setInteger("Levels", this.field_82136_e);
    257        }
    258
    259        /**
    260         * Returns the number of slots in the inventory.
    261         */
    262        public int getSizeInventory()
    263        {
    264            return 1;
    265        }
    266
    267        /**
    268         * Returns the stack in slot i
    269         */
    270        public ItemStack getStackInSlot(int par1)
    271        {
    272            return par1 == 0 ? this.field_82140_h : null;
    273        }
    274
    275        /**
    276         * Removes from an inventory slot (first arg) up to a specified number (second arg) of items and returns them in a
    277         * new stack.
    278         */
    279        public ItemStack decrStackSize(int par1, int par2)
    280        {
    281            if (par1 == 0 && this.field_82140_h != null)
    282            {
    283                if (par2 >= this.field_82140_h.stackSize)
    284                {
    285                    ItemStack var3 = this.field_82140_h;
    286                    this.field_82140_h = null;
    287                    return var3;
    288                }
    289                else
    290                {
    291                    this.field_82140_h.stackSize -= par2;
    292                    return new ItemStack(this.field_82140_h.itemID, par2, this.field_82140_h.getItemDamage());
    293                }
    294            }
    295            else
    296            {
    297                return null;
    298            }
    299        }
    300
    301        /**
    302         * When some containers are closed they call this on each slot, then drop whatever it returns as an EntityItem -
    303         * like when you close a workbench GUI.
    304         */
    305        public ItemStack getStackInSlotOnClosing(int par1)
    306        {
    307            if (par1 == 0 && this.field_82140_h != null)
    308            {
    309                ItemStack var2 = this.field_82140_h;
    310                this.field_82140_h = null;
    311                return var2;
    312            }
    313            else
    314            {
    315                return null;
    316            }
    317        }
    318
    319        /**
    320         * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections).
    321         */
    322        public void setInventorySlotContents(int par1, ItemStack par2ItemStack)
    323        {
    324            if (par1 == 0)
    325            {
    326                this.field_82140_h = par2ItemStack;
    327            }
    328        }
    329
    330        /**
    331         * Returns the name of the inventory.
    332         */
    333        public String getInvName()
    334        {
    335            return "container.beacon";
    336        }
    337
    338        /**
    339         * Returns the maximum stack size for a inventory slot. Seems to always be 64, possibly will be extended. *Isn't
    340         * this more of a set than a get?*
    341         */
    342        public int getInventoryStackLimit()
    343        {
    344            return 1;
    345        }
    346
    347        /**
    348         * Do not make give this method the name canInteractWith because it clashes with Container
    349         */
    350        public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer)
    351        {
    352            return this.worldObj.getBlockTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : par1EntityPlayer.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D;
    353        }
    354
    355        public void openChest() {}
    356
    357        public void closeChest() {}
    358    }