/**
   * Load and return all warps
   *
   * @return An ArrayList containing all loaded Warp instances.
   */
  public List<Warp> loadWarps() {
    List<Warp> warps = Lists.newArrayList();
    List<DataAccess> daos = Lists.newArrayList();
    boolean needsUpdate = false;

    try {
      Database.get().loadAll(schema, daos, new HashMap<String, Object>());
      for (DataAccess dao : daos) {
        WarpDataAccess data = (WarpDataAccess) dao;
        Group[] groups = makeGroupArray(data.groups);
        String owner = ToolBox.stringToNull(data.owner);
        String name = data.name;
        boolean playerHome = data.isPlayerHome;
        Location loc = null;
        if (((WarpDataAccess) dao).location.equals("N/A")) {
          loc = Location.fromDataAccess((LocationDataAccess) dao);
        } else {
          needsUpdate = true;
          loc = Location.fromString(data.location);
        }
        Warp warp;

        if (owner != null) {
          warp = new Warp(loc, name, owner, playerHome);
        } else if (groups != null && groups.length > 0) {
          warp = new Warp(loc, groups, name);
        } else {
          // assume this is a public warp
          warp = new Warp(loc, name);
        }
        warps.add(warp);
      }
    } catch (DatabaseReadException e) {
      log.error(e.getMessage(), e);
    }

    // Apply pending updates
    if (needsUpdate) {
      Canary.log.debug("Updating data for Warps...");
      for (Warp warp : warps) {
        this.updateWarp(warp);
      }
    }
    return warps;
  }
  // Respawn player
  public OEntityPlayerMP a(OEntityPlayerMP var1, int var2, boolean var3, Location spawnLocation) {
    var1.getDimension().getEntityTracker().untrackPlayerSymmetrics(var1.getPlayer());
    var1.getDimension().getEntityTracker().untrackEntity(var1.getCanaryEntity());
    var1.getDimension().getPlayerManager().removePlayer(var1.getPlayer());
    this.b.remove(var1);
    var1.getDimension()
        .removePlayerFromWorld(var1.getPlayer()); // This calls the despawn method in world!

    OChunkCoordinates var4 = var1.ab();
    var1.w = var2; // Set new dimension
    CanaryWorld cworld = (CanaryWorld) var1.getDimension().getWorld();
    CanaryDimension dim = (CanaryDimension) cworld.getDimension(Type.fromId(var2));
    OEntityPlayerMP var5 =
        new OEntityPlayerMP(
            this.c, dim.getHandle(), var1.v, new OItemInWorldManager(dim.getHandle()));
    var5.w = var2;
    if (var3) {
      // copy player
      var5.c((OEntityPlayer) var1);
    }

    var5.bd = var1.bd;
    // Set NetServerHandler
    var5.a = var1.a;
    var5.setServerHandler(var5.a.getCanaryNetServerHandler());
    var5.a.setUser(var5.getPlayer());

    OWorldServer var6 = (OWorldServer) dim.getHandle();
    var5.c.a(var1.c.a());
    var5.c.b(var6.s().getGameMode());
    if (var4 != null) {
      OChunkCoordinates var7 =
          OEntityPlayer.a(((CanaryDimension) var1.getDimension()).getHandle(), var4);
      if (var7 != null) {
        var5.c((var7.a + 0.5F), (var7.b + 0.1F), (var7.c + 0.5F), 0.0F, 0.0F);
        var5.a(var4);
      } else {
        var5.a.b((new OPacket70Bed(0, 0)));
      }
    }

    // CanaryMod set player location and angle if a spawn location is defined
    if (spawnLocation != null) {
      var5.c(
          spawnLocation.getX(),
          spawnLocation.getY(),
          spawnLocation.getZ(),
          spawnLocation.getRotation(),
          spawnLocation.getPitch());
    }

    var6.G.c((int) var5.bm >> 4, (int) var5.bo >> 4);

    while (var6.a(var5, var5.bw).size()
        != 0) { // This is the checks for canSpawnHere  should we do something with this so players
      // don't end up on roofs?
      var5.c(var5.bm, var5.bn + 1.0D, var5.bo);
    }

    // respawn packet
    var5.a.b(
        (new OPacket9Respawn(
            var5.w, (byte) var5.bi.q, var5.bi.s().getWorldType(), var5.bi.y(), var5.c.a())));
    // teleport to spawn location
    var5.a.a(
        var5.bm,
        var5.bn,
        var5.bo,
        var5.bs,
        var5.bt,
        var5.w,
        var5.bi.getCanaryDimension().getName());
    // something
    this.a(var5, var6);
    var5.getDimension().getPlayerManager().addPlayer((Player) var5.getPlayer());
    var5.getDimension()
        .addPlayerToWorld(var5.getPlayer()); // This also calls the spawn method in world!
    this.b.add(var5);
    var5.x();
    var5.E();
    return var5;
  }
  public void a(boolean var1) {
    super.F_();

    for (int var2 = 0; var2 < this.k.c(); ++var2) {
      OItemStack var3 = this.k.g_(var2);
      if (var3 != null && OItem.d[var3.c].t_() && this.a.b() <= 2) {
        OPacket var4 = ((OItemMapBase) OItem.d[var3.c]).c(var3, this.bi, this);
        if (var4 != null) {
          this.a.b(var4);
        }
      }
    }

    if (var1 && !this.f.isEmpty()) {
      OChunkCoordIntPair var14 = (OChunkCoordIntPair) this.f.get(0);
      double var5 = var14.a(this);

      for (int var7 = 0; var7 < this.f.size(); ++var7) {
        OChunkCoordIntPair var8 = (OChunkCoordIntPair) this.f.get(var7);
        double var9 = var8.a(this);
        if (var9 < var5) {
          var14 = var8;
          var5 = var9;
        }
      }

      if (var14 != null) {
        boolean var17 = false;
        if (this.a.b() < 4) {
          var17 = true;
        }

        if (var17) {
          OWorldServer var18 = (OWorldServer) getDimension().getHandle(); // this.b.a(this.w);
          if (var18.i(var14.a << 4, 0, var14.b << 4)) {
            OChunk var11 = var18.d(var14.a, var14.b);
            if (var11.k) {
              this.f.remove(var14);
              this.a.b((new OPacket51MapChunk(var18.d(var14.a, var14.b), true, 0)));
              List var12 =
                  var18.c(var14.a * 16, 0, var14.b * 16, var14.a * 16 + 16, 256, var14.b * 16 + 16);

              for (int var13 = 0; var13 < var12.size(); ++var13) {
                this.a((OTileEntity) var12.get(var13));
              }
            }
          }
        }
      }
    }

    if (this.J) {
      if (this.m != this.l) {
        this.F();
      }

      if (this.bh != null) {
        this.b(this.bh);
      } else {
        this.K += 0.0125F;
        if (this.K >= 1.0F) {
          this.K = 1.0F;
          this.I = 10;
          boolean var15 = false;
          byte var16;
          if (this.w == -1) {
            var16 = 0;
          } else {
            var16 = -1;
          }
          Location location = getPlayer().getLocation();
          int currDim = getPlayer().getDimension().getType().getId();
          location.setDimensionId(currDim == 0 ? -1 : 0);
          CancelableHook hook =
              (CancelableHook)
                  Canary.hooks().callCancelableHook(new TeleportHook(getPlayer(), location, true));
          if (!hook.isCanceled()) {
            this.b.h.switchDimension(this, var16, true);
            this.ci = -1;
            this.cf = -1;
            this.cg = -1;
            this.a(OAchievementList.x);
          }
        }
      }

      this.J = false;
    } else {
      if (this.K > 0.0F) {
        this.K -= 0.05F;
      }

      if (this.K < 0.0F) {
        this.K = 0.0F;
      }
    }

    if (this.I > 0) {
      --this.I;
    }

    if (this.ap != this.cf) {
      // Check if health is enabled
      if (!Configuration.getWorldConfig(bi.getCanaryDimension().getName()).isHealthEnabled()) {
        ap = 20;
        az = false;
      } else {
        // Call hook
        // CancelableHook hook = Canary.hooks().callCancelableHook(new HealthChangeHook());
        // if(hook.isCancelled){
        //  ap = cf;
        // }
      }
    }

    if (this.aD() != this.cf
        || this.cg != this.foodStats.getFoodLevel()
        || this.foodStats.getFoodSaturationLevel() == 0.0F != this.ch) {
      this.a.b(
          (new OPacket8UpdateHealth(
              this.aD(), this.foodStats.getFoodLevel(), this.foodStats.getFoodSaturationLevel())));
      this.cf = this.aD();
      this.cg = this.foodStats.getFoodLevel();
      this.ch = this.foodStats.getFoodSaturationLevel() == 0.0F;
    }

    // CanaryMod start - Experience Update
    if (this.N != this.ci) {
      if (!Configuration.getWorldConfig(bi.getCanaryDimension().getName())
          .isExperienceEnabled()) { // CanaryMod - check if Experience is enabled
        N = 0;
        M = 0;
      } else { // Call hook
        CancelableHook hook =
            (CancelableHook)
                Canary.hooks().callCancelableHook(new ExperienceHook(canaryPlayer, ci, N));
        if (hook.isCanceled()) {
          N = ci;
        }
      }
    }

    if (this.N != this.ci) {
      this.ci = this.N;
      this.a.b((new OPacket43Experience(this.O, this.N, this.M)));
    }
  }