private static void stopAllOtherMiners(Player player, Rock rock)
 {
     foreach(Player p in Server.getPlayerList()) {
         if (p != null && player.getLocation().withinDistance(p.getLocation(), 5) && !p.Equals(player)) {
             if (p.getTemporaryAttribute("miningRock") != null) {
                 Rock otherPlayerRock = (Rock) p.getTemporaryAttribute("miningRock");
                 if (otherPlayerRock.getRockLocation().Equals(rock.getRockLocation())) {
                     p.setLastAnimation(new Animation(65535));
                 }
             }
         }
     }
 }
 public static void mineRock(Player p, ushort rockId, Location rockLocation, int i, bool newMine)
 {
     if (!newMine && p.getTemporaryAttribute("miningRock") == null) {
         return;
     }
     if (newMine) {
         if (!Server.getGlobalObjects().objectExists(rockId, rockLocation)) {
             //misc.WriteError(p.getUsername() + " tried to mine a non existing rock!");
             //return;
         }
         Rock newRock = new Rock(i, rockId, rockLocation, ORES[i], ROCK_LEVEL[i], NAME[i], ROCK_XP[i]);
         p.setTemporaryAttribute("miningRock", newRock);
     }
     Rock rockToMine = (Rock) p.getTemporaryAttribute("miningRock");
     bool essRock = rockToMine.getRockIndex() == 0;
     if (!canMine(p, rockToMine, null)) {
         resetMining(p);
         return;
     }
     if (newMine) {
         string s = essRock ? "You begin to mine Essence.." : "You swing your pick at the rock..";
         p.getPackets().sendMessage(s);
     }
     p.getPackets().closeInterfaces();
     p.setLastAnimation(new Animation(getPickaxeAnimation(p)));
     p.setFaceLocation(rockLocation);
     int delay = getMineTime(p, rockToMine.getRockIndex());
     Event mineRockEvent = new Event(delay);
     mineRockEvent.setAction(() => {
         mineRockEvent.stop(); // Stop the event no matter what
         if (p.getTemporaryAttribute("miningRock") == null) {
             return;
         }
         Rock rock = (Rock) p.getTemporaryAttribute("miningRock");
         if (!canMine(p, rockToMine, rock)) {
             return;
         }
         if (!essRock) {
             Server.getGlobalObjects().lowerHealth(rock.getRockId(), rock.getRockLocation());
             if (!Server.getGlobalObjects().originalObjectExists(rock.getRockId(), rock.getRockLocation())) {
                 resetMining(p);
                 stopAllOtherMiners(p, rock);
                 p.setLastAnimation(new Animation(65535));
                 mineRockEvent.stop();
             }
         }
         bool addGem = (!essRock && misc.random(getGemChance(p)) == 0) ? true : false;
         if (p.getInventory().addItem(addGem ? randomGem() : rock.getOre())) {
             p.getSkills().addXp(Skills.SKILL.MINING, rock.getXp());
             if (addGem) {
                 p.getPackets().sendMessage("You manage to mine a sparkling gem!");
             } else {
                 if (!essRock) {
                     p.getPackets().sendMessage("You manage to mine some " + rock.getName() + ".");
                 }
             }
         }
         if (rock.isContinueMine()) {
             mineRock(p, rock.getRockId(), rock.getRockLocation(), rock.getRockIndex(), false);
         }
     });
     Server.registerEvent(mineRockEvent);
     if (delay >= 9000 && !rockToMine.isContinueMine()) {
         Event mineMoreRockEvent = new Event(9000);
         mineMoreRockEvent.setAction(() => {
             mineMoreRockEvent.stop();
             Rock rock = (Rock) p.getTemporaryAttribute("miningRock");
             if (!canMine(p, rockToMine, rock)) {
                 return;
             }
             p.setFaceLocation(rock.getRockLocation());
             p.setLastAnimation(new Animation(getPickaxeAnimation(p)));
         });
         Server.registerEvent(mineMoreRockEvent);
     }
 }
 private static bool canMine(Player p, Rock rock, Rock rock2)
 {
     if (rock == null || p == null || !Server.getGlobalObjects().originalObjectExists(rock.getRockId(), rock.getRockLocation())) {
         return false;
     }
     if (rock.getRockIndex() != 0) {
         if (!p.getLocation().withinDistance(rock.getRockLocation(), 2)) {
             return false;
         }
     } else {
         // is rune ess rock
         if (!p.getLocation().inArea(rock.getRockLocation().getX()-1, rock.getRockLocation().getY()-1, rock.getRockLocation().getX()+5, rock.getRockLocation().getY()+5)) {
             return false;
         }
     }
     if (rock2 != null) {
         if (!rock.Equals(rock2)) {
             return false;
         }
     }
     if (p.getSkills().getGreaterLevel(Skills.SKILL.MINING) < rock.getLevel()) {
         p.getPackets().sendMessage("You need a Mining level of " + rock.getLevel() + " to mine that rock.");
         return false;
     }
     if (!hasPickaxe(p)) {
         p.getPackets().sendMessage("You need a pickaxe to mine a rock!");
         return false;
     }
     if (p.getInventory().findFreeSlot() == -1) {
         p.getPackets().sendChatboxInterface(210);
         p.getPackets().modifyText("Your inventory is too full to carry any ore.", 210, 1);
         return false;
     }
     return true;
 }