-
Fixed it. The bot now won't renew follow until there's no monsters on the screen...This prevents it constantly switching and running between the attack and follow targets; and prevents the bot spamming spell strike at the ground or on other players.
There's still quite a few stairs, ladders, etc. to be filled in based on my adventures on the OT I'm playing - so please don't view that list as a complete list (some ladders are misplaced as stairs too, sorry).
Code:
FollowThisPerson = "" -- Character name to follow.
FloorChangers = {
Ladders = {Up = {1948, 1950},
Down = {369, 412, 432, 469, 482, 859, 7182, 7478, 8658}},
Holes = {Up = {},
Down = {293, 294, 595, 385, 594}},
RopeSpots = {Up = {386},
Down = {}},
Stairs = {Up = {1947, 1950, 1952, 1954, 1956, 1957, 1958, 1977, 1978, 7542, 7544, 7548, 8657},
Down = {413, 414, 434, 437, 438, 469, 600, 4826, 8932, 6128, 6129, 7731, 7736}},
Sewers = {Up = {},
Down = {435, }},
}
---------------------------------------------
-------------- END OF CONFIG ----------------
---------------------------------------------
local target = FollowThisPerson
local lastKnownPosition
local function goLastKnown()
while Self.DistanceFromPosition(lastKnownPosition.x, lastKnownPosition.y, lastKnownPosition.z) > 1 do
Self.UseItemFromGround(lastKnownPosition.x, lastKnownPosition.y, lastKnownPosition.z)
wait(200, 700)
end
end
local function handleUse(pos)
goLastKnown()
local lastZ = Self.Position().z
while Self.Position().z == lastZ do
Self.UseItemFromGround(pos.x, pos.y, pos.z)
wait(400, 800)
end
end
local function handleStep(pos)
goLastKnown()
local lastZ = Self.Position().z
while Self.Position().z == lastZ do
Self.Step(Map.GetDirectionTo(Self.Position(), pos))
wait(400, 800)
end
end
local function getRope()
local ropes = {"rope", "elvenhair rope"}
for _, rope in ipairs(ropes) do
if Self.ItemCount(rope) > 0 then return Item.GetID(rope) end
end
end
local function handleRope(pos)
goLastKnown()
local lastZ = Self.Position().z
while Self.Position().z == lastZ do
Self.UseItemWithGround(getRope(), pos.x, pos.y, pos.z)
wait(400, 800)
end
end
local floorChangeSelector = {
Ladders = {Up=handleUse, Down=handleStep},
Holes = {Up=handleStep, Down=handleStep},
RopeSpots = {Up=handleRope, Down=handleRope},
Stairs = {Up=handleStep, Down=handleStep},
Sewers = {Up=handleUse, Down=handleUse},
}
Module("Follow-Renew", function(f)
local c = Creature(target)
if c and (#Self.GetTargets(8) == 0) and not c:isFollowed() then
c:Follow()
end
end)
local function checkTargetPos()
local c = Creature(target)
if c:Position().z == Self.Position().z then
lastKnownPosition = c:Position()
end
end
local function distance(pos1, pos2)
local pos2 = pos2 or lastKnownPosition or Self.Position()
return math.abs(pos1.x-pos2.x) + math.abs(pos1.y-pos2.y)
end
local function executeClosest(possibilities)
local closest
local closestDistance = 99999
for _, data in ipairs(possibilities) do
local dist = distance(data.pos)
if dist < closestDistance then
closest = data
closestDistance = dist
end
end
if closest then closest.changer(closest.pos) end
end
local function handleFloorChange()
local c = Creature(target)
local range = 2
local p = Self.Position()
local possibleChangers = {}
for _, dir in ipairs({"Down", "Up"}) do
for changer, data in pairs(FloorChangers) do
for x = -range, range do
for y = -range, range do
if table.find(data[dir], Map.GetTopUseItem(p.x+x, p.y+y, p.z).id) then
table.insert(possibleChangers, {changer=floorChangeSelector[changer][dir], pos={x=p.x+x, y=p.y+y, z=p.z}})
end
end
end
end
end
executeClosest(possibleChangers)
end
local function targetMissing()
for name, c in Creature.iPlayers() do
if name == target then
return c:Position().z ~= Self.Position().z
end
end
return true
end
Module("Handle floor change", function(f)
checkTargetPos()
if targetMissing() and lastKnownPosition then
handleFloorChange()
end
end)
Enjoy...
-
-
Can it be done to keep the distance tracking the player?