Merge remote-tracking branch 'upstream/master'

This commit is contained in:
skelsoft
2021-06-28 08:11:40 +10:00
20 changed files with 1150 additions and 285 deletions
+247 -241
View File
@@ -10178,26 +10178,14 @@
}, },
{ {
"minAmount": "1", "minAmount": "1",
"weight": "40.0",
"id": "2677",
"maxAmount": "1"
},
{
"minAmount": "5",
"weight": "50.0", "weight": "50.0",
"id": "386", "id": "1289",
"maxAmount": "15"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "1373",
"maxAmount": "1" "maxAmount": "1"
}, },
{ {
"minAmount": "1", "minAmount": "1",
"weight": "50.0", "weight": "50.0",
"id": "1201", "id": "1303",
"maxAmount": "1" "maxAmount": "1"
}, },
{ {
@@ -10209,7 +10197,13 @@
{ {
"minAmount": "1", "minAmount": "1",
"weight": "50.0", "weight": "50.0",
"id": "1289", "id": "1113",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "1147",
"maxAmount": "1" "maxAmount": "1"
}, },
{ {
@@ -10219,112 +10213,10 @@
"maxAmount": "1" "maxAmount": "1"
}, },
{ {
"minAmount": "1", "minAmount": "20",
"weight": "50.0", "weight": "50.0",
"id": "5298", "id": "4699",
"maxAmount": "2" "maxAmount": "40"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "5281",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "5294",
"maxAmount": "2"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "5104",
"maxAmount": "3"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "5292",
"maxAmount": "2"
},
{
"minAmount": "3",
"weight": "50.0",
"id": "5311",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "5299",
"maxAmount": "2"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "200",
"maxAmount": "11"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "202",
"maxAmount": "11"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "204",
"maxAmount": "11"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "206",
"maxAmount": "11"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "210",
"maxAmount": "11"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "212",
"maxAmount": "11"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "214",
"maxAmount": "11"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "216",
"maxAmount": "11"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "2486",
"maxAmount": "11"
},
{
"minAmount": "3",
"weight": "50.0",
"id": "1602",
"maxAmount": "5"
},
{
"minAmount": "3",
"weight": "50.0",
"id": "2362",
"maxAmount": "7"
}, },
{ {
"minAmount": "20", "minAmount": "20",
@@ -10333,146 +10225,272 @@
"maxAmount": "40" "maxAmount": "40"
}, },
{ {
"minAmount": "20", "minAmount": "10",
"weight": "50.0", "weight": "50.0",
"id": "565",
"maxAmount": "20"
},
{
"minAmount": "20",
"weight": "25.0",
"id": "563", "id": "563",
"maxAmount": "45" "maxAmount": "40"
},
{
"minAmount": "8",
"weight": "25.0",
"id": "200",
"maxAmount": "10"
},
{
"minAmount": "8",
"weight": "25.0",
"id": "202",
"maxAmount": "10"
},
{
"minAmount": "8",
"weight": "25.0",
"id": "204",
"maxAmount": "10"
},
{
"minAmount": "8",
"weight": "25.0",
"id": "206",
"maxAmount": "10"
},
{
"minAmount": "8",
"weight": "25.0",
"id": "208",
"maxAmount": "10"
},
{
"minAmount": "8",
"weight": "25.0",
"id": "210",
"maxAmount": "10"
},
{
"minAmount": "8",
"weight": "25.0",
"id": "212",
"maxAmount": "10"
},
{
"minAmount": "8",
"weight": "25.0",
"id": "214",
"maxAmount": "10"
},
{
"minAmount": "8",
"weight": "25.0",
"id": "216",
"maxAmount": "10"
},
{
"minAmount": "8",
"weight": "25.0",
"id": "2486",
"maxAmount": "10"
}, },
{ {
"minAmount": "4", "minAmount": "4",
"weight": "50.0",
"id": "1443",
"maxAmount": "4"
},
{
"minAmount": "3000",
"weight": "75.0",
"id": "995",
"maxAmount": "15000"
},
{
"minAmount": "1",
"weight": "25.0",
"id": "5302",
"maxAmount": "2"
},
{
"minAmount": "1",
"weight": "10.0",
"id": "1149",
"maxAmount": "2"
},
{
"minAmount": "1",
"weight": "25.0",
"id": "5303",
"maxAmount": "2"
},
{
"minAmount": "1",
"weight": "25.0",
"id": "5105",
"maxAmount": "3"
},
{
"minAmount": "1",
"weight": "25.0",
"id": "5296",
"maxAmount": "2"
},
{
"minAmount": "1",
"weight": "25.0", "weight": "25.0",
"id": "5323", "id": "5323",
"maxAmount": "4" "maxAmount": "10"
}, },
{ {
"minAmount": "1", "minAmount": "4",
"weight": "25.0", "weight": "25.0",
"id": "12176", "id": "5321",
"maxAmount": "2" "maxAmount": "10"
}, },
{ {
"minAmount": "1", "minAmount": "4",
"weight": "25.0",
"id": "5292",
"maxAmount": "10"
},
{
"minAmount": "4",
"weight": "25.0",
"id": "5294",
"maxAmount": "10"
},
{
"minAmount": "4",
"weight": "25.0", "weight": "25.0",
"id": "5295", "id": "5295",
"maxAmount": "3" "maxAmount": "10"
}, },
{ {
"minAmount": "1", "minAmount": "4",
"weight": "25.0",
"id": "12176",
"maxAmount": "10"
},
{
"minAmount": "4",
"weight": "25.0",
"id": "5296",
"maxAmount": "10"
},
{
"minAmount": "4",
"weight": "25.0",
"id": "5298",
"maxAmount": "10"
},
{
"minAmount": "4",
"weight": "25.0",
"id": "5299",
"maxAmount": "10"
},
{
"minAmount": "4",
"weight": "25.0",
"id": "5300",
"maxAmount": "10"
},
{
"minAmount": "4",
"weight": "25.0",
"id": "5301",
"maxAmount": "10"
},
{
"minAmount": "4",
"weight": "25.0",
"id": "5302",
"maxAmount": "10"
},
{
"minAmount": "4",
"weight": "25.0",
"id": "5304",
"maxAmount": "10"
},
{
"minAmount": "4",
"weight": "25.0", "weight": "25.0",
"id": "5100", "id": "5100",
"maxAmount": "2" "maxAmount": "10"
},
{
"minAmount": "4",
"weight": "25.0",
"id": "5104",
"maxAmount": "10"
},
{
"minAmount": "4",
"weight": "25.0",
"id": "5105",
"maxAmount": "10"
},
{
"minAmount": "4",
"weight": "25.0",
"id": "5311",
"maxAmount": "10"
}, },
{ {
"minAmount": "4", "minAmount": "4",
"weight": "25.0", "weight": "25.0",
"id": "5280", "id": "5280",
"maxAmount": "1" "maxAmount": "10"
},
{
"minAmount": "4",
"weight": "25.0",
"id": "5281",
"maxAmount": "10"
},
{
"minAmount": "4",
"weight": "25.0",
"id": "5282",
"maxAmount": "10"
},
{
"minAmount": "5",
"weight": "50.0",
"id": "385",
"maxAmount": "15"
}, },
{ {
"minAmount": "1", "minAmount": "1",
"weight": "25.0", "weight": "25.0",
"id": "1163", "id": "163",
"maxAmount": "1" "maxAmount": "6"
}, },
{ {
"minAmount": "1", "minAmount": "1",
"weight": "25.0", "weight": "25.0",
"id": "1113", "id": "139",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "25.0",
"id": "208",
"maxAmount": "11"
},
{
"minAmount": "1",
"weight": "25.0",
"id": "5301",
"maxAmount": "3" "maxAmount": "3"
}, },
{ {
"minAmount": "1", "minAmount": "3",
"weight": "25.0", "weight": "50.0",
"id": "218", "id": "2362",
"maxAmount": "11" "maxAmount": "5"
}, },
{ {
"minAmount": "10", "minAmount": "3",
"weight": "50.0",
"id": "1602",
"maxAmount": "5"
},
{
"minAmount": "2",
"weight": "25.0", "weight": "25.0",
"id": "565", "id": "1443",
"maxAmount": "20" "maxAmount": "5"
},
{
"minAmount": "3000",
"weight": "100.0",
"id": "995",
"maxAmount": "13000"
}, },
{ {
"minAmount": "1", "minAmount": "1",
"weight": "1.0", "weight": "3.42",
"id": "14484", "id": "14484",
"maxAmount": "1" "maxAmount": "1"
}, },
{ {
"minAmount": "1", "minAmount": "1",
"weight": "1.0", "weight": "1.71",
"id": "14474",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "1.0",
"id": "14476",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "1.0",
"id": "14472", "id": "14472",
"maxAmount": "1" "maxAmount": "1"
}, },
{ {
"minAmount": "1", "minAmount": "1",
"weight": "5.0", "weight": "1.71",
"id": "14474",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "1.71",
"id": "14476",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "2677",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "50.0",
"id": "31", "id": "31",
"maxAmount": "1" "maxAmount": "1"
} }
@@ -26358,6 +26376,12 @@
"ids": "1615,4230", "ids": "1615,4230",
"description": "", "description": "",
"main": [ "main": [
{
"minAmount": "1",
"weight": "50.0",
"id": "1365",
"maxAmount": "1"
},
{ {
"minAmount": "1", "minAmount": "1",
"weight": "50.0", "weight": "50.0",
@@ -26370,18 +26394,6 @@
"id": "1361", "id": "1361",
"maxAmount": "1" "maxAmount": "1"
}, },
{
"minAmount": "1",
"weight": "50.0",
"id": "1365",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "2.4",
"id": "4151",
"maxAmount": "1"
},
{ {
"minAmount": "1", "minAmount": "1",
"weight": "25.0", "weight": "25.0",
@@ -26491,8 +26503,8 @@
"maxAmount": "3" "maxAmount": "3"
}, },
{ {
"minAmount": "9", "minAmount": "30",
"weight": "50.0", "weight": "100.0",
"id": "995", "id": "995",
"maxAmount": "3000" "maxAmount": "3000"
}, },
@@ -26514,12 +26526,6 @@
"id": "7937", "id": "7937",
"maxAmount": "60" "maxAmount": "60"
}, },
{
"minAmount": "1",
"weight": "25.0",
"id": "1440",
"maxAmount": "1"
},
{ {
"minAmount": "1", "minAmount": "1",
"weight": "25.0", "weight": "25.0",
@@ -26540,13 +26546,19 @@
}, },
{ {
"minAmount": "1", "minAmount": "1",
"weight": "5.0", "weight": "25.0",
"id": "31", "id": "31",
"maxAmount": "1" "maxAmount": "1"
}, },
{ {
"minAmount": "1", "minAmount": "1",
"weight": "100.0", "weight": "2.5",
"id": "4151",
"maxAmount": "1"
},
{
"minAmount": "1",
"weight": "150.0",
"id": "0", "id": "0",
"maxAmount": "1" "maxAmount": "1"
} }
@@ -33874,28 +33886,22 @@
"main": [ "main": [
{ {
"minAmount": "1", "minAmount": "1",
"weight": "0.685", "weight": "0.675",
"id": "6528", "id": "6528",
"maxAmount": "1" "maxAmount": "1"
}, },
{ {
"minAmount": "1", "minAmount": "1",
"weight": "0.685", "weight": "0.675",
"id": "6524", "id": "6524",
"maxAmount": "1" "maxAmount": "1"
}, },
{ {
"minAmount": "1", "minAmount": "1",
"weight": "0.685", "weight": "0.675",
"id": "6568", "id": "6568",
"maxAmount": "1" "maxAmount": "1"
}, },
{
"minAmount": "1",
"weight": "5.0",
"id": "1393",
"maxAmount": "1"
},
{ {
"minAmount": "12", "minAmount": "12",
"weight": "5.0", "weight": "5.0",
@@ -311,4 +311,22 @@ public abstract class DialoguePlugin implements Plugin<Player> {
} }
} }
/**
* Use the automatic linesplitting feature in DialUtils to produce npc dialogues
* @param expr the FacialExpression to use, located in the FacialExpression enum.
* @param msg the message for the NPC to say
*/
public Component npcl(FacialExpression expr, String msg){
return npc(expr, api.DialUtils.splitLines(msg));
}
/**
* Use the automatic linesplitting feature in DialUtils to produce player dialogues
* @param expr the FacialExpression to use, located in the FacialExpression enum.
* @param msg the message for the player to say
*/
public Component playerl(FacialExpression expr, String msg){
return player(expr, api.DialUtils.splitLines(msg));
}
} }
@@ -137,7 +137,7 @@ public final class HansDialoguePlugin extends DialoguePlugin {
case 12: case 12:
switch(buttonId){ switch(buttonId){
case 1: case 1:
options("2.5x","5x","10x","20x"); options("1.0x","2.5x","10x","20x");
stage++; stage++;
break; break;
case 2: case 2:
@@ -150,7 +150,7 @@ public final class HansDialoguePlugin extends DialoguePlugin {
switch(buttonId){ switch(buttonId){
case 1: case 1:
if(player.newPlayer) { if(player.newPlayer) {
player.getSkills().experienceMutiplier = 2.5; player.getSkills().experienceMutiplier = 1.0;
stage = 14; stage = 14;
} else { } else {
stage = 15; stage = 15;
@@ -159,7 +159,7 @@ public final class HansDialoguePlugin extends DialoguePlugin {
break; break;
case 2: case 2:
if(player.newPlayer){ if(player.newPlayer){
player.getSkills().experienceMutiplier = 5.0; player.getSkills().experienceMutiplier = 2.5;
stage = 14; stage = 14;
} else { } else {
stage = 15; stage = 15;
@@ -1,41 +0,0 @@
package core.game.interaction.npc;
import core.cache.def.impl.NPCDefinition;
import core.game.component.Component;
import core.game.interaction.OptionHandler;
import core.game.node.Node;
import core.game.node.entity.npc.NPC;
import core.game.node.entity.player.Player;
import core.plugin.Initializable;
import core.plugin.Plugin;
import core.game.node.entity.skill.crafting.TanningProduct;
/**
* Represents the plugin used for an npc with the trade option.
* @author 'Vexia
* @version 1.0
*/
@Initializable
public final class NPCTradePlugin extends OptionHandler {
@Override
public Plugin<Object> newInstance(Object arg) throws Throwable {
NPCDefinition.setOptionHandler("trade", this);
return this;
}
@Override
public boolean handle(Player player, Node node, String option) {
final NPC npc = (NPC) node;
if (npc.getId() == 2824) {
TanningProduct.open(player, 2824);
return true;
}
if(npc.getId() == 7601){
player.getInterfaceManager().open(new Component(732));
return true;
}
return node.asNpc().openShop(player);
}
}
@@ -0,0 +1,35 @@
package core.game.interaction.npc
import api.ContentAPI
import core.cache.def.impl.NPCDefinition
import core.game.component.Component
import core.plugin.Initializable
import core.game.interaction.OptionHandler
import core.game.node.Node
import core.game.node.entity.npc.NPC
import core.game.node.entity.player.Player
import core.plugin.Plugin
import core.game.node.entity.skill.crafting.TanningProduct
import rs09.game.interaction.InteractionListener
/**
* Represents the plugin used for an npc with the trade option.
* @author Ceikry
* @version 1.0
*/
class NPCTradePlugin : InteractionListener() {
override fun defineListeners() {
on(NPC, "trade", "shop"){player, node ->
val npc = node as NPC
if (npc.id == 2824) {
TanningProduct.open(player, 2824)
return@on true
}
if (npc.id == 7601) {
ContentAPI.openInterface(player, 732)
return@on true
}
return@on npc.openShop(player)
}
}
}
+1
View File
@@ -1,3 +1,4 @@
package api
import rs09.game.system.SystemLogger import rs09.game.system.SystemLogger
import java.util.* import java.util.*
import kotlin.system.exitProcess import kotlin.system.exitProcess
@@ -550,6 +550,26 @@ class ScriptAPI(private val bot: Player) {
bot.pulseManager.run(BankingPulse()) 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)
}
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. * Function that makes the bot eat the food item in their inventory if their HP is below 2/3.
* @author Ceikry * @author Ceikry
@@ -0,0 +1,78 @@
package rs09.game.ai.general.scriptrepository
import core.game.world.map.Location
import org.rs09.consts.Items
import rs09.game.ai.general.ScriptAPI
@PlayerCompatible
@ScriptName("Chicken Killer")
@ScriptDescription("Kills chickens and loots feathers. Start in any chicken area.")
@ScriptIdentifier("chicken_killer")
class ChickenKiller : Script(){
var state = State.INIT
var chickenCounter = 0
var overlay: ScriptAPI.BottingOverlay?= null
var startLocation = Location(0,0,0)
var timer = 3
var lootFeathers = false
override fun tick() {
when(state){
State.INIT -> {
overlay = scriptAPI.getOverlay()
overlay!!.init()
overlay!!.setTitle("Chickens")
overlay!!.setTaskLabel("Chickens KO'd:")
overlay!!.setAmount(0)
state = State.CONFIG
bot.dialogueInterpreter.sendOptions("Loot Feathers?","Yes","No")
bot.dialogueInterpreter.addAction{player,button ->
lootFeathers = button == 2
state = State.KILLING
}
startLocation = bot.location
}
State.KILLING -> {
val chicken = scriptAPI.getNearestNode("Chicken")
if(chicken == null){
scriptAPI.randomWalkTo(startLocation,3)
} else {
scriptAPI.attackNpcInRadius(bot,"Chicken",10)
if(lootFeathers) {
state = State.IDLE
timer = 4
}
chickenCounter++
overlay!!.setAmount(chickenCounter)
}
}
State.IDLE -> {
if(timer-- <= 0){
state = State.LOOTING
}
}
State.LOOTING -> {
scriptAPI.takeNearestGroundItem(Items.FEATHER_314)
state = State.KILLING
}
}
}
override fun newInstance(): Script {
return this
}
enum class State {
IDLE,
INIT,
KILLING,
LOOTING,
RETURN,
CONFIG
}
}
@@ -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,19 @@
package rs09.game.ai.general.scriptrepository
import io.github.classgraph.ClassGraph
object PlayerScripts {
class PlayerScript(val identifier: String, val description: Array<String>, val name: String, val clazz: Class<*>)
val identifierMap = HashMap<String,PlayerScript>()
fun init(){
val result = ClassGraph().enableAnnotationInfo().acceptPackages("rs09.game.ai.general.scriptrepository").scan()
result.getClassesWithAnnotation("rs09.game.ai.general.scriptrepository.PlayerCompatible").forEach { res ->
val description = res.getAnnotationInfo("rs09.game.ai.general.scriptrepository.ScriptDescription").parameterValues[0].value as Array<String>
val identifier = res.getAnnotationInfo("rs09.game.ai.general.scriptrepository.ScriptIdentifier").parameterValues[0].value.toString()
val name = res.getAnnotationInfo("rs09.game.ai.general.scriptrepository.ScriptName").parameterValues[0].value.toString()
identifierMap[identifier] = PlayerScript(identifier,description,name,res.loadClass())
}
}
}
@@ -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 -> { State.FISHING -> {
bot.interfaceManager.close()
if (Random.nextBoolean()) { if (Random.nextBoolean()) {
tick = 0 tick = 0
val spot = scriptAPI.getNearestNode(334, false) val spot = scriptAPI.getNearestNode(334, false)
@@ -22,6 +22,7 @@ class VarrockEssenceMiner : Script(){
when(state){ when(state){
State.TO_ESSENCE -> { State.TO_ESSENCE -> {
bot.interfaceManager.close()
if(!auburyZone.insideBorder(bot)) if(!auburyZone.insideBorder(bot))
scriptAPI.walkTo(auburyZone.randomLoc) scriptAPI.walkTo(auburyZone.randomLoc)
else { else {
@@ -0,0 +1,67 @@
package rs09.game.content.dialogue
import api.ContentAPI
import core.game.content.dialogue.DialoguePlugin
import core.game.content.dialogue.FacialExpression
import core.game.node.entity.player.Player
import core.game.node.item.Item
import core.plugin.Initializable
import org.rs09.consts.Items
import org.rs09.consts.NPCs
import rs09.tools.END_DIALOGUE
import java.text.SimpleDateFormat
import java.time.temporal.ChronoUnit
import java.util.*
@Initializable
class CaptainCainDialogue(player: Player? = null) : DialoguePlugin(player) {
val sdf = SimpleDateFormat("ddMMyyyy")
override fun newInstance(player: Player?): DialoguePlugin {
return CaptainCainDialogue(player)
}
override fun open(vararg args: Any?): Boolean {
npcl(FacialExpression.FRIENDLY, "Hello, there, adventurer. Say, you wouldn't happen to be interested in purchasing a Fighter Torso would you?")
stage = 0
return true
}
override fun handle(interfaceId: Int, buttonId: Int): Boolean {
val start = sdf.parse("27112020").toInstant()
val now = Date().toInstant()
val days = ChronoUnit.DAYS.between(start,now)
when(stage){
0 -> npcl(FacialExpression.ANNOYED,"I'm having to offer this service because it's been $days days since Ryan promised to give us barbarian assault.").also { stage++ }
1 -> options("Yes, please.","No, thanks.").also { stage++ }
2 -> when(buttonId){
1 -> playerl(FacialExpression.FRIENDLY, "Yes, please.").also { stage = 10 }
2 -> playerl(FacialExpression.HALF_THINKING, "No, thanks.").also { stage = END_DIALOGUE }
}
10 -> npcl(FacialExpression.FRIENDLY, "Alright, then, that'll be 7,500,000 gold please.").also { stage++ }
11 -> options("Here you go!","Nevermind.").also { stage++ }
12 -> when(buttonId){
1 -> if(ContentAPI.inInventory(player, 995, 7500000))
playerl(FacialExpression.FRIENDLY, "Here you go!").also { stage = 20 }
else
playerl(FacialExpression.HALF_GUILTY, "Actually, I don't have that much.").also { stage = END_DIALOGUE }
2 -> playerl(FacialExpression.FRIENDLY, "On second thought, nevermind.").also { stage = END_DIALOGUE }
}
20 -> {
npcl(FacialExpression.FRIENDLY, "Thank you much, kind sir. And here's your torso.")
if(ContentAPI.removeItem(player, Item(995,7500000), api.Container.INVENTORY)) {
ContentAPI.addItem(player, Items.FIGHTER_TORSO_10551, 1)
}
stage = END_DIALOGUE
}
}
return true
}
override fun getIds(): IntArray {
return intArrayOf(NPCs.CAPTAIN_CAIN_5030)
}
}
@@ -20,6 +20,8 @@ import core.plugin.Plugin
import core.tools.RandomFunction import core.tools.RandomFunction
import rs09.game.ai.AIPBuilder import rs09.game.ai.AIPBuilder
import rs09.game.ai.AIPlayer import rs09.game.ai.AIPlayer
import rs09.game.ai.general.GeneralBotCreator
import rs09.game.ai.general.scriptrepository.LobsterCatcher
import rs09.game.ai.pvmbots.PvMBotsBuilder import rs09.game.ai.pvmbots.PvMBotsBuilder
import rs09.game.ai.pvp.PVPAIPActions import rs09.game.ai.pvp.PVPAIPActions
import rs09.game.ai.pvp.PVPAIPBuilderUtils import rs09.game.ai.pvp.PVPAIPBuilderUtils
@@ -307,6 +309,7 @@ class AIPCommandPlugin : CommandPlugin() {
return true return true
} }
//"manthiev" -> GeneralBotCreator(player.location, ManThiever()) //"manthiev" -> GeneralBotCreator(player.location, ManThiever())
"fish" -> GeneralBotCreator(Location.create(2805, 3435, 0), LobsterCatcher())
} }
return false return false
} }
@@ -0,0 +1,71 @@
package rs09.game.system.command.sets
import core.game.component.Component
import core.plugin.Initializable
import org.rs09.consts.Components
import rs09.game.ai.general.GeneralBotCreator
import rs09.game.ai.general.scriptrepository.PlayerScripts
import rs09.game.ai.general.scriptrepository.Script
import rs09.game.system.command.Command
import rs09.game.world.GameWorld
import rs09.tools.stringtools.colorize
@Initializable
class BottingCommandSet : CommandSet(Command.Privilege.STANDARD) {
override fun defineCommands() {
define("scripts"){player, _ ->
if(GameWorld.settings?.enabled_botting != true){
player.sendChat("I just tried to do something silly!")
return@define
}
if(!player.getAttribute("botting:warning_shown",false)){
player.dialogueInterpreter.sendDialogue(colorize("%RWARNING: Running a bot script will permanently remove you"),colorize("%Rfrom the highscores."))
player.dialogueInterpreter.addAction { player, buttonId -> player.setAttribute("/save:botting:warning_shown",true) }
return@define
}
for (i in 0..310) {
player.packetDispatch.sendString("", 275, i)
}
var lineid = 11
player.packetDispatch.sendString("Bot Scripts",275,2)
for(script in PlayerScripts.identifierMap.values) {
player.packetDispatch.sendString("<bold>${script.name}</bold>", 275, lineid++)
script.description.forEach { line ->
player.packetDispatch.sendString(line,275,lineid++)
}
player.packetDispatch.sendString("<img=3> ::script ${script.identifier}",275,lineid++)
player.packetDispatch.sendString("<str> </str>",275,lineid++)
}
player.interfaceManager.open(Component(Components.QUESTJOURNAL_SCROLL_275))
}
define("script"){player,args ->
if(GameWorld.settings?.enabled_botting != true){
player.sendChat("I just tried to do something very silly!")
return@define
}
if(!player.getAttribute("botting:warning_shown",false)){
player.dialogueInterpreter.sendDialogue(colorize("%RWARNING: Running a bot script will permanently remove you from the highscores."))
player.dialogueInterpreter.addAction { player, buttonId -> player.setAttribute("/save:botting:warning_shown",true) }
return@define
}
if(args.size < 2){
reject(player,"Usage: ::script identifier")
}
val identifier = args[1]
val script = PlayerScripts.identifierMap[identifier]
if(script == null){
reject(player,"Invalid script identifier")
}
player.interfaceManager.close()
GeneralBotCreator(script!!.clazz.newInstance() as Script,player,true)
player.sendMessage(colorize("%RStarting script..."))
player.sendMessage(colorize("%RTo stop the script, do ::stopscript or log out."))
}
define("stopscript"){player,args ->
val pulse: GeneralBotCreator.BotScriptPulse? = player.getAttribute("botting:script",null)
pulse?.stop()
player.interfaceManager.closeOverlay()
}
}
}
@@ -15,6 +15,7 @@ import core.game.world.map.RegionManager
import core.plugin.CorePluginTypes.StartupPlugin import core.plugin.CorePluginTypes.StartupPlugin
import core.tools.RandomFunction import core.tools.RandomFunction
import core.tools.mysql.DatabaseManager import core.tools.mysql.DatabaseManager
import rs09.game.ai.general.scriptrepository.PlayerScripts
import rs09.ServerConstants import rs09.ServerConstants
import rs09.game.node.entity.state.newsys.StateRepository import rs09.game.node.entity.state.newsys.StateRepository
import rs09.game.system.SystemLogger import rs09.game.system.SystemLogger
@@ -151,6 +152,7 @@ object GameWorld {
} }
ObjectDefinition.getDefinitions().values.forEach(Consumer { obj: ObjectDefinition -> obj.examine }) ObjectDefinition.getDefinitions().values.forEach(Consumer { obj: ObjectDefinition -> obj.examine })
System.gc() System.gc()
PlayerScripts.init()
StateRepository.init() StateRepository.init()
SystemLogger.initTradeLogger() SystemLogger.initTradeLogger()
} }
@@ -41,9 +41,11 @@ object ImmerseWorld {
} }
fun immerseSeersAndCatherby(){ fun immerseSeersAndCatherby(){
GeneralBotCreator(SeersMagicTrees(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE, Location.create(2702, 3397, 0)))
GeneralBotCreator(SeersFlax(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR, Location.create(2738, 3444, 0))) GeneralBotCreator(SeersFlax(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR, Location.create(2738, 3444, 0)))
GeneralBotCreator(FletchingBankstander(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE, Location.create(2722, 3493, 0))) GeneralBotCreator(FletchingBankstander(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE, Location.create(2722, 3493, 0)))
GeneralBotCreator(GlassBlowingBankstander(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE, Location.create(2807, 3441, 0))) GeneralBotCreator(GlassBlowingBankstander(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE, Location.create(2807, 3441, 0)))
GeneralBotCreator(Location.create(2805, 3435, 0), LobsterCatcher())
} }
fun immerseLumbridgeDraynor(){ fun immerseLumbridgeDraynor(){
@@ -53,6 +55,9 @@ object ImmerseWorld {
GeneralBotCreator(ManThiever(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3235, 3213, 0))) GeneralBotCreator(ManThiever(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3235, 3213, 0)))
GeneralBotCreator(FarmerThiever(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3094,3243,0))) GeneralBotCreator(FarmerThiever(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3094,3243,0)))
GeneralBotCreator(FarmerThiever(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3094,3243,0))) GeneralBotCreator(FarmerThiever(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3094,3243,0)))
GeneralBotCreator(DraynorWillows(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.values().random(),Location.create(3094, 3245, 0)))
GeneralBotCreator(DraynorWillows(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.values().random(),Location.create(3094, 3245, 0)))
GeneralBotCreator(DraynorWillows(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.values().random(),Location.create(3094, 3245, 0)))
GeneralBotCreator(DraynorFisher(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3095, 3246, 0))) GeneralBotCreator(DraynorFisher(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3095, 3246, 0)))
GeneralBotCreator(DraynorFisher(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3095, 3246, 0))) GeneralBotCreator(DraynorFisher(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3095, 3246, 0)))
GeneralBotCreator(DraynorFisher(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3095, 3246, 0))) GeneralBotCreator(DraynorFisher(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3095, 3246, 0)))
@@ -78,6 +83,10 @@ object ImmerseWorld {
} }
} }
fun immerseFalador(){
GeneralBotCreator(CoalMiner(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3037, 9737, 0)))
}
fun immerseSlayer(){ fun immerseSlayer(){
GeneralBotCreator(GenericSlayerBot(), assembler.produce(CombatBotAssembler.Type.MELEE,CombatBotAssembler.Tier.HIGH,Location.create(2673, 3635, 0))) GeneralBotCreator(GenericSlayerBot(), assembler.produce(CombatBotAssembler.Type.MELEE,CombatBotAssembler.Tier.HIGH,Location.create(2673, 3635, 0)))
} }