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    }