Someone asked me about script that will make character run to given position and after reaching it run to another. I made it for free, so I decided to publish it as it may be interesting for others.
It’s not ready-to-run module, but I think it’s very close. For tests I pasted parts of it to ‘battle’ module and it worked.
This code requires ‘BOT_PROTECTION’ disabled in OTClient.
local walkEvent = nil
local positionsList = {
{ x = 32608, y = 32131, z = 7 },
{ x = 32601, y = 32131, z = 7 },
{ x = 32601, y = 32138, z = 7 },
{ x = 32608, y = 32138, z = 7 },
}
local isAttacking = 0
local isFollowing = 0
local currentTargetPositionId = 1
local autowalkTargetPosition = positionsList[currentTargetPositionId]
function init()
connect(LocalPlayer, {
onPositionChange = onCreaturePositionChange
})
connect(g_game, {
onAttackingCreatureChange = onAttack,
onFollowingCreatureChange = onFollow,
onDisappear = onCreatureDisappear
})
end
function terminate()
disconnect(LocalPlayer, {
onPositionChange = onCreaturePositionChange
})
disconnect(g_game, {
onAttackingCreatureChange = onAttack,
onFollowingCreatureChange = onFollow,
onDisappear = onCreatureDisappear
})
end
function walkToTarget()
if not g_game.isOnline() then
walkEvent = scheduleEvent(walkToTarget, 500)
return
end
if g_game.getLocalPlayer():getStepTicksLeft() > 0 then
-- wait until walk animation finish
walkEvent = scheduleEvent(walkToTarget, g_game.getLocalPlayer():getStepTicksLeft())
return
end
if isAttacking or isFollowing or not autowalkTargetPosition then
-- do not walk with selected attack/follow target or when there is no target position
walkEvent = scheduleEvent(walkToTarget, 100)
return
end
-- fast search path on minimap (known tiles)
steps, result = g_map.findPath(g_game.getLocalPlayer():getPosition(), autowalkTargetPosition, 5000, 0)
if result == PathFindResults.Ok then
g_game.walk(steps[1], true)
elseif result == PathFindResults.Position then
-- on target position
currentTargetPositionId = currentTargetPositionId + 1
autowalkTargetPosition = positionsList[(currentTargetPositionId % #positionsList) + 1]
else
-- slow search path on minimap, if not found, start 'scanning' map
steps, result = g_map.findPath(g_game.getLocalPlayer():getPosition(), autowalkTargetPosition, 25000, 1)
if result == PathFindResults.Ok then
g_game.walk(steps[1], true)
end
end
-- limit steps to 10 per second (100 ms between steps)
walkEvent = scheduleEvent(walkToTarget, math.max(100, g_game.getLocalPlayer():getStepTicksLeft()))
end
function onCreaturePositionChange(creature, newPos, oldPos)
if not walkEvent then
-- start automoving 1 second after logging into game
walkEvent = scheduleEvent(walkToTarget, 1000)
end
end
function onAttack(creature)
isAttacking = creature and creature:getId() or 0
end
function onFollow(creature)
isFollowing = creature and creature:getId() or 0
end
function onCreatureDisappear(creature)
if isAttacking == creature:getId() then
isAttacking = 0
end
if isFollowing == creature:getId() then
isFollowing = 0
end
end