diff --git a/Server/data/configs/drop_tables.json b/Server/data/configs/drop_tables.json index cbfc65315..dc0d9663b 100644 --- a/Server/data/configs/drop_tables.json +++ b/Server/data/configs/drop_tables.json @@ -10178,26 +10178,14 @@ }, { "minAmount": "1", - "weight": "40.0", - "id": "2677", - "maxAmount": "1" - }, - { - "minAmount": "5", "weight": "50.0", - "id": "386", - "maxAmount": "15" - }, - { - "minAmount": "1", - "weight": "50.0", - "id": "1373", + "id": "1289", "maxAmount": "1" }, { "minAmount": "1", "weight": "50.0", - "id": "1201", + "id": "1303", "maxAmount": "1" }, { @@ -10209,7 +10197,13 @@ { "minAmount": "1", "weight": "50.0", - "id": "1289", + "id": "1113", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "50.0", + "id": "1147", "maxAmount": "1" }, { @@ -10219,112 +10213,10 @@ "maxAmount": "1" }, { - "minAmount": "1", + "minAmount": "20", "weight": "50.0", - "id": "5298", - "maxAmount": "2" - }, - { - "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" + "id": "4699", + "maxAmount": "40" }, { "minAmount": "20", @@ -10333,146 +10225,272 @@ "maxAmount": "40" }, { - "minAmount": "20", + "minAmount": "10", "weight": "50.0", + "id": "565", + "maxAmount": "20" + }, + { + "minAmount": "20", + "weight": "25.0", "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", - "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", "id": "5323", - "maxAmount": "4" + "maxAmount": "10" }, { - "minAmount": "1", + "minAmount": "4", "weight": "25.0", - "id": "12176", - "maxAmount": "2" + "id": "5321", + "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", "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", "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", "weight": "25.0", "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", "weight": "25.0", - "id": "1163", - "maxAmount": "1" + "id": "163", + "maxAmount": "6" }, { "minAmount": "1", "weight": "25.0", - "id": "1113", - "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "25.0", - "id": "208", - "maxAmount": "11" - }, - { - "minAmount": "1", - "weight": "25.0", - "id": "5301", + "id": "139", "maxAmount": "3" }, { - "minAmount": "1", - "weight": "25.0", - "id": "218", - "maxAmount": "11" + "minAmount": "3", + "weight": "50.0", + "id": "2362", + "maxAmount": "5" }, { - "minAmount": "10", + "minAmount": "3", + "weight": "50.0", + "id": "1602", + "maxAmount": "5" + }, + { + "minAmount": "2", "weight": "25.0", - "id": "565", - "maxAmount": "20" + "id": "1443", + "maxAmount": "5" + }, + { + "minAmount": "3000", + "weight": "100.0", + "id": "995", + "maxAmount": "13000" }, { "minAmount": "1", - "weight": "1.0", + "weight": "3.42", "id": "14484", "maxAmount": "1" }, { "minAmount": "1", - "weight": "1.0", - "id": "14474", - "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "1.0", - "id": "14476", - "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "1.0", + "weight": "1.71", "id": "14472", "maxAmount": "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", "maxAmount": "1" } @@ -26358,6 +26376,12 @@ "ids": "1615,4230", "description": "", "main": [ + { + "minAmount": "1", + "weight": "50.0", + "id": "1365", + "maxAmount": "1" + }, { "minAmount": "1", "weight": "50.0", @@ -26370,18 +26394,6 @@ "id": "1361", "maxAmount": "1" }, - { - "minAmount": "1", - "weight": "50.0", - "id": "1365", - "maxAmount": "1" - }, - { - "minAmount": "1", - "weight": "2.4", - "id": "4151", - "maxAmount": "1" - }, { "minAmount": "1", "weight": "25.0", @@ -26491,8 +26503,8 @@ "maxAmount": "3" }, { - "minAmount": "9", - "weight": "50.0", + "minAmount": "30", + "weight": "100.0", "id": "995", "maxAmount": "3000" }, @@ -26514,12 +26526,6 @@ "id": "7937", "maxAmount": "60" }, - { - "minAmount": "1", - "weight": "25.0", - "id": "1440", - "maxAmount": "1" - }, { "minAmount": "1", "weight": "25.0", @@ -26540,13 +26546,19 @@ }, { "minAmount": "1", - "weight": "5.0", + "weight": "25.0", "id": "31", "maxAmount": "1" }, { "minAmount": "1", - "weight": "100.0", + "weight": "2.5", + "id": "4151", + "maxAmount": "1" + }, + { + "minAmount": "1", + "weight": "150.0", "id": "0", "maxAmount": "1" } @@ -33874,28 +33886,22 @@ "main": [ { "minAmount": "1", - "weight": "0.685", + "weight": "0.675", "id": "6528", "maxAmount": "1" }, { "minAmount": "1", - "weight": "0.685", + "weight": "0.675", "id": "6524", "maxAmount": "1" }, { "minAmount": "1", - "weight": "0.685", + "weight": "0.675", "id": "6568", "maxAmount": "1" }, - { - "minAmount": "1", - "weight": "5.0", - "id": "1393", - "maxAmount": "1" - }, { "minAmount": "12", "weight": "5.0", diff --git a/Server/src/main/java/core/game/content/dialogue/DialoguePlugin.java b/Server/src/main/java/core/game/content/dialogue/DialoguePlugin.java index 119bf38b9..962164acf 100644 --- a/Server/src/main/java/core/game/content/dialogue/DialoguePlugin.java +++ b/Server/src/main/java/core/game/content/dialogue/DialoguePlugin.java @@ -311,4 +311,22 @@ public abstract class DialoguePlugin implements Plugin { } } + /** + * 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)); + } + } \ No newline at end of file diff --git a/Server/src/main/java/core/game/content/dialogue/HansDialoguePlugin.java b/Server/src/main/java/core/game/content/dialogue/HansDialoguePlugin.java index 0f65246e6..2639d98a0 100644 --- a/Server/src/main/java/core/game/content/dialogue/HansDialoguePlugin.java +++ b/Server/src/main/java/core/game/content/dialogue/HansDialoguePlugin.java @@ -137,7 +137,7 @@ public final class HansDialoguePlugin extends DialoguePlugin { case 12: switch(buttonId){ case 1: - options("2.5x","5x","10x","20x"); + options("1.0x","2.5x","10x","20x"); stage++; break; case 2: @@ -150,7 +150,7 @@ public final class HansDialoguePlugin extends DialoguePlugin { switch(buttonId){ case 1: if(player.newPlayer) { - player.getSkills().experienceMutiplier = 2.5; + player.getSkills().experienceMutiplier = 1.0; stage = 14; } else { stage = 15; @@ -159,7 +159,7 @@ public final class HansDialoguePlugin extends DialoguePlugin { break; case 2: if(player.newPlayer){ - player.getSkills().experienceMutiplier = 5.0; + player.getSkills().experienceMutiplier = 2.5; stage = 14; } else { stage = 15; diff --git a/Server/src/main/java/core/game/interaction/npc/NPCTradePlugin.java b/Server/src/main/java/core/game/interaction/npc/NPCTradePlugin.java deleted file mode 100644 index ab37bc5fa..000000000 --- a/Server/src/main/java/core/game/interaction/npc/NPCTradePlugin.java +++ /dev/null @@ -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 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); - } - -} diff --git a/Server/src/main/java/core/game/interaction/npc/NPCTradePlugin.kt b/Server/src/main/java/core/game/interaction/npc/NPCTradePlugin.kt new file mode 100644 index 000000000..f2f3bb769 --- /dev/null +++ b/Server/src/main/java/core/game/interaction/npc/NPCTradePlugin.kt @@ -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) + } + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/api/DialUtils.kt b/Server/src/main/kotlin/api/DialUtils.kt index 37f89c69e..a0db709e3 100644 --- a/Server/src/main/kotlin/api/DialUtils.kt +++ b/Server/src/main/kotlin/api/DialUtils.kt @@ -1,3 +1,4 @@ +package api import rs09.game.system.SystemLogger import java.util.* import kotlin.system.exitProcess diff --git a/Server/src/main/kotlin/rs09/game/ai/general/ScriptAPI.kt b/Server/src/main/kotlin/rs09/game/ai/general/ScriptAPI.kt index 567aca3b3..18226073b 100644 --- a/Server/src/main/kotlin/rs09/game/ai/general/ScriptAPI.kt +++ b/Server/src/main/kotlin/rs09/game/ai/general/ScriptAPI.kt @@ -550,6 +550,26 @@ 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) + } + 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 diff --git a/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/ChickenKiller.kt b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/ChickenKiller.kt new file mode 100644 index 000000000..4bb569afc --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/ChickenKiller.kt @@ -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 + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/CoalMiner.kt b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/CoalMiner.kt new file mode 100644 index 000000000..1d3a533ed --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/CoalMiner.kt @@ -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) + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/DraynorWillows.kt b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/DraynorWillows.kt new file mode 100644 index 000000000..c7051f8e3 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/DraynorWillows.kt @@ -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 + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/LobsterCatcher.kt b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/LobsterCatcher.kt new file mode 100644 index 000000000..d8364100c --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/LobsterCatcher.kt @@ -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() + 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) { + 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() + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/PlayerScripts.kt b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/PlayerScripts.kt new file mode 100644 index 000000000..1aaba11e6 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/PlayerScripts.kt @@ -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, val name: String, val clazz: Class<*>) + val identifierMap = HashMap() + + + 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 + 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()) + } + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/SeersMagicTrees.kt b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/SeersMagicTrees.kt new file mode 100644 index 000000000..313ad1561 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/SeersMagicTrees.kt @@ -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 + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/SharkCatcher.kt b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/SharkCatcher.kt index 2d78e48a0..f1a909d53 100644 --- a/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/SharkCatcher.kt +++ b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/SharkCatcher.kt @@ -114,6 +114,7 @@ class SharkCatcher : Script() { } State.FISHING -> { + bot.interfaceManager.close() if (Random.nextBoolean()) { tick = 0 val spot = scriptAPI.getNearestNode(334, false) diff --git a/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/VarrockEssenceMiner.kt b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/VarrockEssenceMiner.kt index d429713c4..5054b98e0 100644 --- a/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/VarrockEssenceMiner.kt +++ b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/VarrockEssenceMiner.kt @@ -22,6 +22,7 @@ class VarrockEssenceMiner : Script(){ when(state){ State.TO_ESSENCE -> { + bot.interfaceManager.close() if(!auburyZone.insideBorder(bot)) scriptAPI.walkTo(auburyZone.randomLoc) else { diff --git a/Server/src/main/kotlin/rs09/game/content/dialogue/CaptainCainDialogue.kt b/Server/src/main/kotlin/rs09/game/content/dialogue/CaptainCainDialogue.kt new file mode 100644 index 000000000..f5de9b1fd --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/content/dialogue/CaptainCainDialogue.kt @@ -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) + } + +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/system/command/oldsys/AIPCommandPlugin.kt b/Server/src/main/kotlin/rs09/game/system/command/oldsys/AIPCommandPlugin.kt index 29c5513c7..71c61da18 100644 --- a/Server/src/main/kotlin/rs09/game/system/command/oldsys/AIPCommandPlugin.kt +++ b/Server/src/main/kotlin/rs09/game/system/command/oldsys/AIPCommandPlugin.kt @@ -20,6 +20,8 @@ import core.plugin.Plugin import core.tools.RandomFunction import rs09.game.ai.AIPBuilder 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.pvp.PVPAIPActions import rs09.game.ai.pvp.PVPAIPBuilderUtils @@ -307,6 +309,7 @@ class AIPCommandPlugin : CommandPlugin() { return true } //"manthiev" -> GeneralBotCreator(player.location, ManThiever()) + "fish" -> GeneralBotCreator(Location.create(2805, 3435, 0), LobsterCatcher()) } return false } diff --git a/Server/src/main/kotlin/rs09/game/system/command/sets/BottingCommandSet.kt b/Server/src/main/kotlin/rs09/game/system/command/sets/BottingCommandSet.kt new file mode 100644 index 000000000..8131ecb3a --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/system/command/sets/BottingCommandSet.kt @@ -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("${script.name}", 275, lineid++) + script.description.forEach { line -> + player.packetDispatch.sendString(line,275,lineid++) + } + player.packetDispatch.sendString(" ::script ${script.identifier}",275,lineid++) + player.packetDispatch.sendString(" ",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() + } + } +} \ No newline at end of file diff --git a/Server/src/main/kotlin/rs09/game/world/GameWorld.kt b/Server/src/main/kotlin/rs09/game/world/GameWorld.kt index f4a75ec0c..7bd821755 100644 --- a/Server/src/main/kotlin/rs09/game/world/GameWorld.kt +++ b/Server/src/main/kotlin/rs09/game/world/GameWorld.kt @@ -15,6 +15,7 @@ import core.game.world.map.RegionManager import core.plugin.CorePluginTypes.StartupPlugin import core.tools.RandomFunction import core.tools.mysql.DatabaseManager +import rs09.game.ai.general.scriptrepository.PlayerScripts import rs09.ServerConstants import rs09.game.node.entity.state.newsys.StateRepository import rs09.game.system.SystemLogger @@ -151,6 +152,7 @@ object GameWorld { } ObjectDefinition.getDefinitions().values.forEach(Consumer { obj: ObjectDefinition -> obj.examine }) System.gc() + PlayerScripts.init() StateRepository.init() SystemLogger.initTradeLogger() } diff --git a/Server/src/main/kotlin/rs09/game/world/ImmerseWorld.kt b/Server/src/main/kotlin/rs09/game/world/ImmerseWorld.kt index 7fe7cde07..cdfc035bb 100644 --- a/Server/src/main/kotlin/rs09/game/world/ImmerseWorld.kt +++ b/Server/src/main/kotlin/rs09/game/world/ImmerseWorld.kt @@ -41,9 +41,11 @@ object ImmerseWorld { } 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(FletchingBankstander(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE, Location.create(2722, 3493, 0))) GeneralBotCreator(GlassBlowingBankstander(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.AVERAGE, Location.create(2807, 3441, 0))) + GeneralBotCreator(Location.create(2805, 3435, 0), LobsterCatcher()) } fun immerseLumbridgeDraynor(){ @@ -53,6 +55,9 @@ object ImmerseWorld { 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(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))) @@ -78,6 +83,10 @@ object ImmerseWorld { } } + fun immerseFalador(){ + GeneralBotCreator(CoalMiner(), skillingBotAssembler.produce(SkillingBotAssembler.Wealth.POOR,Location.create(3037, 9737, 0))) + } + fun immerseSlayer(){ GeneralBotCreator(GenericSlayerBot(), assembler.produce(CombatBotAssembler.Type.MELEE,CombatBotAssembler.Tier.HIGH,Location.create(2673, 3635, 0))) }