I noticed someone had made a text-based tutorial on how to create a 100% AFK script. I decided I would take it one step further with a video tutorial. There are a number of elements to making a script, and this just about covers the basics (making sure you deposit, resupply, and hunt correctly according to the script setup.)
In this video you should learn to:
- Setup an "auto selector" for where to begin running the script
- Choose if you should use a node or stand waypoint, and how to deal with NPCs on PVP
- Sensibly add waypoints to avoid hassle - This requires a kean eye, and I don't demonstrate it incredibly well
- Modify a lua script to suit the needs of the spawn you're scripting for
- Modify an XBST in a text editor to edit loot items and view waypoints
- All in all, generate a completely AFK script with some stability checks
- Deal with doors, depots, backpacks, and floor changing spawn entry points
- Configure spawn specific variables
- Generate and use loot lists using a loot list generator
- Use the Walker.ConditionalGoto without breaking it
- Use Self.UseItemFromGround to manipulate tiles within 1 square range of your character
The link to a loot list generator is here: http://neobot-scripts.com/xenobot_lootlist_creator.php. This will generate an XML format loot list, so you don't need to do what I did (which was to go through the deposit list and put the items into the XBST file), you can just copy the XML and replace the existing XML in your XBST with this.
The link to the deposit list generator is here: http://neobot-scripts.com/SelfDepositItems_creator.php. This is what I used to generate a list of the loot items.
Credits to @biaggio12 for inspiring me (not in a bad way) to make this video. Credits also go to DarkstaR for maintaining the bot, Royaliti for being an amazing friend and putting up with my random decisions to run a whole variety of projects at the same time (and complete very few of them, I might add), and to everyone I play on Olympa with for being a great team. @Rydan for his amazing work with the PHP based loot list and deposit list generators, massive thanks, these two tools save me hours of abusing TibiaWiki and Item ID lists.
http://youtu.be/1Hquf2URnGI
The lua file looks like this (copy it to notepad, save as, change the "Document Type" to "All Files", and save it as something like "MyScript.lua" - Make sure it ends with .lua and not .txt or the bot won't recognise it.
The XBST for Darashia Dragon Lords for RP is attached here and all are free to use it as they wish, excluding for profitable reasons. Credits should be given unless permission is granted by myself.Code:------ REFILL SETTINGS ------
local LeaveMana = 100 --- How many mana potions until you leave the hunt?
local BuyMana = 300 --- How many mana potions you begin the hunt with?
local LeaveHealth = 5 --- How many health potions until you leave the hunt?
local BuyHealth = 10 --- How many health potions you begin the hunt with?
local AmmoName = "Royal Spear" --- What ammunition are you using?
local LeaveAmmo = 10 --- How much ammunition until you leave hunt?
local BuyAmmo = 45 --- How much ammunition do you begin the hunt with?
local AmmoCost = 15 --- What is the cost of your selected ammunition?
local LeaveCap = 100 --- Leaves spawn when character reaches this cap.
local HideEquipment = true --- Do you want to minimize your equipment?
local LogoutStamina = false --- Do you want to logout at 16 hours? (Inside the depot)
-- Item ID's, if you don't want to use SHP and SMP, change these:
local ManaName = "Strong Mana Potion"
local ManaCost = 80
local HealthName = "Strong Health Potion"
local HealthCost = 100
-- Backpack Configuration:
local LootBP = "Fur Backpack"
local GoldBP = "Jewelled Backpack"
-- Spawn Options
local HuntMiddle = false
-- Here I'm gonna get the item ids, leave this as it is.
local ManaID = Item.GetID(ManaName)
local HealthID = Item.GetID(HealthName)
local AmmoID = Item.GetID(AmmoName)
-- These are the flask IDs, not worth changing since it will sell all flasks regardless of type.
local FlaskID = 283
local FlaskIDA = 284
local FlaskIDB = 285
-- local GoldBP = 5801 --- Item ID of your gold backpack.
registerEventListener(WALKER_SELECTLABEL, "onWalkerSelectLabel")
function onWalkerSelectLabel(labelName)
if (labelName == "Checker") then
-- Check Supplies, Hunt or Leave
Walker.ConditionalGoto((Self.ItemCount(ManaID) <= LeaveMana) or (Self.Cap() < LeaveCap) or (Self.ItemCount(HealthID) <= LeaveHealth) or (Self.ItemCount(AmmoID) <= LeaveAmmo), "Leave", "BeginHunt")
elseif (labelName == "Start") then
Walker.ConditionalGoto((Self.Position().z == 11), "BeginHunt", "ReachDepot")
elseif (labelName == "DepositGold") then
-- Deposit Gold, check balance.
Walker.Stop()
Self.SayToNpc({"hi", "deposit all", "yes"}, 100)
local withdrawManas = math.max(BuyMana - Self.ItemCount(ManaID), 0)*ManaCost
local withdrawHealths = math.max(BuyHealth - Self.ItemCount(HealthID), 0)*HealthCost
local withdrawAmmo = math.max(BuyAmmo - Self.ItemCount(AmmoID), 0)*AmmoCost
local total = math.abs(withdrawManas + withdrawHealths + withdrawAmmo)
if total >= 1 then
Self.SayToNpc({"withdraw " .. total, "yes", "balance"}, 100)
end
Walker.Start()
elseif (labelName == "DepositItems") then
-- Deposit Items
Walker.Stop()
Self.ReachDepot(5)
Self.DepositItems({5882, 1}, {3028, 1}, {3029, 1}, {5948, 1}, {11457, 1}, {5920, 1}, {5877, 1}, {3061, 1})
Self.DepositItems({3386, 0}, {3392, 0}, {7402, 0}, {7399, 0}, {3428, 0}, {3416, 0}, {3280, 0}, {3071, 0}, {7430, 0}, {3322, 0})
Walker.Start()
elseif (labelName == "BuyManas") then
-- Buy Mana Potions
Walker.Stop()
if (Self.ItemCount(ManaID) < BuyMana) or (Self.ItemCount(HealthID) < BuyHealth) then
print("Buying manas or healths")
Self.SayToNpc({"hi", "flasks"}, 100)
while (Self.ItemCount(FlaskID) >= 1) or (Self.ItemCount(FlaskIDA) >= 1) or (Self.ItemCount(FlaskIDB) >= 1) do
Self.SayToNpc("yes", 100)
end
wait(2000)
Self.SayToNpc("trade", 100)
wait(2000)
while (Self.ItemCount(ManaID) < BuyMana) do
Self.ShopBuyItemsUpTo(ManaID, BuyMana)
wait(500,800)
end
if (Self.ItemCount(HealthID) < BuyHealth) then
Self.ShopBuyItemsUpTo(HealthID, BuyHealth)
wait(500)
end
wait(200, 500)
end
Walker.Start()
elseif (labelName == "CheckGoneUp") then
-- Check we're on floor 3
Walker.ConditionalGoto((Self.Position().z == 7), "OpenSouth", "Leave")
elseif (labelName == "CheckGoneDown") then
-- Check we're on floor 7
Walker.ConditionalGoto((Self.Position().z == 11), "AmDown", "EnterResp")
elseif (labelName == "BuySpears") then
--------------------------------- TODO -------------------------
Walker.Stop()
Self.SayToNpc({"hi", "trade"}, 100)
-- Buy spears, make sure Self.ItemCount returns items in hands.
while (Self.ItemCount(AmmoID) < BuyAmmo) do
Self.ShopBuyItemsUpTo(AmmoID, BuyAmmo)
wait(500,800)
end
Walker.Start()
elseif (labelName == "ResetBps") then
-- Reset Backpacks
Walker.Stop()
Self.CloseContainers()
Self.OpenMainBackpack(true):OpenChildren({LootBP, true}, {GoldBP, true})
Container.GetFirst():Minimize()
Walker.Start()
elseif (labelName == "OpenNorth") then
Walker.Stop()
Self.UseItemFromGround(Self.Position().x, Self.Position().y - 1, Self.Position().z)
Walker.Start()
elseif (labelName == "OpenSouth") then
Walker.Stop()
Self.UseItemFromGround(Self.Position().x, Self.Position().y + 1, Self.Position().z)
Walker.Start()
elseif (labelName == "MiddleSpawn") then
Walker.Stop()
Walker.ConditionalGoto(HuntMiddle, "MiddleGo", "MiddleDone")
Walker.Start()
end
end
Self.ReachDepot = function (tries)
local tries = tries or 3
Walker.Stop()
local DepotIDs = {3497, 3498, 3499, 3500}
local DepotPos = {}
for i = 1, #DepotIDs do
local dps = Map.GetUseItems(DepotIDs[i])
for j = 1, #dps do
table.insert(DepotPos, dps[j])
end
end
local function gotoDepot()
local pos = Self.Position()
print("Depots found: " .. tostring(#DepotPos))
for i = 1, #DepotPos do
location = DepotPos[i]
Self.UseItemFromGround(location.x, location.y, location.z)
wait(1000, 2000)
if Self.DistanceFromPosition(pos.x, pos.y, pos.z) >= 1 then
wait(5000, 6000)
if Self.DistanceFromPosition(location.x, location.y, location.z) == 1 then
Walker.Start()
return true
end
else
print("Something is blocking the path. Trying next depot.")
end
end
return false
end
repeat
reachedDP = gotoDepot()
if reachedDP then
return true
end
tries = tries - 1
sleep(100)
print("Attempt to reach depot was unsuccessfull. " .. tries .. " tries left.")
until tries <= 0
return false
end
Map.GetUseItems = function (id)
if type(id) == "string" then
id = Item.GetID(id)
end
local pos = Self.Position()
local store = {}
for x = -7, 7 do
for y = -5, 5 do
if Map.GetTopUseItem(pos.x + x, pos.y + y, pos.z).id == id then
itemPos = {x = pos.x + x, y = pos.y + y, z = pos.z}
table.insert(store, itemPos)
end
end
end
return store
end
Thanks all!