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..9fc4b307b --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/CoalMiner.kt @@ -0,0 +1,160 @@ +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 + +@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 -> { + 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(bot.inventory.getAmount(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.bankItem(Items.COAL_453) + state = State.TO_MINE + } + + State.TO_MINE -> { + if(ladderSwitch){ + 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..b9195bb2e --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/DraynorWillows.kt @@ -0,0 +1,93 @@ +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) + willowtree?.let { InteractionListeners.run(willowtree.id, + InteractionListener.OBJECT,"chop",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..6863f20dd --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/LobsterCatcher.kt @@ -0,0 +1,197 @@ +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 -> { + 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..48b7b45c3 --- /dev/null +++ b/Server/src/main/kotlin/rs09/game/ai/general/scriptrepository/SeersMagicTrees.kt @@ -0,0 +1,117 @@ +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) + tree?.let { InteractionListeners.run(tree.id, InteractionListener.OBJECT,"chop",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 -> { + 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/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))) }