Untitled
unknown
plain_text
2 years ago
4.7 kB
4
Indexable
UI.Separator() UI.Separator() local followThis = tostring(storage.followLeader) FloorChangers = { Ladders = { Up = {1948, 5542, 16693, 16692}, Down = {432, 412, 469, 1949, 411, 469} }, Holes = { Up = {}, Down = {293, 294, 595, 4728, 385, 9853} }, RopeSpots = { Up = {386,}, Down = {} }, Stairs = { Up = {16690, 1958, 7548, 7544, 1952, 1950, 1947, 7542, 855, 856, 1978, 1977, 6911, 6915, 1954, 5259, 20492, 1956, 1957, 1955, 5257}, Down = {482, 414, 413, 437, 7731, 469, 413, 434, 469, 859, 438, 6127, 566, 7476, 4826, 5691,} }, Sewers = { Up = {}, Down = {435} }, } local target = followThis local lastKnownPosition local function goLastKnown() if getDistanceBetween(pos(), {x = lastKnownPosition.x, y = lastKnownPosition.y, z = lastKnownPosition.z}) > 1 then local newTile = g_map.getTile({x = lastKnownPosition.x, y = lastKnownPosition.y, z = lastKnownPosition.z}) if newTile then g_game.use(newTile:getTopUseThing()) delay(math.random(300, 700)) end end end local function handleUse(pos) goLastKnown() local lastZ = posz() if posz() == lastZ then local newTile = g_map.getTile({x = pos.x, y = pos.y, z = pos.z}) if newTile then g_game.use(newTile:getTopUseThing()) delay(math.random(400, 800)) end end end local function handleStep(pos) goLastKnown() local lastZ = posz() if posz() == lastZ then autoWalk(pos) delay(math.random(400, 800)) end end local function handleRope(pos) goLastKnown() local lastZ = posz() if posz() == lastZ then local newTile = g_map.getTile({x = pos.x, y = pos.y, z = pos.z}) if newTile then useWith(3003, newTile:getTopUseThing()) delay(math.random(400, 800)) end 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}, } local function checkTargetPos() local c = getCreatureByName(target) if c and c:getPosition().z == posz() then lastKnownPosition = c:getPosition() end end local function distance(pos1, pos2) local pos2 = pos2 or lastKnownPosition or pos() 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 = getCreatureByName(target) local range = 2 local p = pos() 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 local tile = g_map.getTile({x = p.x + x, y = p.y + y, z = p.z}) if tile then if table.find(data[dir], tile:getTopUseThing():getId()) 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 end executeClosest(possibleChangers) end local function targetMissing() for _, n in ipairs(getSpectators(false)) do if n:getName() == target then return n:getPosition().z ~= posz() end end return true end macro(500, "Follow Player", "", function(macro) local c = getCreatureByName(target) if g_game.isFollowing() then if g_game.getFollowingCreature() ~= c then g_game.cancelFollow() g_game.follow(c) end end if c and not g_game.isFollowing() then g_game.follow(c) elseif c and g_game.isFollowing() and getDistanceBetween(pos(), c:getPosition()) > 1 then g_game.cancelFollow() g_game.follow(c) end checkTargetPos() if targetMissing() and lastKnownPosition then handleFloorChange() end end) UI.Label("Follow Player:") addTextEdit("playerToFollow", storage.followLeader or "Trala", function(widget, text) storage.followLeader = text target = tostring(text) end)
Editor is loading...
Leave a Comment