mirror of
https://gitlab.com/2009scape/2009scape.git
synced 2025-12-09 16:45:44 -07:00
Corrected rune essence mining behavior and speeds
Also corrected various mining messages across many rock types to be authentic
This commit is contained in:
parent
6241ff9ce5
commit
56986ad6bc
2 changed files with 64 additions and 23 deletions
|
|
@ -13,6 +13,9 @@ import core.game.world.GameWorld
|
|||
import core.game.world.repository.Repository
|
||||
import core.tools.colorize
|
||||
|
||||
// TODO: Shooting stars should roll for bonus gems while mining
|
||||
// See: https://youtu.be/6OqZ2TGc6fM?si=U8nB5IDQREhWXApD
|
||||
|
||||
/**
|
||||
* The pulse used to handle mining shooting stars.
|
||||
*/
|
||||
|
|
@ -130,7 +133,7 @@ class ShootingStarMiningPulse(player: Player?, node: Scenery?, val star: Shootin
|
|||
|
||||
override fun message(type: Int) {
|
||||
when (type) {
|
||||
0 -> player.packetDispatch.sendMessage("You swing your pickaxe at the rock...")
|
||||
0 -> player.packetDispatch.sendMessage("You swing your pickaxe at the rock.")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ class MiningListener : InteractionListener {
|
|||
private fun handleMining(player: Player, node: Node, state: Int) : Boolean {
|
||||
val resource = MiningNode.forId(node.id)
|
||||
val tool = SkillingTool.getPickaxe(player)
|
||||
val isEssence = resource.id == 2491
|
||||
val isEssence = resource == MiningNode.RUNE_ESSENCE
|
||||
val isGems = resource.identifier == MiningNode.GEM_ROCK_0.identifier
|
||||
|
||||
if (!finishedMoving(player))
|
||||
|
|
@ -50,13 +50,13 @@ class MiningListener : InteractionListener {
|
|||
return true
|
||||
}
|
||||
anim(player, tool)
|
||||
sendMessage(player, "You swing your pickaxe at the rock...")
|
||||
return delayScript(player, getDelay(resource))
|
||||
sendMessage(player, "You swing your pickaxe at the rock.")
|
||||
return delayScript(player, getDelay(resource, tool))
|
||||
}
|
||||
|
||||
anim(player, tool)
|
||||
if (!checkReward(player, resource, tool))
|
||||
return delayScript(player, getDelay(resource))
|
||||
return delayScript(player, getDelay(resource, tool))
|
||||
|
||||
// Reward logic
|
||||
var reward = resource!!.reward
|
||||
|
|
@ -94,13 +94,23 @@ class MiningListener : InteractionListener {
|
|||
if (reward == Items.GOLD_ORE_444 && inBorders(player, familyCrestGoldOreArea)) {
|
||||
reward = Items.PERFECT_GOLD_ORE_446
|
||||
}
|
||||
val rewardName = getItemName(reward).lowercase()
|
||||
|
||||
// Prepare reward name - gems stay lowercase without "Uncut", others are lowercase
|
||||
val rewardName = if (isGems) {
|
||||
getItemName(reward).replace("Uncut ", "").lowercase()
|
||||
} else {
|
||||
getItemName(reward).substringBefore(" (").lowercase().removeSuffix(" ore")
|
||||
}
|
||||
|
||||
// Send the message for the resource reward
|
||||
if (isGems) {
|
||||
sendMessage(player, "You get ${prependArticle(rewardName)}.")
|
||||
} else {
|
||||
sendMessage(player, "You get some ${rewardName.lowercase()}.")
|
||||
val withArticle = prependArticle(rewardName) // "an emerald" or "a red topaz"
|
||||
val parts = withArticle.split(" ", limit = 2) // ["an", "emerald"] or ["a", "red topaz"]
|
||||
val article = parts[0] // "an" or "a"
|
||||
val gemName = parts[1].replaceFirstChar { it.uppercase() } // "Emerald" or "Red topaz"
|
||||
sendMessage(player, "You just mined $article $gemName!")
|
||||
} else if (!isEssence) {
|
||||
sendMessage(player, "You manage to mine some ${rewardName}.")
|
||||
}
|
||||
|
||||
// Give the mining reward, increment 'rocks mined' attribute
|
||||
|
|
@ -124,7 +134,7 @@ class MiningListener : InteractionListener {
|
|||
}
|
||||
if (RandomFunction.roll(chance)) {
|
||||
val gem = GEM_REWARDS.random()
|
||||
sendMessage(player,"You find a ${gem.name}!")
|
||||
sendMessage(player,"You just found ${prependArticle(gem.name.replace("Uncut ", "").lowercase())}!")
|
||||
if (freeSlots(player) == 0) {
|
||||
sendMessage(player,"You do not have enough space in your inventory, so you drop the gem on the floor.")
|
||||
}
|
||||
|
|
@ -138,6 +148,14 @@ class MiningListener : InteractionListener {
|
|||
node.setActive(false)
|
||||
return true
|
||||
}
|
||||
|
||||
// For essence, check inventory and continue mining
|
||||
if (isEssence) {
|
||||
if (freeSlots(player) == 0) {
|
||||
return true
|
||||
}
|
||||
return delayScript(player, getDelay(resource, tool))
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
|
@ -189,6 +207,10 @@ class MiningListener : InteractionListener {
|
|||
}
|
||||
|
||||
private fun checkReward(player: Player, resource: MiningNode?, tool: SkillingTool): Boolean {
|
||||
// Essence mining always succeeds
|
||||
if (resource == MiningNode.RUNE_ESSENCE) {
|
||||
return true
|
||||
}
|
||||
val level = 1 + getDynLevel(player, Skills.MINING) + getFamiliarBoost(player, Skills.MINING)
|
||||
val hostRatio = Math.random() * (100.0 * resource!!.rate)
|
||||
var toolRatio = tool.ratio
|
||||
|
|
@ -199,8 +221,20 @@ class MiningListener : InteractionListener {
|
|||
return hostRatio < clientRatio
|
||||
}
|
||||
|
||||
fun getDelay(resource: MiningNode) : Int {
|
||||
return if (resource.id == 2491) 3 else 4
|
||||
fun getDelay(resource: MiningNode, tool: SkillingTool) : Int {
|
||||
if (resource == MiningNode.RUNE_ESSENCE) { // Essence mining - speed varies by pickaxe
|
||||
return when (tool) {
|
||||
SkillingTool.BRONZE_PICKAXE -> 7
|
||||
SkillingTool.IRON_PICKAXE -> 6
|
||||
SkillingTool.STEEL_PICKAXE -> 5
|
||||
SkillingTool.MITHRIL_PICKAXE -> 4
|
||||
SkillingTool.ADAMANT_PICKAXE -> 3
|
||||
SkillingTool.RUNE_PICKAXE -> 2
|
||||
SkillingTool.INFERNO_ADZE2 -> if (RandomFunction.random(2) == 0) 1 else 2 //https://www.youtube.com/watch?v=9XhjSdJ4qro
|
||||
else -> 4 // fallback
|
||||
}
|
||||
}
|
||||
return 4 // normal rocks
|
||||
}
|
||||
|
||||
fun anim(player: Player, tool: SkillingTool) {
|
||||
|
|
@ -222,6 +256,10 @@ class MiningListener : InteractionListener {
|
|||
sendDialogue(player,"Your inventory is too full to hold any more gems.")
|
||||
return false
|
||||
}
|
||||
if (resource == MiningNode.RUNE_ESSENCE) {
|
||||
sendDialogue(player,"Your inventory is too full to hold any more essence.")
|
||||
return false
|
||||
}
|
||||
sendDialogue(player,"Your inventory is too full to hold any more ${ItemDefinition.forId(resource!!.reward).name.lowercase()}.")
|
||||
return false
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue