EQ2Interface.com
Search Downloads


Go Back   EQ2Interface > Developer Discussion > UI Developer Discussion

 
 
Thread Tools Search this Thread Display Modes
Prev Previous Post   Next Post Next
  #1  
Old 06-14-2026, 07:55 AM
Bubbs Bubbs is offline
A Young Mystail Rat
Interface Author - Click to view interfaces
 
Join Date: Jun 2026
Server: Unkown
Posts: 3
Default Notes from a new ui contributer.

Hi All,

I'm currently waiting for my project to be approved so I won't be talking to much about that, but what I do want to add or talk about are some of the roadblocks I came across and how I solved them. As background info, I'm a systems archictect that really only get's to mess around with tools I make for myself an my team. Primary backend stuff. This was a fun side project to spite someone who questioned my tech creds.... So yeah...

This is an appreciation post to you guys, been a really fun weekend project and have enjoyed going through your posts while looking for some answers. Anyways, here are my observations, ai helped me pull all my test results and thoughts together. Don't burn me too hard on that part lol.

I did find info on some of these, but the posts were kind of old, so figured at least an updated confirmation on whether they still hold true are helpful. Some of these were head-scratchers though.


1. THE BIG ONE: file encoding is load-critical for custom windows

A custom standalone window (one the client builds via createWindow, i.e. anything you summon with /show_window) must be saved as UTF-8 with a BOM AND with CRLF (\r\n) line endings. This is an AND, not an OR; we isolated it with a 4-cell truth table:


BOM | line endings | result
yes CRLF manufactures
yes LF fails
no CRLF fails
no LF fails

If either is wrong, the XML still parses, but the window silently fails to to manufacture: nothing appears, no chat error. The only trace is a line in alertlog.txt:

Eq2GuiModule::createWindow(): failed to manufacture window <Name>

Nuance: plain override files (e.g. eq2ui_inventory_bag.xml, which modify an existing Default window rather than create a new one) tolerate LF/no-BOM. The strict requirement is on new manufactured windows. When in doubt, save BOM+CRLF anyway.

Many text editors default to LF/no-BOM. Notepad++ → Encoding → "UTF-8 BOM", and Edit → EOL Conversion → "Windows (CR LF)".

==================

2. Skin activation: eq2_recent.ini overrides eq2.ini

Two files can set cl_ui_skinname:

eq2.ini: the manual override you create.
eq2_recent.ini: written by the client on exit; this one wins at startup.

So if you ever /loadui and pick Default, the client writes cl_ui_skinname Default into eq2_recent.ini, and from then on every launch loads Default no matter what eq2.ini says. Symptom: "my custom UI stopped loading and restarting doesn't help." Fix: re-select your skin in /loadui, or hand-edit cl_ui_skinname in eq2_recent.ini (while the client is closed).

==================

3. A skin folder needs eq2ui_skininfo.xml to appear in /loadui

Without it, the folder loads fine if pointed at by the ini, but never shows up in the Load UI picker, so you can't re-select it, and you're stuck restarting to reload (see #2 for the trap that creates). The file supplies the Author/Version/Description shown in the picker. Minimal form:

<Page Name="SkinInfoPage" ScrollExtent="800,600" Size="800,600" Visible="false">
<Data author="..." contact="..." description="..." Name="SkinInfo"
text=":f:MuleStation" version="..."/>
</Page>

Once present, you can reload edits fast: /loadui → Default → /loadui → your skin, no full client restart needed.

==================

4. Custom windows do NOT auto-load: register + summon

There is no custom_*.xml auto-scan convention. To load a custom window:

Put the window file in the skin folder.
Register it: add <include>yourfile.xml</include> inside eq2ui_custom.xml, whose root is <Page Name="Custom" ...>.
Summon it: /show_window Custom.<WindowName>.

eq2ui_custom.xml example:

<Page IgnoreTab="false" ismodule="true" Name="Custom" ... Visible="false">
<include>custom_mulestation.xml</include>
<include>custom_toggle_bag1.xml</include>
</Page>

=================

5. The window's root element is <Page>, not <Window>

A standalone window is <Page Name="MuleStation" ...> and is addressed by joining the registry page name to it: /show_window Custom.MuleStation. (Assuming <Window> was an early wrong turn.)

=================

6. Running a slash command from a button: the "command emitter" pattern

There's no direct "run command on click." Instead, a button's OnPress flips a hidden child <Page> visible; that page's OnShow holds the raw command (no leading slash) and then re-hides itself so it can fire again:

<Page Name="CmdToggle" Visible="false" OnShow="
togglebags
Visible=false" />
...
<Button ... OnPress="Parent.Parent.CmdToggle.Visible=true" />

Mind the relative path (Parent.Parent...); it must resolve from the button up to wherever the emitter page lives.

=================

7. alertlog.txt is your instrument

Manufacture failures only surface here, at UI-load time (before /show_window). When testing variants, delete alertlog.txt first, reload, then read it; the failing window names tell you exactly what broke. This is how we bisected the encoding rule.

=================

8. Confirmed native styling vocabulary (from Daybreak's own bag XML)

Safe to use; pulled from eq2ui_inventory_bag.xml:

<Text ...>label</Text> with TextColor="#RRGGBB": colored static labels work.
Fonts: /TextStyles.Large.LargeStyle, /Fonts.FontZapf15.
ShadowStyle="/ShadowStylesNew.Outline.style": outline shadow for titles.
Window background: a child <Page> with RStyleDefault="/rectlist.win_plain".
Buttons: Style="/CommonElements.SmallPushButton.data.style", label via the Text="..." attribute (not inner content). Color="#RRGGBB" tints a button.

=================

9. Command verification status

togglebags: CONFIRMED.
bag_open N / bag_close N: CONFIRMED (tested in-game).
sort_bags tier d | name a | level d: family CONFIRMED; exact arg behavior to retest.
finditem: exists; argument behavior to verify.


=================

10. Command reality check (current client, verified)

Confirmed working (safe to wire to buttons):

togglebags: open/close all personal bags.
finditem: searches ALL inventory: bags, personal bank, shared, house vault.
dump_items_to_log: writes full inventory to the log file.
empty_overflow: pushes overflow-window items back into bags.

Does NOT work on this client (don't rely on it):

sort_bags <method> <a|d>: documented (tier/name/level, a/d), but params don't take here: same confirmation dialog, no reorder, even from chat. Might be doing this one wrong though.
bag_open -3 (personal bank view) / bag_open -4 (shared bank view): legacy 2008 syntax, dead on current client.

Not possible by command at all:

Opening a specific bank / shared bag. The bank window (eq2ui_inventory_bank.xml) has only 3 buttons (window chrome); bag slots are engine-bound DynamicData/ ActionData widgets, opened by built-in double-click, not a fireable command.
Moving an item between containers (the classic two-decade wall). Drag-and-drop only; the lone exception is swapping a whole bag onto an empty bag slot.

==================

11. I did some data mining, and found a few commands that weren't really well documented.

Commands the wikis never list:

output_inventory_to_file -- THE location win. Writes <Server>_<Char>_Inventory.txt to the EQ2 root, container-structured: [Bag] name with [Bag Slot N] items, plus explicit [Bank], [Shared Bank], [House Vault], [Overflow], [Equipped Items], [Mounts], [Familiars] sections. It has NO tier/level/qty. Pair it with dump_items_to_log (which HAS tier/level/qty but no location) and join on item name = full picture. Note: name-join is approximate for items split across multiple stacks.
togglebankbags -- opens/closes ALL bank bags at once (revives the bank panel).
togglehouseinventory -- opens the house vault.
toggleinventory / showinventory -- inventory open/close.
cl_disable_bag_confirmation_dialog true -- kills the "Are you sure you want to sort?" popup. Set once; also lets you tell if sort is actually reordering.

==================

12. In-game browser -> local web app (embedding)

browserexternal <url> -- opens the URL in your SYSTEM browser.
browser <url> -- opens the in-game (embedded CEF) browser. Old engine; may not render a modern app well. Good for simple pages.
cl_browser_homepage, cl_enable_browser -- browser config.
file:/// local paths ARE supported by the client (cl_help_path file:///help/ in eq2_default.ini proves it). So a button can open a local HTML file.
EULA-safe: opening a local read-only page touches nothing in the client.

==================

13. Browser commands confirmed in-game

/browserexternal file:/// -> opens in the SYSTEM default app/browser (works).
/browser file:/// -> opens the in-game CEF browser to the path (works; renders blank on plain-text files, will paint real HTML). Both take the path as a direct argument.
Reply With Quote
 



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump


All times are GMT -5. The time now is 05:21 PM.


Our Network
EQInterface | EQ2Interface | WoWInterface | LoTROInterface | ESOUI | MMOUI