UO Sagas: All in one taming

Created: 14 days ago on 06/01/2025, 12:18:08 AMUpdated: about 16 hours ago on 06/14/2025, 06:06:21 PM
FileType: LUA
Size: 12700
Category: Animal Taming
Tags: pvm

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

All in one taming

No changes to display
View list of scripts
Disclaimer: This is a fan made site and is not directly associated with Ultima Online or UO staff.