예제 #1
0
  public void a(Packet10Flying packet10flying) {
    WorldServer worldserver = this.minecraftServer.a(this.player.dimension);

    this.i = true;
    double d0;

    if (!this.m) {
      d0 = packet10flying.y - this.y;
      if (packet10flying.x == this.x && d0 * d0 < 0.01D && packet10flying.z == this.z) {
        this.m = true;
      }
    }

    // CraftBukkit start
    Player player = getPlayer();
    Location from =
        new Location(player.getWorld(), lastPosX, lastPosY, lastPosZ, lastYaw, lastPitch);
    Location to = player.getLocation();

    // Prevent 40 event-calls for less than b single pixel of movement >.>
    double delta =
        Math.pow(this.lastPosX - this.x, 2)
            + Math.pow(this.lastPosY - this.y, 2)
            + Math.pow(this.lastPosZ - this.z, 2);
    float deltaAngle =
        Math.abs(this.lastYaw - this.player.yaw) + Math.abs(this.lastPitch - this.player.pitch);

    if (delta > 1f / 256 || deltaAngle > 10f) {
      // Skip the first time we do this
      if (lastPosX != Double.MAX_VALUE) {
        PlayerMoveEvent event = new PlayerMoveEvent(player, from, to);
        server.getPluginManager().callEvent(event);

        from = event.getFrom();
        to = event.isCancelled() ? from : event.getTo();

        this.player.locX = to.getX();
        this.player.locY = to.getY();
        this.player.locZ = to.getZ();
        this.player.yaw = to.getYaw();
        this.player.pitch = to.getPitch();
      }

      this.lastPosX = this.player.locX;
      this.lastPosY = this.player.locY;
      this.lastPosZ = this.player.locZ;
      this.lastYaw = this.player.yaw;
      this.lastPitch = this.player.pitch;
    }

    if (Math.abs(packet10flying.x) > 32000000 || Math.abs(packet10flying.z) > 32000000) {
      player.teleport(player.getWorld().getSpawnLocation());
      System.err.println(
          player.getName() + " was caught trying to crash the server with an invalid position.");
      player.kickPlayer("Nope!");
      return;
    }

    if (Double.isNaN(packet10flying.x)
        || packet10flying.x == Double.POSITIVE_INFINITY
        || packet10flying.x == Double.NEGATIVE_INFINITY) {
      player.teleport(player.getWorld().getSpawnLocation());
      System.err.println(player.getName() + " was caught trying to set an invalid position.");
      player.kickPlayer("Nope!");
      return;
    }

    if (Double.isNaN(packet10flying.y)
        || packet10flying.y == Double.POSITIVE_INFINITY
        || packet10flying.y == Double.NEGATIVE_INFINITY) {
      player.teleport(player.getWorld().getSpawnLocation());
      System.err.println(player.getName() + " was caught trying to set an invalid position.");
      player.kickPlayer("Nope!");
      return;
    }

    if (Double.isNaN(packet10flying.z)
        || packet10flying.z == Double.POSITIVE_INFINITY
        || packet10flying.z == Double.NEGATIVE_INFINITY) {
      player.teleport(player.getWorld().getSpawnLocation());
      System.err.println(player.getName() + " was caught trying to set an invalid position.");
      player.kickPlayer("Nope!");
      return;
    }

    if (Double.isNaN(packet10flying.stance)
        || packet10flying.stance == Double.POSITIVE_INFINITY
        || packet10flying.stance == Double.NEGATIVE_INFINITY) {
      player.teleport(player.getWorld().getSpawnLocation());
      System.err.println(player.getName() + " was caught trying to set an invalid position.");
      player.kickPlayer("Nope!");
      return;
    }

    if (this.m && !this.player.dead) {
      // CraftBukkit end
      double d1;
      double d2;
      double d3;
      double d4;

      if (this.player.vehicle != null) {
        float f = this.player.yaw;
        float f1 = this.player.pitch;

        this.player.vehicle.f();
        d1 = this.player.locX;
        d2 = this.player.locY;
        d3 = this.player.locZ;
        double d5 = 0.0D;

        d4 = 0.0D;
        if (packet10flying.hasLook) {
          f = packet10flying.yaw;
          f1 = packet10flying.pitch;
        }

        if (packet10flying.h && packet10flying.y == -999.0D && packet10flying.stance == -999.0D) {
          d5 = packet10flying.x;
          d4 = packet10flying.z;
        }

        this.player.onGround = packet10flying.g;
        this.player = this.player.a(true); // CraftBukkit
        this.player.move(d5, 0.0D, d4);
        this.player.setLocation(d1, d2, d3, f, f1);
        this.player.motX = d5;
        this.player.motZ = d4;
        if (this.player.vehicle != null) {
          worldserver.vehicleEnteredWorld(this.player.vehicle, true);
        }

        if (this.player.vehicle != null) {
          this.player.vehicle.f();
        }

        this.minecraftServer.serverConfigurationManager.d(this.player);
        this.x = this.player.locX;
        this.y = this.player.locY;
        this.z = this.player.locZ;
        worldserver.playerJoinedWorld(this.player);
        return;
      }

      d0 = this.player.locY;
      this.x = this.player.locX;
      this.y = this.player.locY;
      this.z = this.player.locZ;
      d1 = this.player.locX;
      d2 = this.player.locY;
      d3 = this.player.locZ;
      float f2 = this.player.yaw;
      float f3 = this.player.pitch;

      if (packet10flying.h && packet10flying.y == -999.0D && packet10flying.stance == -999.0D) {
        packet10flying.h = false;
      }

      if (packet10flying.h) {
        d1 = packet10flying.x;
        d2 = packet10flying.y;
        d3 = packet10flying.z;
        d4 = packet10flying.stance - packet10flying.y;
        if (!this.player.isSleeping() && (d4 > 1.65D || d4 < 0.1D)) {
          this.disconnect("Illegal stance");
          a.warning(this.player.name + " had an illegal stance: " + d4);
          return;
        }

        if (Math.abs(packet10flying.x) > 3.2E7D || Math.abs(packet10flying.z) > 3.2E7D) {
          this.disconnect("Illegal position");
          return;
        }
      }

      if (packet10flying.hasLook) {
        f2 = packet10flying.yaw;
        f3 = packet10flying.pitch;
      }

      this.player.a(true);
      this.player.br = 0.0F;
      this.player.setLocation(this.x, this.y, this.z, f2, f3);
      if (!this.m) {
        return;
      }

      d4 = d1 - this.player.locX;
      double d6 = d2 - this.player.locY;
      double d7 = d3 - this.player.locZ;
      double d8 = d4 * d4 + d6 * d6 + d7 * d7;

      // CraftBukkit start - make the movement speed check behave properly under tick degradation.
      int elapsedTicks = MinecraftServer.currentTick - this.lastTick;
      // Added this.m condition to solve this check being triggered by teleports
      if (d8 > 100.0D * (elapsedTicks <= 0 ? 1 : elapsedTicks) && this.m) {
        a.warning(
            this.player.name
                + " moved too quickly! Elapsed ticks: "
                + (elapsedTicks == 0 ? 1 : elapsedTicks)
                + ", Distance change: "
                + d8);
        this.disconnect("You moved too quickly :( (Hacking?)");
        return;
      }
      this.lastTick = MinecraftServer.currentTick;
      // CraftBukkit end

      float f4 = 0.0625F;
      boolean flag =
          worldserver
                  .getEntities(
                      this.player,
                      this.player.boundingBox.clone().shrink((double) f4, (double) f4, (double) f4))
                  .size()
              == 0;

      this.player.move(d4, d6, d7);
      d4 = d1 - this.player.locX;
      d6 = d2 - this.player.locY;
      if (d6 > -0.5D || d6 < 0.5D) {
        d6 = 0.0D;
      }

      d7 = d3 - this.player.locZ;
      d8 = d4 * d4 + d6 * d6 + d7 * d7;
      boolean flag1 = false;

      if (d8 > 0.0625D && !this.player.isSleeping()) {
        flag1 = true;
        a.warning(this.player.name + " moved wrongly!");
        System.out.println("Got position " + d1 + ", " + d2 + ", " + d3);
        System.out.println(
            "Expected " + this.player.locX + ", " + this.player.locY + ", " + this.player.locZ);
      }

      this.player.setLocation(d1, d2, d3, f2, f3);
      boolean flag2 =
          worldserver
                  .getEntities(
                      this.player,
                      this.player.boundingBox.clone().shrink((double) f4, (double) f4, (double) f4))
                  .size()
              == 0;

      if (flag && (flag1 || !flag2) && !this.player.isSleeping()) {
        this.a(this.x, this.y, this.z, f2, f3);
        return;
      }

      AxisAlignedBB axisalignedbb =
          this.player
              .boundingBox
              .clone()
              .b((double) f4, (double) f4, (double) f4)
              .a(0.0D, -0.55D, 0.0D);

      if (!this.minecraftServer.o && !worldserver.b(axisalignedbb)) {
        if (d6 >= -0.03125D) {
          ++this.h;
          if (this.h > 80) {
            a.warning(this.player.name + " was kicked for floating too long!");
            this.disconnect("Flying is not enabled on this server");
            return;
          }
        }
      } else {
        this.h = 0;
      }

      this.player.onGround = packet10flying.g;
      this.minecraftServer.serverConfigurationManager.d(this.player);
      this.player.b(this.player.locY - d0, packet10flying.g);
    }
  }