Quantcast
Download
(39 Kb)
Download
Updated: 08/02/20 08:53 PM
Pictures
File Info
Compatibility:
Stonethorn (6.1.0)
Greymoor (6.0.5)
Harrowstorm (5.3.4)
Dragonhold (5.2.5)
Scalebreaker (5.1.5)
Elsweyr (5.0.5)
Updated:08/02/20 08:53 PM
Created:06/09/17 03:03 PM
Monthly downloads:1,631
Total downloads:49,516
Favorites:146
MD5:
6.0.5
Thief Tools  Updated less than 3 days ago!  Popular! (More than 5000 hits)
Version: 2.10
by: Shadowfen [More]
Depends on the following (separately installed) libraries: LibSFUtils, LibAddonMenu

Thief Tools provides a variety of helpful tools to help you manage and profit from your thieving career:
  • A configurable status bar to provide you with your current hot item counts and quotas.
  • Smart auto-looting of stolen items
  • Configurable auto-junking of stolen items - and an icon to display which mode you are in
  • A convenient control of whether you are allowed to kill NPCs or not - and an icon to display at a glance which mode you are in.

The Thief Tools Status Bar
The status bar to help you keep track of your stealing at a glance! It can display the following:
  • A red hand icon if you are in "Kill NPCs" mode (dynamic)
  • A gold bag with coins around if you are in "Auto-Steal" mode (dynamic)
  • The total value of fence-able items you're carrying.
  • The number of fence-able items you're carrying and the remainder of sells for the day.
  • The number of launder-able items you're carrying and the remainder of launders for the day.
  • The average value of the fence-able items (off by default).
  • The estimated session's income you'll get if you fence items of like value up to your per-day limit.
  • A graph of your fence-able items' quality.

Filtering

These counts can be configured according to your preferences by setting filters for certain categories of stolen items.

The categories, such as
  • gear,
  • furnishings,
  • provisioning recipes and furnishing recipes (formerly just "recipes"),
  • motifs,
  • style materials,
  • trait materials,
  • raw and refined materials (clothing, woodworking, and blacksmithing),
  • alchemical solvents and reagents and
  • lockpicks
can be set for particular destinations: Fence, Launder, Ignore (does not count towards either), or Junk .
Certain categories or sub-categories might have special handling that cannot be overridden at this time (to prevent them from being considered fenceable:
  • Treasure maps (and other trophies) are automatically set for Launder
Any other items that don't belong to any of these categories are automatically considered for fencing.

Only items considered for fencing will be counted in the fence-able items, the total value of currently held items, the average value, and the quality displays.

Only items considered for laundering will be counted in the launder-able items.

Ignored items will not be counted by anything except the recipe, motif, or furnishing counts that you can see in the chat window.

You can also set it to ignore all stolen items that you have marked as junk in your inventory.

Finally, you have the option of saying that if an item would normally be considered for fencing, you can still have it ignored if the value of the item is less that a threshold value that you set. If the threshold value is zero, then none of the worthless fence-ables will be ignored by this.


Auto-Stealing

Thief Tools now provides an auto-stealing "mode" which sets it so that you have auto-looting of stolen items turned on when you are sneaking and undetected. If you stop sneaking, auto-looting of stolen items is turned off. If you are sneaking and detected (in enough time for the addon to notice before ESO opens the container), auto-looting of stolen items is turned off. It is still possible to be caught stealing - because they saw you after the container started to open - but this does offer you just a little bit more protection. The protection against detection is less effective when you are pickpocketing - just be careful!

The coin bag icon in the status bar will appear if you have the auto-stealing capability turned on (and if you turned on the icon!).

How to enter/exit Auto-Stealing mode
(You need to turn off auto-looting of stolen items in the ESO Settings->Gameplay for this to work correctly.)
It is on by default. There are two ways you can toggle it on or off:
  • Use the /tt.as command in the chat window
  • Bind a keyboard key to the "Toggle Auto-Steal" in Controls->Addon Keybinds->Thief Tools

(Note: I will not add selective stealing (leaving junk behind in the container) ever. If you don't take everything in the container, the container does not respawn new contents. This hurts you as well as your fellow thieves. Take everything and let the auto-junker sort it out.)


Auto-Junking

In addition to simply ignoring junked items, Thief Tools can now automatically put items into Junk for you.

Certain items are always auto-junked:
  • items that have been deprecated by Zenimax
  • spoiled food (which, oddly enough is not considered trash)

Certain categories or sub-categories might have special handling that cannot be overridden at this time (to prevent them from being considered fenceable or junked:
  • Rare ingredients and food additives such as flour and decorative wax will not be auto-junked even if you have set ingredients to "Junk"
  • Any item at or above a certain (configurable) level of quality cannot be auto-junked no matter what you set the category that item belongs to - the default level is currently "Legendary".

The auto-junker only works on stolen items. Your other addons can handle junking of non-stolen items. Really, it makes sense to have separate rules for stolen verses non-stolen items anyway. You would not want to junk soul gems - unless they were stolen soul gems that are only worth 30 gold - one of your limited number of fence slots should be saved for something worth a lot more than that! And laundering them for 30 gold, when you might get them from guild traders for less - or in Cyrodiil for free (Rewards for the Worthy) - that doesn't really make sense either.

Although the auto-junker generally operates properly without help, it is possible to toggle auto-junking mode off or back on again when you need to. There are two ways you can toggle it on or off:
  • Use the /tt.junk command in the chat window
  • Bind a keyboard key to the "Toggle Auto-junk, stolen" in Controls->Addon Keybinds->Thief Tools

Also, auto-junking is temporarily turned off while you are looking at your inventory - that way you can unmark junked items before destroying or selling what's left without worrying about having the item automatically re-junked while you are working there. It is automatically returned to its previous setting when the inventory window closes. You will see messages about this in your chat window each time it occurs.

(Note: I will not add auto-deletion of items from your inventory ever. It is too dangerous, and I'm not about to test it on my own characters and valuable stuff or make you test it on yours. Besides, even if I did and got it working perfectly, Zenimax can update the game and break my addon.)



Prevent Killing of Innocents Mode Management

This very simple capability provides two ways of turning on or off the Prevent Kill mode provided by the game, and an optional icon on the status bar when you are in "Kill Everyone" mode.

There are two ways you can toggle it on or off:
  • Use the /tt.tm or /tt.safe command in the chat window (they are identical commands - I wanted the /tt.tm because I was used to using the TroubleMaker addon).
  • Bind a keyboard key to the "Toggle Kill Innocents" in Controls->Addon Keybinds->Thief Tools

If you prefer to use a different addon such as TroubleMaker, Thief Tools will happily co-exist with it. Thief Tools will still detect when the Kill Innocents game setting changes either by other addons or by game settings and display the red hand icon as appropriate.



Commands in Chat
(Most of these are also available as keybinds under Controls->Addon Keybinds->Thief Tools

/thieftools - Display all of the chat commands for ThiefTools with a brief description of what they do.

Of particular interest:

/tt.counts - Display all of the counts for what you have in your pack - the recipe, motif, and furnishings counts (these are counted in these special counts even if they are otherwise ignored due to other filter settings), and the fence and launder counts.

/tt.fencetime - Fence Reset Timer. According to Elmseeker (Thieves Knapsack Extended), it appears this is a fixed time (3am UTC).

/tt.as - Toggle auto-steal mode
/tt.tm or /tt.safe - Toggle kill innocents mode
/tt.junk - Toggle auto-junk mode




Acknowledgements:
This addon owes its inspiration to Elmseeker's Thieves Knapsack Extended addon - who heavily influenced my UI choices since I really liked the UI that it provided and wanted most of it back.

As this is my very first addon, I also wish to acknowledge the ESOUI Wiki, the tutorials there, the Thieves Knapsack Extended addon, and the Roam Home addon which I read to discover how some things worked.
2.10 (32)
  • Reverted to the original bounty decay calculation for players over level 50, and keep Cheshire1981's decay calculation for pre-50 characters.
  • API bump.


2.9 (31)
  • Cheshire1981 has developed a more accurate calculation for bounty value decay over time for the under-level 50 toons and has graciously permitted me to use it.
  • API bump. Preparing for Greymoor.

2.8.2 (30)
  • Correct accidental global variables.

2.8.1 (29)
  • Set AddonVersion in manifest file.

2.8
  • Upgrading to the latest localization features of LibSFUtils.

2.7.1
  • API Bump

2.7
  • Change the font on the toolbar from ZoFontChat to ZoFontGame to allow for smaller scaling as suggested by tim99.
  • API Bump

2.6
  • Use LibAddonMenu-2.0 directly instead of through LibStub. LibAddonMenu-2.0 and LibSFUtil both still need to be installed separately.
  • API Bump

2.5
  • API Bump
  • Updated /thieftools help command to use the new utilities from LibSFUtils.
  • Removed direct dependency on library LibStub.
  • Change to use standalone libraries (LibSFUtils, and LibAddonMenu) instead of bundling the libraries with ThiefTools.

2.4
  • The Display option "Hide in menu ON/OFF" will turn off the ThiefTool bar when set to ON and the bar will remain hidden for as long as you are in the menu. (Previously it would hide and then reappear after a few seconds.)
  • Can temporarily stop or restart ThiefTools by removing or adding ThiefTool-related inventory event checking for the current character. (Performance)
    This basically removes the addon overhead (and functionality!) for the current character on an adhoc basis without having to /reloadui to unload or load the addon. By doing a /tt.stop you tell ThiefTools to essentially disable itself - no further ThiefTools background processing can happen. By doing a /tt.start, you tell ThiefTools to re-hook itself into the game in order to receive event notifications to to perform its automatic stolen inventory and loot processing and restore the toolbar if you have it set to be visible. If there is a problem, reloading the ui will reset ThiefTools back to "started".

2.3.3
  • API Bump

2.3.2
  • API Bump

2.3.1
  • Reverted the "[TT]hFence sells left: " prompt fix that didn't work out.

2.3
  • Revise the calculation of bounty decay time to better match with the game timing - with the changes to the way skills are handled with the release of Summerset, I can actually base the calculation off of the enhanced decay rate for the various levels of the "Swiftly Forgotten" passive instead of creating an approximation that was always wrong but close most of the time for many levels...
  • Possibly fixed the "[TT]hFence sells left: " prompt that was occasionally seen. (reported by AgnarUrthadar) (Fix suggested by wyzzard2k).

2.2
  • Add the ability to decide how stolen jewelry should be handled. Setting it to "Ignore" will prevent it from counting towards your fence totals and will prevent it from being auto-junked.

2.1.14
  • API Bump

2.1.13
  • Created a new slash command for ThiefTools - /tt.resetbar - which will move the bar to the top left of the screen and set it to be visible (and moveable). This can be used for those occasions that the ThiefTools status bar has inexplicably disappeared to make it visible again. Also, the ESO standard Infamy (Bounty) meter will be set to hidden (the default).
  • Removed some debug printouts that were mistakenly left in chat.

2.1.12
  • Fixed error where minimum quality to save was set to "Mode_Legendary" instead of 5.
    Still looking at other reported errors.

2.1.11
  • Fixed error reported by joshmiller83.
  • Upgraded LibSFUtils to version 8.
  • Changed to ZO_SavedVarsNewCharacterId() in order to properly handle toon name changes with saved variables.

2.1.10
  • API bump.
  • Updated LibSFUtils to version 7.

2.1.9
  • API bump.
  • Updated LibSFUtils to version 6.

2.1.8
  • Updated LibAddonMenu 2.0 to r25.

2.1.7
  • The status belt will automatically hide itself when you go into the Battlegrounds and restore itself to its previous setting when you leave those areas.

2.1.6
  • Fixed the Bounty Timer so that it counts down again.

2.1.5
Compatibility - Clockwork City
  • The status belt will automatically hide itself when you go into Cyrodiil or Imperial City and restore itself to its previous setting when you leave those areas. (It probably works the same with the Battlegrounds but I have not tested that yet.) It is not really needed in those areas as there are no guards and nothing to steal there - and you have more pressing concerns anyway, like hostile players, to worry about.
  • Modified the settings saves so that it distinguishes which megaserver you are currently on. This change will require everyone to redo their settings to save them for the megaserver(s) that they play on, but it allows people to play on multiple megaservers without getting the savedvariables corrupted.
  • Note: Some people have mentioned that autostealing gets turned off due to the settings reset. In order to turn it back on, you can use the /tt.as command in the chat window which will toggle autostealing between off and on.

2.1.4
  • If you destroy a stolen item, the gold value for fenceable items is reduced.
  • Note: Further investigation of two known problems: max number of fences not increasing when you put a skill point in Trafficer passive, and the fences left counts not resetting when the fence resets daily are both traceable back to the fact that Zenimax does not update the counters that this addon references until you visit a fence. While I could potentially track when the passive increases and fix that, it would unnecessarily add load to the game for the sake of catching something that happens oh 4-5 times in the life of the character. Also, I can't realistically fix the fenced items count not resetting properly without potentially making the game slower (all that periodic checking just to see if it is reset time yet) - It's just not worth it when all you have to do is to visit a fence.

2.1.3
  • Change the addon version number in display.
  • Toggle auto-junk message fixed. Before, when you toggled it on it would say that it was turned off and vice versa. Now it announces the correct state.
  • All chat messages that come from ThiefTools are now tagged with "[ThiefTools] " in the chat window.
  • Revised bounty time calculator to make more accurate estimates.

2.1.2
  • Stolen containers will be ignored.

2.1.1
Compatibility - Horns of the Reach
  • The sound has been turned off for the "inventory almost full" and "fence almost full" warning messages as a trial. It might return later. (Note: If you don't want to use these warning messages because you have some other addon providing them, simply set the threshold to zero in the settings.)
  • The setting of auto-junking on or off with /tt.junk is now remembered between sessions (logins and reloads).
  • Defaulting the values of new saved variables has been fixed now, so that new variables will be set to the proper default values until they are changed by the user. (In particular, the new "don't junk if quality is at least ???" in the Filter settings should now show that it defaulted to Legendary instead of being blank.)
  • The display of launders/launders left was not always working properly. Fixed.
  • The display of fences/fences left did not update when you put in the skill point to upgrade it. Should be fixed, but I don't have a character I can test it with anymore.
  • The category "Trash" is no longer an auto-junked item as it sometimes is applied to something you might want to fence.
  • Recipes were not separating into provisioning and furnishing recipe categories. Fixed.
  • The temporary auto-junking disabled and re-enabled messages in chat - they were always a temporary measure which would be removed after I had the chance to test with the new Horns of the Reach DLC. They have served their purpose and have now been removed.

2.1.0
  • Added Russian translations for the new strings. (Courtesy of ForgottenLight)
  • Fixed problem with not being able to turn on auto-stealing mode after turning it off.

2.0.2
  • Fixed lua errors reported from OnStealthChange function and OnRemoved function
  • Removed debug messages from chat (sorry).

2.0.1
  • Fixed the version number.
  • The temporarily disabling and reenabling auto-junking messages are not displayed if auto-junking has been disabled.
  • Fixed the lua errors being reported from the junkIt function.


2.0
Filtering
Note: If you are upgrading from an older version of Thief Tools, please /reloadui the first time that you run with the upgraded addon (for each character) if you notice any problems. There appears to be some kind of issue between the old saved variables and the new version of the addon that I have not been able to track down. Simply reloading the ui will fix the problem and save the new version of saved variables.)
  • Added filtering of stolen alchemy reagents and solutions.
  • Split out Recipes into Provisioning and Furnishing Recipes so that you can control them separately. (You will need to update your setting for these.)
  • Added filtering of stolen soulgems.
  • Automatically place stolen treasure maps (and other trophies) on the ignore list.
Auto-junking (New)
  • Added a setting for the "if value less than x" setting so that you can auto-junk them instead of just ignoring them.
  • Added special handling to auto-junk spoiled food (which oddly enough is not considered to be "trash" by ESO).
  • Rare ingredients and ingredient additives are now set to "Launder" even if you have the ingredients setting on something else. This allows separating out specifically the "Decorative Wax" and "Flour" ingredients that are used for furniture crafting.
  • Whenever you are in an inventory page (simply looking at your inventory or at a vendor), auto-junking will be temporarily disabled. This allows you to remove items from the junk tab by unmarking them, and then doing a sell all junk or destroy all junk (as appropriate) on the remaining junk items. When the inventory page is closed, the auto-junker will automatically go back to its set mode. The next time some inventory change occurs to cause ThiefTools to rescan your inventory, the items that you unmarked as junk will automatically be put back into junk (unless you have changed the setting that caused that item to be considered junk).
  • Added a "Junk" choice to the "Fence", "Launder", and "Ignore" choice lists. The "Junk" option will cause the item to automatically be placed in the Junk tab of your inventory. You can then examine the list and sell or destroy the contents of the junk list normally. Note, you can "Unmark as junk" an item that was placed in the list, but it will be put back at some time in the future (the next time that the backpack contents are scanned again) - so ALWAYS examine the contents of the junk list before you destroy it!!
  • Automatically place stolen deprecated items on the junk list.
  • Automatically place stolen trash items on the junk list.
  • Added a setting to allow you to specify that if an item is a certain minimum quality, it will never be auto-junked, no matter what your other settings say. Originally implement to prevent auto-junking of Legendary items, it now allows you to set also Epic and Superior quality as well. Legendary is the default (and cannot be turned off).
  • Added special checks to the Ingredients so that you can say to junk them and the Flour and Decorative Wax will not be junked (because they are "rare" and used for furnishing recipes too.)
Commands/Modes (New)
  • Added a toggle to enable/disable the "Prevent killing of innocents". When logging in (or reloadui), this is reset to whatever the ESO setting is.
  • Added a toggle to enable/disable auto-stealing/pickpocketing while you are sneaking (and undetected). Auto-looting of stolen items is only turned on when you are sneaking when this is enabled. When you are not sneaking, then you can look in containers/NPCs without stealing from them.
  • Modified auto-stealing so that if it sees that you have been detected, before the container opens then it will revert from auto-stealing to looking. (A little extra protection that does not always work fast enough. Be warned and wary.)
Miscellaneous
  • Made it possible for addon keybinds to be translated to other languages.
  • Started using my utility library for functions shared between this addon and Where's My Guild Hall.
  • Upgraded LibAddonMenu to 2.0_r24.
  • Rewritten things as I've learned more Lua.

1.1.1
  • Updated the Russian translation for the "not a thief" feature (previously from Google) thanks to ForgottenLight.

1.1.0
  • Rewrote significant portions of the settings logic. You will have to reset your characters settings. The good news is that Thief Tools now provides the option of having account-wide settings - so you don't have to change things for every character you have.
  • The "Display" settings which control size and location of the status bar are only account-wide settings. Every character will have the Thief Tools status bar displayed in the same location on the screen.
  • The "Status Bar Display", "Filters", and "Warnings" settings can each either be account-wide or specific to the character. This means you can specialize any of these for a specific character and use the shared account-wide settings for all of your other characters.
  • Provided a "This character is not a thief" setting, so that when you turn it on the Thief Tools bar will not automatically be visible for that character when you log in. (You can still make it visible with either the /tt or the key binding for those special occasions.) This setting is per-character only - it just doesn't make sense as an account-wide setting. Note: The Russian translation for this feature was done by Google since it was done at the very last minute before release. If the Russian says something completely idiotic, I totally blame Google! :-)
  • Fixed the Estimated Fence slots = 0 warning to only appear once in chat (until it stops being 0).
  • Fixed the turning off the Estimated Fence slots = 0 warning by setting the slider to zero.
  • Fixed the turning off the Free slots left warning by setting the slider to zero.
  • Added the Russian translations for the new strings thanks to ForgottenLight.

1.0.6
  • Fixed it so that when you deconstruct stolen gear, it is properly subtracted from your count of stolen goods.
  • Added a new Warning Announcements setting section to allow you to set if you want to be told when your inventory is about to be full or if you have stolen enough for today's fencing quota.
  • Added the Russian translations for the new strings thanks to ForgottenLight.


1.0.5
  • Added a setting to provide chat warning messages when you are getting closed to having a full backpack. If you set the warning value to zero, it will not put messages in chat. (Warning for Russian language users: Localization strings were added - in English - and need to be translated.)
  • The colors of the quality stolen bars are back in all their glory. (And the previous color fix is still fixed!)

1.0.4
  • Added Russian translation thanks to ForgottenLight.
  • Fixed the color problem with icons on the bar.

1.0.3
  • Added ingredients to the list of items that you can filter on.
  • Finally managed to find and fix the location of the bar problem that FWSWBN was having.

1.0.2
  • Due to a change in the way that filter options are stored (to support localization) you may need to reselect your filter options in Settings.
  • Added localization changes suggested by ForgottenLight.
  • The filtering for lockpicks was broken because lockpicks do not correspond to the ITEMTYPE_LOCKPICK that Zenimax created but does not use. Had to set it so that lockpicks now match up with ITEMTYPE_TOOL.

1.0.1
  • Added the option to have a fence reset timer on the status bar like Thief's Knapsack Extended has.
  • The icon for Launders Left now disappears from the status bar when you turn off the Launders Left option.
  • Increased icon sizes to make them easier to distinguish.
  • Remove the anchoring options since they are not working as I expected them to.

1.0
  • Works with Morrowind
  • Release by Shadowfen
Optional Files (0)


Archived Files (37)
File Name
Version
Size
Uploader
Date
2.9
39kB
Shadowfen
04/30/20 06:17 PM
2.8.2
38kB
Shadowfen
04/01/20 07:22 PM
2.7.1
38kB
Shadowfen
10/20/19 05:03 PM
2.7
37kB
Shadowfen
08/15/19 10:58 PM
2.6
37kB
Shadowfen
05/02/19 11:10 PM
2.6
87kB
Shadowfen
02/25/19 10:17 PM
2.4
86kB
Shadowfen
12/24/18 09:56 PM
2.3.3
85kB
Shadowfen
10/22/18 06:09 PM
2.3.2
85kB
Shadowfen
08/13/18 05:56 PM
2.3.1
85kB
Shadowfen
07/17/18 09:24 PM
2.3
85kB
Shadowfen
07/09/18 09:17 PM
2.1.14
84kB
Shadowfen
05/20/18 02:55 PM
2.1.13
84kB
Shadowfen
03/30/18 11:01 PM
2.1.12
84kB
Shadowfen
03/30/18 04:10 PM
2.1.12
84kB
Shadowfen
03/30/18 04:08 PM
2.1.11
84kB
Shadowfen
03/25/18 04:49 PM
2.1.9
84kB
Shadowfen
01/08/18 10:50 PM
2.1.6
88kB
Shadowfen
10/26/17 07:44 PM
2.1.5
88kB
Shadowfen
10/25/17 06:12 PM
2.1.4
89kB
Shadowfen
10/09/17 03:19 PM
2.1.3
84kB
Shadowfen
09/04/17 05:03 PM
2.1.3
84kB
Shadowfen
09/04/17 04:52 PM
2.1.2
83kB
Shadowfen
08/20/17 09:53 PM
2.1.1
83kB
Shadowfen
08/17/17 07:32 PM
2.1.0
82kB
Shadowfen
08/13/17 02:22 PM
2.0.2
82kB
Shadowfen
08/10/17 01:32 PM
2.0.1
82kB
Shadowfen
08/09/17 09:27 PM
2.0
82kB
Shadowfen
08/06/17 03:02 PM
1.1.1
67kB
Shadowfen
07/12/17 07:31 AM
1.1.0
65kB
Shadowfen
07/10/17 07:10 PM
1.0.6
63kB
Shadowfen
07/02/17 12:43 PM
1.0.5
62kB
Shadowfen
06/25/17 02:51 PM
1.0.4
62kB
Shadowfen
06/22/17 11:25 PM
1.0.3
59kB
Shadowfen
06/16/17 08:49 AM
1.0.2
59kB
Shadowfen
06/15/17 10:25 PM
1.0.1
58kB
Shadowfen
06/11/17 05:44 PM
1.0
58kB
06/09/17 03:03 PM


Post A Reply Comment Options
Unread 06/15/20, 06:08 AM  
cheshire1981

Forum posts: 0
File comments: 6
Uploads: 0
Hi NTak,

for clarification purposes, I never intended to use any part of your UI but only to look at your code to figure out how the function GetSecondsUntilBountyDecaysToZero() could be used in the UI Thief Tools already has.
Since GetSecondsUntilBountyDecaysToZero() is apparently a function implemented by Zenimax I would never have used any part of your code at all but just looked at it.
Though I would assume you'd agree that there are only so many ways as how to convert seconds in a more suitable time-format

As for everyone else, I am sorry I wasn't able to provide a better timer based on GetSecondsUntilBountyDecaysToZero(), unfortunately I have had some chaotic times and weren't able to attend to the bounty timer matter as of yet.
Hopefully I will be able to provide a better timer soon (not based on NTaks code, ofcourse)

Originally Posted by NTak
Hey there,

Glad to see that my code is helpful… for others to copy.
You could at least have PM me.

Originally Posted by cheshire1981
[...]
edit: I found out how the other addon manages to be more precise...
during the Update 24 API patch a little known function GetSecondsUntilBountyDecaysToZero() has been added to the API, which I didn't see before now...
[...]
this new function makes this sooo much easier since it gives an accurate value in seconds which only has to get converted to minutes / hours and refreshed every x seconds...

NTak Loot Steal uses a simple function for that, based on that it would be easy to adapt the timer in thiefTools too
[...]
I will get to work this weekend and update my code for ThiefTools bounty timer, this should be fairly easy now.
... Is everything working as intended?

Anyway...
Please don't copy how I included the timers in the UI.

... I am really proud of that one.
( It's kind of my signature to fit the info the best possible way in the UI in my Loot'n'Steal addon. )

Cheers,
N'Tak'
Report comment to moderator  
Reply With Quote
Unread 05/22/20, 10:59 AM  
Shadowfen
AddOn Author - Click to view AddOns

Forum posts: 53
File comments: 424
Uploads: 11
Originally Posted by NTak
Hey there,

Glad to see that my code is helpful… for others to copy.
You could at least have PM me.

Originally Posted by cheshire1981
[...]
edit: I found out how the other addon manages to be more precise...
during the Update 24 API patch a little known function GetSecondsUntilBountyDecaysToZero() has been added to the API, which I didn't see before now...
[...]
... Is everything working as intended?

Anyway...
Please don't copy how I included the timers in the UI.

... I am really proud of that one.
( It's kind of my signature to fit the info the best possible way in the UI in my Loot'n'Steal addon. )

Cheers,
N'Tak'
First, I am the author of ThiefTools, not Cheshire1981 and second, I have not looked at your addon or copied your code for use anywhere. I did include some of Cheshire1981's code in mine prior to the discussion that had him looking at other addons for alternative algorithms - so, once again, your code is still not in ThiefTools as far as I know. ZOS functions, new or otherwise, are available for any addon creator to use within the limits of ZOS's security, again so far as I know.

Chesire1981 was discussing a bounty timer problem with someone else here. He has not gotten back to me with any change recommendations.

I have been dealing with my mother going into the hospital, and so have not had much time to think about addons or to even play the game.
Report comment to moderator  
Reply With Quote
Unread 05/21/20, 08:00 AM  
NTak
 
NTak's Avatar
AddOn Author - Click to view AddOns

Forum posts: 6
File comments: 165
Uploads: 4
Hey there,

Glad to see that my code is helpful… for others to copy.
You could at least have PM me.

Originally Posted by cheshire1981
[...]
edit: I found out how the other addon manages to be more precise...
during the Update 24 API patch a little known function GetSecondsUntilBountyDecaysToZero() has been added to the API, which I didn't see before now...
[...]
this new function makes this sooo much easier since it gives an accurate value in seconds which only has to get converted to minutes / hours and refreshed every x seconds...

NTak Loot Steal uses a simple function for that, based on that it would be easy to adapt the timer in thiefTools too
[...]
I will get to work this weekend and update my code for ThiefTools bounty timer, this should be fairly easy now.
... Is everything working as intended?

Anyway...
Please don't copy how I included the timers in the UI.

... I am really proud of that one.
( It's kind of my signature to fit the info the best possible way in the UI in my Loot'n'Steal addon. )

Cheers,
N'Tak'
__________________
I believe in…
Making tweaking easy: Camera / Dialog / Loot'n'Steal
⸻⸻⸻⸻⸻
⸺ ⋅ ⋅ ⸺ ⸺ ⋅ ⸺

@Takit (EU Server)
Last edited by NTak : 05/21/20 at 08:23 AM.
Report comment to moderator  
Reply With Quote
Unread 05/17/20, 04:05 AM  
Sargon_Starblade

Forum posts: 7
File comments: 3
Uploads: 0
Re: Request Bounty Timer

Originally Posted by Sargon_Starblade
Is it possible to have a timer function added to Thief Tools that will let you know how much time until you are reputable again?
Never mind it looks like there is already one there that is set off by default.
Report comment to moderator  
Reply With Quote
Unread 05/16/20, 11:06 PM  
Sargon_Starblade

Forum posts: 7
File comments: 3
Uploads: 0
Request Bounty Timer

Is it possible to have a timer function added to Thief Tools that will let you know how much time until you are reputable again?
Report comment to moderator  
Reply With Quote
Unread 05/14/20, 10:21 AM  
cheshire1981

Forum posts: 0
File comments: 6
Uploads: 0
Originally Posted by denzil
What I ended up realising is that the number is way off and there's nothing I can do about it
Originally Posted by denzil
And in case it matters, I'm CP220 or something.. and my Swiftly Forgotten is on 3/4. Legerdemain also not maxed out.
I am quite confused as to how much off the numbers really are and to figure out where it went wrong since I am the one having written the code...
but I will take a look at the other addons code and try to figure out the difference... you might however help me with an example including numbers...
if you are at CP220 with 3/4 swiftly forgotten you should have a bounty decay of 92 every 3 minutes (you can verify this by hovering over swiftly forgotten and see if the tooltip is identical), which is what the addon would be using as a value...

may I ask, have you been raking up bounty by getting a bounty, waiting some minutes and then getting more bounty? (like getting caught several times a few minutes apart before the bounty decayed)
this would tend to destabilize my code and I know the reason behind it but I haven't been able to fix it yet... maybe the other addon would help me with this one..

I am truely sorry that my code didn't work out for you and cast a bad light on shadowfens addon since it's solely my fault that this doesn't work as intended...
I hope with your help I can figure out what happend and hopefully how to fix it...

-----------------------------------------------------------------

edit: I found out how the other addon manages to be more precise...
during the Update 24 API patch a little known function GetSecondsUntilBountyDecaysToZero() has been added to the API, which I didn't see before now...
ThiefTools uses a self-written function that tries to determine the time until the bounty decays based on level and swiftly forgotten ranks but this isn't always perfect
before the API update there hasn't been a way to accurately determine how long the bounty decay would be and had to be guessed by using only the amount of bounty, the level of the char and the rank of swiftly forgotten...
this new function makes this sooo much easier since it gives an accurate value in seconds which only has to get converted to minutes / hours and refreshed every x seconds...

NTak Loot Steal uses a simple function for that, based on that it would be easy to adapt the timer in thiefTools too:

Code:
local function FormatTimer(s)
	if s <= 0 then
		return ""
	end
	if s > 3600 then
		return math.floor(s / 3600) .. "h"
	end
	if s > 60 then
		return math.floor(s / 60) .. "m"
	end
	return s .. "s"
end
local runningBounty = false
local function UpdateBountyTimer()
	local s = FormatTimer(GetSecondsUntilBountyDecaysToZero())
	bountyTimer:SetText(s)
	
	if s == "" then
		runningBounty = false
		return
	end	
		
	zo_callLater(UpdateBountyTimer, 1000)
end
local function OnBountyUpdate(eventCode, oldBounty, newBounty, isInitialize)
	if not(runningBounty) then
		runningBounty = true
		UpdateBountyTimer()
	end
end
I will get to work this weekend and update my code for ThiefTools bounty timer, this should be fairly easy now.

Thanks for the hint
Last edited by cheshire1981 : 05/14/20 at 10:49 AM.
Report comment to moderator  
Reply With Quote
Unread 05/05/20, 02:53 AM  
denzil

Forum posts: 0
File comments: 10
Uploads: 0
Originally Posted by Shadowfen
Coincidentally, Cheshire1981 and I have been discussing how the bounty works in this forum - in the preceeding messages. So you can look through those to see how the bounty check works. Yes the passive Swiftly Forgotten is taken into account.
I just gave it a read, thx
What I ended up realising is that the number is way off and there's nothing I can do about it
I was kinda hoping I was doing something wrong.. but I guess not.

Anyway for that particular feature I'll just continue using NTak Loot'n'Steal.. and if you need help with the math behind the correct number, I suggest you take look in that mods code or contact the author and see how it's done.. because those numbers work very accurately for me. And in case it matters, I'm CP220 or something.. and my Swiftly Forgotten is on 3/4. Legerdemain also not maxed out.

GL and thx for the reply
Report comment to moderator  
Reply With Quote
Unread 05/04/20, 05:52 PM  
Shadowfen
AddOn Author - Click to view AddOns

Forum posts: 53
File comments: 424
Uploads: 11
Originally Posted by denzil
How does the timer for bounty work exactly?
And does it take into account passive "TSwiftly Forgotten"?

Because the numbers I'm seeing displayed here make literally ZERO sense
So I'm guessing I'm missing something...
Coincidentally, Cheshire1981 and I have been discussing how the bounty works in this forum - in the preceeding messages. So you can look through those to see how the bounty check works. Yes the passive Swiftly Forgotten is taken into account. That is what
Code:
GetSkillAbilityInfo(5, 5, 2)
is refering to.
Report comment to moderator  
Reply With Quote
Unread 05/04/20, 07:13 AM  
denzil

Forum posts: 0
File comments: 10
Uploads: 0
How does the timer for bounty work exactly?
And does it take into account passive "TSwiftly Forgotten"?

Because the numbers I'm seeing displayed here make literally ZERO sense
So I'm guessing I'm missing something...
Report comment to moderator  
Reply With Quote
Unread 04/23/20, 12:57 PM  
cheshire1981

Forum posts: 0
File comments: 6
Uploads: 0
hmmm suggestion:
how about we use my solution as "optional files" for those who would prefer the better estimate and leave your addon as is for those who prefer the (very slightly) lower cpu usage?
This might be a good point to branch this with both branches under your control

or we could simply add an options in your config menu where players can toggle the more precise timer for lower levels, so we can have the best of both worlds in one version of the addon
Last edited by cheshire1981 : 04/23/20 at 04:03 PM.
Report comment to moderator  
Reply With Quote
Unread 04/22/20, 10:31 AM  
cheshire1981

Forum posts: 0
File comments: 6
Uploads: 0
Re: Re: Re: Re: Re: Re: Bounty Reset Clock

I now changed the code of your ThiefTools.lua beginning in line 1058 from this:

Code:
local _,_,earnedRank,_,_,_,_,progressionIndex = GetSkillAbilityInfo(5, 5, 2)
local perk = (progressionIndex * 23 + 23)
local estimate = ((TT.bounty) * 180.0/perk) - (now - TT.bounty_start)
to this:

Code:
local _,_,earnedRank,_,_,_,_,progressionIndex = GetSkillAbilityInfo(5, 5, 2)
	
	--[[
		edited by Ysrthgrathe Thais, EU
	--]]
	
	local function roundnum(num, numDecimalPlaces) -- lua doesn't have a proper rounding function
		local mult = 10^(numDecimalPlaces or 0)
		return math.floor(num * mult + 0.5) / mult
	end
	
	local level = GetUnitLevel("player")
	
	if level == 50 then -- cp don't count below lvl 50
		local cp = GetUnitChampionPoints("player")
		if cp < 161 then -- above 160 cp there is no change anymore
			level = level + (math.floor(cp/10)) -- treating every 10cp as 1 lvl for this calculation
		else
			level = 66
		end
	end

	local base = level*0.346 --base bounty decay times the level gives the appropriate bounty decay for each level
	
	base = roundnum(base, 1)
	
	local perk = (progressionIndex*base+base)
	
	perk = roundnum(perk,0) --actual bounty decay based on rank of swiftly forgotten and level of the char, rounded to full gold
	
	if (TT.bounty%perk ~= 0) then
		TT.bounty = (math.ceil(TT.bounty/perk)*perk) --quick and dirty fix to make sure that the timer always starts at a multiple of 3 since bounty only decreases every 3 minutes
	end
	
	--[[
		end of edit
	--]]
	
	local estimate = ((TT.bounty) * 180.0/perk) - (now - TT.bounty_start)
which gives a proper estimate of your bounty timer regardless of level...
(edit: it might give you timer which is 3 minutes off within the first 3 minutes of your bounty if you are at lvl 50 cp 160 and have EXACTLY 12996 bounty (or a multiple thereof) but this would correct itself after 3 minutes thanks to your magic and wouldn't even matter much when you already have to wait 5.7 hours (or a multiple thereof) for your bounty to decay )
unfortunately I have to keep most of the checks in your local function bountyCheck(now, drift)
since your level, cp and swiftly forgotten could change while you have a bounty on your head and your bounty decay would change accordingly... turns out I need your self-correction magic after all
but these calculations really shouldn't make any impact on any CPU that's capable of running ESO at all, even if you have a ton of addons active. I estimate the whole part of my code should use up no more than 150 cycles, which on a 1.2 Ghz single core CPU should take about 1/8000000th of a second or about 0.000000125 seconds...
for a measurable impact you would need about 2 million addons doing similar work on this CPU, provided you can actually feel a delay of a quarter of a second

feel free to do with my solution as you please, I would be happy if you were to use it and improve your estimates for alot of players (actually EVERY thief below lvl 50 cp 160 since the cp don't get counted for your bounty decay if you are below lvl 50, even if your twink/toon has cp)
but since this is your addon it's obviously up to you if you want to use it or not, sorry if I overstepped any boundaries

In any case, please know that I deeply appreciate your addon and your work (and your commented code, it's actually quite beautiful), thanks for your great contribution to ESO
Last edited by cheshire1981 : 04/23/20 at 08:45 AM.
Report comment to moderator  
Reply With Quote
Unread 04/22/20, 09:56 AM  
Shadowfen
AddOn Author - Click to view AddOns

Forum posts: 53
File comments: 424
Uploads: 11
Re: Re: Re: Re: Re: Bounty Reset Clock

Originally Posted by cheshire1981

I think I will need your self-correction magic but my best estimates deviate (in rare cases) only 1 gold from the real bounty decrease, regardles of level now...
you set a base value of 23 (for lvl 50 cp 160) but this base value changes with level in the following way:
base value = character level * 0.346 (rounded to one decimal point after the comma)
to incorporate cp simply treat cp as levels, every 10 cp is 1 level as long as the character is lvl 50, below that the cp don't matter (so a lvl 50 cp 160 would become a lvl 66 char)

to use a lvl 50 cp 140 char as an example, treat him like a lvl 64 char so the calculation would look somewhat like this:

base = 64*0.346 = 21.798
decay at max swiftly forgotten is 4*base+base, which would be
4*21.8+21.8 = 109
which is exactly the value I was hoping for

the value decrease should be rounded to the nearest full number without any decimal points, it should be max. 1 gold off, which would be close enough for a good estimate in nearly every case...
I can come up with the appropriate lua code if you want but it shouldn't be that hard to read the character level and cp and round some values in any case...

GetUnitLevel("player") and GetUnitChampionPoints("player") should do the trick for this one

this leaves only the problem of your timer starting while the heat is still on, which makes your guess somewhat incorrect in the first 3 minutes since a huge amount of heat takes some time to dissipate
either we let the timer wait until the heat is gone or I need to start a new excel table and come up with a formula to determine how long the heat takes to dissipate and add this time to your timer at the start

in either case you should probably check for GetPlayerInfamyData() which returns heat and bounty as two seperate integers instead of GetFullBountyPayoffAmount() and only start your bounty timer when the heat returns to 0
question is, how do we get your code to wait for the appropriate time... we could either check every second if heat is 0 or I need to come up with a formula of heat dissipation per level to wait for the appropriate time...
any suggestion on your part would be quite helpful here

oh and what I just noticed: since bounty is only decreased every 3 minutes your initial estimate of the decay time should be a multiple of 3...
lets say your bounty is 172g on a lvl 50 cp 160 char, your addon would suggest that the decay time is 4.5 minutes while in fact it would be 6 minutes since it only decreases every 3 minutes, regardless of the amount of bounty left. we should look into this as well to get a perfect estimate (wouldn't be too hard to fix: bounty divided by our estimated bounty decay, rounded up, times 3 should give us the right initial decay time)
Encouraging!

One of the reasons that I haven't bothered to correct for lower level characters is because that problem is self-mitigated as people level up. Toons spend the majority of their playtime above lvl 50/cp 160+ because once you hit CP160 the first time, all new toons after that become CP160 as soon as they hit lvl 50.

I don't want to introduce a long calculation/lookup/adjustment for a problem that only is needed when the toon is a "child" and would otherwise unnecessarily add useless calculation. Being able to easily skip the child adjustment without performance penalty is essential.

While the performance penalty for unnecessary calculation is probably rather small, people run with LOTS of addons sometimes and it adds up if all of the addons think "just a little bit won't hurt". I know people who run with well over 100 addons.
Report comment to moderator  
Reply With Quote
Unread 04/22/20, 05:06 AM  
cheshire1981

Forum posts: 0
File comments: 6
Uploads: 0
Re: Re: Re: Re: Bounty Reset Clock

Originally Posted by Shadowfen
I would appreciate the help if you can come up with an equation that can work for lower level characters more accurately as well as maxed characters.

It should be based on rank of swiftly forgotten and the character level, but it currently assumes character level of CP160 (because I don't have decay numbers for lower levels) and bases only off of swiftly forgotten with a little self-correction magic as the remaining bounty decreases.

Originally Posted by cheshire1981
I hope you don't mind me messing about with your addon
Not at all!
I think I will need your self-correction magic but my best estimates deviate (in rare cases) only 1 gold from the real bounty decrease, regardles of level now...
you set a base value of 23 (for lvl 50 cp 160) but this base value changes with level in the following way:
base value = character level * 0.346 (rounded to one decimal point after the comma)
to incorporate cp simply treat cp as levels, every 10 cp is 1 level as long as the character is lvl 50, below that the cp don't matter (so a lvl 50 cp 160 would become a lvl 66 char)

to use a lvl 50 cp 140 char as an example, treat him like a lvl 64 char so the calculation would look somewhat like this:

base = 64*0.346 = 21.798
decay at max swiftly forgotten is 4*base+base, which would be
4*21.8+21.8 = 109
which is exactly the value I was hoping for

the value decrease should be rounded to the nearest full number without any decimal points, it should be max. 1 gold off, which would be close enough for a good estimate in nearly every case...
I can come up with the appropriate lua code if you want but it shouldn't be that hard to read the character level and cp and round some values in any case...

GetUnitLevel("player") and GetUnitChampionPoints("player") should do the trick for this one

this leaves only the problem of your timer starting while the heat is still on, which makes your guess somewhat incorrect in the first 3 minutes since a huge amount of heat takes some time to dissipate
either we let the timer wait until the heat is gone or I need to start a new excel table and come up with a formula to determine how long the heat takes to dissipate and add this time to your timer at the start

in either case you should probably check for GetPlayerInfamyData() which returns heat and bounty as two seperate integers instead of GetFullBountyPayoffAmount() and only start your bounty timer when the heat returns to 0
question is, how do we get your code to wait for the appropriate time... we could either check every second if heat is 0 or I need to come up with a formula of heat dissipation per level to wait for the appropriate time...
any suggestion on your part would be quite helpful here

oh and what I just noticed: since bounty is only decreased every 3 minutes your initial estimate of the decay time should be a multiple of 3...
lets say your bounty is 172g on a lvl 50 cp 160 char, your addon would suggest that the decay time is 4.5 minutes while in fact it would be 6 minutes since it only decreases every 3 minutes, regardless of the amount of bounty left. we should look into this as well to get a perfect estimate (wouldn't be too hard to fix: bounty divided by our estimated bounty decay, rounded up, times 3 should give us the right initial decay time)

oh and another addendum, I'm beginning to be a windbag..
it's probably your self-correction magic that's the cause of the frozen timer... as soon as the timer reaches zero (since it doesn't start with a multiple of 3 minutes) it simply freezes on the initial estimated time left and doesn't tick down anymore... but that problem should simply go away once we have my level-dependant base value, the heat fix and the corrected initial estimate in place
Last edited by cheshire1981 : 04/22/20 at 09:42 AM.
Report comment to moderator  
Reply With Quote
Unread 04/21/20, 07:59 PM  
Shadowfen
AddOn Author - Click to view AddOns

Forum posts: 53
File comments: 424
Uploads: 11
Re: Re: Re: Bounty Reset Clock

Originally Posted by cheshire1981
could you please elaborate which parameters this estimate is based upon?
I have rank 20 in legerdemain and rank 12 in the thieves guild with every passive skill maxed out and the estimate is still WAY off.
Swiftly Forgotten's bonuses are based on the level of the skill and the level of the character. My calculation is based on the level of the skill for a CP 160 level player because I don't have any lower than that (which remain so for very long). The estimate self-corrects after each three minute interval passes and the bounty is reduced by the game so that the estimate becomes less incorrect for lower levels as it gets closer to expiring.

I'm basically calculating decay as seconds/gold and then multiplying by the amount of bounty (gold) to get the number of seconds that it should decay to nothing.

I would appreciate the help if you can come up with an equation that can work for lower level characters more accurately as well as maxed characters.



Originally Posted by cheshire1981
As far as I can determine your estimate would have to be based on the rank of swiftly forgotten, the character level and apparently your legerdemain skill... I am getting closer to this but there is another factor that throws off your estimate: your timer starts while the character still have heat though your bounty only decreases after the heat is off...
It should be based on rank of swiftly forgotten and the character level, but it currently assumes character level of CP160 (because I don't have decay numbers for lower levels) and bases only off of swiftly forgotten with a little self-correction magic as the remaining bounty decreases.

Originally Posted by cheshire1981
I hope you don't mind me messing about with your addon
Not at all!
Report comment to moderator  
Reply With Quote
Unread 04/21/20, 07:27 AM  
cheshire1981

Forum posts: 0
File comments: 6
Uploads: 0
Re: Re: Bounty Reset Clock

Originally Posted by Shadowfen
The bounty reset clock is an estimate based on skill, skill points into particular skills and so on, because Zenimax does not actually provide access to real data. The estimates are known to be more accurate the higher level of a Thief you are with maxed Legerdemaine skills. For lower levels, the estimate is less accurate.
could you please elaborate which parameters this estimate is based upon?
I have rank 20 in legerdemain and rank 12 in the thieves guild with every passive skill maxed out and the estimate is still WAY off.

I am deeply thankful for your addon, it helped me quite alot.
Because of this I would love to help with this problem.
According to your code you determine the rank of swiftly forgotton and modify your estimate accordingly but your values don't correlate to my swiftly forgotten modifiers, is it possible that swiftly forgotten takes your character level into account?
It should be a bounty decay of 115 but on a lvl 37 char it's only 64 (and on 38 it's 66)... maybe if we figure this out we can make your estimates a bit more reliable...
Since it appears to be level dependant and your bounty decay is (<swiftly forgotten rank>*<base value>)+<base value> it all depends on how your base value is being modified by your lower level...
I definetely need more data to help with this one but I am getting there

edit:
As far as I can determine your estimate would have to be based on the rank of swiftly forgotten, the character level and apparently your legerdemain skill... I am getting closer to this but there is another factor that throws off your estimate: your timer starts while the character still have heat though your bounty only decreases after the heat is off...
I hope you don't mind me messing about with your addon
Last edited by cheshire1981 : 04/21/20 at 09:25 AM.
Report comment to moderator  
Reply With Quote
Post A Reply



Category Jump: