public void saveSettings() {
   amcConfig.set("radio-format", amcTools.formatSaveFix(varMsgFormat));
   amcConfig.set("broadcast-format", amcTools.formatSaveFix(varBCsatMsgFormat));
   amcConfig.set("radio-suffix", varRadioFreqSuffix);
   amcConfig.set("chat-distance", varPlayerMaxChatDist);
   amcConfig.set("radio-distance", varRadioMaxChatDist);
   amcConfig.set("manage-local", varManagePlayerChat);
   amcConfig.set("chat-limited", varLimitPlayerChat);
   amcConfig.set("radio-limited", varLimitRadioChat);
   amcConfig.set("enable-skywave", varSkyWaveEnabled);
   amcConfig.set("skywave-mod", varRadioSkyWaveMod);
   amcConfig.set("radio-min", varRadioMinFreq);
   amcConfig.set("radio-max", varRadioMaxFreq);
   amcConfig.set("radio-cutoff-max", varRadioMaxCuttoff);
   amcConfig.set("radio-code-max", varRadioMaxCode);
   amcConfig.set("radio-default-channel", varRadioDefFreq);
   amcConfig.set("radio-auto-on", varRadioAutoOn);
   amcConfig.set("radio-item-id", varHeldItemID);
   amcConfig.set("radio-item-required", varHeldItemReq);
   amcConfig.set("antenna-range-mod", varFixedRadioRangeMod);
   amcConfig.set("antenna-user-mod-iron", varFixedRadioUserModI);
   amcConfig.set("antenna-user-mod-gold", varFixedRadioUserModG);
   amcConfig.set("antenna-user-mod-diamond", varFixedRadioUserModD);
   amcConfig.set("antenna-tick-rate", varScheduleTickRate);
   amcConfig.set("antenna-max-height", varRadioMaxHeight);
   amcConfig.set("save-interval", varScheduleSaveRate);
   amcConfig.set("waypoint-update", varUpdateWaypointOnLink);
   this.saveConfig();
 }
 public void togglePlayerFilter(Player player) {
   if (playerRadioFilter.get(player)) {
     playerRadioFilter.put(player, false);
     amcTools.msgToPlayer(player, "[Filter]:", " OFF");
   } else {
     playerRadioFilter.put(player, true);
     amcTools.msgToPlayer(player, "[Filter]:", " ON");
   }
 }
 public void togglePlayerMic(Player player) {
   if (playerRadioMic.get(player)) {
     playerRadioMic.put(player, false);
     amcTools.msgToPlayer(player, "[Mic]:", " OFF");
   } else {
     playerRadioMic.put(player, true);
     amcTools.msgToPlayer(player, "[Mic]:", " ON");
   }
 }
 public void togglePlayerRadio(Player player) {
   if (playerRadioOn.contains(player.getDisplayName())) {
     playerRadioOn.remove(player.getDisplayName());
     amcTools.msgToPlayer(player, "[Radio]:", " OFF");
   } else {
     playerRadioOn.add(player.getDisplayName());
     amcTools.msgToPlayer(player, "[Radio]:", " ON");
   }
 }
 public void playerRadioPing(Player sender, Player player) {
   // This works pretty simple, we use the message format to show our information
   String senderInfo =
       "Frequency:"
           + getPlayerRadioChannel(player)
           + this.varRadioFreqSuffix
           + " Code:"
           + getPlayerRadioCode(player);
   String pingMessage =
       "*PING*" + amcTools.createMessage(player, ChatColor.YELLOW + senderInfo + "*PING*");
   amcTools.msgToPlayer(player, pingMessage);
   if (canPing(sender, player)) {
     amcTools.msgToPlayer(sender, pingMessage);
   }
 }
  public boolean canReceive(AMChatRadio radio, Player player) {
    if (player.hasPermission("amchat.radio.hearall") || player.isOp()) {
      return true;
    }
    if (!isRadioOn(player)) { // The player doesn't even have his radio on		
      return false;
    }

    if (!radio.getLoc().getWorld().equals(player.getWorld())) { // we can't talk to the other side.
      return false;
    }

    if (radio.getChan() < (playerRadioChannel.get(player) - playerRadioCutoff.get(player))) {
      // Radio chat is below cutoff limit
      return false;
    } else if (radio.getChan() > (playerRadioChannel.get(player) + playerRadioCutoff.get(player))) {
      // Radio channel is above the cutoff limit
      return false;
    }
    if ((!playerRadioChannel.get(player).equals(radio.getChan()))
        && (!playerRadioCode.get(player).equals(radio.getCode()))
        && (playerRadioFilter.get(player))) {
      // message is encrypted and we don't want to hear that.
      return false;
    }
    if (varLimitRadioChat) {
      if (!radio.isAdmin()
          && (amcTools.getDistance(radio.getLoc(), player.getLocation())
              > radio.getMaxDistance())) {
        return false;
      }
    }
    return true;
  }
 public void scanPlayerRadioChannel(Player player, boolean varDirection) {
   if (isPlayerLinked(player)) {
     amcTools.msgToPlayer(player, "Scanning disabled while linked to a fixed radio!");
   } else {
     int playerOnThisChan = varRadioMinFreq;
     if (playerRadioChannel.containsKey(player)) {
       int currentChan = playerRadioChannel.get(player);
       int scanValue = playerRadioCutoff.get(player);
       // SCAN UP
       if (varDirection) {
         playerOnThisChan = currentChan + scanValue;
         if (playerOnThisChan > varRadioMaxFreq) {
           playerOnThisChan = varRadioMinFreq + (playerOnThisChan - varRadioMaxFreq);
         }
         // SCAN DOWN
       } else {
         playerOnThisChan = currentChan - scanValue;
         if (playerOnThisChan < varRadioMinFreq) {
           playerOnThisChan = varRadioMaxFreq - (playerOnThisChan + varRadioMinFreq);
         }
       }
     } else {
       playerRadioChannel.put(player, varRadioDefFreq);
       playerOnThisChan = varRadioDefFreq;
     }
     tunePlayerRadioChannel(player, playerOnThisChan);
   }
 }
 public void setPlayerRadioCode(Player player, Integer value) {
   if (value < 0) {
     value = 0;
   }
   playerRadioCode.put(player, value);
   amcTools.msgToPlayer(player, "[Code]:", " " + value);
 }
 // Set Players Radio link id, if the give id is blank its set to none
 public void setPlayerLinkID(Player player, String linkID) {
   if (linkID.isEmpty()) {
     linkID = "none";
   }
   amcTools.msgToPlayer(player, "[Link]: ", linkID);
   this.playerRadioLinkID.put(player, linkID);
 }
 public boolean canPing(Player sender, Player player) {
   if (varLimitRadioChat) {
     if (amcTools.getDistance(sender.getLocation(), player.getLocation()) > varRadioMaxChatDist) {
       return false;
     }
   }
   return true;
 }
 public void setPlayerRadioCutoff(Player player, Integer value) {
   if (value < 0) {
     value = 0;
   }
   playerRadioCutoff.put(player, value);
   amcTools.msgToPlayer(player, "[Cutoff]:", " " + value);
   ;
 }
  // Instead of slamming the main object with compares we do all that stuff here
  public boolean canReceive(Player sender, Player player) {
    if (sender.equals(player)) {
      return true;
    }
    // If the player receiving the message is a op or has the below permission they can hear
    // everything.
    if (player.hasPermission("amchat.radio.hearall") || player.isOp()) {
      return true;
    }

    if (!isRadioOn(player)) { // The player doesn't even have his radio on		
      return false;
    }

    if (!sender.getWorld().equals(player.getWorld())) { // we can't talk to the other side.
      return false;
    }

    if (playerRadioChannel.get(sender)
        < (playerRadioChannel.get(player) - playerRadioCutoff.get(player))) {
      // Radio chat is below cutoff limit
      return false;
    } else if (playerRadioChannel.get(sender)
        > (playerRadioChannel.get(player) + playerRadioCutoff.get(player))) {
      // Radio channel is above the cutoff limit
      return false;
    }
    // TODO:Change this comparison, This might cause issues on certain channel/code combinations
    if ((playerRadioChannel.get(sender) != playerRadioChannel.get(player))
        && (playerRadioCode.get(sender) != playerRadioCode.get(player))
        && (playerRadioFilter.get(player))) {
      // message is encrypted and we don't want to hear that.
      return false;
    }
    if (varLimitRadioChat) {
      if (amcTools.getDistance(sender.getLocation(), player.getLocation()) > varRadioMaxChatDist) {
        // Radio chat is limited and they are too far
        return false;
      }
    }
    return true;
  }
  public boolean canLink(AMChatRadio radio, Player player) {
    if (player.hasPermission("amchat.radio.override.link") || player.isOp()) {
      return true;
    }
    if (!isRadioOn(player)) { // The player doesn't even have his radio on		
      return false;
    }

    if (!radio.getLoc().getWorld().equals(player.getWorld())) { // we can't talk to the other side.
      return false;
    }
    if (varLimitRadioChat) {
      if (!radio.isAdmin()
          && (amcTools.getDistance(radio.getLoc(), player.getLocation())
              > radio.getMaxDistance())) {
        return false;
      }
    }
    return true;
  }
 public void tunePlayerRadioChannel(Player player, Integer value) {
   playerRadioChannel.put(player, value);
   amcTools.msgToPlayer(player, "[Freq]:", " " + value);
 }