The Elder Scrolls Online. The AUI addon was working fine and now, it does not even detect that its even on the list of addons in game. ESOUI's Minion client. There are likely way to many various base game packages of ESO on steam that they current way just will not work for all players. The way it currently works really makes it impossible to use the service for ESO at least for old ESO purchases. Provide an option to launch with mods using the app Minion. Hello everyone! Updating addons manually is a huge pain in the ass, and minion won't work for me:(, are there any other addon managers? When i start minion, i check on elder scrolls, C Drive, but nothing happens and it doesn't track it, so i add game manually, go to my documents - TESO-LiveEU-Addons, and click 'select', but it returns me to the main screen without ESO, i tried. Minion, AddOn Manager for The Elder Scrolls Online. To install all the addons we list below, simply navigate to “Find More”, and copy-paste the addon name. Installing the addons manually is not rocket science, you just drop the downloaded folders inside the AddOns folder which we mentioned above. Minion doesnt really support auto detection of AddOn folders not in the default documents folder location for ESO. That is something in the works. If you already have a listing for the ESO game but its just saving the addons in the wrong location just change the path under the options tab. Make sure to click on the last folder so that the full.
From ESOUI Wiki
Jump to: navigation,search
|
How do I install an addon?
- Find the AddOns folder inside your ESO folder (if it doesn't exist, start up the game once, and it will create it for you):
To find the folder 'AddOns' read this wiki entry: https://wiki.esoui.com/UserFolder
It is a subfolder of the UserFolder.
It is a subfolder of the UserFolder.
- All your addons will go in this directory.
- Individual addons are just folders that contain a bunch of files. One really important file will be the <addonName>.txt file. It will have the same name as the folder that contains it.
- If you've copied an addons folder from somewhere else, like a network share, just paste it in this directory and when you run the game you should see it in the AddOn Manager (which you can open at character select, or in the game from the main menu)
Symlinking folders
You can use one AddOn installation over multiple user profiles by symlinking the folders from the system console like this:
- Windows: mklink /D 'TARGET_PATH' 'SOURCE_PATH'
- Mac: ln -s 'SOURCE_PATH' 'TARGET_DIR'
Debugging for New Addon Devs
So you looked at one of the tutorials, and you did what was there but it's just not working! Here's a few easy things to trip up on:- Make sure that the name of the containing folder, and the name of the .txt file are EXACTLY the same. The string that is passed to the handler for EVENT_ADD_ON_LOADED should also match that.- Do you have a d() message in your addon intialization? Chat isn't initialized until the UI is finished loading, so you won't see it. Get pChat and add it as an optional depends on in the .txt file.- Check the .txt file and make sure the spelling of other files (specifically the main.lua file or whatever you call it) is spelled correctly and exactly.
How do I output something to the chat?
Send chat messages
You cannot send chat messages, but you are able to put text into the Chat of the client. There are two ways:
- For simple text, use 'CHAT_SYSTEM:AddMessage(<message String>)'
- This will put the message in the active tab of the active Chat Container
- If you want to specify which Chat Container, Tab and the like to send to, you can specify array indexes like this: 'CHAT_SYSTEM.containers[<Chat Container Number>].windows[<Tab number>].buffer:AddMessage(<message String>)'
- This is only suitable for simple strings, so it is not ideal for debugging purposes
Debug Output
d() adds yellow text to the chat box. It's mostly used for debug/dump.
- use 'd(<list of variables>)' to call it
- it will automatically iterate over tables and print out the ID's of functions and tables
- d() is by default only available after the loaded events have been fired (as the chat is not ready before and it is not buffered).
If you need to output d() messages from your .lua file or the loaded event, BugEaters[[1]], Pre-Init debug option is worth a look. Just don't forget to add it as optional dependency (so it is executed before your addon if present).
Alternatively, you can use pChat. (Which comes with a nice 'save chat after /reloadui function too')
How do I save settings on the local machine?
AddOn settings can be persisted on the local machine using saved variables. A saved variable is a table that your add-on declares in its text file. When your add-on is loaded, the saved variable is created in memory from its save file. When the add-on is unloaded, the table in memory is saved to a file on disk. The file is located in Windows: Documents/Elder Scrolls Online/<build flavor>/SavedVariables/<your add-on's saved variable name>.lua, Mac: ~/Documents/Elder Scrolls Online/<build flavor>/SavedVariables/<your add-on's saved variable name>.lua. To use a saved variable in your add-on:
- Open the .txt file for you add-on in the add-on's directory.
- Add a line declaring the saved variable's name:
- Create an event handler for EVENT_ADD_ON_LOADED. The saved variable does not exist until the add-on is loaded so it must be created at the point your add-on's ADD_ON_LOADED event is sent.
In any of your lua files:
- Create a ZO_SavedVars object to access the raw saved variable table, or create it from the default if nothing fitting is on the disk. The saved variable constructor looks like this for character specific data:
This will use the unique character ID to save the data into the SavedVariables table. Inside the table there will also be written the character's name with the key ['$LastCharacterName'] so you are able to read the character ID (it's a string!) and name from the table, if you need to!-> There also exists an obsolte old way to save the charater data by the charater name, which obviously is not character rename save and should not be used anymore: ZO_SavedVars:New
- And like this for account wide data (that is shared between all Characters):
- The parameters are:
- savedVariableName - The variable name you put in the add-on text file.
- variableVersion - The current version of this saved variable. It should start with 1. The version number is saved with the saved table on the disk. If the version number in the file and the version given to the constructor do not match, the values in the file are ignored and default is used instead. Use this at development time to force ignoring the values from previous attempts and at distirbution time to force previous versions stored data to be reset.
- namespace - An optional string that lets you define sub-tables in your saved variable. Use if you need to store several different sets of data in one saved var. For example, the ZO_Ingame_SavedVariable has namespaces for Chat and WorldMap. Probably not necessary for most add-ons.
- defaults - A table that lets you specify what the default values in the saved variable are*. You have to define a default table before calling the constructor, but it can be an emtpy one. There is no way to check if defaults are needed (the decision is made by the constructor)
- profile - Allows you to select a specific profile instead of the current character's default profile. Probably not necessary for most simple add-ons without robust profile management.
- For example, if you were storing a relative window position and you wanted to default it to 0, 0 then your default table might look like:
- Read and write from the saved variable:
- Iterating over SavedVariables:
If the SavedVariable contains int indexed values, you cannot properly get the highest number using #savedVars (it returns 0). If you need to easily iterate over the data in the saved variable, assign the table with int-indexes to a string Index, even if that results in the saved variables containing nothing but this one string index:
- Limitations:
The game will not save a string variable, if it is 2,000 or more characters. So split long strings below that. Unicode wide characters count as longer, so use #string to get the correct byte length of it. Splitting strings is officially recommended, as done in the Librarian addon:
Why can't I call MoveForwardStart / TurnLeftStart / this function?
Some of the lua API functions are marked with accessControl='private.' These functions cannot be called or even referenced in addons for security reasons. Look in ESO UI Documentation to see what accessControl is set for a function. No accessControl being set means that it is public.
Another group of API functions are marked with accessControl='protected'. These function cannot be called while in combat, but calling them outside combat is not an issue. This restriction usually applies to actions the user cannot perform during combat.
Another group of API functions are marked with accessControl='protected'. These function cannot be called while in combat, but calling them outside combat is not an issue. This restriction usually applies to actions the user cannot perform during combat.
Is there a way to dynamically create controls like buttons or labels?
Controls can be created dynamically using the CreateControlFromVirtual function and a virtual template defined in XML. The template defines what the created control will look like and can be as complex as a normal control (with sub-controls, properties, etc).
- To define the template we use the same XML we would use to write the control with the addition of the virtual='true' attribute:
To use the template we call CreateControlFromVirtual. It has the following arguments:
- controlName - The name of your new control. It must not be the same as any other control.
- parent - The control that will be the parent. It should be the top level or whatever container control should hold these.
- templateName - The name of the template defined in XML.
- currentId - You can optionally pass in a number that will be appended to the control name. This is used to make it easier to make a whole lot of controls by incrementing the id for each new control.
How do events work?
Events allow your add-on to be notified when a specific 'event' happens in the game client. These events vary widely and include things like getting new inventory items, receiving chat messages, and accepting quests. You add-on is 'notified' in the form of the game client running a function that you registered earlier on. For example, when the client receives a group invitation for the player, EVENT_GROUP_INVITE_RECEIVED is triggered, calling all functions that have registered to be notified of it. When the functions are ran, they may be passed arguments that offer more information about the event. The first argument is always eventCode which is a number identifying the event. In the case of EVENT_GROUP_INVITE_RECEIVED, the second argument is the name of the person that is inviting the player to the group. You can look up what arguments come with each event in the ESO UI Documentation files.
So how does this look in lua?
Event handler function
Register the event
You may also unregister events with the UnregisterEvent function.
If your addon can benefit from splitting up parts of its functionality into separate files to make them more manageable you can use the unique string to specify a combination of say addon and file to further control what happens when. This way, for example, you can have one file that does something in the PlayerActivated event function but can now safely tell it to unregister the event for that file without affecting a file that may have to process something every time your player is activated and not only when you first log in or reload.
NOTE: Bear in mind that the order these events are triggered and acted on are initially based on the order they are in the addon txt file.
![Addon Addon](https://img.youtube.com/vi/Ws1HmtSkqcM/0.jpg)
For example Halo 3 for mac macintosh.
Eso Minion Not Working Images
(file 1):
(file 2):
How does screen resolution impact the UI?
To understand how the game lays out the UI we should start by talking about UI units. UI units are what you are specifying when you set the width, height, offsets, or any other positional values of a control. They are not the same as pixels and are based on aspect ratio instead of the resolution. The number of pixels that a UI unit actually represents varies based on the resolution of the player's screen. The reason why we use UI units is it allows up to guarantee that we have at least 1680 x 1050 UI unit space regardless of the player's resolution. This means that if we wanted to put a 1680 UI unit wide window into to game, it would fit on monitors from 1280 x 1024 pixels, to 2560 x 1980 pixels, to anything else. Lets look at some examples to see how UI units map to pixels in the game.
- Player's Resolution: 1680 x 1050.
- In this case, the player's resolution exactly matches our target resolution and aspect ratio. The canvas (the UI unit grid that covers the whole screen) measures 1680 x 1050 and one UI unit is equal to one pixel.
- Player's Resolution: 1980 x 1050.
- In this example, the player's screen is wider that our target aspect ratio. If we just put a 1680 x 1050 canvas inside of it we would have some additional space on the sides. So we expand the canvas to be 1980x 1050. This means that the UI can be wider that the target size (or taller), but never smaller. Here also we have one UI unit equal to one pixel.
- Player's Resolution: 1680 x 1200.
- This one is taller than the target aspect ration. Putting in a 1680 x 1050 canvas would have some additional space on the top and bottom. So we expand the canvas vertically to fill the space, leading to a 1680 x 1200 canvas. Notice that one of the canvas dimensions is always fixed. Either it will be 1680 x (Something larger than 1050) or (Something larger than 1680) x 1050. When the aspect ratio is wider (larger) than our target, the canvas height is fixed at 1050 and the width grows. When the aspect ration is taller (smaller) than our target, the canvas width is fixed at 1680 and the height grows.
- Player's Resolution: 1920 x 1200.
- This screen has the same aspect ratio as our target (1.6) but its bigger. In this case, the number of pixels representing a UI unit changes. The canvas will be 1680 x 1050 UI units (because the aspect ratio is a match), but we have to scale the UI units up to match the number of pixels on the monitor. We take the resolution dimension and divide it by the canvas dimension (1920 / 1680 = 1.14 pixels per UI unit).
- Player's Resolution: 1228 x 768.
- This screen has the same aspect ratio as our target but its smaller. The pixels per UI unit in this example are 1228 / 1680 = .73 pixels per UI unit.
- Player's Resolution: 2000 x 1000.
- In this last example lets consider a resolution that doesn't match the aspect ratio or resolution. The aspect ratio of the screen is 2 (2000 / 1000) which is larger than the target (1.6) so it is wider than desired. This means that it has a fixed height of 1050, and extra space on the sides. At an aspect ratio of 2, 1050 height matches (1050 x 2 = 2100 UI units wide) for the canvas. So our UI canvas is 2100 x 1050. Finally, we compute the pixels per UI unit which is (2100 / 2000 = 1.05 pixels per UI unit).
The above examples ignore one feature of the UI which is called global scale. This is the slider in the UI options that lets you make the UI larger or smaller. Global scale functions by changing the size of the canvas to impact the relative size of the windows. A small global scale makes the canvas bigger, which makes the windows seem smaller. A larger global scale makes the canvas smaller, which makes the windows seem bigger in comparison. For example, consider a 1000 x 1000 canvas with a 500 x 500 window centered in it. At a global scale of 0.5 the canvas becomes 2000 x 2000 (Original Canvas * (1 / Global Scale)). Whereas the 500 x 500 window used to be half the height and width (500 / 1000), it is now 25% of the height and width (500 / 2000).
What are Draw Level, Layer and Tier?
For a discussion of the difference between these control ordering settings see: Control Ordering
How do I generate my own 'events' in Lua?
You cannot add events to or Raise Events in the Event_Manager. All you can do is adding handlers to it. Events there are added and fired from outside of the Lua Environment (and thus are out of the range for the Addons).Instead you have to use something called the 'Callback Manager' to realise custom events. Creating Custom events is a 3 step process:
1. Setup:
- (optional) Making local Callback Manager:
Callback 'Events' need a ID that is unique for the instance of the CallbackManager Class they are Fired in. If you choose to use the Global Callback manager (found under the global variable CALLBACK_MANAGER), high care must be taken to not collide with other Custom Events, especially as they do not have to be 'registered' beforehand in any way. All the colission concerns of Global Variables apply to Custom Events registered in the Global Callback Manager.If you want to avoid this you can create a local Callback Manager (with the Scope of your Code) for Custom Events. Just bear in mind that you have to expose it globally if you want other code to be able to register the Custom Events in your Callback Manager. You create a Local Scope Callback manager this way:
From there just replace all mentions of 'CALLBACK_MANAGER' with 'LocalCallbackManager' to get your local Callback Manager instance instead of the global, shared one.
- Choosing a name:
Regardless of which Callback Manager you use (the global one or a local one), you need a unique String ID for the Event. Ideally write it down as constant into a variable. Choose anything you are certain will be unique for this instance of the Callback Manager. If you want other code to be able to register your events, don't forget to also expose their names globally. Avoid just mentioning the Event Name in the Documentation (after all if they can use your variable, they have the right name without needing to know the right name which can be important if you change it later).
2. Firing the Event:
- You just have to tell the Callback Manager wich Event to fire, followed by the Arguments the Event handlers should receive:
This line will run all the Callbacks/Handlers (if there are any registered under <Event Name>), hand each handler a copy of each argument and then continue. If none are registered, it will just continue without doing any work (you do not have to guard against nil/empty collection problems).
3. Registering Custom Events:
- This process is very similar to registering EventManager Events, except there is no ID for your registration. Each Registered Callback is identified based on the Event it is registered to and the Callback function given.
3b Unregistering Custom Events Handlers:
![Eso Minion Not Working Eso Minion Not Working](https://i.ytimg.com/vi/JMNccCJyY_g/hqdefault.jpg)
Just hand it the same function and event name as when registering it. National automatic bread maker sd bt2n manual pdf.
Are there Keypress events that we can tie into?
If you want custom bindings (like in the keybinding window), you can make a bindings.xml file for your add-on and add them there. You can look at the bindings.xml files for examples. You will also need to make a string entry with the name 'SI_BINDING_NAME_X' using ZO_CreateStringId('SI_BINDING_NAME_X', 'My Custom Bind Name') where X is the name of the binding you added and it should appear in the bindings window. For example:
THIS SECTION GOES IN THE LUA FILE, NOT THE BINDINGS FILE
You can choose to add sections for up, down, or both. The code in the section will be run each time the binding is activated (<Down> for key down and <Up> for key up).
Minion Addons Eso
You can also make a top level window keyboardEnabled='1' in the xml and it will eat up all keypress events when it is shown. This is best used for when your window has a completely different use of the keyboard and you don't care that bindings aren't triggered. For example, if your wrote a Tetris add-on and wanted WASD to control the piece, keyboardEnabled can do it. The script handlers for keys are <OnKeyDown>, <OnKeyUp>, and <OnChar>. OnChar passes the key, while OnKeyUp and OnKeyDown pass the key, ctrl, alt, and shift arguments as booleans. Search ESO UI Documentation for KEY_ globals and you will find all the key definitions. For example, KEY_A, KEY_Z, KEY_ENTER, KEY_BACKSPACE. If you want to add controls for moving the tetris piece left and right you might do the following:
Minion Eso Addon Manager
Can I add my own sound files to play with PlaySound()?
At the moment this is not possible. However, ZOS has confirmed that they will probably add it eventually.
Nothing seems to load from my Addon LUA file
Make sure the file end-of-line format is set to windows mode (rn) instead of linux mode (n). It can silently ignore the file if you have the incorrect line ending.
Make sure that the name of the folder matches the name of the .text manifest file.
Eso Minion Not Opening
Make sure the names of the files to load in the manifest file are correct.
Make sure that the folders you're editing are the live and not PTS folders or vice versa.
Try adding an optionalDependsOn for pChat, and then scatter d() in the LUA file. It could be that some stuff is loading and others isn't.
Make sure the addonName in LUA is the same as the name of the folder and the name of the manifest file.
In what order are Addons loaded? I want mine to load before others!
Tests indicate addon loading rules only follow dependencies. Otherwise, the loading order is undefined. There's no rule saying addon A will load before addon B, newer folders before older folders, etc.
Only if B depends on A (optional or not optional), will A be run before B. So if you want your addon to run before others, you have to ask the authors to add an appropriate Optional dependency.
Only if B depends on A (optional or not optional), will A be run before B. So if you want your addon to run before others, you have to ask the authors to add an appropriate Optional dependency.
What's the difference between pairs and ipairs
The functions pairs and ipairs are used to iterate over your tables/indexed arrays. The difference between them is:
pairs: Will iterate in a non predictable order, using the table's key (which can be non-numeric, e.g. a string).
ipairs: Will iterate in a predictable order over numerically indexed array only! If the array's index is missing one number the function will return nil! If the array does not use a numerically index the function will return nil
Many problems or errors within your addons occur because you try to use ipairs to iterate over a table with string keys or the key is missing one number (got a gap).
Your addon won't show any error message but just will abort the ipairs function at this point silently.
pairs: Will iterate in a non predictable order, using the table's key (which can be non-numeric, e.g. a string).
ipairs: Will iterate in a predictable order over numerically indexed array only! If the array's index is missing one number the function will return nil! If the array does not use a numerically index the function will return nil
Many problems or errors within your addons occur because you try to use ipairs to iterate over a table with string keys or the key is missing one number (got a gap).
Your addon won't show any error message but just will abort the ipairs function at this point silently.
Retrieved from 'https://wiki.esoui.com/AddOn_Quick_Questions'
TTC will not be able to afford everyday server costs without Ads. If you like TTC and wish to keep our servers running, please support us by disabling Ads blocker or by adding TTC into whitelist. Thank you! Addon and client
Detailed Instruction
|