421c419f69
Added some runecrafting player scripts
174 lines
6.1 KiB
Kotlin
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
|
|
}
|
|
|
|
}
|