• You've discovered RedGuides, an EverQuest multi-boxing and scripting community 🧙‍♀️⚙️. We want you to play several EQ characters at once, come join us and say hello! 👋

  • A TLP without truebox has thawed (Very Vanilla ready)
    Frostreaver
Boxhud

Release Boxhud (1 Viewer) 04/06/2024

No permission to download
aquietone updated boxhud.lua (Requires MQNext and MQ2Lua) with a new update entry:

v1.8.0

- Set initial window size so it isn't a tiny square on first use
- Update button command handling a bit for crashes
- Add more settings validation
- Add handling for observing TLOs that may not be present on all toons
Relies on defining dependencies between observed properties. For example:
If you have the MQ2Monk, MQ2Eskay and MQ2Rogue plugins, which add TLO `CWTN`, and you want to observe `CWTN.Mode`, then it may interfere
with macros running on toons without a CWTN class plugin...

Read the rest of this update entry...
 
Let me start by saying that I'm not a coder by profession and most of what I've "written" has been through cut, paste and modify to my needs. Having said all that, I added a column on the XP tab for aaxp percent using me.aaexp. It works fine except that the data is formatted 65535 when the actual percent is 65.535. When attempting to math my way out of this predicament I found out that it's a string value as well. Using tonumber to convert before mathing it told me that it was now a nil value. I realize that this is really a Lua question and not specifically related to boxhud, but I figured that some kind soul could help me out =).

I apologize in advance for making a verbing a noun and turning it into an adjective but it sounded funny so I went with it.

-G
 
You probably missed the () on the end of the TLO and things went down hill from there.

edit: This was totally wrong and aquietone cleared it up, just in case someone else comes along and wonders what I was talking about -- we're on the same page, I don't know what I was talking about either.
 
Last edited:
Let me start by saying that I'm not a coder by profession and most of what I've "written" has been through cut, paste and modify to my needs. Having said all that, I added a column on the XP tab for aaxp percent using me.aaexp. It works fine except that the data is formatted 65535 when the actual percent is 65.535. When attempting to math my way out of this predicament I found out that it's a string value as well. Using tonumber to convert before mathing it told me that it was now a nil value. I realize that this is really a lua question and not specifically related to boxhud, but I figured that some kind soul could help me out =).

I apologize in advance for making a verbing a noun and turning it into an adjective but it sounded funny so I went with it.

-G

you'll want ObservedProperties to include:
{Name='Me.PctAAExp'},
instead of just {Name='Me.AAExp'},

then the column could be like:
INI:
{
  Name='AA Exp%',
  Properties={
    all='Me.PctAAExp'
  },
  Thresholds={33,66},
  Percentage=true,
  Ascending=true
}
 
you'll want ObservedProperties to include:
{Name='Me.PctAAExp'},
instead of just {Name='Me.AAExp'},

then the column could be like:
INI:
{
  Name='AA Exp%',
  Properties={
    all='Me.PctAAExp'
  },
  Thresholds={33,66},
  Percentage=true,
  Ascending=true
}

You Rock! I looked for another property but just didn't see one. Thanks!

-G
 
One thing to make note of for folks, if you are doing the CWTN stuff like this:

Code:
{
            Name='CWTN.Mode',
            DependsOnName='Me.Class.ShortName',
            DependsOnValue='MNK,ROG,WAR,SHD,MAG,ENC,CLR,BER,SHM'
},

You have to have an observed property for {Name='Me.Class.ShortName'} above the CWTN stuff or you'll get errors in the DependsOnName part.


1627706495784.png
 
For the sake of sharing ideas, here's what I currently use. I haven't added the CWTN stuff yet, its on my to do list.

[CODE lang="ini" title="boxhud-settings"]Tabs = {
{
Name='Combat',
Columns={
{
Name='Class',
Type='property',
Properties={all='Me.Class.ShortName'},
Thresholds=nil,
Percentage=false,
InZone=false,
},
{
Name='DST',
Type='property',
Properties={all='Distance3D'},
Thresholds={100,200},
Ascending=false,
Percentage=false,
InZone=true,
},
{
Name='Target',
Type='property',
Properties={all='Target.CleanName'},
Thresholds=nil,
Percentage=false,
InZone=true,
},
{
Name='Spell/Disc',
Type='property',
Properties={
all='Me.Casting.Name',
melee='Me.ActiveDisc.Name'
},
Thresholds=nil,
Percentage=false,
InZone=false,
}
}
},
{
Name='Stats',
Columns={
{
Name='HP%',
Type='property',
Properties={all='Me.PctHPs'},
Thresholds={35,70},
Percentage=true,
Ascending=true,
InZone=false
},
{
Name='MP%',
Type='property',
Properties={all='Me.PctMana'},
Thresholds={35,70},
Percentage=true,
Ascending=true,
InZone=false
},
{
Name='EP%',
Type='property',
Properties={all='Me.PctEndurance'},
Thresholds={35,70},
Percentage=true,
Ascending=true,
InZone=false
},
{
Name='HP',
Type='property',
Properties={
all='Me.CurrentHPs'
},
Thresholds=nil,
Percentage=false,
InZone=false,
},
{
Name='MANA',
Type='property',
Properties={
all='Me.CurrentMana'
},
Thresholds=nil,
Percentage=false,
InZone=false,
},
{
Name='END',
Type='property',
Properties={
all='Me.CurrentEndurance'
},
Thresholds=nil,
Percentage=false,
InZone=false,
},
{
Name='CState',
Type='property',
Properties={
all='Me.CombatState'
},
Thresholds=nil,
Percentage=false,
InZone=false,
}
}
},
{
Name='StatFood',
Columns = {
{
Name='Hunger',
Type='property',
Properties={
all='Me.Hunger'
},
Thresholds=nil,
Percentage=false,
InZone=false,
},
{
Name='Thirst',
Type='property',
Properties={
all='Me.Thirst'
},
Thresholds=nil,
Percentage=false,
InZone=false,
},
{
Name='SFood',
Type='property',
Properties={
all='FindItemCount[Primordial Noodles with Indigenous Primordial Meat]'
},
Thresholds=nil,
Percentage=false,
InZone=false,
},
{
Name='SDrink',
Type='property',
Properties={
all='FindItemCount[Primordial Plasma Smoothie]'
},
Thresholds=nil,
Percentage=false,
InZone=false,
},
{
Name='Bread',
Type='property',
Properties={
all='FindItemCount[Loaf of Bread]'
},
Thresholds=nil,
Percentage=false,
InZone=false,
},
{
Name='Milk',
Type='property',
Properties={
all='FindItemCount[Bottle of Milk]'
},
Thresholds=nil,
Percentage=false,
InZone=false,
}
}
},
{
Name='Misc',
Columns = {
{
Name='Plat',
Type='property',
Properties={
all='Me.Platinum'
},
Thresholds=nil,
Percentage=false,
InZone=false,
},
{
Name='Sub',
Type='property',
Properties={
all='Me.Subscription'
},
Thresholds=nil,
Percentage=false,
InZone=false,
},
{
Name='Time',
Type='property',
Properties={
all='Me.SubscriptionDays'
},
Thresholds=nil,
Percentage=false,
InZone=false,
},
{
Name='Krono',
Type='property',
Properties={
all='Me.Krono'
},
Thresholds=nil,
Percentage=false,
InZone=false,
}
}
},
{
Name='XP',
Columns = {
{
Name='LVL',
Type='property',
Properties={
all='Me.Level'
},
Thresholds=nil,
Percentage=false,
InZone=false,
},
{
Name='XP%',
Type='property',
Properties={
all='Me.PctExp'
},
Thresholds=nil,
Percentage=false,
InZone=false,
},
{
Name='AA%',
Type='property',
Properties={
all='Me.PctAAExp'
},
Thresholds=nil,
Percentage=true,
InZone=false,
},
{
Name='AA Points',
Type='property',
Properties={
all='Me.AAPointsTotal'
},
Thresholds=nil,
Percentage=false,
InZone=false,
},
{
Name='AA Unspent',
Type='property',
Properties={
all='Me.AAPoints'
},
Thresholds=nil,
Percentage=false,
InZone=false,
}
}
},
{
Name='Macros',
Columns = {
{
Name='Macro',
Type='property',
Properties={
all='Macro.Name'
},
Thresholds=nil,
Percentage=false,
InZone=false
},
{
Name='Paused',
Type='property',
Properties={
all='Macro.Paused'
},
Mappings={
TRUE='PAUSED',
FALSE=''
},
Thresholds=nil,
Percentage=false,
InZone=false
},
{
Name='Pause',
Type='button',
Action='/dex #botName# /mqp'
},
{
Name='End',
Type='button',
Action='/dex #botName# /end'
}
}
}
},

ObservedProperties = {
{Name='Me.Class.ShortName'},
{Name='Me.CombatState'},
{Name='Me.PctHPs'},
{Name='Me.PctMana'},
{Name='Me.PctEndurance'},
{Name='Me.Casting.Name'},
{Name='Me.ActiveDisc.Name'},
{Name='Target.CleanName'},
{Name='Me.Hunger'},
{Name='Me.Thirst'},
{Name='FindItemCount[Primordial Plasma Smoothie]'},
{Name='FindItemCount[Primordial Noodles with Indigenous Primordial Meat]'},
{Name='FindItemCount[Bottle of Milk]'},
{Name='FindItemCount[Loaf of Bread]'},
{Name='Me.CurrentHPs'},
{Name='Me.CurrentEndurance'},
{Name='Me.CurrentMana'},
{Name='Me.Platinum'},
{Name='Me.Subscription'},
{Name='Me.SubscriptionDays'},
{Name='Me.Krono'},
{Name='Macro.Name'},
{Name='Macro.Paused'},
{Name='Me.Level'},
{Name='Me.PctExp'},
{Name='Me.PctAAExp'},
{Name='Me.AAPointsTotal'},
{Name='Me.AAPoints'}

},[/CODE]
 
I'm having problems with the FromIDProperty usage:

INI:
|-- The column I'm trying to add...

                {
                    Name='Distance',
                    Type='property',
                    Properties={all='Distance3D'},
                    Thresholds={100,200},
                    Percentage=false,
                    InZone=true,
                    Width=60
                },
              
|-- The property observed as described...

    SpawnProperties = {
        {Name='Distance3D'},
        {Name='Distance',FromIDProperty='Group.MainAssist'}
    },

Oh, I think I need to use NetBots to do this?

The spawn property support i have in here is a bit odd and only useful for a couple things. The ${Spawn[id SomeID].SomeProperty} is run from the toon running the HUD, where "SomeID" is the value of the observed property referenced by FromIDProperty.
I mainly added it for netbots to be able to display the target name, since netbots only returned the target id. In that case, it was like
INI:
NetBotsProperties={
  {Name='TargetID'}
},
SpawnProperties={
  {Name='CleanName', FromIDProperty='TargetID'}
}
So then the toon running the HUD would look at ${Spawn[id ${NetBots[toon].TargetID}].CleanName}.

For what you're trying to do, it would always end up returning the distance from the toon running the HUD to the group MA, instead of from each individual toon to the group MA.
 
Thank you, I deleted it right as you posted it because I found the solution. Still learning the TLOs and what inherits what. :) I think I can go with ${Group.MainAssist.Distance3D} as a work-around.
 
aquietone updated boxhud.lua (Requires MQNext and MQ2Lua) with a new update entry:

v2.0 - configure all the things

- Add in game configuration of tabs, columns and properties
- Rearrange settings file a bit
- Break up the script into a few files in a boxhud folder
- Add persistence.lua library for dumping table to save configuration
- Various minor fixes..
- case insensitive check for Observed Property DependsOnValue
- Right align percent columns, not just plain numbers
- Update getting zone peer group name
- ...

Read the rest of this update entry...
 
With this latest update, should I remove the boxhud-settings.Lua and the boxhud-settings-toonname.Lua files from the main Lua directory? Should I move them to the new boxhud folder?
 
With this latest update, should I remove the boxhud-settings.lua and the boxhud-settings-toonname.lua files from the main lua directory? Should I move them to the new boxhud folder?

you can remove them. the only file needed outside the boxhud folder is boxhud.Lua. I just left the old settings there as a backup. If a toon has a settings file in Lua/ and not in boxhud/ then it will copy it over automatically, leaving the old one in place.
 
Thanks. Sometimes the simplest of things summon Murphy and his damn laws...
 
First, the latest update additions are incredible; thanks for your work! I used the configuration tab to add some things and everything worked great. But even though I saved everything, all my additions were gone when I relogged. Is there something else I missed?
 
First, the latest update additions are incredible; thanks for your work! I used the configuration tab to add some things and everything worked great. But even though I saved everything, all my additions were gone when I relogged. Is there something else I missed?

So, I probably need to make the "save configuration" on the left hand side a bit more obvious, you're not the only one lol.
The saves of the individual items just add them to the runtime configuration but don't persist them to the settings file. The "save configuration" on the left will persist the updates.

Depending on feedback, maybe the saving of each individual update should just update the settings file right away. Will see how things go with more people trying it out.
 
Doh! I missed that, thanks.

So I've installed the very latest version. When I navigate to Configuration/Tabs/General and click the edit button, it goes to editing Add a new tab rather than editing the general tab. I wanted to check to see if it would act the same when editing columns and properties. I clicked on the columns tab and when I clicked one of the columns to edit, I got a CTD. I relogged and tried again and the crash happened again in the same way. I'll DM you the dumps.
 
Doh! I missed that, thanks.

So I've installed the very latest version. When I navigate to Configuration/Tabs/General and click the edit button, it goes to editing Add a new tab rather than editing the general tab. I wanted to check to see if it would act the same when editing columns and properties. I clicked on the columns tab and when I clicked one of the columns to edit, I got a CTD. I relogged and tried again and the crash happened again in the same way. I'll DM you the dumps.

Thanks, not sure how I missed that one, think it was some code I "cleaned up" last minute before pushing it. 2.0.3 should fix that hopefully.
For the editing, it does just go back to the "add" panel but with the fields pre-populated with the thing you chose to edit. Think of it more as a Add/Edit than just Add.
Though, if you do edit and change the name of something, it will treat it as adding something new, rather than rename the existing thing.
 
Boxhud has been failing to start for me. I hadn't used it in several weeks, so I'm not sure exactly when the issue started. I'm running latest Next and latest boxhud. Here's the stack trace:


Code:
[2021/08/10 10:57:27] Running lua script 'boxhud' with PID 2

[2021/08/10 10:57:27] [BOXHUD] Loading settings from file: boxhud-settings-redacted.lua

[2021/08/10 10:57:27] C:\Users\redacted\Desktop\MQNext\lua\boxhud.lua:123: attempt to call field 'ObserveSet' (a nil value)stack traceback:    C:\Users\redacted\Desktop\MQNext\lua\boxhud.lua: in function 'addObserver'    C:\Users\redacted\Desktop\MQNext\lua\boxhud.lua:166: in function 'manageObservers'    C:\Users\redacted\Desktop\MQNext\lua\boxhud.lua:674: in function 'main'    C:\Users\redacted\Desktop\MQNext\lua\boxhud.lua:707: in main chunk

[2021/08/10 10:57:27] Lua: manageObservers (method)

[2021/08/10 10:57:27] Line 166 in C:\Users\redacted\Desktop\MQNext\lua\boxhud.lua

[2021/08/10 10:57:27] ---- Begin Stack (size: 15) ----

[2021/08/10 10:57:27] 15 -- (-1) ---- `C:\Users\redacted\Desktop\MQNext\lua\boxhud.lua:123: attempt to call field 'ObserveSet' (a nil value)stack traceback:    C:\Users\redacted\Desktop\MQNext\lua\boxhud.lua: in function 'addObserver'    C:\Users\redacted\Desktop\MQNext\lua\boxhud.lua:166: in function 'manageObservers'    C:\Users\redacted\Desktop\MQNext\lua\boxhud.lua:674: in function 'main'    C:\Users\redacted\Desktop\MQNext\lua\boxhud.lua:707: in main chunk'

[2021/08/10 10:57:27] 14 -- (-2) ---- `C:\Users\redacted\Desktop\MQNext\lua\boxhud.lua:123: attempt to call field 'ObserveSet' (a nil value)'

[2021/08/10 10:57:27] 13 -- (-3) ---- `attempt to call field 'ObserveSet' (a nil value)'

[2021/08/10 10:57:27] 12 -- (-4) ---- 3

[2021/08/10 10:57:27] 11 -- (-5) ---- nil

[2021/08/10 10:57:27] 10 -- (-6) ---- nil

[2021/08/10 10:57:27] 9 -- (-7) ---- 67

[2021/08/10 10:57:27] 8 -- (-8) ---- `"Me.PctHPs"'

[2021/08/10 10:57:27] 7 -- (-9) ---- `Me.PctHPs'

[2021/08/10 10:57:27] 6 -- (-10) ---- `"%s"'

[2021/08/10 10:57:27] 5 -- (-11) ---- `"Me.PctHPs"'

[2021/08/10 10:57:27] 4 -- (-12) ---- nil

[2021/08/10 10:57:27] 3 -- (-13) ---- table

[2021/08/10 10:57:27] 2 -- (-14) ---- `Me.PctHPs'

[2021/08/10 10:57:27] 1 -- (-15) ---- table

[2021/08/10 10:57:27] ---- End Stack ----

[2021/08/10 10:57:27] Ending lua script 'boxhud' with PID 2 and status -1
 
I would suggest you make sure that you are using the most up to date MQ and make sure you are using the current up to date version of Boxhud.
 
Getting this every few times I run grind after I max back out my banked AA and reg exp.
1628632019679.png
 
Getting this every few times I run grind after I max back out my banked AA and reg exp.
View attachment 32246
that seems a little odd. that line is reading Me.Class.ShortName value for the character, which I wouldn't really expect to ever see change after its been read initially. it is meant to be observed for everyone, then used for a few class based features in the HUD.
I can put an extra check around it and see if that clears it up.
 
if you want to start the script every time you log in, you can use a config file like config/rizlona_Toonname.cfg and add the command to it:

/timed 100 /Lua run boxhud

I forget if there was a reason i used /timed 100 in my config, but it works out well enough for me.

 
Enhancement Request: Add a "Minimize" function to the window to roll it up into its title bar.
 
Enhancement Request: Add a "Minimize" function to the window to roll it up into its title bar.

I'd removed the title bar as it just seemed to add clutter to it. Its just a flag on the window that should be pretty simple to re-enable though.
In boxhud.Lua, search for
local flags = ImGuiWindowFlags.NoTitleBar
and change it to
local flags = ImGuiWindowFlags.None or just local flags = 0

Also, there's the transparency option under general settings, though that's hit or miss depending on the background colors of the zone you're in
 
Release Boxhud

Users who are viewing this thread

Back
Top
Cart