XenoBot Forums - Powered by vBulletin

User Tag List

Results 1 to 10 of 13

Thread: Follow - My First Script

Threaded View

Previous Post Previous Post   Next Post Next Post
  1. #4

    Join Date
    Apr 2012
    Posts
    20
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)
    @The_Miguelito ,
    You have to add stairs id etc. But the framework is working. :]

    Code:
    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. :]
    Last edited by Adrstalik; 02-07-2016 at 11:11 AM.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •