Files
2009scape/Server/src/main/content/global/bots/NatureCrafter.kt
T
Pine Stone 421c419f69 Fixed deadlock regression in bots
Added some runecrafting player scripts
2023-07-29 05:02:38 +00:00

174 lines
6.1 KiB
Kotlin

package content.global.bots
import content.global.skill.runecrafting.MysteriousRuin
import core.api.teleport
import core.game.bots.*
import core.game.interaction.IntType
import core.game.interaction.InteractionListeners
import core.game.node.entity.player.link.TeleportManager
import core.game.node.item.Item
import core.game.node.scenery.Scenery
import core.game.world.map.Location
import core.game.world.map.zone.ZoneBorders
import org.rs09.consts.Items
@PlayerCompatible
@ScriptName("Nature Rune Crafter")
@ScriptDescription("Crafts nat runes. Start in Zanaris w/ dramen staff + Nat tiara.")
@ScriptIdentifier("nature_crafter")
class NatureCrafter : Script() {
var state = State.INIT
var runeCounter = 0
var overlay: ScriptAPI.BottingOverlay? = null
var startLocation = Location(0,0,0)
var timer = 0
var teleWaitTime = 16 // 18 ticks needed to rotate the clocks, 2 to teleport
var bank = Location(2384, 4457)
var ruinsZone = ZoneBorders(2866, 3017, 2873, 3022)
var faeRingDestination = Location(2412, 4435, 0) // You don't walk to the fae rings
// you can only walk next to them. so path to the nearest point that isn't in the ring.
var faeRingCenter = Location(2412, 4434, 0)
var karamjaRingDestination = Location(2801, 3002, 0)
var karamjaRingCenter = Location(2801, 3003, 0)
var natureZone = ZoneBorders(2387, 4828, 2416, 4856)
override fun tick() {
if (timer-- > 0) {
return
}
if (bot.settings.runEnergy > 10.0) {
bot.settings.isRunToggled = true
}
when(state){
State.INIT -> {
if (checkValid()) {
overlay = scriptAPI.getOverlay()
overlay!!.init()
overlay!!.setTitle("Nature Runes")
overlay!!.setTaskLabel("Runes Crafted:")
overlay!!.setAmount(0)
startLocation = bot.location
state = State.BANKING
}
}
State.BANKING -> {
if(bot.location != bank) {
scriptAPI.walkTo(bank)
return
}
val runes = bot.inventory.getAmount(Item(Items.NATURE_RUNE_561))
if (runes > 0) {
runeCounter += runes
overlay!!.setAmount(runeCounter)
bot.sendMessage("You have crafted a total of: $runeCounter runes.")
scriptAPI.bankItem(Items.NATURE_RUNE_561)
} else {
scriptAPI.withdraw(Items.PURE_ESSENCE_7936, 28)
state = State.RUNNING_TO_TELE
}
}
State.RUNNING_TO_TELE -> {
if (bot.location != faeRingDestination) {
scriptAPI.walkTo(faeRingDestination)
} else {
if (checkValid()) {
timer = teleWaitTime
state = State.TELE_WAIT
bot.sendMessage("Entering Fairy Ring Codes. Please wait...")
}
}
}
State.TELE_WAIT -> {
teleport(bot, karamjaRingCenter, TeleportManager.TeleportType.FAIRY_RING)
state = State.RUNNING_TO_ALTER
// tele takes 4 ticks so wait that long.
timer = 4
}
State.RETURN_WAIT -> {
teleport(bot, faeRingCenter, TeleportManager.TeleportType.FAIRY_RING)
state = State.BANKING
}
State.RUNNING_TO_ALTER -> {
val ruins = scriptAPI.getNearestNode(2460,true)
if (natureZone.insideBorder(bot))
state = State.CRAFTING
if (!ruinsZone.insideBorder(bot)) {
scriptAPI.walkTo(ruinsZone.randomLoc)
} else if (ruins != null && ruins.location.withinDistance(bot.location, 20) && checkValid()) {
val ruinsChild = (ruins as Scenery).getChild(bot)
scriptAPI.interact(bot, ruinsChild, "enter")
timer = 4
}
}
State.CRAFTING -> {
val alter = scriptAPI.getNearestNode(2486,true)
scriptAPI.interact(bot, alter, "craft-rune")
if(bot.inventory.containsAtLeastOneItem(Item(Items.NATURE_RUNE_561)))
state = State.LEAVING_ALTER
}
State.LEAVING_ALTER -> {
var portalOut = scriptAPI.getNearestNode(2473, true)
scriptAPI.interact(bot, portalOut, "use")
if (ruinsZone.insideBorder(bot))
state = State.RETURNING_TO_TELE
}
State.RETURNING_TO_TELE -> {
if (bot.location != karamjaRingDestination) {
scriptAPI.walkTo(karamjaRingDestination)
} else {
if (checkValid()) {
var portalOut = scriptAPI.getNearestNode(14130, true)
portalOut?.interaction?.handle(bot, portalOut.interaction[0])
timer = 4
state = State.RETURN_WAIT
}
}
}
State.INVALID -> {
timer = 25
state = State.INIT
}
}
}
// Terminates if you have invalid inventory to avoid cheating
private fun checkValid(): Boolean {
if (!bot.equipment.containsAtLeastOneItem(Items.DRAMEN_STAFF_772) or !bot.equipment.containsAtLeastOneItem(Items.NATURE_TIARA_5541)) {
bot.sendMessage("Please equip a dramen staff and nature tiara first.")
state = State.INVALID
return false
}
return true
}
override fun newInstance(): Script {
return this
}
enum class State {
INIT,
BANKING,
RUNNING_TO_TELE,
TELE_WAIT,
RUNNING_TO_ALTER,
CRAFTING,
LEAVING_ALTER,
RETURNING_TO_TELE,
RETURN_WAIT,
INVALID
}
}