Beispiel #1
0
        public override void updatePlayerActionState()
        {
            hasAttacked = false;
            float f = 16F;

            if (playerToAttack == null)
            {
                playerToAttack = findPlayerToAttack();
                if (playerToAttack != null)
                {
                    pathToEntity = worldObj.getPathToEntity(this, playerToAttack, f);
                }
            }
            else if (!playerToAttack.isEntityAlive())
            {
                playerToAttack = null;
            }
            else
            {
                float f1 = playerToAttack.getDistanceToEntity(this);
                if (canEntityBeSeen(playerToAttack))
                {
                    attackEntity(playerToAttack, f1);
                }
            }
            if (!hasAttacked && playerToAttack != null && (pathToEntity == null || rand.nextInt(20) == 0))
            {
                pathToEntity = worldObj.getPathToEntity(this, playerToAttack, f);
            }
            else if (pathToEntity == null && rand.nextInt(80) == 0 || rand.nextInt(80) == 0)
            {
                bool  flag = false;
                int   j    = -1;
                int   k    = -1;
                int   l    = -1;
                float f2   = -99999F;
                for (int i1 = 0; i1 < 10; i1++)
                {
                    int   j1 = MathHelper.floor_double((posX + rand.nextInt(13)) - 6D);
                    int   k1 = MathHelper.floor_double((posY + rand.nextInt(7)) - 3D);
                    int   l1 = MathHelper.floor_double((posZ + rand.nextInt(13)) - 6D);
                    float f3 = getBlockPathWeight(j1, k1, l1);
                    if (f3 > f2)
                    {
                        f2   = f3;
                        j    = j1;
                        k    = k1;
                        l    = l1;
                        flag = true;
                    }
                }

                if (flag)
                {
                    pathToEntity = worldObj.getEntityPathToXYZ(this, j, k, l, 10F);
                }
            }
            int  i     = MathHelper.floor_double(boundingBox.minY);
            bool flag1 = handleWaterMovement();
            bool flag2 = handleLavaMovement();

            rotationPitch = 0.0F;
            if (pathToEntity == null || rand.nextInt(100) == 0)
            {
                base.updatePlayerActionState();
                pathToEntity = null;
                return;
            }
            Vec3D vec3d = pathToEntity.getPosition(this);

            for (double d = width * 2.0F; vec3d != null && vec3d.squareDistanceTo(posX, vec3d.yCoord, posZ) < d * d;)
            {
                pathToEntity.incrementPathIndex();
                if (pathToEntity.isFinished())
                {
                    vec3d        = null;
                    pathToEntity = null;
                }
                else
                {
                    vec3d = pathToEntity.getPosition(this);
                }
            }

            isJumping = false;
            if (vec3d != null)
            {
                double d1 = vec3d.xCoord - posX;
                double d2 = vec3d.zCoord - posZ;
                double d3 = vec3d.yCoord - i;
                float  f4 = (float)((Math.atan2(d2, d1) * 180D) / 3.1415927410125732D) - 90F;
                float  f5 = f4 - rotationYaw;
                moveForward = moveSpeed;
                for (; f5 < -180F; f5 += 360F)
                {
                }
                for (; f5 >= 180F; f5 -= 360F)
                {
                }
                if (f5 > 30F)
                {
                    f5 = 30F;
                }
                if (f5 < -30F)
                {
                    f5 = -30F;
                }
                rotationYaw += f5;
                if (hasAttacked && playerToAttack != null)
                {
                    double d4 = playerToAttack.posX - posX;
                    double d5 = playerToAttack.posZ - posZ;
                    float  f7 = rotationYaw;
                    rotationYaw = (float)((Math.atan2(d5, d4) * 180D) / 3.1415927410125732D) - 90F;
                    float f6 = (((f7 - rotationYaw) + 90F) * 3.141593F) / 180F;
                    moveStrafing = -MathHelper.sin(f6) * moveForward * 1.0F;
                    moveForward  = MathHelper.cos(f6) * moveForward * 1.0F;
                }
                if (d3 > 0.0D)
                {
                    isJumping = true;
                }
            }
            if (playerToAttack != null)
            {
                faceEntity(playerToAttack, 30F);
            }
            if (isCollidedHorizontally)
            {
                isJumping = true;
            }
            if (rand.nextFloat() < 0.8F && (flag1 || flag2))
            {
                isJumping = true;
            }
        }