mirror of
https://gitlab.com/2009scape/2009scape.git
synced 2025-12-20 21:40:27 -07:00
Adventure bots no longer get stuck at Falador wall, Draynor bank or east of Catherby
Added moderator+ command ::botinfo that lets you see what a bot is up to
This commit is contained in:
parent
066422e7cd
commit
f76d32c203
4 changed files with 103 additions and 19 deletions
|
|
@ -39,6 +39,11 @@ public abstract class Script {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return bot.getName() + " is a " + this.getClass().getSimpleName() + " at location " + bot.getLocation().toString() + " Current pulse: " + bot.getPulseManager().getCurrent();
|
||||||
|
}
|
||||||
|
|
||||||
public abstract void tick();
|
public abstract void tick();
|
||||||
|
|
||||||
public void setLevel(int skill, int level) {
|
public void setLevel(int skill, int level) {
|
||||||
|
|
|
||||||
|
|
@ -353,12 +353,39 @@ class ScriptAPI(private val bot: Player) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function to iteratively walk an array of Locations to get over complex obstacles.
|
||||||
|
* @param steps the array of locations to walk to.
|
||||||
|
* @author dginovker
|
||||||
|
*/
|
||||||
|
fun walkArray(steps: Array<Location>){
|
||||||
|
bot.pulseManager.run(object : Pulse(){
|
||||||
|
var stepIndex = 0
|
||||||
|
override fun pulse(): Boolean {
|
||||||
|
// If the stepIndex is out of bounds, we're done
|
||||||
|
if(stepIndex >= steps.size) return true
|
||||||
|
// If we're near the last step, we're done
|
||||||
|
if (bot.location.withinDistance(steps[steps.size - 1], 2)) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// If we're not near the next step, walk to it
|
||||||
|
if (!bot.location.withinDistance(steps[stepIndex], 5)) {
|
||||||
|
walkTo(steps[stepIndex])
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
// If we're near the next step, increment the step index
|
||||||
|
stepIndex++
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param loc the location to walk to.
|
* @param loc the location to walk to.
|
||||||
* @param radius tiles around the location the bot could walk to.
|
* @param radius tiles around the location the bot could walk to.
|
||||||
* @author Kermit
|
* @author Kermit
|
||||||
*/
|
*/
|
||||||
|
|
||||||
fun randomWalkTo(loc: Location, radius: Int) {
|
fun randomWalkTo(loc: Location, radius: Int) {
|
||||||
if(!bot.walkingQueue.isMoving) {
|
if(!bot.walkingQueue.isMoving) {
|
||||||
GlobalScope.launch {
|
GlobalScope.launch {
|
||||||
|
|
@ -383,8 +410,6 @@ class ScriptAPI(private val bot: Player) {
|
||||||
diffY /= 2
|
diffY /= 2
|
||||||
}
|
}
|
||||||
GameWorld.Pulser.submit(object : MovementPulse(bot, bot.location.transform(diffX, diffY, 0), Pathfinder.SMART) {
|
GameWorld.Pulser.submit(object : MovementPulse(bot, bot.location.transform(diffX, diffY, 0), Pathfinder.SMART) {
|
||||||
|
|
||||||
|
|
||||||
override fun pulse(): Boolean {
|
override fun pulse(): Boolean {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import core.game.interaction.DestinationFlag
|
||||||
import core.game.interaction.MovementPulse
|
import core.game.interaction.MovementPulse
|
||||||
import core.game.node.scenery.Scenery
|
import core.game.node.scenery.Scenery
|
||||||
import core.game.node.entity.combat.CombatStyle
|
import core.game.node.entity.combat.CombatStyle
|
||||||
import rs09.game.node.entity.combat.CombatSwingHandler
|
|
||||||
import core.game.node.entity.skill.Skills
|
import core.game.node.entity.skill.Skills
|
||||||
import core.game.node.item.Item
|
import core.game.node.item.Item
|
||||||
import core.game.system.task.Pulse
|
import core.game.system.task.Pulse
|
||||||
|
|
@ -12,12 +11,7 @@ import rs09.game.world.GameWorld
|
||||||
import core.game.world.map.Location
|
import core.game.world.map.Location
|
||||||
import core.game.world.map.RegionManager
|
import core.game.world.map.RegionManager
|
||||||
import core.game.world.map.zone.ZoneBorders
|
import core.game.world.map.zone.ZoneBorders
|
||||||
import rs09.game.world.repository.Repository.sendNews
|
|
||||||
import core.game.world.update.flag.*
|
import core.game.world.update.flag.*
|
||||||
import core.game.world.update.flag.context.Animation
|
|
||||||
import core.game.world.update.flag.context.ChatMessage
|
|
||||||
import core.game.world.update.flag.context.Graphics
|
|
||||||
import core.game.world.update.flag.player.ChatFlag
|
|
||||||
import core.tools.RandomFunction
|
import core.tools.RandomFunction
|
||||||
import org.json.simple.JSONArray
|
import org.json.simple.JSONArray
|
||||||
import org.json.simple.JSONObject
|
import org.json.simple.JSONObject
|
||||||
|
|
@ -78,6 +72,10 @@ class Adventurer(val style: CombatStyle): Script() {
|
||||||
skills[Skills.SLAYER] = 90
|
skills[Skills.SLAYER] = 90
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return "${bot.name} is an Adventurer bot at ${bot.location}! State: $state - City: $city"
|
||||||
|
}
|
||||||
|
|
||||||
private var state = State.START
|
private var state = State.START
|
||||||
|
|
||||||
fun getRandomCity(): Location{
|
fun getRandomCity(): Location{
|
||||||
|
|
@ -156,10 +154,10 @@ class Adventurer(val style: CombatStyle): Script() {
|
||||||
|
|
||||||
// zoneborder checker
|
// zoneborder checker
|
||||||
if(ticks % 30 == 0){
|
if(ticks % 30 == 0){
|
||||||
for(border in common_stuck_locations){
|
for((zone, resolution) in common_stuck_locations){
|
||||||
if(border.insideBorder(bot)){
|
if(zone.insideBorder(bot)){
|
||||||
refresh()
|
resolution(this)
|
||||||
ticks = 0
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -551,9 +549,50 @@ class Adventurer(val style: CombatStyle): Script() {
|
||||||
magics,gemrocks,chaosnpc,chaosnpc,
|
magics,gemrocks,chaosnpc,chaosnpc,
|
||||||
chaosnpc2,taverly)
|
chaosnpc2,taverly)
|
||||||
|
|
||||||
val common_stuck_locations = arrayListOf(
|
private val whiteWolfMountainTop = Location(2850, 3496, 0)
|
||||||
ZoneBorders(2861,3425,2869,3440),
|
private val catherbyToTopOfWhiteWolf = arrayOf(Location(2856, 3442, 0), Location(2848, 3455, 0), Location(2848, 3471, 0), Location(2848, 3487, 0))
|
||||||
ZoneBorders(2937,3356,2936,3353)
|
private val tavleryToTopOfWhiteWolf = arrayOf(Location(2872, 3425, 0), Location(2863, 3440, 0), Location(2863, 3459, 0), Location(2854, 3475, 0), Location(2859, 3488, 0))
|
||||||
|
val common_stuck_locations = mapOf(
|
||||||
|
// South of Tavlery dungeon
|
||||||
|
ZoneBorders(2878, 3386, 2884, 3395) to { it: Adventurer ->
|
||||||
|
it.scriptAPI.walkArray(tavleryToTopOfWhiteWolf + whiteWolfMountainTop + catherbyToTopOfWhiteWolf.reversedArray())
|
||||||
|
},
|
||||||
|
// West of Tavlery dungeon
|
||||||
|
ZoneBorders(2874, 3390, 2880, 3401) to { it: Adventurer ->
|
||||||
|
it.scriptAPI.walkArray(tavleryToTopOfWhiteWolf + whiteWolfMountainTop + catherbyToTopOfWhiteWolf.reversedArray())
|
||||||
|
},
|
||||||
|
// South of White Wolf Mountain in Tavlery
|
||||||
|
ZoneBorders(2865,3408,2874,3423) to { it: Adventurer ->
|
||||||
|
it.scriptAPI.walkArray(tavleryToTopOfWhiteWolf + whiteWolfMountainTop + catherbyToTopOfWhiteWolf.reversedArray())
|
||||||
|
},
|
||||||
|
// On beginning of White Wolf Mountain in Tavlery
|
||||||
|
ZoneBorders(2855, 3454, 2852, 3450) to { it: Adventurer ->
|
||||||
|
it.scriptAPI.walkArray(tavleryToTopOfWhiteWolf + whiteWolfMountainTop + catherbyToTopOfWhiteWolf.reversedArray())
|
||||||
|
},
|
||||||
|
// South of White Wolf Mountain in Catherby
|
||||||
|
ZoneBorders(2861,3425,2867, 3432) to { it: Adventurer ->
|
||||||
|
it.scriptAPI.walkArray(catherbyToTopOfWhiteWolf + whiteWolfMountainTop + tavleryToTopOfWhiteWolf.reversedArray())
|
||||||
|
},
|
||||||
|
// On beginning of White Wolf Mountain in Catherby
|
||||||
|
ZoneBorders(2863, 3441, 2859, 3438) to { it: Adventurer ->
|
||||||
|
it.scriptAPI.walkArray(catherbyToTopOfWhiteWolf + whiteWolfMountainTop + tavleryToTopOfWhiteWolf.reversedArray())
|
||||||
|
},
|
||||||
|
// At the Crumbling Wall in Falador
|
||||||
|
ZoneBorders(2937,3356,2936,3353) to { it: Adventurer ->
|
||||||
|
// Interact with the Crumbling Wall
|
||||||
|
val wall = it.scriptAPI.getNearestNode("Crumbling wall", true);
|
||||||
|
if (wall == null) {
|
||||||
|
it.refresh()
|
||||||
|
it.ticks = 0
|
||||||
|
return@to
|
||||||
|
}
|
||||||
|
it.scriptAPI.interact(it.bot, wall, "Climb-over")
|
||||||
|
},
|
||||||
|
// Northwest corner of Draynor Bank
|
||||||
|
ZoneBorders(3092, 3246, 3091, 3247) to { it: Adventurer ->
|
||||||
|
// Walk into Draynor Bank
|
||||||
|
it.scriptAPI.walkTo(Location(3093, 3243, 0))
|
||||||
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
val dialogue: JSONObject
|
val dialogue: JSONObject
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,8 @@ import kotlinx.coroutines.GlobalScope
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import org.rs09.consts.Components
|
import org.rs09.consts.Components
|
||||||
import rs09.ServerConstants
|
import rs09.ServerConstants
|
||||||
|
import rs09.game.ai.AIPlayer
|
||||||
|
import rs09.game.ai.AIRepository
|
||||||
import rs09.game.camerautils.PlayerCamera
|
import rs09.game.camerautils.PlayerCamera
|
||||||
import rs09.game.content.activity.fishingtrawler.TrawlerLoot
|
import rs09.game.content.activity.fishingtrawler.TrawlerLoot
|
||||||
import rs09.game.content.ame.RandomEventManager
|
import rs09.game.content.ame.RandomEventManager
|
||||||
|
|
@ -191,10 +193,23 @@ class MiscCommandSet : CommandSet(Privilege.ADMIN){
|
||||||
player.packetDispatch.sendString(red + "<img=" + (Rights.getChatIcon(p) - 1) + ">" + p.username + if(rights > 0) " [ip=" + p.details.ipAddress + ", name=" + p.details.compName + "]" else "",275,lineStart++)
|
player.packetDispatch.sendString(red + "<img=" + (Rights.getChatIcon(p) - 1) + ">" + p.username + if(rights > 0) " [ip=" + p.details.ipAddress + ", name=" + p.details.compName + "]" else "",275,lineStart++)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* ===================================================================================
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lists information about a bot
|
||||||
|
*/
|
||||||
|
define("botinfo", Privilege.MODERATOR, "::botinfo <lt>botname<gt>", "Prints debug information about a bot"){ player, args ->
|
||||||
|
val scriptInstances = AIRepository.PulseRepository
|
||||||
|
|
||||||
|
// Find the bot with the given name (non-case sensitive)
|
||||||
|
val bot = scriptInstances.find { it.botScript.bot.username.equals(args[1], true) }
|
||||||
|
if (bot == null) {
|
||||||
|
reject(player, "No bot with that name found.")
|
||||||
|
return@define
|
||||||
|
}
|
||||||
|
val botInfo = bot.botScript.toString()
|
||||||
|
// Print the bot's information, max 80chars per line
|
||||||
|
botInfo.chunked(80).forEach { notify(player, it) }
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Opens the credit/voting shop
|
* Opens the credit/voting shop
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue