• You've discovered RedGuides 📕 an EverQuest multi-boxing community 🛡️🧙🗡️. We want you to play several EQ characters at once, come join us and say hello! 👋
  • IS THIS SITE UGLY? Change the look. To dismiss this notice, click the X --->
MQ2DanNet

Plugin - MQ2DanNet (1 Viewer)

I am having trouble converting some of the things i do in eqbcs to dannet. /multiline doesnt seem to work very well, like it only reads the last command of the line.
Example for inviting a group in eqbcs i have /multiline ; /bct thistard //invite thattard ; /bct thistard //invite othertard ; and so on.
How do i do this in dannet using multiline? Ive tried /multiline ; /invite tard1 ; /invite tard2 ; etc but only the last toon in the line will get invited.

thanks 8)


I wrote a macro to invite my chars in the same zone over DanNet, I used on my tank and it will set the inviter as tank/puller/ma. Could easily change it to just invite all your chars on if you only ever have 6 or less loaded.

I use two hot keys to invite/startup my chars when logging into a camp via MQ2Login. Macro is flexible enough to just need to use on tank for any group if chars are in the same zone.
 

Attachments

  • groupinv.mac
    620 bytes · Views: 27
I wrote a macro to invite my chars in the same zone over DanNet, I used on my tank and it will set the inviter as tank/puller/ma. Could easily change it to just invite all your chars on if you only ever have 6 or less loaded.

I use two hot keys to invite/startup my chars when logging into a camp via MQ2Login. Macro is flexible enough to just need to use on tank for any group if chars are in the same zone.
Ill check it out thanks man 8)
 
If this is how you're actually doing it, you've completely left out the dannet comands. All you're doing here is telling the local character to send invites to tard1 and tard2.


See here how you have a eqbc command /bct preceding the invite commands? You need the equivalent dannet command /dex. You'll want to do /multiline ; /dex thistard /invite thattard ; /dex thistard /invite othertard

For more general dannet conversions, I use this thread: https://www.redguides.com/community/threads/mq2dannet-users-guide-moving-from-eqbcs-to-dannet.69597/
yeah it should be pretty straightforward but it doesn't work for me.

Tried restarting computer etc. and fiddling around. To me it seems like you cant /dex yourself to do something. Is that right? If im inviting my group with the group leader if i just use /invite tard in a hot key there is no problem. However, /dex groupleader /invite tard nothing happens.
Anyway thanks for the help 8)
 
Last edited:
yeah it should be pretty straightforward but it doesn't work for me.

Tried restarting computer etc. and fiddling around. To me it seems like you cant /dex yourself to do something. Is that right? If im inviting my group with the group leader if i just use /invite tard in a hot key there is no problem. However, /dex groupleader /invite tard nothing happens.
Anyway thanks for the help 8)
no, you don't /dex yourself, you'd just do the command locally if you want your local character to do the invites. You would use /dex groupleader /invite tard in the situation where you're controlling Tard3 and you want groupLeader, who is not Tard3, to invite tards 1 and 2 to his group. Your multiline command with 5 invite commands is likely not working because the EQ client won't process invites that quickly. Basically, /multiline attempts to do all the commands simultaneously, or very close to simultaneously, and EQ takes a bit of time to process the first invite before it will do another. When you slam the client with 5 invites simultaneously, the EQ client basically says "fuck this, I give up!"

Also, how are you accepting the invites? I haven't seen you post the bit where you tell the remote toons to accept.
 
Last edited:
I can't seem to get my characters to see each other. I'm running 6 toons on one PC. I had to manually set the interface on each and I've reloaded the plugin. /dnet info only shows the individual character in each of the channels and none of the commands are working across the accounts.

Just looking for some help. I've done all the normal troubleshooting like making sure my firewall is off, etc. I tried enabling the debugging option but didn't see any output.
 
I'm good. I went back a few pages and found a post by wreck that had some commands to reset all the fancy network stuff. Did that, rebooted, and we're in business.
 
Ran into issues where turning off "Follow Me" only stops my current-group no matter what. My other group's have to be told via
INI:
/dgaexec /afollow
to get them to stop following. Also,
INI:
Come To Me
seems to have serious issues when converted to DanNet where suddenly they just stop mid-nav for no reason? Using EQBC doesn't appear to have this issue.

Are these hard-coded issues with MQ2TargetInfo?

I switched to DanNet from EQBC as I was having serious, serious, issues with EQBC getting "clogged up" or out of sync forcing me to zone to refresh states (buffed state, hp %, etc). Then I learned there are multiple undocumented verisons of EQBC that no one really talks about outside of Discord/private messages.

Is DanNet really the best route to go right now if using KA, or is EQBC2 better still?

Thanks!
 
both of those settings can be changed in your release folder in the MQ2Targetinfo.ini file. They default to eqbcs settings, but you can change them to the dannet variant.

as it exists now /bcg is what is being sent with those buttons. That will not stop anyone in another group or on another computer. /dgae works because it broadcasts the command to every single dannet connect character on your network regardless of group or computer connected. be careful of this though, as changing from /bcg to /dgae could have seriously unintended consequences. Before I changed my hot buttons I'd gone from /bcga to /dgae and had no issues until I started running a second group, then moved that group to another computer, and I started having issues, because those two groups weren't the same level, nor in the same content, and sending network wide messages caused all kinds of havoc until I toned it down to /dgga and /dex type commands instead.

The stopping mid-nav is a new issue that's I've only noticed in the past week or so, prior to that it has been working near flawlessly for me for about a year now.
 
both of those settings can be changed in your release folder in the MQ2Targetinfo.ini file. They default to eqbcs settings, but you can change them to the dannet variant.

as it exists now /bcg is what is being sent with those buttons. That will not stop anyone in another group or on another computer. /dgae works because it broadcasts the command to every single dannet connect character on your network regardless of group or computer connected. be careful of this though, as changing from /bcg to /dgae could have seriously unintended consequences. Before I changed my hot buttons I'd gone from /bcga to /dgae and had no issues until I started running a second group, then moved that group to another computer, and I started having issues, because those two groups weren't the same level, nor in the same content, and sending network wide messages caused all kinds of havoc until I toned it down to /dgga and /dex type commands instead.

The stopping mid-nav is a new issue that's I've only noticed in the past week or so, prior to that it has been working near flawlessly for me for about a year now.

Ok cool thanks, so the navving issue is 100% unrelated. I was going nuts because prior-to this week it was flawless with EQBC + Modbot. Wasn't sure if it was something I broke or not.

Also, there's a bug with turning "Follow Me" off even with /dgaexec......my other teams won't stop following. So something is bugged there too. I had to make a macro that does "/dgaexec /afollow off" and put it above my "Follow Me" to work-around it. Is there a way to revert MQ2Nav to a previous version?? I'm assuming something updated recently?
 
Getting this message after about 45% of the upgrade of the latest version ... any thoughts?

I launch the launcher as the administrator btw....
 
Last edited:
nope that did not work, turned bitdefender off, redid the update and I did get an installation complete but it fails when I launch MQ2 with the code out of date message
moved to another directory and tried a complete install, still only that file is the issue... any thoughts?
 
Last edited:
I downloaded it and had BitDefender loot at the file, it is reporting this: The file C:\EQGames\Macroquest2\MQ2DanNet.dll is infected with Gen:Variant.Graftor.769876 and was moved to quarantine. It is recommended that you run a System Scan to make sure your system is clean.

Not really keen on allowing this, can you comment?
 
I already commented. The code is open source, if it doesn't meet your standards don't use it.

If you think I'm adding something to the code, I urge you to compile it yourself and see what your antivirus says.
 
From time to time MQ2 files will pop up in heuristic scans. You can see that virustotal.com lists 11 engines that pick up the current set of MQ2 files.

Usually they will be of the "generic" variety. Right now the injector shows up as a "Game Hack" under "potentially unwanted programs." Because, well, it's a game hack.

When this happens, it takes time to get them removed. As Redbot said, you can either exclude the directory during that time or not use the file and use an alternative method for download.

If you are super concerned, submit it to your antivirus vendor and have them verify. They will likely tell you that it is a false positive. For the job they do, it's better to err on the side of false positives.
 
What would be a good example of when this macro would be useful?
this isn't a macro. the github has the description as "This plugin is designed to be a serverless peer network. It is (hopefully) mostly plug and play, and should automatically discover peers for most local network configurations."

you can read more about it and see the code here: > Dannet GitHub <
 
What would be a good example of when this macro would be useful?
Plugin is great for a alternative buff tracker vs using CachedBuffs or Target.Buff. Because observers can let you know when something falls off with out you having to target them for a update.

Its also a great alternative to EQBC, with less overhead, and simpler to run, as you do not need so start or connect to a server.
 
Let me tell you how I move and it almost 100% works. I was having issues like you with characters stopping sometimes. I tried EQBC and DanNet had issues with both. Ending up sticking with DanNet cause it is getting loaded anyway because of 3 of my characters are using IHCMerc macro. The other 3 are using CWTN class plugins.

Lets MOVE > Pause > Hide > Auto Follow

Pause Macro

To move I mash my "Pause" macro. Sends a /mqp on message to everyone in the DanNet group called mercs, I created a group and added the 3 IHCMerc characters to it. To do this do /djoin NEWGROUPNAME on each character you want in the group. Notice this does not "Pause" my "driving" character, you could add a line to pause that if you wanted.
/dgex mercs /mqp on /noparse /dex CHARACTERNAME /docommand /${Me.Class.ShortName} pause on /noparse /dex CHARACTERNAME /docommand /${Me.Class.ShortName} pause on

Hide Macro
Most of the time I Invis & Levitate my group while moving so I hit this next. Just the AA's for the class your going to use, these below are for a shaman to Levitate and then Invis the group.
/dex CHARACTERNAME /alt activate 1202 /dex CHARACTERNAME /alt activate 630

Auto Follow
This has everyone in my group, except me of coarse. Chase after me using afollow, works like a charm while the macros/plugins are all paused.
/dgge /afollow spawn ${Me.ID}
____________________________________________________________________________________________________________________________________________________

Reverse of Above

Un-Pause Macro

/dgex mercs /mqp off /noparse /dex CHARACTERNAME /docommand /${Me.Class.ShortName} pause off /noparse /dex CHARACTERNAME /docommand /${Me.Class.ShortName} pause off

Reveal Macro
/dgae /removelev /dgae /makemevisible

Follow OFF
/dgge /afollow off
____________________________________________________________________________________________________________________________________________________

If Character gets stuck!

Manual Mode Macro

For a IHCMerc macro character
/afollow off /mqp on /ihc chaseoff /nav stop

Manual Mode Macro
For a CWTN plugin character (example using MQ2BerZerker)
/afollow off /zerk pause off /zerk mode 0 /nav stop

If all else fails do /plugin mq2nav , /plugin mq2advpath to unload these!
 
Last edited:
I've replaced NetBots with DanNet in my version of modbot and it's crashing a good bit, is this possibly because I don't have enough flow control on the dquerries? I'm starting to add more /delays to wait until the .Received data comes through. I guess my question is, could this be the cause of my crashes? Not waiting for receipt every dquery? Modbot hammers dannet pretty hard . . . might just be a throughput problem?

to be clear, when I say crash, my EQ window freezes and goes non-responsive, I have to ctrl-alt-del and reload. Only happens when running the DanNet version of my modbot (trotsbot).
 
I'm also really having trouble getting reliable HP values from the peers using dquery.

HP Check:
            /dquery ${TankName} -q Me.PctHPs -o TankNameHP
            /delay 30 ${DanNet[${TankName}].Query[Me.PctHPs].Received}

I increased the delay to 30 but I still get 0's back from this code all the time. Now I'm putting checks in to ensure the output var exist before I kick off heals but I don't believe this is how we want this to work correct? Am I missing something to make this more reliable when checking 5-8 times per sec?
 
I'm also really having trouble getting reliable HP values from the peers using dquery.

HP Check:
            /dquery ${TankName} -q Me.PctHPs -o TankNameHP
            /delay 30 ${DanNet[${TankName}].Query[Me.PctHPs].Received}

I increased the delay to 30 but I still get 0's back from this code all the time. Now I'm putting checks in to ensure the output var exist before I kick off heals but I don't believe this is how we want this to work correct? Am I missing something to make this more reliable when checking 5-8 times per sec?

you dont need to check that many times a second. the peer is allways sending its information once the observer is set, and it hasnt timed out.

I create a observer 1 time for the mac then leave it because im polling the data all the time, and it wont time out. Yours is not wrong, just way too much.

Try this /if (!${DanNet[${TankName}].Observe["Me.PctHPs"]}) /dquery ${TankName} -q "Me.PctHPs" -o TankNameHP

PS im no DanNet Expert, but that should work for you.
 
Wow ok, that's blowing my mind a bit then. So how .. hrmm ok. That's super cool! Makes sense why I'm crashing as well now, cause I'm rebuilding like 50-70 observers every seconds between heals, buffs, and events lol. Thanks a bunch!
 
Ok some clarifications here.

For me what ended up working inside of my heal while/for loops was this. ObserveSet TLO is important in the if statement because if you use Observe you might get non numerics back since that actually returns the result of the query.

INI:
/if (!${DanNet[PeerName].ObserveSet[Query]}) /dobserve PeerName -q Query

/delay 20 ${DanNet[PeerName].Observe[Query].Received}

Then just call the data directly later on in the heal logic using the dnet TLO

INI:
${DanNet[PeerName].Observe[Query]}

Also some feedback from what I have found to work when trying to run heal checks on 36+ bots at speed.

1) outputting to a variable is super slow in the context of doing raid level heals, if I just call the dnet TLO directly I find it to be much faster (${DanNet[PeerName].Observe[Query]})
2) default observedelay is too slow as well, I've reduced it to 100ms for now
3) dquery seems to become inconsistant at speed as well, so I'm using observe for heals for now and that seems to be more reliable. So for me anytime I'm going to be doing more than 10 or so queries in 100ms-200ms I'll probably try to setup observes moving forward

I'll keep tinkering to figure out where it's best to use a /dobserver and /dquery but yea, the TLO's you call to check those call backs are different which threw me off for a bit this morning. It seems I can call both TLO's though to pull the results directly instead of outputing to a var to speed things up where needed.

I feel like we need more real examples of DanNet in action too, so that's why I'm being intentionally over-detailed here!
 
Heres a example of how i set up to check if my Group Main Tank is in Combat now for slows and malo on shaman.
GMT Aggro.:
/if (${Spawn[${GMT}].ID} && !${Defined[cGMT]}) {
    /declare cGMT bool outer
    /if (${Bool[${DanNet.Peers.Find[${Spawn[${GMT}].DisplayName}]}]}) {
    /dobserve ${Spawn[${GMT}].DisplayName} -q "Me.CombatState.Equal[Combat]" -o cGMT
}

Once the var cGMT is created and the observer set, I never make the observer again.

I call it / access its data with ${cGMT}

${cGMT} is probably accessed 10 - 20 times a second when not casting.

I have never had a observer time out this way, and do not crash from dannet overuse anymore like i did when i first started.
 
Also some feedback from what I have found to work when trying to run heal checks on 36+ bots at speed.

1) outputting to a variable is super slow in the context of doing raid level heals, if I just call the dnet TLO directly I find it to be much faster (${DanNet[PeerName].Observe[Query]})
2) default observedelay is too slow as well, I've reduced it to 100ms for now
3) dquery seems to become inconsistant at speed as well, so I'm using observe for heals for now and that seems to be more reliable. So for me anytime I'm going to be doing more than 10 or so queries in 100ms-200ms I'll probably try to setup observes moving forward

I'll keep tinkering to figure out where it's best to use a /dobserver and /dquery but yea, the TLO's you call to check those call backs are different which threw me off for a bit this morning. It seems I can call both TLO's though to pull the results directly instead of outputing to a var to speed things up where needed.

I feel like we need more real examples of DanNet in action too, so that's why I'm being intentionally over-detailed here!

Sounds like you've gotten a handle on things. A couple thoughts:
1) This shouldn't be the case, the output variables and query are written together, so I'm curious how you are using them (or if there is perhaps some underlying bug with /varset in core MQ2)
2) You're the first person I know of to need it faster, I'm glad that option was useful
3) dquery is designed to be slow -- it does a full round trip to the other client to get data. It's purpose is to do one-off things that you don't do very often that aren't time-critical in order to elide the need to set up a dobserve. The main difference between a dobserve and a dquery is that a dobserve sets up the query in the remote client so that it continually sends you the answer to it. Then when you look at the output variable or the TLO, your client just reads the last sent value; an instant operation. A dquery, on the other hand, does none of that setup in the remote client and simply responds with the answer you want at the cost of a call and response lag (which can be several ms to a couple hundred ms even on your local machine because of how the underlying library handles windows IPC!)
 
@dannuic Thanks for the explanation that makes a lot of sense now. I'm using dqueries for a few of my static event/commands now and then dobserve's for all of my heals/buffs/cure/debuff/melee routines that require constant updates.

I've completely rolled it into my version of modbot so I'll run it for a few days and see how it goes!

On 1) So I should describe what I was seeing here better. When I first start my macro it initializes all of my observes using for or while loops, when I would use an output variable the observes took a very long time to all initialize (20-30sec), like the first pass maybe I'd get 34 of 36 initialized but 2 of them would go all the way past the /delay 20 and take several passes before saving a value to the output variable which would result in a lot of false heals and such for the first 20-30 seconds. After the dobserve got established the issue went away. When I switch to using the TLO directly with no output, it's lightning fast right off the bat, almost no delay at all even on the first pass where I'm building all the dobserves out.

Here is an example of my bot heal threshold build out, this for loop tended to show the issue the most when I used an output variable, I even saw the 2nd observes result a few times on the first observes output variable.

INI:
/for i 1 to ${DanNet.PeerCount}
         /if (${Group.Member[${PeerList.Arg[${i},|].Right[${PLOffSet}]}].Index} || ${PeerList.Arg[${i},|].Right[${PLOffSet}].Equal[${Me.CleanName}]}) /continue
         /if (${AHThreshold[${a},1]}) {
            /if (!${Spawn[pc ${PeerList.Arg[${i},|].Right[${PLOffSet}]}].PctHPs} || ${Spawn[${PeerList.Arg[${i},|].Right[${PLOffSet}]}].Type.Equal[corpse]}) /continue
            /if (!${DanNet[${PeerList.Arg[${i},|].Right[${PLOffSet}]}].ObserveSet["Me.PctHPs"]}) {
                /dobserve ${PeerList.Arg[${i},|].Right[${PLOffSet}]} -q "Me.PctHPs"
                }
            /delay 20 ${DanNet[${PeerList.Arg[${i},|].Right[${PLOffSet}]}].Observe["Me.PctHPs"].Received}
            /if (!${DanNet[${PeerList.Arg[${i},|]}].ObserveSet["Me.Class.ShortName"]}) /dobserve ${PeerList.Arg[${i},|].Right[${PLOffSet}]} -q "Me.Class.ShortName" -o AHBotClass
            /delay 20 ${DanNet[${PeerList.Arg[${i},|].Right[${PLOffSet}]}].Observe["Me.Class.ShortName"].Received}
            /if (${DanNet[${PeerList.Arg[${i},|].Right[${PLOffSet}]}].Observe["Me.PctHPs"]}<${AHThreshold[${a},1]} && ${AHLine.Find[${AHBotClass}]}) {
 
@dannuic Is there any limit to how many observers the plugin can manage? My shaman for example has nearly 100 active observers between all my bots due to how many buffs, heals, and cures she is managing. Is there any limit to how many observers i can have active at once? I could slow things down and use more dqueries if I had to but I like the speed of the observers!
 
@dannuic Is there any limit to how many observers the plugin can manage? My shaman for example has nearly 100 active observers between all my bots due to how many buffs, heals, and cures she is managing. Is there any limit to how many observers i can have active at once? I could slow things down and use more dqueries if I had to but I like the speed of the observers!

There is no theoretical limit, and I doubt anyone will ever see the practical limit through normal use (I don't even know what that would be). Think about it like this: netbots does the equivalent of setting up ~100 observers per character on each client, so you will normally have 600 or so pieces of data sent out and received every 50ms (I just checked, that's the timing). DanNet can handle more than that because there's no bottlenecking from a central server (it's direct P2P communication), but at the same time you can significantly reduce your network traffic by targeting the data that gets sent to which client (the tank doesn't need to know that the rogue needs a cure, but the shaman might! -- so you don't set the observer up on the tank).
 
@dannuic Thanks man that's great to hear. I have it all plugged into my modbot and fully functional now, even got the chat commands transferred over from eqbcs so no eqbc or netbots at all running now. One more question though! Is there anyway to do chat formatting like we could do in EQBC with [+g+] and such? All my pretty color codes are just printing in danchat currently!

Figured out the color codes, normal echo stuff, dope!
 
Last edited:
@dannuic I'm having an issue that seems to only happen after awhile but basically my observers start getting inconsistent and occasionally report 0 values. I actually put some echos in last time i happened and I had this obs

INI:
   /if (${TankName.Length}) {
        /if (!${DanNet[${TankName}].ObserveSet["Target.ID"]}) /dobserve ${TankName} -q "Target.ID" -o TankNameID
        /delay 20 ${DanNet[${TankName}].Observe[Target.ID].Received}
    }

When I ran an echo on this variable (TankName ID) it was reporting the ID of the target my tank was targeting and then every other report it was a 0.

To fix it I have to completely reload the mq2dannet plugin and then rebuild my observers. I've seen it happen for the other observers as well usually after a few hours of run time on the macro. Any thoughts on what might cause this?
 
@dannuic I'm having an issue that seems to only happen after awhile but basically my observers start getting inconsistent and occasionally report 0 values. I actually put some echos in last time i happened and I had this obs

INI:
   /if (${TankName.Length}) {
        /if (!${DanNet[${TankName}].ObserveSet["Target.ID"]}) /dobserve ${TankName} -q "Target.ID" -o TankNameID
        /delay 20 ${DanNet[${TankName}].Observe[Target.ID].Received}
    }

When I ran an echo on this variable (TankName ID) it was reporting the ID of the target my tank was targeting and then every other report it was a 0.

To fix it I have to completely reload the mq2dannet plugin and then rebuild my observers. I've seen it happen for the other observers as well usually after a few hours of run time on the macro. Any thoughts on what might cause this?

This has been a long-term unfix issue. Sometimes observers just stop to update anymore, the only way is to unload/reload MQ2Dannet to fix it.
 
@KingArthur Thanks man, that's kind of a deal breaker unfortunately for me. The queries are too inconsistent and observers stop reporting reliably at some point as well. I really want to get away from netbots but I will have to shelve this version of my macro until this is more reliable. I've tried to rewrite all my observers 15 different ways now and it seems every way displays this behavior eventually, pulling directly from the TLO was the most reliable but even that would eventually start to report nulls intermittently.
 
Plugin - MQ2DanNet

Users who are viewing this thread

Back
Top