From d81803f93834c17ad1d8a5f840dc05ac8641df56 Mon Sep 17 00:00:00 2001 From: Avi Weinstock Date: Mon, 3 Jan 2022 19:24:30 +0000 Subject: [PATCH] Prevent furnace temperature from going negative and deduplicate bar handling. --- CHANGELOG | 1 + .../activity/blastfurnace/BlastFurnace.kt | 137 ++++------- .../blastfurnace/BlastFurnaceListeners.kt | 212 +++--------------- 3 files changed, 83 insertions(+), 267 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 338d0d447..cf5aeb0f5 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -97,3 +97,4 @@ - Can now pickpocket women in ardy (npc ID 25) - Can now travel on free charter boats without having money in inventory - Emerald and diamond bracelet enchants no longer produce noted items +- Prevent furnace temperature from going negative and deduplicate bar handling. diff --git a/Server/src/main/kotlin/rs09/game/content/activity/blastfurnace/BlastFurnace.kt b/Server/src/main/kotlin/rs09/game/content/activity/blastfurnace/BlastFurnace.kt index ca9fed7d6..ee91fb146 100644 --- a/Server/src/main/kotlin/rs09/game/content/activity/blastfurnace/BlastFurnace.kt +++ b/Server/src/main/kotlin/rs09/game/content/activity/blastfurnace/BlastFurnace.kt @@ -5,6 +5,7 @@ import core.game.container.impl.EquipmentContainer import core.game.node.entity.player.Player import core.game.node.entity.skill.Skills import core.game.node.item.Item +import core.game.node.entity.skill.smithing.smelting.Bar import core.game.system.task.Pulse import core.game.world.map.Location import core.tools.RandomFunction @@ -125,8 +126,8 @@ object BlastFurnace { furnaceTemp += 2 } else if (stoveTemp > 0 && pumping && furnaceTemp < 100 && (!pumpPipeBroken || !pumpPipeBroken)) { furnaceTemp += 1 - } else if (furnaceTemp > 0 && getWorldTicks() % 2 == 0) { - furnaceTemp -= 2 + } else if (furnaceTemp > 0) { + furnaceTemp -= 1 } } @@ -148,96 +149,50 @@ object BlastFurnace { }else if (makeBars && playerOre.isNotEmpty() && barsAmountFree > 0 && totalAmount < 56 && player.getAttribute("OreInPot",false) == true) { playerOre.forEach { oreID -> playerCoal = player.blastCoal.getAmount(Items.COAL_453) - if (oreID.id == Items.RUNITE_ORE_451 && player.blastOre.getAmount(451) * 4 <= playerCoal) { - player.varpManager.get(543).setVarbit(8, 1).send(player) - barsHot = true - player.blastBars.add(Item(Items.RUNITE_BAR_2363, 1)) - player.blastOre.remove(Item(Items.RUNITE_ORE_451, 1)) - rewardXP(player, Skills.SMITHING,50.0) - player.blastCoal.remove(Item(453, 4)) - totalAmount = barsAmount + oreAmount - giveSmithXp++ + var bars = arrayOf(Bar.forOre(oreID.id)!!) + if(oreID.id == Items.IRON_ORE_440) { + bars = arrayOf(Bar.STEEL, Bar.IRON) } - else if (oreID.id == Items.ADAMANTITE_ORE_449 && player.blastOre.getAmount(449) * 3 <= playerCoal) { - player.varpManager.get(543).setVarbit(8, 1).send(player) - barsHot = true - player.blastBars.add(Item(Items.ADAMANTITE_BAR_2361, 1)) - player.blastOre.remove(Item(Items.ADAMANTITE_ORE_449, 1)) - rewardXP(player, Skills.SMITHING,37.5) - player.blastCoal.remove(Item(453, 3)) - totalAmount = barsAmount + oreAmount - giveSmithXp++ - } - else if (oreID.id == Items.MITHRIL_ORE_447 && player.blastOre.getAmount(447) * 2 <= playerCoal) { - player.varpManager.get(543).setVarbit(8, 1).send(player) - barsHot = true - player.blastBars.add(Item(Items.MITHRIL_BAR_2359, 1)) - player.blastOre.remove(Item(Items.MITHRIL_ORE_447, 1)) - rewardXP(player, Skills.SMITHING,30.0) - player.blastCoal.remove(Item(453, 2)) - totalAmount = barsAmount + oreAmount - giveSmithXp++ - } - else if (oreID.id == Items.IRON_ORE_440 && player.blastOre.getAmount(447) <= playerCoal) { - player.varpManager.get(543).setVarbit(8, 1).send(player) - barsHot = true - player.blastBars.add(Item(Items.STEEL_BAR_2353, 1)) - player.blastOre.remove(Item(Items.MITHRIL_ORE_447, 1)) - rewardXP(player, Skills.SMITHING,17.5) - player.blastCoal.remove(Item(453, 1)) - totalAmount = barsAmount + oreAmount - giveSmithXp++ - } - else if (oreID.id == Items.IRON_ORE_440) { - player.varpManager.get(543).setVarbit(8, 1).send(player) - barsHot = true - player.blastBars.add(Item(Items.IRON_BAR_2351, 1)) - player.blastOre.remove(Item(Items.IRON_ORE_440, 1)) - rewardXP(player, Skills.SMITHING,12.5) - totalAmount = barsAmount + oreAmount - giveSmithXp++ - } - else if (oreID.id == Items.SILVER_ORE_442) { - player.varpManager.get(543).setVarbit(8, 1).send(player) - barsHot = true - player.blastBars.add(Item(Items.SILVER_BAR_2355, 1)) - rewardXP(player, Skills.SMITHING,13.6) - player.blastOre.remove(Item(Items.SILVER_ORE_442, 1)) - totalAmount = barsAmount + oreAmount - giveSmithXp++ - } - else if (oreID.id == Items.GOLD_ORE_444) { - player.varpManager.get(543).setVarbit(8, 1).send(player) - barsHot = true - player.blastBars.add(Item(Items.GOLD_BAR_2357, 1)) - if((player.equipment[EquipmentContainer.SLOT_HANDS] != null && player.equipment[EquipmentContainer.SLOT_HANDS].id == GOLDSMITH_GAUNTLETS_776)){ - rewardXP(player, Skills.SMITHING,56.2) - }else{ - rewardXP(player, Skills.SMITHING,22.5) + inner@ for(bar in bars) { + var hasRequirements = true + for(required in bar.ores) { + if(required.id == Items.COAL_453) { + if(!player.blastCoal.contains(Items.COAL_453, required.amount / 2)) { + hasRequirements = false + } + } else if(!player.blastOre.containsItem(required)) { + hasRequirements = false + } + } + if(hasRequirements) { + var removed = true + for(required in bar.ores) { + if(required.id == Items.COAL_453) { + if(!player.blastCoal.remove(Item(Items.COAL_453, required.amount / 2))) { + removed = false + } + } else { + if(!player.blastOre.remove(required)) { + removed = false + } + } + } + if(removed) { + player.varpManager.get(543).setVarbit(8, 1).send(player) + barsHot = true + player.blastBars.add(bar.product) + var experience = bar.experience + if(bar.product.id == Items.GOLD_BAR_2357 && + player.equipment[EquipmentContainer.SLOT_HANDS] != null && + player.equipment[EquipmentContainer.SLOT_HANDS].id == GOLDSMITH_GAUNTLETS_776) { + experience *= 2.5; + } + rewardXP(player, Skills.SMITHING, experience) + totalAmount = barsAmount + oreAmount + giveSmithXp++ + break@inner + } } - player.blastOre.remove(Item(Items.GOLD_ORE_444, 1)) - totalAmount = barsAmount + oreAmount - giveSmithXp++ - } - else if (oreID.id == Items.COPPER_ORE_436 && player.blastOre.containsAtLeastOneItem(438)) { - player.varpManager.get(543).setVarbit(8, 1).send(player) - barsHot = true - player.blastOre.remove(Item(Items.TIN_ORE_438, 1)) - player.blastOre.remove(Item(Items.COPPER_ORE_436, 1)) - player.blastBars.add(Item(Items.BRONZE_BAR_2349, 1)) - rewardXP(player, Skills.SMITHING,6.2) - totalAmount = barsAmount + oreAmount - giveSmithXp++ - } - else if(oreID.id == Items.TIN_ORE_438 && player.blastOre.containsAtLeastOneItem(436)){ - player.varpManager.get(543).setVarbit(8, 1).send(player) - barsHot = true - player.blastOre.remove(Item(Items.COPPER_ORE_436, 1)) - player.blastOre.remove(Item(Items.TIN_ORE_438, 1)) - player.blastBars.add(Item(Items.BRONZE_BAR_2349, 1)) - rewardXP(player, Skills.SMITHING,6.2) - totalAmount = barsAmount + oreAmount - giveSmithXp++ } } } @@ -402,4 +357,4 @@ object BlastFurnace { } } } -} \ No newline at end of file +} diff --git a/Server/src/main/kotlin/rs09/game/content/activity/blastfurnace/BlastFurnaceListeners.kt b/Server/src/main/kotlin/rs09/game/content/activity/blastfurnace/BlastFurnaceListeners.kt index 059a037a2..059cad2dd 100644 --- a/Server/src/main/kotlin/rs09/game/content/activity/blastfurnace/BlastFurnaceListeners.kt +++ b/Server/src/main/kotlin/rs09/game/content/activity/blastfurnace/BlastFurnaceListeners.kt @@ -4,6 +4,7 @@ import api.Container import api.* import core.game.node.entity.skill.Skills import core.game.node.item.Item +import core.game.node.entity.skill.smithing.smelting.Bar import core.game.system.task.Pulse import rs09.game.interaction.InteractionListener import core.game.world.map.Location @@ -195,100 +196,27 @@ class BlastFurnaceListeners : InteractionListener() { oreToActuallyAdd-- } } - when(oreID){ - Items.COAL_453 -> { - if (coalToActuallyAdd > 0 && getStatLevel(player, Skills.SMITHING) >= 30) { - player.blastCoal.add(Item(Items.COAL_453,coalToActuallyAdd)) - removeItem(player, Item(oreID, coalToActuallyAdd), Container.INVENTORY) - BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreID)],coalToActuallyAdd).init() - } - else if(getStatLevel(player, Skills.SMITHING) < 30){ - sendDialogue(player, "My Smithing level is not high enough to use Coal!") - } - else sendDialogue(player, "It looks like the melting pot is already full of coal!") + val bar = Bar.forOre(oreID) + if(oreID == Items.COAL_453) { + if (coalToActuallyAdd > 0 && getStatLevel(player, Skills.SMITHING) >= 30) { + player.blastCoal.add(Item(Items.COAL_453,coalToActuallyAdd)) + removeItem(player, Item(oreID, coalToActuallyAdd), Container.INVENTORY) + BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreID)],coalToActuallyAdd).init() } - Items.RUNITE_ORE_451 -> { - if (oreToActuallyAdd > 0 && getStatLevel(player, Skills.SMITHING) >= 85) { - player.blastOre.add(Item(oreID,oreToActuallyAdd)) - removeItem(player, Item(oreID, oreToActuallyAdd), Container.INVENTORY) - BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreID)],oreToActuallyAdd).init() - } - else if(getStatLevel(player, Skills.SMITHING) < 85){ - sendDialogue(player, "My Smithing level is not high enough to smelt Runite!") - } - else sendDialogue(player, "It looks like the melting pot is already full of ore!") + else if(getStatLevel(player, Skills.SMITHING) < 30){ + sendDialogue(player, "My Smithing level is not high enough to use Coal!") } - Items.ADAMANTITE_ORE_449 -> { - if (oreToActuallyAdd > 0 && getStatLevel(player, Skills.SMITHING) >= 70) { - player.blastOre.add(Item(oreID,oreToActuallyAdd)) - removeItem(player, Item(oreID, oreToActuallyAdd), Container.INVENTORY) - BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreID)],oreToActuallyAdd).init() - } - else if(getStatLevel(player, Skills.SMITHING) < 70){ - sendDialogue(player, "My Smithing level is not high enough to smelt Adamantite!") - } - else sendDialogue(player, "It looks like the melting pot is already full of ore!") + else sendDialogue(player, "It looks like the melting pot is already full of coal!") + } else if (bar != null) { + if (oreToActuallyAdd > 0 && getStatLevel(player, Skills.SMITHING) >= bar.level) { + player.blastOre.add(Item(oreID,oreToActuallyAdd)) + removeItem(player, Item(oreID, oreToActuallyAdd), Container.INVENTORY) + BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreID)],oreToActuallyAdd).init() } - Items.MITHRIL_ORE_447 -> { - if (oreToActuallyAdd > 0 && getStatLevel(player, Skills.SMITHING) >= 50) { - player.blastOre.add(Item(oreID,oreToActuallyAdd)) - removeItem(player, Item(oreID, oreToActuallyAdd), Container.INVENTORY) - BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreID)],oreToActuallyAdd).init() - } - else if(getStatLevel(player, Skills.SMITHING) < 50){ - sendDialogue(player, "My Smithing level is not high enough to smelt Mithril!") - } - else sendDialogue(player, "It looks like the melting pot is already full of ore!") - } - Items.IRON_ORE_440 -> { - if (oreToActuallyAdd > 0 && getStatLevel(player, Skills.SMITHING) >= 15) { - player.blastOre.add(Item(oreID,oreToActuallyAdd)) - removeItem(player, Item(oreID, oreToActuallyAdd), Container.INVENTORY) - BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreID)],oreToActuallyAdd).init() - } - else if(getStatLevel(player, Skills.SMITHING) < 15){ - sendDialogue(player, "My Smithing level is not high enough to smelt Iron!") - } - else sendDialogue(player, "It looks like the melting pot is already full of ore!") - } - Items.SILVER_ORE_442 -> { - if (oreToActuallyAdd > 0 && getStatLevel(player, Skills.SMITHING) >= 20) { - player.blastOre.add(Item(oreID,oreToActuallyAdd)) - removeItem(player, Item(oreID, oreToActuallyAdd), Container.INVENTORY) - BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreID)],oreToActuallyAdd).init() - } - else if(getStatLevel(player, Skills.SMITHING) < 20){ - sendDialogue(player, "My Smithing level is not high enough to smelt Silver!") - } - else sendDialogue(player, "It looks like the melting pot is already full of ore!") - } - Items.GOLD_ORE_444 -> { - if (oreToActuallyAdd > 0 && getStatLevel(player, Skills.SMITHING) >= 40) { - player.blastOre.add(Item(oreID,oreToActuallyAdd)) - removeItem(player, Item(oreID, oreToActuallyAdd), Container.INVENTORY) - BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreID)],oreToActuallyAdd).init() - } - else if(getStatLevel(player, Skills.SMITHING) < 40){ - sendDialogue(player, "My Smithing level is not high enough to smelt Gold!") - } - else sendDialogue(player, "It looks like the melting pot is already full of ore!") - } - Items.COPPER_ORE_436 -> { - if (oreToActuallyAdd > 0) { - player.blastOre.add(Item(oreID,oreToActuallyAdd)) - removeItem(player, Item(oreID, oreToActuallyAdd), Container.INVENTORY) - BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreID)],oreToActuallyAdd).init() - } - else sendDialogue(player, "It looks like the melting pot is already full of ore!") - } - Items.TIN_ORE_438 -> { - if (oreToActuallyAdd > 0) { - player.blastOre.add(Item(oreID,oreToActuallyAdd)) - removeItem(player, Item(oreID, oreToActuallyAdd), Container.INVENTORY) - BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreID)],oreToActuallyAdd).init() - } - else sendDialogue(player, "It looks like the melting pot is already full of ore!") + else if(getStatLevel(player, Skills.SMITHING) < bar.level){ + sendDialogue(player, "My Smithing level is not high enough to smelt ${bar.name.toLowerCase()}!") } + else sendDialogue(player, "It looks like the melting pot is already full of ore!") } } }else if (button == 2 && rocksInInven.isEmpty()){ @@ -329,93 +257,25 @@ class BlastFurnaceListeners : InteractionListener() { amountToAdd-- } } - when(oreType.id){ - Items.TIN_ORE_438 ->{ - if (amountToAdd > 0) { - player.blastOre.add(Item(oreType.id,amountToAdd)) - removeItem(player, Item(oreType.id, amountToAdd), Container.INVENTORY) - BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreType.id)],amountToAdd).init() - } - else sendDialogue(player, "It looks like the melting pot is already full of ore!") + val bar = Bar.forOre(oreType.id) + if(oreType.id == Items.COAL_453) { + if (amountToAdd > 0 && getStatLevel(player, Skills.SMITHING) >= 30) { + player.blastCoal.add(Item(oreType.id,amountToAdd)) + removeItem(player, Item(oreType.id, amountToAdd), Container.INVENTORY) + BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreType.id)],amountToAdd).init() + }else if(getStatLevel(player,Skills.SMITHING) < 30){ + sendDialogue(player,"My Smithing level is not high enough to use Coal!") } - Items.COPPER_ORE_436 ->{ - if (amountToAdd > 0) { - player.blastOre.add(Item(oreType.id,amountToAdd)) - removeItem(player, Item(oreType.id, amountToAdd), Container.INVENTORY) - BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreType.id)],amountToAdd).init() - } - else sendDialogue(player, "It looks like the melting pot is already full of ore!") - } - Items.IRON_ORE_440 ->{ - if (amountToAdd > 0 && getStatLevel(player, Skills.SMITHING) >= 15) { - player.blastOre.add(Item(oreType.id,amountToAdd)) - removeItem(player, Item(oreType.id, amountToAdd), Container.INVENTORY) - BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreType.id)],amountToAdd).init() - }else if(getStatLevel(player,Skills.SMITHING) < 15){ - sendDialogue(player,"My Smithing level is not high enough to smelt Iron!") - } - else sendDialogue(player, "It looks like the melting pot is already full of ore!") - } - Items.MITHRIL_ORE_447 ->{ - if (amountToAdd > 0 && getStatLevel(player, Skills.SMITHING) >= 50) { - player.blastOre.add(Item(oreType.id,amountToAdd)) - removeItem(player, Item(oreType.id, amountToAdd), Container.INVENTORY) - BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreType.id)],amountToAdd).init() - }else if(getStatLevel(player,Skills.SMITHING) < 50){ - sendDialogue(player,"My Smithing level is not high enough to smelt Mithril!") - } - else sendDialogue(player, "It looks like the melting pot is already full of ore!") - } - Items.GOLD_ORE_444 ->{ - if (amountToAdd > 0 && getStatLevel(player, Skills.SMITHING) >= 40) { - player.blastOre.add(Item(oreType.id,amountToAdd)) - removeItem(player, Item(oreType.id, amountToAdd), Container.INVENTORY) - BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreType.id)],amountToAdd).init() - }else if(getStatLevel(player,Skills.SMITHING) < 40){ - sendDialogue(player,"My Smithing level is not high enough to smelt Gold!") - } - else sendDialogue(player, "It looks like the melting pot is already full of ore!") - } - Items.SILVER_ORE_442 ->{ - if (amountToAdd > 0 && getStatLevel(player, Skills.SMITHING) >= 20) { - player.blastOre.add(Item(oreType.id,amountToAdd)) - removeItem(player, Item(oreType.id, amountToAdd), Container.INVENTORY) - BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreType.id)],amountToAdd).init() - }else if(getStatLevel(player,Skills.SMITHING) < 20){ - sendDialogue(player,"My Smithing level is not high enough to smelt Silver!") - } - else sendDialogue(player, "It looks like the melting pot is already full of ore!") - } - Items.ADAMANTITE_ORE_449 ->{ - if (amountToAdd > 0 && getStatLevel(player, Skills.SMITHING) >= 70) { - player.blastOre.add(Item(oreType.id,amountToAdd)) - removeItem(player, Item(oreType.id, amountToAdd), Container.INVENTORY) - BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreType.id)],amountToAdd).init() - }else if(getStatLevel(player,Skills.SMITHING) < 70){ - sendDialogue(player,"My Smithing level is not high enough to smelt Adamantite!") - } - else sendDialogue(player, "It looks like the melting pot is already full of ore!") - } - Items.RUNITE_ORE_451 ->{ - if (amountToAdd > 0 && getStatLevel(player, Skills.SMITHING) >= 85) { - player.blastOre.add(Item(oreType.id,amountToAdd)) - removeItem(player, Item(oreType.id, amountToAdd), Container.INVENTORY) - BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreType.id)],amountToAdd).init() - }else if(getStatLevel(player,Skills.SMITHING) < 85){ - sendDialogue(player,"My Smithing level is not high enough to smelt Runite!") - } - else sendDialogue(player, "It looks like the melting pot is already full of ore!") - } - Items.COAL_453 ->{ - if (amountToAdd > 0 && getStatLevel(player, Skills.SMITHING) >= 30) { - player.blastOre.add(Item(oreType.id,amountToAdd)) - removeItem(player, Item(oreType.id, amountToAdd), Container.INVENTORY) - BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreType.id)],amountToAdd).init() - }else if(getStatLevel(player,Skills.SMITHING) < 30){ - sendDialogue(player,"My Smithing level is not high enough to use Coal!") - } - else sendDialogue(player, "It looks like the melting pot is already full of ore!") + else sendDialogue(player, "It looks like the melting pot is already full of ore!") + } else if(bar != null) { + if (amountToAdd > 0 && getStatLevel(player, Skills.SMITHING) >= bar.level) { + player.blastOre.add(Item(oreType.id,amountToAdd)) + removeItem(player, Item(oreType.id, amountToAdd), Container.INVENTORY) + BlastFurnaceOre(player, BFOreVariant.values()[playerOre.indexOf(oreType.id)],amountToAdd).init() + }else if(getStatLevel(player,Skills.SMITHING) < bar.level){ + sendDialogue(player,"My Smithing level is not high enough to smelt Iron!") } + else sendDialogue(player, "It looks like the melting pot is already full of ore!") } return@onUseWith true } @@ -501,4 +361,4 @@ class BlastFurnaceListeners : InteractionListener() { return@on true } } -} \ No newline at end of file +}