    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.func_85032_ar())
    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    }