Mining in RuneScape 3 (RS3) underwent a massive rework. Unlike the old system where success was random, the modern system uses a progress bar. Every swing of your pickaxe deals damage to the rock. Once the rock's "HP" (Hardness) reaches zero, you receive an ore and full XP.
Key Mechanics:
Damage per Swing: This is determined by your Mining level, your Strength level, and the tier of pickaxe you are using. High-tier pickaxes deal significantly more damage per tick.
Rock Hardness: Each tier of ore has a specific durability. Higher-tier ores like Animica require much more damage to "deplete" than Copper.
Stamina: Your character's stamina drops over time. If it reaches zero, your damage per swing is greatly reduced. This calculator assumes high stamina for maximum efficiency.
Mining Level XP Table
Level
XP Required
Unlock Highlights
1
0
Copper, Tin, Bronze Pickaxe
10
1,154
Iron, Steel Pickaxe
50
101,333
Runite, Rune Pickaxe
90
5,346,332
Animica, Elder Rune Pickaxe
99
13,034,431
Skillcape, Earth and Song Pickaxe
Efficiency Tips for RS3 Mining
To maximize your XP per hour while using this calculator, consider the following buffs:
Powerburst of Opportunity: Doubling your progress for a short duration.
Stone Spirits: These do not provide extra XP, but they double your ore output, making Mining much more profitable.
Perfect Juju Mining Potions: Provides a 10% chance to instantly finish a rock progress bar.
Lava Titan: An invisible +10 Mining level boost that increases your damage per swing.
function calculateMiningXP() {
var xpTable = [
0, 83, 174, 276, 388, 512, 650, 801, 969, 1154, 1358, 1584, 1833, 2107, 2411, 2746, 3115, 3523, 3973, 4470,
5018, 5624, 6291, 7028, 7842, 8740, 9730, 10824, 12031, 13363, 14833, 16456, 18247, 20224, 22406, 24815, 27473, 30408, 33648, 37224,
41171, 45529, 50339, 55649, 61512, 67983, 75127, 83014, 91721, 101333, 111945, 123660, 136594, 150872, 166636, 184040, 203254, 224466, 247886, 273742,
302288, 333804, 368599, 407015, 449428, 496254, 547953, 605032, 668051, 737627, 814445, 899257, 992895, 1096278, 1210421, 1336443, 1475581, 1629200, 1798808, 1986068,
2192818, 2421087, 2673114, 2951373, 3258594, 3597792, 3972294, 4385776, 4842295, 5346332, 5902831, 6517253, 7195629, 7944614, 8771558, 9684577, 10692629, 11805606, 13034431
];
var currentXP = parseFloat(document.getElementById('currentXP').value) || 0;
var targetLvl = parseInt(document.getElementById('targetLevel').value) || 1;
var miningLvl = parseInt(document.getElementById('miningLevel').value) || 1;
var strengthLvl = parseInt(document.getElementById('strengthLevel').value) || 1;
var rockData = document.getElementById('rockType').value.split('|');
var oreXP = parseFloat(rockData[0]);
var rockHP = parseFloat(rockData[1]);
var pickaxeDmg = parseFloat(document.getElementById('pickaxeType').value);
// Get Target XP
var targetXP = 0;
if (targetLvl > 99) {
targetXP = 13034431; // Simplification for 99+
} else if (targetLvl < 1) {
targetXP = 0;
} else {
targetXP = xpTable[targetLvl – 1];
}
var xpNeeded = targetXP – currentXP;
if (xpNeeded <= 0) {
alert("Target XP reached!");
return;
}
// RS3 Mining Damage Math (Simplified for Calc)
// Avg Damage = (Mining Level + (Strength Level / 10)) + Pickaxe Tier Base
var damagePerSwing = (miningLvl + (strengthLvl / 10)) + pickaxeDmg;
// XP per swing is roughly 10% of total ore XP distributed over progress (Simplified)
// In reality, you get small XP per swing and large XP on completion.
var oresNeeded = Math.ceil(xpNeeded / oreXP);
var swingsPerOre = Math.ceil(rockHP / damagePerSwing);
var totalSwings = oresNeeded * swingsPerOre;
// Time: 1 swing per 0.6 seconds (1 tick)
var totalSeconds = totalSwings * 0.6;
var hours = Math.floor(totalSeconds / 3600);
var minutes = Math.floor((totalSeconds % 3600) / 60);
// Display Results
document.getElementById('resXPNeeded').innerText = Math.round(xpNeeded).toLocaleString();
document.getElementById('resOres').innerText = oresNeeded.toLocaleString();
document.getElementById('resSwings').innerText = totalSwings.toLocaleString();
document.getElementById('resTime').innerText = hours + "h " + minutes + "m";
document.getElementById('mining-results').style.display = 'block';
}