UO Sagas: All in one taming

Created: 19 days ago on 06/01/2025, 12:18:08 AMUpdated: 4 days ago on 06/15/2025, 01:01:00 PM
FileType: LUA
Size: 13560
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

V3.73 Cleaned Up some variables and added journal entry check for 2 many followers with message print

V3.74 Added a variable to turn off perm ignore list when taming and added "That wasn't even challenging" as a trigger to text

V3.75 Reverted back to system message "It seems to accept you as master" as the trigger for a successful tame instead of follower counts.

Messages.Print("=================================", 60) Messages.Print("Tamer Assistant Script v3.75", 68) Messages.Print("Status: Scanning for nearby creatures", 89) Messages.Print("=================================", 60) -- === Config === -- === Timing Control === local pauseScan = 400 -- Delay when no mobs are found (in milliseconds) local pausePolling = 400 -- Delay inside the tame result checking loop (in milliseconds) local pauseBetweenAttempts = 600 -- Delay after a successful tame before restarting loop (in milliseconds) local pauseSmallStep = 100 -- Fallback pause used inside loops (in milliseconds) -- === Taming Behavior === local renameAfterTame = true -- Whether to rename the pet after taming local renameSuffix = "Rab" -- Suffix or replacement name for renamed pets local autoRelease = true -- Whether to auto-release pet after successful tame local repeatAfterTame = true -- Whether to loop after taming success or stop script local ignoreAfterSuccessfulTame = true -- Whether to ignore a mob after successful tame -- === Display Options === local showAlreadyTamedOverhead = true -- Show "Already Tamed... Skipping" overhead message local showStatusMessages = true -- Periodically print system messages if script is idle local statusMessageInterval = 5 -- Interval for system status messages (in seconds) local killMeCooldown = 3 -- Cooldown between repeated "Kill me" overheads (in seconds) local cantTameCooldown = 5 -- Cooldown between repeated "Can't tame" overheads (in seconds) local tameSkipMessageCooldown = 10 -- Cooldown between "Already Tamed" overheads (in seconds) -- === Release Settings === local releaseGumpId = 3432224886 -- Gump ID for the taming release window local releaseButtonId = 2 -- Button ID to confirm release -- === Mob Ignore Settings === local ignoreScanRange = 10 -- Scan range (in tiles) for displaying ignore overheads local ignoreDuration = 15 -- How long to temporarily ignore mobs (in seconds) local ignoreNoChanceTamesPermanently = true -- If true, mobs that can't be tamed are ignored forever -- === Custom Ignore List === local customIgnoreNames = { "Muffin", "Baconator", "SirPoopsAlot" } -- List of mob names to always ignore -- === Caches and Counters === local tamedShownCache = {} -- Tracks which mobs showed "Already Tamed" local tameSkipShownCache = {} -- Tracks cooldowns for "Already Tamed" messages local tooManyOwnersShownCache = {} -- Tracks cooldowns for "Kill me" overheads local cantTameShownCache = {} -- Tracks cooldowns for "Can't tame" messages local ignoreList = {} -- Stores serials and expiration or permanent ignore status local lastStatusPrint = os.clock() -- Timestamp for last idle status message local tamedCount = 0 local lastTooManyFollowers = nil -- cooldown tracking for too many followers message -- Total count of successful tames 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.Name and mob.Name ~= "" and not mob.Name:find(renameSuffix) 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 (ignoredUntil ~= true and (not ignoredUntil or 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] local success = false 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 while elapsed < timeout do if Journal.Contains("You have too many followers to tame that creature.") then if not lastTooManyFollowers or os.clock() - lastTooManyFollowers > 5 then Messages.Overhead("Too many followers!", 38, Player.Serial) Messages.Print("Too many followers — taming not possible.", 38) lastTooManyFollowers = os.clock() end break end if Journal.Contains("You have no chance of taming this creature.") or Journal.Contains("That animal looks tame already") then 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) if ignoreNoChanceTamesPermanently then ignoreList[target.Serial] = true else ignoreList[target.Serial] = os.clock() + ignoreDuration end break elseif Journal.Contains("It seems to accept you as master") or Journal.Contains("You tame the creature.") or Journal.Contains("That wasn't even challenging") then 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) 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) else Messages.Print("Release gump not found. Skipping release.", 38) end end if ignoreAfterSuccessfulTame then ignoreList[target.Serial] = true end success = true break elseif Journal.Contains("You fail to tame the creature.") then Messages.Print("Taming failed. Trying again...", 20) break elseif Journal.Contains("You seem to anger the beast") then Messages.Print("The beast was angered.", 20) Pause(pauseSmallStep) break elseif Journal.Contains("That is too far away.") then Messages.Print("Target too far. Skipping...", 38) break elseif Journal.Contains("This animal has had too many owners") then 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 end Pause(pausePolling) elapsed = elapsed + pausePolling end if success then if repeatAfterTame then Pause(pauseBetweenAttempts) else Messages.Print("Ending script after successful tame.", 89) return end end end end

Version History

Version 9 - 6/15/2025, 1:01:00 PM - 4 days ago

All in one taming

Version 8 - 6/15/2025, 12:48:21 PM - 4 days ago

All in one taming

Version 7 - 6/15/2025, 12:02:46 PM - 4 days ago

All in one taming

Version 6 - 6/15/2025, 11:58:41 AM - 4 days ago

All in one taming

Version 5 - 6/14/2025, 6:06:21 PM - 5 days ago

All in one taming

Version 4 - 6/14/2025, 5:55:06 PM - 5 days ago

All in one taming

Version 3 - 6/14/2025, 5:54:09 PM - 5 days ago

All in one taming

Version 2 - 6/14/2025, 11:26:33 AM - 5 days ago

All in one taming

Version 1 - 6/14/2025, 11:23:24 AM - 5 days ago

All in one taming

Original Version Saved - 6/14/2025, 11:23:24 AM - 5 days 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.