Player script fixes, and bankAll scriptAPI function added

Fixed the bank window exploit in the coal miner, Draynor willows, lobster catcher, Seers magic, shark catcher, and Varrock essence scripts.

Made it so that the coal miner script banks its entire inventory instead of just the coal ore, this way it should no longer get stuck if its inventory is full of mithril ore and uncut gems.

Fixed the Draynor willows and Seers magic trees scripts so that the bot actually chops down the trees instead of just standing next to them.

Added a bankAll function to the scriptAPI, the coal miner script is dependent on this change
This commit is contained in:
philliam
2021-06-26 01:18:51 -04:00
parent 473728c2bd
commit e651be47d2
7 changed files with 599 additions and 0 deletions
@@ -550,6 +550,28 @@ class ScriptAPI(private val bot: Player) {
bot.pulseManager.run(BankingPulse())
}
/**
* Takes every item out of the bots inventory and places it into the bank.
* @param none
* @author cfunnyman joe
*/
fun bankAll(){
class BankingPulse() : Pulse(20){
override fun pulse(): Boolean {
for(item in bot.inventory.toArray()){
var itemAmount = bot.inventory.getAmount(item)
bot.inventory.remove(item)
bot.bank.add(item)
bot.bank.refresh()
bot.inventory.refresh()
}
return true
}
}
bot.pulseManager.run(BankingPulse())
}
/**
* Function that makes the bot eat the food item in their inventory if their HP is below 2/3.
* @author Ceikry
@@ -0,0 +1,164 @@
package rs09.game.ai.general.scriptrepository
import core.game.interaction.DestinationFlag
import core.game.interaction.MovementPulse
import core.game.node.Node
import core.game.node.entity.skill.Skills
import core.game.node.item.Item
import core.game.world.map.zone.ZoneBorders
import org.rs09.consts.Items
import rs09.game.ai.general.ScriptAPI
import rs09.game.ai.skillingbot.SkillingBotAssembler
import rs09.game.interaction.InteractionListener
import rs09.game.interaction.InteractionListeners
import api.ContentAPI
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import java.util.logging.Handler
@PlayerCompatible
@ScriptName("Falador Coal Miner")
@ScriptDescription("Start in Falador East Bank with a pick equipped","or in your inventory.")
@ScriptIdentifier("fally_coal")
class CoalMiner : Script() {
var state = State.INIT
var ladderSwitch = false
val bottomLadder = ZoneBorders(3016,9736,3024,9742)
val topLadder = ZoneBorders(3016,3336,3022,3342)
val mine = ZoneBorders(3027,9733,3054,9743)
val bank = ZoneBorders(3009,3355,3018,3358)
var overlay: ScriptAPI.BottingOverlay? = null
var coalAmount = 0
override fun tick() {
when(state){
State.INIT -> {
overlay = scriptAPI.getOverlay()
ladderSwitch = true
overlay!!.init()
overlay!!.setTitle("Mining")
overlay!!.setTaskLabel("Coal Mined:")
overlay!!.setAmount(0)
if (mine.insideBorder(bot)){
ladderSwitch = false
state = State.MINING
} else {
state = State.TO_MINE
}
}
State.MINING -> {
bot.interfaceManager.close()
if(bot.inventory.freeSlots() == 0){
state = State.TO_BANK
}
if(!mine.insideBorder(bot)){
scriptAPI.walkTo(mine.randomLoc)
} else {
val rock = scriptAPI.getNearestNode("rocks",true)
rock?.let { InteractionListeners.run(rock.id, InteractionListener.OBJECT,"mine",bot,rock) }
}
overlay!!.setAmount(ContentAPI.amountInInventory(bot, Items.COAL_453) + coalAmount)
}
State.TO_BANK -> {
if(bank.insideBorder(bot)){
val bank = scriptAPI.getNearestNode("bank booth",true)
if(bank != null) {
bot.pulseManager.run(object : BankingPulse(this, bank){
override fun pulse(): Boolean {
state = State.BANKING
return super.pulse()
}
})
}
} else {
if(!ladderSwitch) {
val ladder = scriptAPI.getNearestNode(30941, true)
ladder ?: scriptAPI.walkTo(bottomLadder.randomLoc).also { return }
ladder?.interaction?.handle(bot, ladder.interaction[0]).also { ladderSwitch = true }
} else {
if (!bank.insideBorder(bot)) scriptAPI.walkTo(bank.randomLoc).also { return }
}
}
}
State.BANKING -> {
coalAmount += bot.inventory.getAmount(Items.COAL_453)
scriptAPI.bankAll()
state = State.TO_MINE
}
State.TO_MINE -> {
if(ladderSwitch){
bot.interfaceManager.close()
if(!topLadder.insideBorder(bot.location)){
scriptAPI.walkTo(topLadder.randomLoc)
} else {
val ladder = scriptAPI.getNearestNode("Ladder",true)
if(ladder != null){
ladder.interaction.handle(bot,ladder.interaction[0])
ladderSwitch = false
} else {
scriptAPI.walkTo(topLadder.randomLoc)
}
}
} else {
if(!mine.insideBorder(bot)){
scriptAPI.walkTo(mine.randomLoc)
} else {
state = State.MINING
}
}
}
State.TO_GE -> {
scriptAPI.teleportToGE()
state = State.SELLING
}
State.SELLING -> {
scriptAPI.sellOnGE(Items.COAL_453)
state = State.GO_BACK
}
State.GO_BACK -> {
scriptAPI.teleport(bank.randomLoc)
state = State.TO_MINE
}
}
}
open class BankingPulse(val script: Script, val bank: Node) : MovementPulse(script.bot,bank, DestinationFlag.OBJECT){
override fun pulse(): Boolean {
script.bot.faceLocation(bank.location)
return true
}
}
override fun newInstance(): Script {
val script = CoalMiner()
script.bot = SkillingBotAssembler().produce(SkillingBotAssembler.Wealth.POOR,bot.startLocation)
return script
}
enum class State {
MINING,
TO_MINE,
TO_BANK,
BANKING,
TO_GE,
SELLING,
GO_BACK,
INIT
}
init {
equipment.add(Item(Items.IRON_PICKAXE_1267))
skills.put(Skills.MINING,75)
}
}
@@ -0,0 +1,94 @@
package rs09.game.ai.general.scriptrepository
import core.game.component.Component
import core.game.interaction.DestinationFlag
import core.game.interaction.MovementPulse
import core.game.node.entity.skill.Skills
import core.game.node.item.Item
import core.game.world.map.zone.ZoneBorders
import org.rs09.consts.Items
import rs09.game.interaction.InteractionListener
import rs09.game.interaction.InteractionListeners
import rs09.tools.stringtools.colorize
@PlayerCompatible
@ScriptName("Draynor Willows")
@ScriptDescription("Start in Draynor with an axe equipped or in inventory.")
@ScriptIdentifier("draynor_trees")
class DraynorWillows : Script(){
val willowZone = ZoneBorders(3084, 3225,3091, 3239)
val bankZone = ZoneBorders(3092, 3240,3094, 3246)
var state = State.INIT
var logCount = 0
override fun tick() {
when(state){
State.INIT -> {
if(true){
bot.interfaceManager.openOverlay(Component(195))
bot.packetDispatch.sendString("Woodcutting",195,7)
bot.packetDispatch.sendString(colorize("%BLogs Chopped:"),195,8)
bot.packetDispatch.sendString(colorize("%B0"),195,9)
bot.packetDispatch.sendInterfaceConfig(195,5,true)
}
state = State.CHOPPING
}
State.CHOPPING -> {
if (!willowZone.insideBorder(bot))
scriptAPI.walkTo(willowZone.randomLoc)
else {
val willowtree = scriptAPI.getNearestNode("willow", true)
bot.interfaceManager.close()
willowtree?.let { InteractionListeners.run(willowtree.id,
InteractionListener.OBJECT,"Chop down",bot,willowtree) }
if (bot.inventory.isFull)
state = State.BANKING
}
bot.packetDispatch.sendString(colorize("%B${logCount + bot.inventory.getAmount(Items.WILLOW_LOGS_1519)}"), 195, 9)
}
State.BANKING -> {
if(!bankZone.insideBorder(bot))
scriptAPI.walkTo(bankZone.randomLoc)
else{
val bank = scriptAPI.getNearestNode("Bank Booth",true)
if(bank != null){
bot.pulseManager.run(object : MovementPulse(bot,bank, DestinationFlag.OBJECT){
override fun pulse(): Boolean {
val logs = bot.inventory.getAmount(Item(Items.WILLOW_LOGS_1519))
logCount += logs
bot.inventory.remove(Item(Items.WILLOW_LOGS_1519,logs))
bot.bank.add(Item(Items.WILLOW_LOGS_1519,logs))
state = State.CHOPPING
return true
}
})
}
}
}
}
}
init {
inventory.add(Item(Items.ADAMANT_AXE_1357))
skills[Skills.WOODCUTTING] = 35
}
override fun newInstance(): Script {
val script = DraynorWillows()
return script
}
enum class State {
CHOPPING,
BANKING,
INIT
}
}
@@ -0,0 +1,198 @@
package rs09.game.ai.general.scriptrepository
import core.game.interaction.DestinationFlag
import core.game.interaction.MovementPulse
import core.game.node.entity.skill.Skills
import core.game.node.item.Item
import core.game.system.task.Pulse
import core.game.world.map.Location
import core.game.world.map.path.Pathfinder
import core.game.world.update.flag.context.Animation
import core.game.world.update.flag.context.Graphics
import core.tools.RandomFunction
import org.rs09.consts.Items
import rs09.game.ai.AIPlayer
import rs09.game.ai.general.ScriptAPI
import rs09.game.interaction.InteractionListener
import rs09.game.interaction.InteractionListeners
import rs09.game.world.GameWorld
import kotlin.random.Random
@PlayerCompatible
@ScriptName("Catherby Lobs")
@ScriptDescription("Start in Catherby bank with a lobster pot in your inventory.")
@ScriptIdentifier("cath_lobs")
class LobsterCatcher : Script() {
private val ANIMATION = Animation(714)
val offers = HashMap<Int, Int>()
val limit = 2000
var myCounter = 0
/**
* Represents the graphics to use.
*/
private val GRAPHICS = Graphics(308, 100, 50)
internal enum class Sets(val equipment: List<Item>) {
SET_1(listOf(Item(2643), Item(9470), Item(10756), Item(10394), Item(88), Item(9793))),
SET_2(listOf(Item(2643), Item(6585), Item(10750), Item(10394), Item(88), Item(9793))),
SET_3(listOf(Item(9472), Item(9470), Item(10750), Item(10394), Item(88), Item(9786))),
SET_4(listOf(Item(2639), Item(6585), Item(10752), Item(10394), Item(88), Item(9786))),
SET_5(listOf(Item(2639), Item(9470), Item(10750), Item(10394), Item(88), Item(9784))),
SET_6(listOf(Item(2639), Item(6585), Item(10750), Item(10394), Item(88), Item(9784)));
}
private var bots = 0
private var lobstopper = false
var overlay: ScriptAPI.BottingOverlay?= null
var fishCounter = 0
private var state = State.INIT
private var tick = 0
override fun tick() {
when(state){
State.INIT -> {
overlay = scriptAPI.getOverlay()
overlay!!.init()
overlay!!.setTitle("Fishing")
overlay!!.setTaskLabel("Lobs Caught:")
overlay!!.setAmount(0)
state = State.FIND_SPOT
}
State.BANKING -> {
fishCounter += bot.inventory.getAmount(Items.RAW_LOBSTER_377)
scriptAPI.bankItem(Items.RAW_LOBSTER_377)
state = State.IDLE
}
State.FISHING -> {
bot.interfaceManager.close()
val spot = scriptAPI.getNearestNode(333, false)
if(spot == null){
state = State.IDLE
} else {
InteractionListeners.run(spot.id,InteractionListener.NPC,"cage",bot,spot)
}
if(bot.inventory.isFull){
state = State.FIND_BANK
}
overlay!!.setAmount(fishCounter + bot.inventory.getAmount(Items.RAW_LOBSTER_377))
}
State.IDLE -> {
if (Random.nextBoolean()){
state = State.FIND_SPOT
}
else if(myCounter++ >= RandomFunction.random(1,25)){
state = State.FIND_SPOT
}
}
State.FIND_SPOT -> {
val spot = scriptAPI.getNearestNode(333, false)
if (spot != null) {
bot.walkingQueue.reset()
state = State.FISHING
} else {
if (bot.location.x < 2837) {
Pathfinder.find(bot, Location.create(2837, 3435, 0)).walk(bot)
} else {
Pathfinder.find(bot, Location.create(2854, 3427, 0)).walk(bot)
}
}
}
State.FIND_BANK -> {
val bank = scriptAPI.getNearestGameObject(bot.location, 2213)
class BankingPulse : MovementPulse(bot, bank, DestinationFlag.OBJECT) {
override fun pulse(): Boolean {
bot.faceLocation(bank!!.location)
state = State.BANKING
return true
}
}
if(bank != null){
bot.pulseManager.run(BankingPulse())
} else {
if (bot.location.x > 2837) {
Pathfinder.find(bot, Location.create(2837, 3435, 0)).walk(bot)
} else if (bot.location.x > 2821) {
Pathfinder.find(bot, Location.create(2821, 3435, 0)).walk(bot)
} else if (bot.location.x > 2809){
Pathfinder.find(bot,Location.create(2809, 3436, 0)).walk(bot)
}
}
}
State.TELEPORT_GE -> {
scriptAPI.teleportToGE()
state = State.SELL_GE
}
State.SELL_GE -> {
scriptAPI.sellOnGE(Items.RAW_LOBSTER_377)
state = State.TELE_CATH
}
State.TELE_CATH -> {
if(tick++ == 10) {
bot.lock()
bot.visualize(ANIMATION, GRAPHICS)
bot.impactHandler.disabledTicks = 4
val location = Location.create(2819, 3437, 0)
GameWorld.Pulser.submit(object : Pulse(4, bot) {
override fun pulse(): Boolean {
bot.unlock()
bot.properties.teleportLocation = location
bot.animator.reset()
state = State.IDLE
return true
}
})
}
}
}
}
init {
val setUp = RandomFunction.random(Sets.values().size)
equipment.addAll(Sets.values()[setUp].equipment)
inventory.add(Item(301))
skills[Skills.FISHING] = 40
}
enum class State{
FISHING,
BANKING,
FIND_BANK,
FIND_SPOT,
TELEPORT_GE,
SELL_GE,
TELE_CATH,
IDLE,
INIT
}
override fun newInstance(): Script {
if (!lobstopper && bots <= 0) {
val script = LobsterCatcher()
script.bot = AIPlayer(bot.startLocation)
script.state = State.FIND_SPOT
bots = 1
return script
}else if (tick++ == 6000 && lobstopper) {
tick = 0
lobstopper = false
}
return newInstance()
}
}
@@ -0,0 +1,119 @@
package rs09.game.ai.general.scriptrepository
import core.game.interaction.DestinationFlag
import core.game.interaction.MovementPulse
import core.game.node.entity.skill.Skills
import core.game.node.item.Item
import core.game.world.map.Location
import core.game.world.map.zone.ZoneBorders
import core.tools.RandomFunction
import org.rs09.consts.Items
import rs09.game.ai.general.ScriptAPI
import rs09.game.ai.skillingbot.SkillingBotAssembler
import rs09.game.interaction.InteractionListener
import rs09.game.interaction.InteractionListeners
@PlayerCompatible
@ScriptName("Seers Magics")
@ScriptDescription("Start in Seers Bank with an axe equipped or in your inventory.")
@ScriptIdentifier("seers_magics")
class SeersMagicTrees : Script(){
var state = State.INIT
var stage = 0
val bankZone = ZoneBorders(2722,3490,2727,3493)
val magicsZone = ZoneBorders(2700, 3396,2704, 3399)
var overlay: ScriptAPI.BottingOverlay? = null
var logCounter = 0
override fun tick() {
when(state){
State.INIT -> {
overlay = scriptAPI.getOverlay()
overlay!!.init()
overlay!!.setTitle("Woodcutting")
overlay!!.setTaskLabel("Logs cut:")
overlay!!.setAmount(0)
state = State.RETURN_TO_TREES
}
State.CHOPPING -> {
val tree = scriptAPI.getNearestNode(1306,true)
bot.interfaceManager.close()
tree?.let { InteractionListeners.run(tree.id, InteractionListener.OBJECT,"Chop down",bot,tree) }
if(bot.inventory.isFull){
state = State.FIND_BANK
}
overlay!!.setAmount(logCounter + bot.inventory.getAmount(Items.MAGIC_LOGS_1513))
}
State.FIND_BANK -> {
if(!bankZone.insideBorder(bot)){
scriptAPI.walkTo(bankZone.randomLoc)
} else {
state = State.BANKING
}
}
State.BANKING -> {
val bank = scriptAPI.getNearestNode(25808,true)
if(bank != null)
bot.pulseManager.run(object: MovementPulse(bot,bank, DestinationFlag.OBJECT){
override fun pulse(): Boolean {
bot.faceLocation(bank.location)
logCounter += bot.inventory.getAmount(Items.MAGIC_LOGS_1513)
scriptAPI.bankItem(Items.MAGIC_LOGS_1513)
state = State.RETURN_TO_TREES
return true
}
})
}
State.RETURN_TO_TREES -> {
bot.interfaceManager.close()
if(!magicsZone.insideBorder(bot)){
scriptAPI.walkTo(magicsZone.randomLoc)
} else {
state = State.CHOPPING
}
}
State.TELE_GE -> {
state = State.SELL_GE
scriptAPI.teleportToGE()
}
State.SELL_GE -> {
state = State.TELE_SEERS
scriptAPI.sellOnGE(Items.MAGIC_LOGS_1513)
}
State.TELE_SEERS -> {
state = State.RETURN_TO_TREES
scriptAPI.teleport(Location.create(2756, 3478, 0))
}
}
}
init {
inventory.add(Item(Items.RUNE_AXE_1359))
skills[Skills.WOODCUTTING] = RandomFunction.random(75,99)
}
enum class State {
CHOPPING,
FIND_BANK,
BANKING,
RETURN_TO_TREES,
TELE_GE,
SELL_GE,
TELE_SEERS,
INIT
}
override fun newInstance(): Script {
val script = SeersMagicTrees()
script.bot = SkillingBotAssembler().produce(SkillingBotAssembler.Wealth.AVERAGE,bot.startLocation)
return script
}
}
@@ -114,6 +114,7 @@ class SharkCatcher : Script() {
}
State.FISHING -> {
bot.interfaceManager.close()
if (Random.nextBoolean()) {
tick = 0
val spot = scriptAPI.getNearestNode(334, false)
@@ -22,6 +22,7 @@ class VarrockEssenceMiner : Script(){
when(state){
State.TO_ESSENCE -> {
bot.interfaceManager.close()
if(!auburyZone.insideBorder(bot))
scriptAPI.walkTo(auburyZone.randomLoc)
else {