    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.ArrayList;
    006    import java.util.Iterator;
    007    import java.util.List;
    008
    009    public class EntityPainting extends Entity
    010    {
    011        private int tickCounter1;
    012
    013        /** the direction the painting faces */
    014        public int direction;
    015        public int xPosition;
    016        public int yPosition;
    017        public int zPosition;
    018        public EnumArt art;
    019
    020        public EntityPainting(World par1World)
    021        {
    022            super(par1World);
    023            this.tickCounter1 = 0;
    024            this.direction = 0;
    025            this.yOffset = 0.0F;
    026            this.setSize(0.5F, 0.5F);
    027        }
    028
    029        public EntityPainting(World par1World, int par2, int par3, int par4, int par5)
    030        {
    031            this(par1World);
    032            this.xPosition = par2;
    033            this.yPosition = par3;
    034            this.zPosition = par4;
    035            ArrayList var6 = new ArrayList();
    036            EnumArt[] var7 = EnumArt.values();
    037            int var8 = var7.length;
    038
    039            for (int var9 = 0; var9 < var8; ++var9)
    040            {
    041                EnumArt var10 = var7[var9];
    042                this.art = var10;
    043                this.setDirection(par5);
    044
    045                if (this.onValidSurface())
    046                {
    047                    var6.add(var10);
    048                }
    049            }
    050
    051            if (!var6.isEmpty())
    052            {
    053                this.art = (EnumArt)var6.get(this.rand.nextInt(var6.size()));
    054            }
    055
    056            this.setDirection(par5);
    057        }
    058
    059        @SideOnly(Side.CLIENT)
    060        public EntityPainting(World par1World, int par2, int par3, int par4, int par5, String par6Str)
    061        {
    062            this(par1World);
    063            this.xPosition = par2;
    064            this.yPosition = par3;
    065            this.zPosition = par4;
    066            EnumArt[] var7 = EnumArt.values();
    067            int var8 = var7.length;
    068
    069            for (int var9 = 0; var9 < var8; ++var9)
    070            {
    071                EnumArt var10 = var7[var9];
    072
    073                if (var10.title.equals(par6Str))
    074                {
    075                    this.art = var10;
    076                    break;
    077                }
    078            }
    079
    080            this.setDirection(par5);
    081        }
    082
    083        protected void entityInit() {}
    084
    085        /**
    086         * Sets the direction the painting faces.
    087         */
    088        public void setDirection(int par1)
    089        {
    090            this.direction = par1;
    091            this.prevRotationYaw = this.rotationYaw = (float)(par1 * 90);
    092            float var2 = (float)this.art.sizeX;
    093            float var3 = (float)this.art.sizeY;
    094            float var4 = (float)this.art.sizeX;
    095
    096            if (par1 != 0 && par1 != 2)
    097            {
    098                var2 = 0.5F;
    099            }
    100            else
    101            {
    102                var4 = 0.5F;
    103            }
    104
    105            var2 /= 32.0F;
    106            var3 /= 32.0F;
    107            var4 /= 32.0F;
    108            float var5 = (float)this.xPosition + 0.5F;
    109            float var6 = (float)this.yPosition + 0.5F;
    110            float var7 = (float)this.zPosition + 0.5F;
    111            float var8 = 0.5625F;
    112
    113            if (par1 == 0)
    114            {
    115                var7 -= var8;
    116            }
    117
    118            if (par1 == 1)
    119            {
    120                var5 -= var8;
    121            }
    122
    123            if (par1 == 2)
    124            {
    125                var7 += var8;
    126            }
    127
    128            if (par1 == 3)
    129            {
    130                var5 += var8;
    131            }
    132
    133            if (par1 == 0)
    134            {
    135                var5 -= this.func_70517_b(this.art.sizeX);
    136            }
    137
    138            if (par1 == 1)
    139            {
    140                var7 += this.func_70517_b(this.art.sizeX);
    141            }
    142
    143            if (par1 == 2)
    144            {
    145                var5 += this.func_70517_b(this.art.sizeX);
    146            }
    147
    148            if (par1 == 3)
    149            {
    150                var7 -= this.func_70517_b(this.art.sizeX);
    151            }
    152
    153            var6 += this.func_70517_b(this.art.sizeY);
    154            this.setPosition((double)var5, (double)var6, (double)var7);
    155            float var9 = -0.00625F;
    156            this.boundingBox.setBounds((double)(var5 - var2 - var9), (double)(var6 - var3 - var9), (double)(var7 - var4 - var9), (double)(var5 + var2 + var9), (double)(var6 + var3 + var9), (double)(var7 + var4 + var9));
    157        }
    158
    159        private float func_70517_b(int par1)
    160        {
    161            return par1 == 32 ? 0.5F : (par1 == 64 ? 0.5F : 0.0F);
    162        }
    163
    164        /**
    165         * Called to update the entity's position/logic.
    166         */
    167        public void onUpdate()
    168        {
    169            if (this.tickCounter1++ == 100 && !this.worldObj.isRemote)
    170            {
    171                this.tickCounter1 = 0;
    172
    173                if (!this.isDead && !this.onValidSurface())
    174                {
    175                    this.setDead();
    176                    this.worldObj.spawnEntityInWorld(new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, new ItemStack(Item.painting)));
    177                }
    178            }
    179        }
    180
    181        /**
    182         * checks to make sure painting can be placed there
    183         */
    184        public boolean onValidSurface()
    185        {
    186            if (!this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).isEmpty())
    187            {
    188                return false;
    189            }
    190            else
    191            {
    192                int var1 = this.art.sizeX / 16;
    193                int var2 = this.art.sizeY / 16;
    194                int var3 = this.xPosition;
    195                int var4 = this.yPosition;
    196                int var5 = this.zPosition;
    197
    198                if (this.direction == 0)
    199                {
    200                    var3 = MathHelper.floor_double(this.posX - (double)((float)this.art.sizeX / 32.0F));
    201                }
    202
    203                if (this.direction == 1)
    204                {
    205                    var5 = MathHelper.floor_double(this.posZ - (double)((float)this.art.sizeX / 32.0F));
    206                }
    207
    208                if (this.direction == 2)
    209                {
    210                    var3 = MathHelper.floor_double(this.posX - (double)((float)this.art.sizeX / 32.0F));
    211                }
    212
    213                if (this.direction == 3)
    214                {
    215                    var5 = MathHelper.floor_double(this.posZ - (double)((float)this.art.sizeX / 32.0F));
    216                }
    217
    218                var4 = MathHelper.floor_double(this.posY - (double)((float)this.art.sizeY / 32.0F));
    219
    220                for (int var6 = 0; var6 < var1; ++var6)
    221                {
    222                    for (int var7 = 0; var7 < var2; ++var7)
    223                    {
    224                        Material var8;
    225
    226                        if (this.direction != 0 && this.direction != 2)
    227                        {
    228                            var8 = this.worldObj.getBlockMaterial(this.xPosition, var4 + var7, var5 + var6);
    229                        }
    230                        else
    231                        {
    232                            var8 = this.worldObj.getBlockMaterial(var3 + var6, var4 + var7, this.zPosition);
    233                        }
    234
    235                        if (!var8.isSolid())
    236                        {
    237                            return false;
    238                        }
    239                    }
    240                }
    241
    242                List var9 = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox);
    243                Iterator var10 = var9.iterator();
    244                Entity var11;
    245
    246                do
    247                {
    248                    if (!var10.hasNext())
    249                    {
    250                        return true;
    251                    }
    252
    253                    var11 = (Entity)var10.next();
    254                }
    255                while (!(var11 instanceof EntityPainting));
    256
    257                return false;
    258            }
    259        }
    260
    261        /**
    262         * Returns true if other Entities should be prevented from moving through this Entity.
    263         */
    264        public boolean canBeCollidedWith()
    265        {
    266            return true;
    267        }
    268
    269        /**
    270         * Called when the entity is attacked.
    271         */
    272        public boolean attackEntityFrom(DamageSource par1DamageSource, int par2)
    273        {
    274            if (!this.isDead && !this.worldObj.isRemote)
    275            {
    276                this.setDead();
    277                this.setBeenAttacked();
    278                EntityPlayer var3 = null;
    279
    280                if (par1DamageSource.getEntity() instanceof EntityPlayer)
    281                {
    282                    var3 = (EntityPlayer)par1DamageSource.getEntity();
    283                }
    284
    285                if (var3 != null && var3.capabilities.isCreativeMode)
    286                {
    287                    return true;
    288                }
    289
    290                this.worldObj.spawnEntityInWorld(new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, new ItemStack(Item.painting)));
    291            }
    292
    293            return true;
    294        }
    295
    296        /**
    297         * (abstract) Protected helper method to write subclass entity data to NBT.
    298         */
    299        public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
    300        {
    301            par1NBTTagCompound.setByte("Dir", (byte)this.direction);
    302            par1NBTTagCompound.setString("Motive", this.art.title);
    303            par1NBTTagCompound.setInteger("TileX", this.xPosition);
    304            par1NBTTagCompound.setInteger("TileY", this.yPosition);
    305            par1NBTTagCompound.setInteger("TileZ", this.zPosition);
    306        }
    307
    308        /**
    309         * (abstract) Protected helper method to read subclass entity data from NBT.
    310         */
    311        public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
    312        {
    313            this.direction = par1NBTTagCompound.getByte("Dir");
    314            this.xPosition = par1NBTTagCompound.getInteger("TileX");
    315            this.yPosition = par1NBTTagCompound.getInteger("TileY");
    316            this.zPosition = par1NBTTagCompound.getInteger("TileZ");
    317            String var2 = par1NBTTagCompound.getString("Motive");
    318            EnumArt[] var3 = EnumArt.values();
    319            int var4 = var3.length;
    320
    321            for (int var5 = 0; var5 < var4; ++var5)
    322            {
    323                EnumArt var6 = var3[var5];
    324
    325                if (var6.title.equals(var2))
    326                {
    327                    this.art = var6;
    328                }
    329            }
    330
    331            if (this.art == null)
    332            {
    333                this.art = EnumArt.Kebab;
    334            }
    335
    336            this.setDirection(this.direction);
    337        }
    338
    339        /**
    340         * Tries to moves the entity by the passed in displacement. Args: x, y, z
    341         */
    342        public void moveEntity(double par1, double par3, double par5)
    343        {
    344            if (!this.worldObj.isRemote && !this.isDead && par1 * par1 + par3 * par3 + par5 * par5 > 0.0D)
    345            {
    346                this.setDead();
    347                this.worldObj.spawnEntityInWorld(new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, new ItemStack(Item.painting)));
    348            }
    349        }
    350
    351        /**
    352         * Adds to the current velocity of the entity. Args: x, y, z
    353         */
    354        public void addVelocity(double par1, double par3, double par5)
    355        {
    356            if (!this.worldObj.isRemote && !this.isDead && par1 * par1 + par3 * par3 + par5 * par5 > 0.0D)
    357            {
    358                this.setDead();
    359                this.worldObj.spawnEntityInWorld(new EntityItem(this.worldObj, this.posX, this.posY, this.posZ, new ItemStack(Item.painting)));
    360            }
    361        }
    362    }