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