private void handlePower(
      boolean doEffects,
      DimensionStorage dimensionStorage,
      Map.Entry<Integer, DimensionDescriptor> entry,
      Integer id,
      DimensionInformation information) {
    int cost = 0;
    if (DimletConfiguration.dimensionDifficulty != -1) {
      cost = information.getActualRfCost();
      if (cost == 0) {
        cost = entry.getValue().getRfMaintainCost();
      }
    }

    int power = dimensionStorage.getEnergyLevel(id);
    power -= cost * MAXTICKS;
    if (power < 0) {
      power = 0;
    }

    handleLowPower(id, power, doEffects);
    if (doEffects && power > 0) {
      handleEffectsForDimension(power, id, information);
    }

    dimensionStorage.setEnergyLevel(id, power);
  }
  private void serverTick(boolean doEffects) {
    World entityWorld = MinecraftServer.getServer().getEntityWorld();
    RfToolsDimensionManager dimensionManager =
        RfToolsDimensionManager.getDimensionManager(entityWorld);

    if (!dimensionManager.getDimensions().isEmpty()) {
      DimensionStorage dimensionStorage = DimensionStorage.getDimensionStorage(entityWorld);

      for (Map.Entry<Integer, DimensionDescriptor> entry :
          dimensionManager.getDimensions().entrySet()) {
        Integer id = entry.getKey();
        // If there is an activity probe we only drain power if the dimension is loaded (a player is
        // there or a chunkloader)
        DimensionInformation information = dimensionManager.getDimensionInformation(id);
        WorldServer world = DimensionManager.getWorld(id);

        // Power handling.
        if (world != null || information.getProbeCounter() == 0) {
          handlePower(doEffects, dimensionStorage, entry, id, information);
        }

        // Special effect handling.
        if (world != null && !world.playerEntities.isEmpty()) {
          handleRandomEffects(world, information);
        }
      }

      dimensionStorage.save(entityWorld);
    }
  }