• 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.
 
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.
 
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.
 
@dannuic I have a snippet of my code above but essentially I set observers in for loops for all of my buffs and each bots PctHPs (this is the bulk of the observers). All of these values are being checked constantly (very little delay between passes) by the macro, running 18-36 toons typically.

This is one section of a much larger for loop for my buff routine, I've tried rewriting the DanNet observers many ways but no matter how I do it the output vars just stop updating after awhile. If I reload the plugin it performs great for a little while again. Sometimes when I echo the output vars it will flip from a null to value back and forth, other times it just suddenly starts reporting null and never comes back until the plugin is reloaded.

For me anyways, this didn't happen at first, it wasn't until I had completely implemented DanNet throughout my plugin that observers got flakey like this. My heal loops also tend to have the same behavior over time as well.

I can share the entire macro if you want to look at it, let me know. I definitely want to get this working because when it works it's much better than eqbc/netbots combo.


INI:
/if (${tBot}) {
         /varset tSpellName ${Spell[${tSpellID}]}
         /varset dQuery Me.Buff[${tSpellName}].ID
         /varset tQuery Me.Buff[${tSpellName}].Duration.TotalSeconds
         /varset pQuery Me.PetBuff[${tSpellName}].ID
         /if (${Spawn[${tName}].Type.Find[pet]} && !${DanNet[${Spawn[${tName}].Master.CleanName}].ObserveSet["${pQuery}"]}) {
            /dobserve ${Spawn[${tName}].Master.CleanName} -q "${dQuery}" -o ABBotPetSpellID
            /delay 20 ${DanNet[${Spawn[${tName}].Master.CleanName}].Observe["${pQuery}"].Received}
         }
         /if (!${DanNet[${tName}].ObserveSet["${dQuery}"]} && ${DanNet.Peers.Find[${tName}]}) {
            /dobserve ${tName} -q "${dQuery}" -o ABBotSpellID
            /delay 20 ${DanNet[${tName}].Observe["${dQuery}"].Received}
         }
         /if (!${DanNet[${tName}].ObserveSet["${tQuery}"]} && ${DanNet.Peers.Find[${tName}]}) {
            /dobserve ${tName} -q "${tQuery}" -o ABBotSpellDur
            /delay 20 ${DanNet[${tName}].Observe["${tQuery}"].Received}
         }
         /if (${ABBotSpellID} || ${ABBotPetSpellID}) {
            /if (${ABBotSpellDur}>=(${tTime}+30)) {
                /call AddtoBuffArray ${tTargetID} ${tSpellID} ${ABBotSpellDur}
                /goto :tNextBot
             }
 
I don't have a bunch of time tonight to look at it, but
INI:
         /if (${Spawn[${tName}].Type.Find[pet]} && !${DanNet[${Spawn[${tName}].Master.CleanName}].ObserveSet["${pQuery}"]}) {
            /dobserve ${Spawn[${tName}].Master.CleanName} -q "${dQuery}" -o ABBotPetSpellID
            /delay 20 ${DanNet[${Spawn[${tName}].Master.CleanName}].Observe["${pQuery}"].Received}
         }

that should probably be pQuery instead of dQuery -- that might account for some of this since you are setting dQuery twice, and checking for something that isn't set. I'll look closer tomorrow.
 
This is news to me, I wasn't aware of any issue that required dannet to be reloaded... I usually run it for days before restarting anything. What are you doing that causes this?

Well it rarely happens. I set up a bunch of buff/debuff observers in raid (normally 20-40 boxes), 99% time everything works smooth. But occasionally I found my priest was spanning some cure, and I then /echo found that one of the variable from observers refused to change. I then unload/reload the dannet plugin it returned to normal ( the variable started to update again).
I can send the snippet if needed once I get back to my desktop.
 
@KingArthur I spoke with Dannuic on this some yesterday and ultimately found the observers would occasionally miss a var update. Their setup to only send data when they detect a change in whatever their tracking, and it seems like their sometimes (rarely) missing that change. I have the exact same issue, but the thing is if even one PctHPs observe misses an update all my healers go berserk and I have to restart my macro. Seems to happen every 5-30 minutes currently eventually one observe gets outa wack.

I also found I could do a /observer name -q whatever -drop command and let the macro rebuild but there's not a good way to detect when something is out of sync unfortunately so it's just a manual work around atm. Perhaps I could just make my macro hard codes to -drop any obs older than 5 minutes ?
 
Hi, folks - hoping for some help here. 2 Computers on the same network, in the same workgroup, windows 10. Primary computer won't see the second computer, or it's toons, in dnet info. Only thing I can come up with is that the second computer's IP address is before the primary computers. (e.g., primary is 192.168.86.48, vs 192.168.86.33 for the secondary). I reserved the IP for the primary to be .10, but still no dice.

How can I get the primary to see the toons on the second computer? What am I missing? (They're both using the same interface, so I don't think that's the problem...)
 
The order of the IP addresses won't be an issue. Most likely cause of something like this is software firewall or an interface binding issue.

Run /dnet interface

You can see what interface it is using and change it if you need to.
 
Plugin - MQ2DanNet

Users who are viewing this thread

Back
Top