public void handleFlying(Packet10Flying par1Packet10Flying) {
    WorldServer worldserver = mcServer.worldServerForDimension(playerEntity.dimension);
    field_72584_h = true;

    if (playerEntity.playerHasConqueredTheEnd) {
      return;
    }

    if (!field_72587_r) {
      double d = par1Packet10Flying.yPosition - lastPosY;

      if (par1Packet10Flying.xPosition == lastPosX
          && d * d < 0.01D
          && par1Packet10Flying.zPosition == lastPosZ) {
        field_72587_r = true;
      }
    }

    if (field_72587_r) {
      if (playerEntity.ridingEntity != null) {
        float f = playerEntity.rotationYaw;
        float f1 = playerEntity.rotationPitch;
        playerEntity.ridingEntity.updateRiderPosition();
        double d2 = playerEntity.posX;
        double d4 = playerEntity.posY;
        double d6 = playerEntity.posZ;
        double d8 = 0.0D;
        double d9 = 0.0D;

        if (par1Packet10Flying.rotating) {
          f = par1Packet10Flying.yaw;
          f1 = par1Packet10Flying.pitch;
        }

        if (par1Packet10Flying.moving
            && par1Packet10Flying.yPosition == -999D
            && par1Packet10Flying.stance == -999D) {
          if (par1Packet10Flying.xPosition > 1.0D || par1Packet10Flying.zPosition > 1.0D) {
            System.err.println(
                (new StringBuilder())
                    .append(playerEntity.username)
                    .append(" was caught trying to crash the server with an invalid position.")
                    .toString());
            kickPlayerFromServer("Nope!");
            return;
          }

          d8 = par1Packet10Flying.xPosition;
          d9 = par1Packet10Flying.zPosition;
        }

        playerEntity.onGround = par1Packet10Flying.onGround;
        playerEntity.onUpdateEntity();
        playerEntity.moveEntity(d8, 0.0D, d9);
        playerEntity.setPositionAndRotation(d2, d4, d6, f, f1);
        playerEntity.motionX = d8;
        playerEntity.motionZ = d9;

        if (playerEntity.ridingEntity != null) {
          worldserver.uncheckedUpdateEntity(playerEntity.ridingEntity, true);
        }

        if (playerEntity.ridingEntity != null) {
          playerEntity.ridingEntity.updateRiderPosition();
        }

        mcServer.getConfigurationManager().func_72358_d(playerEntity);
        lastPosX = playerEntity.posX;
        lastPosY = playerEntity.posY;
        lastPosZ = playerEntity.posZ;
        worldserver.updateEntity(playerEntity);
        return;
      }

      if (playerEntity.isPlayerSleeping()) {
        playerEntity.onUpdateEntity();
        playerEntity.setPositionAndRotation(
            lastPosX, lastPosY, lastPosZ, playerEntity.rotationYaw, playerEntity.rotationPitch);
        worldserver.updateEntity(playerEntity);
        return;
      }

      double d1 = playerEntity.posY;
      lastPosX = playerEntity.posX;
      lastPosY = playerEntity.posY;
      lastPosZ = playerEntity.posZ;
      double d3 = playerEntity.posX;
      double d5 = playerEntity.posY;
      double d7 = playerEntity.posZ;
      float f2 = playerEntity.rotationYaw;
      float f3 = playerEntity.rotationPitch;

      if (par1Packet10Flying.moving
          && par1Packet10Flying.yPosition == -999D
          && par1Packet10Flying.stance == -999D) {
        par1Packet10Flying.moving = false;
      }

      if (par1Packet10Flying.moving) {
        d3 = par1Packet10Flying.xPosition;
        d5 = par1Packet10Flying.yPosition;
        d7 = par1Packet10Flying.zPosition;
        double d10 = par1Packet10Flying.stance - par1Packet10Flying.yPosition;

        if (!playerEntity.isPlayerSleeping()
            && (d10 > 1.6499999999999999D || d10 < 0.10000000000000001D)) {
          kickPlayerFromServer("Illegal stance");
          logger.warning(
              (new StringBuilder())
                  .append(playerEntity.username)
                  .append(" had an illegal stance: ")
                  .append(d10)
                  .toString());
          return;
        }

        if (Math.abs(par1Packet10Flying.xPosition) > 32000000D
            || Math.abs(par1Packet10Flying.zPosition) > 32000000D) {
          kickPlayerFromServer("Illegal position");
          return;
        }
      }

      if (par1Packet10Flying.rotating) {
        f2 = par1Packet10Flying.yaw;
        f3 = par1Packet10Flying.pitch;
      }

      playerEntity.onUpdateEntity();
      playerEntity.ySize = 0.0F;
      playerEntity.setPositionAndRotation(lastPosX, lastPosY, lastPosZ, f2, f3);

      if (!field_72587_r) {
        return;
      }

      double d11 = d3 - playerEntity.posX;
      double d12 = d5 - playerEntity.posY;
      double d13 = d7 - playerEntity.posZ;
      double d14 = Math.min(Math.abs(d11), Math.abs(playerEntity.motionX));
      double d15 = Math.min(Math.abs(d12), Math.abs(playerEntity.motionY));
      double d16 = Math.min(Math.abs(d13), Math.abs(playerEntity.motionZ));
      double d17 = d14 * d14 + d15 * d15 + d16 * d16;

      if (d17 > 100D
          && (!mcServer.isSinglePlayer()
              || !mcServer.getServerOwner().equals(playerEntity.username))) {
        logger.warning(
            (new StringBuilder())
                .append(playerEntity.username)
                .append(" moved too quickly! ")
                .append(d11)
                .append(",")
                .append(d12)
                .append(",")
                .append(d13)
                .append(" (")
                .append(d14)
                .append(", ")
                .append(d15)
                .append(", ")
                .append(d16)
                .append(")")
                .toString());
        setPlayerLocation(
            lastPosX, lastPosY, lastPosZ, playerEntity.rotationYaw, playerEntity.rotationPitch);
        return;
      }

      float f4 = 0.0625F;
      boolean flag =
          worldserver
              .getCollidingBoundingBoxes(
                  playerEntity, playerEntity.boundingBox.copy().contract(f4, f4, f4))
              .isEmpty();

      if (playerEntity.onGround && !par1Packet10Flying.onGround && d12 > 0.0D) {
        playerEntity.addExhaustion(0.2F);
      }

      playerEntity.moveEntity(d11, d12, d13);
      playerEntity.onGround = par1Packet10Flying.onGround;
      playerEntity.addMovementStat(d11, d12, d13);
      double d18 = d12;
      d11 = d3 - playerEntity.posX;
      d12 = d5 - playerEntity.posY;

      if (d12 > -0.5D || d12 < 0.5D) {
        d12 = 0.0D;
      }

      d13 = d7 - playerEntity.posZ;
      d17 = d11 * d11 + d12 * d12 + d13 * d13;
      boolean flag1 = false;

      if (d17 > 0.0625D
          && !playerEntity.isPlayerSleeping()
          && !playerEntity.theItemInWorldManager.isCreative()) {
        flag1 = true;
        logger.warning(
            (new StringBuilder())
                .append(playerEntity.username)
                .append(" moved wrongly!")
                .toString());
      }

      playerEntity.setPositionAndRotation(d3, d5, d7, f2, f3);
      boolean flag2 =
          worldserver
              .getCollidingBoundingBoxes(
                  playerEntity, playerEntity.boundingBox.copy().contract(f4, f4, f4))
              .isEmpty();

      if (flag && (flag1 || !flag2) && !playerEntity.isPlayerSleeping()) {
        setPlayerLocation(lastPosX, lastPosY, lastPosZ, f2, f3);
        return;
      }

      AxisAlignedBB axisalignedbb =
          playerEntity
              .boundingBox
              .copy()
              .expand(f4, f4, f4)
              .addCoord(0.0D, -0.55000000000000004D, 0.0D);

      if (!mcServer.isFlightAllowed()
          && !playerEntity.theItemInWorldManager.isCreative()
          && !worldserver.isAABBNonEmpty(axisalignedbb)) {
        if (d18 >= -0.03125D) {
          ticksForFloatKick++;

          if (ticksForFloatKick > 80) {
            logger.warning(
                (new StringBuilder())
                    .append(playerEntity.username)
                    .append(" was kicked for floating too long!")
                    .toString());
            kickPlayerFromServer("Flying is not enabled on this server");
            return;
          }
        }
      } else {
        ticksForFloatKick = 0;
      }

      playerEntity.onGround = par1Packet10Flying.onGround;
      mcServer.getConfigurationManager().func_72358_d(playerEntity);
      playerEntity.updateFlyingState(playerEntity.posY - d1, par1Packet10Flying.onGround);
    }
  }
Пример #2
0
 public void handleFlying(Packet10Flying packet10flying) {
   WorldServer worldserver = mcServer.getWorldManager(playerEntity.dimension);
   field_22003_h = true;
   if (!hasMoved) {
     double d = packet10flying.yPosition - lastPosY;
     if (packet10flying.xPosition == lastPosX
         && d * d < 0.01D
         && packet10flying.zPosition == lastPosZ) {
       hasMoved = true;
     }
   }
   if (hasMoved) {
     if (playerEntity.ridingEntity != null) {
       float f = playerEntity.rotationYaw;
       float f1 = playerEntity.rotationPitch;
       playerEntity.ridingEntity.updateRiderPosition();
       double d2 = playerEntity.posX;
       double d4 = playerEntity.posY;
       double d6 = playerEntity.posZ;
       double d8 = 0.0D;
       double d9 = 0.0D;
       if (packet10flying.rotating) {
         f = packet10flying.yaw;
         f1 = packet10flying.pitch;
       }
       if (packet10flying.moving
           && packet10flying.yPosition == -999D
           && packet10flying.stance == -999D) {
         d8 = packet10flying.xPosition;
         d9 = packet10flying.zPosition;
       }
       playerEntity.onGround = packet10flying.onGround;
       playerEntity.onUpdateEntity(true);
       playerEntity.moveEntity(d8, 0.0D, d9);
       playerEntity.setPositionAndRotation(d2, d4, d6, f, f1);
       playerEntity.motionX = d8;
       playerEntity.motionZ = d9;
       if (playerEntity.ridingEntity != null) {
         worldserver.func_12017_b(playerEntity.ridingEntity, true);
       }
       if (playerEntity.ridingEntity != null) {
         playerEntity.ridingEntity.updateRiderPosition();
       }
       mcServer.configManager.func_613_b(playerEntity);
       lastPosX = playerEntity.posX;
       lastPosY = playerEntity.posY;
       lastPosZ = playerEntity.posZ;
       worldserver.updateEntity(playerEntity);
       return;
     }
     if (playerEntity.func_22057_E()) {
       playerEntity.onUpdateEntity(true);
       playerEntity.setPositionAndRotation(
           lastPosX, lastPosY, lastPosZ, playerEntity.rotationYaw, playerEntity.rotationPitch);
       worldserver.updateEntity(playerEntity);
       return;
     }
     double d1 = playerEntity.posY;
     lastPosX = playerEntity.posX;
     lastPosY = playerEntity.posY;
     lastPosZ = playerEntity.posZ;
     double d3 = playerEntity.posX;
     double d5 = playerEntity.posY;
     double d7 = playerEntity.posZ;
     float f2 = playerEntity.rotationYaw;
     float f3 = playerEntity.rotationPitch;
     if (packet10flying.moving
         && packet10flying.yPosition == -999D
         && packet10flying.stance == -999D) {
       packet10flying.moving = false;
     }
     if (packet10flying.moving) {
       d3 = packet10flying.xPosition;
       d5 = packet10flying.yPosition;
       d7 = packet10flying.zPosition;
       double d10 = packet10flying.stance - packet10flying.yPosition;
       if (!playerEntity.func_22057_E()
           && (d10 > 1.6499999999999999D || d10 < 0.10000000000000001D)) {
         kickPlayer("Illegal stance");
         logger.warning(
             (new StringBuilder())
                 .append(playerEntity.username)
                 .append(" had an illegal stance: ")
                 .append(d10)
                 .toString());
         return;
       }
       if (Math.abs(packet10flying.xPosition) > 32000000D
           || Math.abs(packet10flying.zPosition) > 32000000D) {
         kickPlayer("Illegal position");
         return;
       }
     }
     if (packet10flying.rotating) {
       f2 = packet10flying.yaw;
       f3 = packet10flying.pitch;
     }
     playerEntity.onUpdateEntity(true);
     playerEntity.ySize = 0.0F;
     playerEntity.setPositionAndRotation(lastPosX, lastPosY, lastPosZ, f2, f3);
     if (!hasMoved) {
       return;
     }
     double d11 = d3 - playerEntity.posX;
     double d12 = d5 - playerEntity.posY;
     double d13 = d7 - playerEntity.posZ;
     double d14 = d11 * d11 + d12 * d12 + d13 * d13;
     if (d14 > 100D) {
       logger.warning(
           (new StringBuilder())
               .append(playerEntity.username)
               .append(" moved too quickly!")
               .toString());
       kickPlayer("You moved too quickly :( (Hacking?)");
       return;
     }
     float f4 = 0.0625F;
     boolean flag =
         worldserver
                 .getCollidingBoundingBoxes(
                     playerEntity, playerEntity.boundingBox.copy().getInsetBoundingBox(f4, f4, f4))
                 .size()
             == 0;
     playerEntity.moveEntity(d11, d12, d13);
     d11 = d3 - playerEntity.posX;
     d12 = d5 - playerEntity.posY;
     if (d12 > -0.5D || d12 < 0.5D) {
       d12 = 0.0D;
     }
     d13 = d7 - playerEntity.posZ;
     d14 = d11 * d11 + d12 * d12 + d13 * d13;
     boolean flag1 = false;
     if (d14 > 0.0625D && !playerEntity.func_22057_E()) {
       flag1 = true;
       logger.warning(
           (new StringBuilder())
               .append(playerEntity.username)
               .append(" moved wrongly!")
               .toString());
       System.out.println(
           (new StringBuilder())
               .append("Got position ")
               .append(d3)
               .append(", ")
               .append(d5)
               .append(", ")
               .append(d7)
               .toString());
       System.out.println(
           (new StringBuilder())
               .append("Expected ")
               .append(playerEntity.posX)
               .append(", ")
               .append(playerEntity.posY)
               .append(", ")
               .append(playerEntity.posZ)
               .toString());
     }
     playerEntity.setPositionAndRotation(d3, d5, d7, f2, f3);
     boolean flag2 =
         worldserver
                 .getCollidingBoundingBoxes(
                     playerEntity, playerEntity.boundingBox.copy().getInsetBoundingBox(f4, f4, f4))
                 .size()
             == 0;
     if (flag && (flag1 || !flag2) && !playerEntity.func_22057_E()) {
       teleportTo(lastPosX, lastPosY, lastPosZ, f2, f3);
       return;
     }
     AxisAlignedBB axisalignedbb =
         playerEntity
             .boundingBox
             .copy()
             .expand(f4, f4, f4)
             .addCoord(0.0D, -0.55000000000000004D, 0.0D);
     if (!mcServer.allowFlight && !worldserver.func_27069_b(axisalignedbb)) {
       if (d12 >= -0.03125D) {
         playerInAirTime++;
         if (playerInAirTime > 80) {
           logger.warning(
               (new StringBuilder())
                   .append(playerEntity.username)
                   .append(" was kicked for floating too long!")
                   .toString());
           kickPlayer("Flying is not enabled on this server");
           return;
         }
       }
     } else {
       playerInAirTime = 0;
     }
     playerEntity.onGround = packet10flying.onGround;
     mcServer.configManager.func_613_b(playerEntity);
     playerEntity.handleFalling(playerEntity.posY - d1, packet10flying.onGround);
   }
 }