refactored to couple Agent and Doer in a more sensible way through inheritance.
This commit is contained in:
parent
065d85dd59
commit
a39268a7fc
@ -11,24 +11,18 @@ import java.awt.event.KeyEvent
|
||||
*
|
||||
* @property doer The Doer used by this Agent for simulating user input.
|
||||
*/
|
||||
class Agent {
|
||||
class Agent: Doer() {
|
||||
|
||||
companion object {
|
||||
/**
|
||||
* Constant for the F6 key code.
|
||||
* Performs a standing crafting task loop for the agent.
|
||||
*
|
||||
* The agent will repeatedly go to the bank, withdraw items,
|
||||
* open the crafting interface, craft items, close it,
|
||||
* and deposit items back until the total volume is reached.
|
||||
*
|
||||
* @param params the parameters configuring how to perform the standing task
|
||||
*/
|
||||
const val F6 = KeyEvent.VK_F6
|
||||
|
||||
/**
|
||||
* Constant for the Spacebar key code.
|
||||
*/
|
||||
const val Space = KeyEvent.VK_SPACE
|
||||
|
||||
/**
|
||||
* Constant for the Minus/Dash key code.
|
||||
*/
|
||||
const val Minus = KeyEvent.VK_MINUS
|
||||
|
||||
fun doStandingTask(params: StandingTaskParams) {
|
||||
val agent = params.agent
|
||||
agent.doLoop(params.totalVolume, params.volumePerStep) {
|
||||
@ -42,6 +36,14 @@ class Agent {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs a looped travel task for the agent.
|
||||
*
|
||||
* This handles having the agent repeatedly travel from the bank
|
||||
* to a station, process items, and travel back.
|
||||
*
|
||||
* @param params the parameters configuring how to perform the task
|
||||
*/
|
||||
fun doTravelTask(params: TravelTaskParams) {
|
||||
val agent = params.agent
|
||||
agent.doLoop(params.totalVolume, params.volumePerStep) {
|
||||
@ -58,26 +60,20 @@ class Agent {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The Doer instance used by this Agent for simulated mouse and keyboard actions.
|
||||
*/
|
||||
private val doer = Doer()
|
||||
|
||||
/**
|
||||
* Calculates the total number of steps needed to process the given volume.
|
||||
* Computes the total number of steps needed to process the given total volume.
|
||||
*
|
||||
* @param totalVolume The total volume that needs to be processed.
|
||||
* @param volumePerStep The volume that can be processed per step.
|
||||
*
|
||||
* @return The computed total steps based on the total volume and volume per step.
|
||||
*
|
||||
* This method calculates the total steps by dividing the total volume by the volume per step,
|
||||
* rounding up to account for any remainder/partial volume, and adding 1 to get an inclusive count.
|
||||
*
|
||||
* For example, with totalVolume = 101 and volumePerStep = 20, it would return 6 total steps.
|
||||
* @param totalVolume the total amount that needs to be processed
|
||||
* @param volumePerStep the amount to process per step
|
||||
* @return the number of steps required to process the total volume
|
||||
*/
|
||||
private fun computeTotalSteps(totalVolume: Int, volumePerStep: Int) =
|
||||
totalVolume / volumePerStep + 1
|
||||
totalVolume / volumePerStep + if (totalVolume % volumePerStep > 0) {
|
||||
1
|
||||
} else {
|
||||
0
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@ -179,14 +175,14 @@ class Agent {
|
||||
*/
|
||||
fun promptUserForPoint(prompt: String): Point {
|
||||
println(prompt)
|
||||
doer.countDown(5) {
|
||||
countDown(5) {
|
||||
print("\rtaking point snapshot in $it... ")
|
||||
if (it == 0) {
|
||||
println("\r ")
|
||||
}
|
||||
}
|
||||
|
||||
return doer.getPointerLocation()
|
||||
return getPointerLocation()
|
||||
}
|
||||
|
||||
/**
|
||||
@ -206,14 +202,14 @@ class Agent {
|
||||
* a reasonable scroll animation speed.
|
||||
*/
|
||||
fun scrollOutToHeight(height: Int, scrollWaitAndVariance: Long = 10L) {
|
||||
doer.sleep(1000)
|
||||
sleep(1000)
|
||||
|
||||
for (i in 0 until height * 2) {
|
||||
doer.scrollIn(scrollWaitAndVariance, scrollWaitAndVariance)
|
||||
scrollIn(scrollWaitAndVariance, scrollWaitAndVariance)
|
||||
}
|
||||
|
||||
for (i in 0 until height) {
|
||||
doer.scrollOut(scrollWaitAndVariance, scrollWaitAndVariance)
|
||||
scrollOut(scrollWaitAndVariance, scrollWaitAndVariance)
|
||||
}
|
||||
}
|
||||
|
||||
@ -242,19 +238,19 @@ class Agent {
|
||||
waitDurationVariance: Long
|
||||
) {
|
||||
//open the bank located by the chest parameter
|
||||
doer.moveMouseLeftClickAndSleep(doer.getAlmostPoint(chest, Doer.WiggleParams()), 900, 400)
|
||||
moveMouseLeftClickAndSleep(getAlmostPoint(chest, Doer.WiggleParams()), 900, 400)
|
||||
//withdraw the desired inventory preset
|
||||
doer.keypress(bankPresetHotkey)
|
||||
keypress(bankPresetHotkey)
|
||||
//sleep for a server tick
|
||||
doer.sleepForNTicks(1)
|
||||
sleepForNTicks(1)
|
||||
//open the crafting dialog with the correct hotkey
|
||||
doer.keypress(craftingDialogueHotkey)
|
||||
keypress(craftingDialogueHotkey)
|
||||
//sleep for a server tick
|
||||
doer.sleepForNTicks(1)
|
||||
sleepForNTicks(1)
|
||||
//press the "accept" default hotkey
|
||||
doer.keypress(Space)
|
||||
keypress(KeyEvent.VK_SPACE)
|
||||
//wait for the desired time to finish
|
||||
doer.sleep(waitDurationMillis, waitDurationVariance)
|
||||
sleep(waitDurationMillis, waitDurationVariance)
|
||||
}
|
||||
|
||||
/**
|
||||
@ -274,16 +270,16 @@ class Agent {
|
||||
*/
|
||||
fun bankStandWithoutDialog(chest: Point, invKey: Int, hotKey: Int) {
|
||||
//open the bank located by the chest parameter
|
||||
doer.moveMouseLeftClickAndSleep(doer.getAlmostPoint(chest, Doer.WiggleParams()), 900, 400)
|
||||
moveMouseLeftClickAndSleep(getAlmostPoint(chest, Doer.WiggleParams()), 900, 400)
|
||||
//withdraw the desired inventory preset
|
||||
doer.keypress(invKey)
|
||||
keypress(invKey)
|
||||
|
||||
doer.sleepForNTicks(1)
|
||||
sleepForNTicks(1)
|
||||
|
||||
//press the hotkey that causes action without dialogue
|
||||
doer.keypress(hotKey)
|
||||
keypress(hotKey)
|
||||
|
||||
doer.sleepForNTicks(1)
|
||||
sleepForNTicks(1)
|
||||
}
|
||||
|
||||
/**
|
||||
@ -314,24 +310,24 @@ class Agent {
|
||||
waitDurationVarianceMillis: Long
|
||||
) {
|
||||
//move to the bank and open the interface
|
||||
doer.moveMouseLeftClickAndSleep(
|
||||
doer.getAlmostPoint(chest, Doer.WiggleParams()),
|
||||
moveMouseLeftClickAndSleep(
|
||||
getAlmostPoint(chest, Doer.WiggleParams()),
|
||||
travelDurationMillis,
|
||||
travelDurationVarianceMillis
|
||||
)
|
||||
|
||||
//withdraw desired loadout
|
||||
doer.keypress(bankPresetHotkey)
|
||||
doer.sleepForNTicks(1)
|
||||
keypress(bankPresetHotkey)
|
||||
sleepForNTicks(1)
|
||||
|
||||
//move to station and open the crafting dialog
|
||||
doer.moveMouseLeftClickAndSleep(station, travelDurationMillis, travelDurationVarianceMillis)
|
||||
moveMouseLeftClickAndSleep(station, travelDurationMillis, travelDurationVarianceMillis)
|
||||
|
||||
//start the crafting task
|
||||
doer.keypress(KeyEvent.VK_SPACE)
|
||||
keypress(KeyEvent.VK_SPACE)
|
||||
|
||||
//wait for it to complete
|
||||
doer.sleep(waitDurationMillis, waitDurationVarianceMillis)
|
||||
sleep(waitDurationMillis, waitDurationVarianceMillis)
|
||||
}
|
||||
|
||||
/*==============================================================================================================
|
||||
|
||||
@ -32,7 +32,7 @@ import kotlin.random.Random
|
||||
*
|
||||
* @constructor Creates a Doer instance with a Robot.
|
||||
*/
|
||||
class Doer(private val robot: Robot = Robot()) {
|
||||
open class Doer(private val robot: Robot = Robot()) {
|
||||
companion object{
|
||||
/**
|
||||
* The duration in milliseconds of one "tick". The duration of 600ms matches the tick duration of game servers.
|
||||
@ -130,7 +130,7 @@ class Doer(private val robot: Robot = Robot()) {
|
||||
*
|
||||
* Returns immediately If button is negative. Button must be a positive integer.
|
||||
*/
|
||||
private fun click(button: Int) {
|
||||
fun click(button: Int) {
|
||||
//guardian logic
|
||||
if (button < 0) {
|
||||
return
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import java.awt.Point
|
||||
import java.awt.event.InputEvent
|
||||
import java.awt.event.KeyEvent
|
||||
|
||||
/**
|
||||
@ -184,7 +185,7 @@ object Routines {
|
||||
val well = agent.promptUserForPoint("Put your mouse over the well...")
|
||||
|
||||
agent.doLoop(params.totalVolume, params.volumePerStep) {
|
||||
agent.processAtStationNearBank(chest, well, Agent.F6, 0, 0, 6500, 1000)
|
||||
agent.processAtStationNearBank(chest, well, KeyEvent.VK_F6, 0, 0, 6500, 1000)
|
||||
}
|
||||
|
||||
}
|
||||
@ -240,7 +241,7 @@ object Routines {
|
||||
val chestFromSaw = Point(1226, 180)
|
||||
|
||||
agent.doLoop(params.totalVolume, params.volumePerStep) {
|
||||
agent.processAtStationNearBank(chestFromSaw, sawFromChest, Agent.F6, 2700, 500, 64000, 1000)
|
||||
agent.processAtStationNearBank(chestFromSaw, sawFromChest, KeyEvent.VK_F6, 2700, 500, 64000, 1000)
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user