Description: I wanted to create an all-in-one taming that encompasses the core of taming from start to finish and this is the results. The configuration variables should be easy enough to understand but there is a pitful to this when it comes to the small taming window. You may do actions inside the "You start to tame this creature" window but if you have a spell charged it will target the creature so if it's a dragon you will attempt to heal it. There isn't a way to target.cancel the cursor yet so just be mindful of that window otherwise it can mess the script sequence up "Personally I just stop all scripts if I think its going to happen". Hit me up on discord if you have any issues or bugs.
-
-
-
-
-
V3.1 Added some variables and script for an ignore creature cache to kill a mob that has exceeded the maximum tame attempts. The last tame of a mob is the best possible tame you can find so please kill it off
-
V3.2 Added a way to add custom names for people who have pets that follow them around so it doesn't spam "Already Tamed"
-
V3.3 Added control logic for "You can't tame that creature" and "That creature looks already tamed" Also cleaned up the logic loop for spamming multiple attempts of taming against those targets so should only show once
-
V3.3a changed a possible line error
V3.6 a hotfix to add a different check for creature has been tamed by looking at follower count instead of system message, I don't like this way but it works for now
V3.7 Changed how ignorelists work to try and better suit players who are not just wandering around...
V3.71 Added Variable controls for ping so people can personally adjust what they need if they get timeouts
-- Tamer Assistant Script v3.7
Messages.Print("=================================", 60)
Messages.Print("Tamer Assistant Script v3.7", 68)
Messages.Print("Status: Scanning for nearby creatures", 89)
Messages.Print("=================================", 60)
-- === Config ===
-- === Timing Control ===
local pauseScan = 400 -- delay when no mobs found
local pausePolling = 400 -- delay inside tame result loop
local pauseBetweenAttempts = 600 -- delay after successful tame before next loop
local pauseSmallStep = 100 -- fallback polling pause
local renameAfterTame = true -- whether to rename the pet after taming
local renameSuffix = "Rab" -- suffix added to renamed pets
local autoRelease = true -- whether to auto-release after taming
local showAlreadyTamedOverhead = true -- show overhead text for already tamed pets
local repeatAfterTame = true -- restart loop after a successful tame
local showStatusMessages = true -- show periodic status messages in system log
local statusMessageInterval = 5 -- how often to show status message (seconds)
local releaseGumpId = 3432224886 -- gump ID for release confirmation
local releaseButtonId = 2 -- button ID for release action
local ignoreScanRange = 10 -- range to scan for mobs to ignore (tamed, etc)
local tameSkipMessageCooldown = 10 -- cooldown between "can't tame" overhead messages
local killMeCooldown = 3 -- cooldown between "Kill me" overhead messages
local cantTameCooldown = 5 -- cooldown between "Can't tame" overhead messages
local ignoreDuration = 15 -- temporary ignore duration for mobs in seconds
local showCantTameOverhead = true -- show "Can't tame" overhead message
local ignoreNoChanceTamesPermanently = true -- permanently ignore no-chance tames
local customIgnoreNames = { -- list of pet names to always ignore
"Muffin",
"Baconator",
"SirPoopsAlot"
}
local tamedShownCache = {}
local tameSkipShownCache = {}
local tooManyOwnersShownCache = {}
local cantTameShownCache = {}
local ignoreList = {}
local lastStatusPrint = os.clock()
local tamedCount = 0
local lastFollowers = Player.Followers
Journal.Clear()
while true do
local now = os.clock()
if showAlreadyTamedOverhead or showCantTameOverhead then
local nearby = Mobiles.FindByFilter({
rangemax = ignoreScanRange,
dead = false,
human = false
}) or {}
if type(nearby) == "table" then
for _, mob in ipairs(nearby) do
if showAlreadyTamedOverhead and mob.Name and mob.Name ~= "" and mob.Name:find(renameSuffix) then
local lastShown = tamedShownCache[mob.Serial] or 0
if now - lastShown >= 3 then
Messages.Overhead("Already Tamed... Skipping", 38, mob.Serial)
tamedShownCache[mob.Serial] = now
end
end
if showCantTameOverhead and ignoreList[mob.Serial] == true then
local lastShown = cantTameShownCache[mob.Serial] or 0
if now - lastShown >= cantTameCooldown then
Messages.Overhead("Cant tame!", 53, mob.Serial)
cantTameShownCache[mob.Serial] = now
end
end
end
end
end
local all = Mobiles.FindByFilter({
rangemax = 2,
dead = false,
human = false
}) or {}
local untamed = {}
for _, mob in ipairs(all) do
if mob.Notoriety == 1 or mob.Notoriety == 2 then
ignoreList[mob.Serial] = true
elseif (mob.Name and mob.Name ~= "" and not mob.Name:find(renameSuffix)) and ignoreList[mob.Serial] ~= true then
local ignoredUntil = ignoreList[mob.Serial]
local skip = false
for _, name in ipairs(customIgnoreNames) do
if mob.Name:lower() == name:lower() then
skip = true
break
end
end
if not skip and not (ignoredUntil == true or (ignoredUntil and os.clock() < ignoredUntil)) then
table.insert(untamed, mob)
end
end
end
table.sort(untamed, function(a, b) return a.Distance < b.Distance end)
if #untamed == 0 then
if showStatusMessages and now - lastStatusPrint >= statusMessageInterval then
Messages.Print("...Still scanning for wild creatures...", 89)
lastStatusPrint = now
end
Pause(pauseScan)
else
local target = untamed[1]
if target.Notoriety == 1 or target.Notoriety == 2 then
Messages.Print("Skipping blue or green target.", 38)
ignoreList[target.Serial] = true
goto continue
end
Journal.Clear()
Skills.Use("Animal Taming")
if Targeting.WaitForTarget(2000) then
Targeting.Target(target.Serial)
else
Messages.Print("Targeting failed. Skipping creature.", 38)
end
local timeout, elapsed = 15000, 0
local tameResultFound = false
local initialFollowers = Player.Followers
while elapsed < timeout do
Pause(400)
local currentFollowers = Player.Followers
if currentFollowers > initialFollowers then
tameResultFound = true
tamedCount = tamedCount + 1
Messages.Print("Tamed successfully! (" .. tamedCount .. " total)", 68)
local releaseName = target.Name
if renameAfterTame then
local originalName = target.Name or "Unknown"
local newName
if originalName:lower():match("^a%s") then
newName = renameSuffix
else
originalName = originalName:gsub("%s+", "")
newName = originalName .. renameSuffix
end
Mobiles.Rename(target.Serial, newName)
Pause(500)
releaseName = newName
Messages.Print("Renamed to: " .. newName, 89)
end
if autoRelease then
Messages.Print("Releasing tamed creature...", 20)
Player.Say(releaseName .. " release")
Pause(500)
if Gumps.WaitForGump(releaseGumpId, 1000) then
Gumps.PressButton(releaseGumpId, releaseButtonId)
Messages.Print("Released successfully.", 68)
ignoreList[target.Serial] = "released"
else
Messages.Print("Release gump not found. Skipping release.", 38)
end
end
if repeatAfterTame then
Pause(pauseBetweenAttempts)
else
Messages.Print("Ending script after successful tame.", 89)
return
end
break
elseif Journal.Contains("You have no chance of taming this creature.")
or Journal.Contains("That animal looks tame already")
or Journal.Contains("That creature cannot be tamed.") then
tameResultFound = true
if showCantTameOverhead then
local lastShown = cantTameShownCache[target.Serial] or 0
if os.clock() - lastShown >= cantTameCooldown then
Messages.Overhead("Cant tame!", 53, target.Serial)
cantTameShownCache[target.Serial] = os.clock()
end
end
Messages.Print("No chance to tame — ignoring mob.", 38)
ignoreList[target.Serial] = true
break
elseif Journal.Contains("This animal has had too many owners") then
tameResultFound = true
local lastShown = tooManyOwnersShownCache[target.Serial] or 0
if os.clock() - lastShown >= killMeCooldown then
Messages.Overhead("Kill me", 33, target.Serial)
tooManyOwnersShownCache[target.Serial] = os.clock()
end
Messages.Print("Too many owners — marked for death.", 38)
ignoreList[target.Serial] = true
break
elseif Journal.Contains("You fail to tame the creature.") then
tameResultFound = true
Messages.Print("Taming failed. Trying again...", 20)
break
elseif Journal.Contains("You seem to anger the beast") then
tameResultFound = true
Messages.Print("The beast was angered.", 20)
Pause(400)
break
elseif Journal.Contains("That is too far away.") then
tameResultFound = true
Messages.Print("Target too far. Skipping...", 38)
break
end
Pause(pauseSmallStep)
elapsed = elapsed + 50
end
if not tameResultFound and elapsed >= timeout then
Messages.Print("No tame result detected — skipping.", 38)
ignoreList[target.Serial] = true
end
end
::continue::
end -- closes while true do
Version History
Version 5 - 6/14/2025, 6:06:21 PM - about 16 hours ago
All in one taming
Version 4 - 6/14/2025, 5:55:06 PM - about 16 hours ago
All in one taming
Version 3 - 6/14/2025, 5:54:09 PM - about 16 hours ago
All in one taming
Version 2 - 6/14/2025, 11:26:33 AM - about 22 hours ago
All in one taming
Version 1 - 6/14/2025, 11:23:24 AM - about 23 hours ago
All in one taming
Original Version Saved - 6/14/2025, 11:23:24 AM - about 23 hours ago