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