PDA

View Full Version : Follow - My First Script



wurcel
01-30-2016, 07:03 PM
So, I decided to post my first lua script because it helped me a lot to play with mutiples Tibia Clients. It's a really basic script to follow other players.

Commands:

follow "player name"
start
stop

If you are following one player and wants to follow another one, you must stop it first then use the command follow again.



local target = ""

Module("autoFollow", function(module)
local player = Creature(target)
print(target)
if player:isOnScreen(true) then
Creature.Follow(target)
end
end, false)

function onSpeak(chat, msg)
chat:SendYellowMessage(Self.Name(), msg)
if (msg == "start") then
Module("autoFollow"):Start()
chat:SendOrangeMessage("Console", string.format("Started following %s.", target ))
elseif (msg == "stop") then
Module("autoFollow"):Stop()
chat:SendOrangeMessage("Console", "Stoped following.")
elseif msg:match("^name") then
local name = msg:match("^follow (.+)")
if name then
Module("autoFollow"):Stop()
target = name
chat:SendOrangeMessage("Control", "New player added.")
end
end
end

function onClose() end

local chat = Channel("autoFollow", onSpeak, onClose)

Mageq
01-31-2016, 12:55 PM
Problem with this is if the player that is being followed goes to a different floor :S

The_Miguelito
02-04-2016, 04:49 AM
Congratulations on this one! If you could make a script that auto-follow and also change floors, it would be amazing! Thanks!

Adrstalik
02-07-2016, 11:03 AM
The_Miguelito ,
You have to add stairs id etc. But the framework is working. :]



FollowThisPerson = "" -- Character name to follow.

FloorChangers = {
Ladders = {Up = {1948,},
Down = {432, 412, 469, 369, 7478, 7182, 482, 8658}},

Holes = {Up = {},
Down = {293, 294, 595, 385, 594}},

RopeSpots = {Up = {386},
Down = {}},

Stairs = {Up = {1958, 7548, 7544, 1952, 1950, 1947, 7542, 1978, 8657, 1977, 1956, 1957, 1954},
Down = {414, 413, 437, 7731, 469, 413, 434, 469, 438, 600, 4826, 8932, 6129}},
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 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)

edit

Hum, I think it's possible to glue the first script made by wurcel and this one. :]

nacho_125
02-12-2016, 11:33 AM
Im super horrible at lua, anyway someone can put the two together ? : )

also if targeting is active, would it target as it follows?, or, anyway it can follow when its not targetting anything?

Pat
05-31-2017, 09:33 AM
Has anyone managed to get the level change follow script to stop following when a creature is targeted? That'd be awesome... I have mucked around with it but keep breaking the script

Trykon
05-31-2017, 02:35 PM
I had the script to follow and fight without changing floors ;)
http://forums.xenobot.net/showthread.php?42709-TRK-Scripts-taking-requests&p=485499&viewfull=1#post485499

Pat
06-03-2017, 05:32 AM
Thanks yeah I've seen that. Was hoping someone might've modded the level changing follow script to stop following when there are creatures to be attacked.

I find that when using it my characters run back and forth between each other and the creature, and it affects targeting with spells, too (client seems to be confused and shoots blank squares despite targeting a creature)

Trykon
06-03-2017, 10:12 PM
On my script I was hunting old fortress on ~70 levels ek and ed. It was working fine so I supposey script is quite alright.

Pat
06-06-2017, 02:51 PM
On my script I was hunting old fortress on ~70 levels ek and ed. It was working fine so I supposey script is quite alright.

I get that your script works. What I was saying was the script which was posted above (that changes levels) doesn't stop following when attacking, which means characters run back and forth between the person they're following and the creature they're attacking. It also makes mage strikes attack the player they're following, too.


I was hoping someone that can script might edit the follow script which changes levels to pause following when attacking a creature...

Pat
06-07-2017, 04:20 PM
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).




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...

Trykon
06-07-2017, 08:00 PM
Good job ;)

bohun
08-28-2017, 08:16 PM
Can it be done to keep the distance tracking the player?