Merge branch 'bf-fixes' into 'master'

Prevent furnace temperature from going negative and deduplicate bar handling.

See merge request 2009scape/2009scape!379
This commit is contained in:
Ceikry 2022-01-03 19:24:31 +00:00
commit eca439b99e
3 changed files with 83 additions and 267 deletions

View file

@ -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.

View file

@ -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 {
}
}
}
}
}

View file

@ -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
}
}
}
}