• 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 (3 Viewers)

One interesting logic I found is that maybe the ini setting
[General] Groups=XXX|YYY

Don't have any actual meanning.

Think about it, General groups means a global setting for all your client, that means every toon you are running will join this "channels" automatically.

So either that equals what exactly "all" means (e.g. /dge all /comman will do it all) or you are messing some specific channels (e.g. if you put priest in your General Groups, then all your toon will be priest channel which makes priest channel not special for priest anymore, /dge all and /dge priest will do exactly the same).

Following that logic, the General Groups is redundant? no?
 
Hah! It took all night running your macro, but I finally think I got a repro, and have a potential fix. I'm going to run your macro again today and see if it's better. There also seems to be a latency issue that I need to look at after the wife stops making me do yard work
 
dannet 0.7502 is up, it fixes a bug where you couldn't give commands in channels you weren't in and adds color parsing (normal /echo style) to /dtell and /dgtell

Thanks a ton sir! Can't wait for Redbot's compile update!

Btw, how do you guys compile the plugin by yourself? I used the MQ2 site builder and it said the .cpp file is more than 512k??? (I'm a builder member)
 
Thanks a ton sir! Can't wait for Redbot's compile update!

Btw, how do you guys compile the plugin by yourself? I used the MQ2 site builder and it said the .cpp file is more than 512k??? (I'm a builder member)
Hmm, I don't have that issue. Are you only uploading MQ2DanNet.cpp?
P. S the version downloaded here is 0.7501 FYI
Ah, I forgot to update the download last night. Hopefully I can do it at work.
 
Why would you invoke it with BC?

To get all the characters to execute the dantest command at the same time. I wanted all 9 characters to actively be using the /dquery command.

I ran the test about 6 times from 1 character and then switched to a different character. On the 2nd test one of the other characters crashed.
 
To get all the characters to execute the dantest command at the same time. I wanted all 9 characters to actively be using the /dquery command.

I ran the test about 6 times from 1 character and then switched to a different character. On the 2nd test one of the other characters crashed.
He was asking because you could execute it with DanNet rather than EQBC.
 
I saw on Git there is a known issue with Win10 talking to Win7. Is there any fix I can do on my side of the network?

My Win10 machine won't communicate to my Win7/Win8 ones, though the 7 & 8 talk to each other fine.
 
I saw on Git there is a known issue with Win10 talking to Win7. Is there any fix I can do on my side of the network?

My Win10 machine won't communicate to my Win7/Win8 ones, though the 7 & 8 talk to each other fine.

Usually this is because the various flavors of Windows use different versions of SMB (Server Message Block) to communicate with each other. Ensure all your Windows machines are using v2.x or higher!

https://www.howtogeek.com/321072/how-to-disable-smbv1-and-protect-your-windows-pc-from-attack/
 
Is there a guide on the syntax for the query.
I am having trouble creating simple queries, for instance print out my group's level and %experience.

For instance in this command

/dobserve <name> -q <query> [-o <result>]

Is <name> the name of the character that I want to observe? or the name of the query?
What is the syntax for displaying <result>?

Also what is the sequence of commands to do something like this?
I assume 1) observe, 2) query, 3) Echo? but I am getting NULL
and I am not sure which step I am missing.

Where do I find the list of properties that I can query? Is it the same as the ones that netbots documented?
 
Is there a guide on the syntax for the query.
I am having trouble creating simple queries, for instance print out my group's level and %experience.

For instance in this command

/dobserve <name> -q <query> [-o <result>]

Is <name> the name of the character that I want to observe? or the name of the query?
What is the syntax for displaying <result>?

Also what is the sequence of commands to do something like this?
I assume 1) observe, 2) query, 3) Echo? but I am getting NULL
and I am not sure which step I am missing.

Where do I find the list of properties that I can query? Is it the same as the ones that netbots documented?

@freeferli A more up to date set of commands/instructions are on dannuic's git site ( https://github.com/dannuic/MQ2Dan ), the instructions here are a bit misleading. I dont believe you can just play around and echo the observe and query commands/results anymore, they have the be run in a mac and supplied with a defined variable. So for what your wanting to do it would look similar to this using observe in a macro:
Code:
/declare tmpCharlvl int outer 0
/declare tmpCharExp float outer 0

/dobserver ${Group.Member[1].Name} -q Me.Level -o tmpCharlvl
/dobserver ${Group.Member[1].Name} -q Me.PctExp -o tmpCharExp

/echo ${Group.Member[1].Name} Level:${tmpCharlvl}
/echo ${Group.Member[1].Name} Experience:${tmpCharExp}

Observe is kinda like doing a query every second or so unless you adjust the observe response time, the variable needs to exist for the observe to keep running so you want to use outer variables. Now the above would be sort of wasteful to constantly observe everyone's lvl and exp because in a full group you'd need 12 variables but you could check/use those variables at any time in your code and they would be updated (MA/MT targets are great observe's) . For something more simple using a query in a loop is more flexable and queries are a bit faster imo ( about 2 tenths or a second or less ), ex:
Code:
/declare tmpCharlvl int local 0
/declare tmpCharExp float local 0
/declare tmpCounter int local 0

/for tmpCounter 0 to ${Group}
 /dquery ${Group.Member[${tmpCounter}].Name} -q Me.Level -o tmpCharlvl
 |Best to add a small delay after each query to make sure it completes, its fast trust me.
 /delay 20 ${DanNet[${Group.Member[${tmpCounter}].Name}].Query[Me.Level].Received}
 
 /dquery ${Group.Member[${tmpCounter}].Name} -q Me.PctExp -o tmpCharExp
 /delay 20 ${DanNet[${Group.Member[${tmpCounter}].Name}].Query[Me.PctExp].Received}
 
 /echo ${Group.Member[${tmpCounter}].Name} Level:${tmpCharlvl}
 /echo ${Group.Member[${tmpCounter}].Name} Experience:${tmpCharExp}
/next tmpCounter

Hope this helps make sense out of it, I was a bit confused on getting this to work at first until I found it had to be run in a macro and I saw a couple code examples.
In any see's any errors in what I said or my code examples please correct me :)
 
@ihc385 I see, thanks, I will try this when I get home.
I can only have 1 macro running at a time right (is that correct)?
So then I can not run this at the same time that I am running kissassist?
 
@ihc385 I see, thanks, I will try this when I get home.
I can only have 1 macro running at a time right (is that correct)?
So then I can not run this at the same time that I am running kissassist?

Yup only 1 at a time, so it would be more like adding some code to kiss if you want to use it while kiss is running, obviously if theres an issue they dont support modded versions, when I used kiss I always named my modded version kissassistm but kept the original around so when I got an error I could just start non the nonmoded version and see if the error was on my end or theirs.
 
Made a quick macro to invite connected players in current zone to group and set the invite (person running macro) to tank/assist/puller

Slowly trying to work out ways to use more of this plugin, ihc post above has helped clear up a few things i missed but suspected (ie need a macro with defined variables to actually store/access info)
 

Attachments

  • dangroupinv.mac
    619 bytes · Views: 23
If anyone is interested, this will perform a proper stress test on DanNet. compliant with v.7505.
It will issue a non complex query for a simple ${Me.FreeBuffSlots} check.

The test defaults to the built in ALL group provided by DanNet. It can be changed in the code.

Round trip times are provided and pretty colors.

usage:
start the mac
It will sit there and look dumb till you do what it says to do. So, issue a /stress # (where number is how many times you want each of your toons to be tested.)
/end will stop the mac.

if you want more verbosity, you can throw in some more echos.
 

Attachments

  • DanNetStress.mac
    6.1 KB · Views: 13
Made a quick macro to invite connected players in current zone to group and set the invite (person running macro) to tank/assist/puller

Slowly trying to work out ways to use more of this plugin, ihc post above has helped clear up a few things i missed but suspected (ie need a macro with defined variables to actually store/access info)

try this


INI:
/squelch /dnet fullnames FALSE
/declare i int local
/declare Name string local

/for i 1 to ${DanNet.PeerCount[zone_${MacroQuest.Server}_${Zone.ShortName}]}
    /varset Name ${DanNet.Peers[zone_${MacroQuest.Server}_${Zone.ShortName}].Arg[${i},|]}
    /if (${Name.Equal[${Me.DisplayName}]}) /continue
    /echo Have ${Name} -- to invite
    /invite ${Name}
    /delay 5
    /dexecute ${Name} /invite
/next i

though this is assuming you have <= 6 characters in the zone. might be a better choice to use a pre-made dannet group or make your own.
 
Also with the plugin auto joining/creating zone channels, is there a way to auto leave/delete them channels?
 
So, I've read through this thread and there seems to be a lot of semi understanding to how DanNet observers function. I for one learn best by trying and seeing what doesn't work until I find a way I like it to work. If that involves reading through others code, even better.

Of late, I've been on a binge of getting rid of plugins and decide to get rid of MQ2Debuffs for Core. The following is the result, taken a little further.

This is a frame work for establishing any observers you need with 1 call and a simple string containing the tlo/members you are after.

Using this example, we are going to establish a series of debuffs we want to look for on our group.

Somewhere in your code you have defined the following:
/declare lstObserverCure string outer "|Me|TotalCounters|CountersDisease|CountersCurse|CountersPoison|CountersCorruption|Snared|Mezzed|Maloed|Tashed"'
This is the list of debuffs and the TLO we will be passing to the function that establishes all the unique observers for each character.


to establish the observers on all your group members you would:
/call observer FALSE "${lstObserverCure}" FALSE

if you wanted to DEBUG it,
/call observer TRUE "${lstObserverCure}" FALSE

If you wan it to be completely quiet:
/call observer FALSE "${lstObserverCure}" TRUE


Code:
|***
*    DES: creates observers
*    USE: /call observer [DEBUG T/F] [string of things to observe] [SILENT T/F]
*    NOTE: the variable passed to this sub, _observer, is a list.
*    NOTE: the first item in the list is the tlo, all the other items are members you want to check
*    NOTE: if you want to use more then 1 TLO, call the sub multiple times with different lists
***|
sub observer(bool _debug, string _observer, bool _silent)
    /if (${_debug}) /echo observer(${_debug}, ${_observer})

    /declare _countT                     int         local 0
    /declare _countE                    int         local 0
    /declare _toonName                 string     local FALSE
    /declare _element                    string    local FALSE
    /declare _TLO                            string     local FALSE
    /declare _timestart                int            local 0
    /declare _timeend                    int            local 0
    /declare DanNetChannel        string    local all
  
    /if (${_debug}) /echo Observers Set\aw::\ax\a-tStart\ax

    | cycle the toons inside the dan group
    /for _countT 1 to ${DanNet.PeerCount[${DanNetChannel}]}
        /varset _timestart ${MacroQuest.Running}

        /varset _toonName ${DanNet.Peers[${DanNetChannel}].Arg[${_countT},|]}
      
        | skip me
        /if (${_toonName.Equal[${Me.DisplayName}]}) /continue

        | existing?
        /if (${DanNet[${_toonName}].ObserveCount}) /continue
  
        | set the TLO
        /if (${_debug}) /echo ::_TLO::${_observer.Arg[1,|]}
        /varset _TLO ${_observer}.Arg[1,|]}

        | loop the string, skip the first one
        /for _countE 2 to ${_observer}.Count[|]}
            /if (${_debug}) /echo ::_element[${_countE}]::${_observer.Arg[${_countE},|]}

            | set the element
            /varset _element ${_observer.Arg[${_countE},|]}

            | define the variable. we will be using this for a while. like a long while
            /if (!${Defined[${_toonName}_${_element}]}) /declare ${_toonName}_${_element} string outer

            | set observer
            /if (${_debug}) /echo /dobserve ${_toonName} -q "${_TLO}.${_element}" -o ${_toonName}_${_element}
            /dobserve ${_toonName} -q "${_TLO}.${_element}" -o ${_toonName}_${_element}

            | give the loop the briefest of pauses..
            /delay 1 ${DanNet[${_toonName}].O[${_toonName}_${_element}].Received}

        /next _countE

        /varset _timeend ${MacroQuest.Running}
        /if (!${_silent}) /echo Observers Set\a-t::\ax\aw${_observer}\ax\a-t::\ax\aw${_toonName}\ax ${sep} (${Math.Calc[((${_timeend}-${_timestart}) / 10) / 60]}s)

    /next _countT

/return


The snip is fairly commented so you can see what I did. But to summarize, we look therough all the members of the DanNet group All, and for each person we cycle Me.???? for every other element in the list to establish all the debuff observations.

In the end we get variables like ${charactername_TotalCounters} that we can echo to see if the toon has any debuffs at all. If they do, then you can start checking which ones they may have. There will be a variable created for each toon_DEBUFF that you want to watch. But in reality, we only need to watch for one to speed up our checks in the end.

For me, my cleric takes about 1 second to establish ~45 observers covering all the debuffs I'm interested in checking for all the toons. How you check the observers is your design, mines a little too built into Core to lay out here. I reestablish this observer routine in case characters. The average time for a cure check cycle for me happens about of every 3 seconds. The actual check takes less then 1 second for all 6 characters in the group.

But this is how I removed MQ2Debuffs from my builds.

Hopefully, this helps a little in the understanding of observers with working examples. If you have questions, feel free.

-exspes

edit: fixed a variable i forgot to adapt as i pulled it out of my macro.
 
Last edited:
requests:

When adding a toon to a group can we get an echo notifying the toon and/or the all channel that said toon was added to channel X?

Can a help command be added listing the various /dg.. commands from within the plugin, with short descriptions? I've not been able to find one yet, although I'm compiling the information for myself as I go from various posts.
 
Tried to get this up today: as I logged in my toons, they all spammed me with "Plugin Load Failed Please recompile C:\MQ2\Release\mq2dannet.dll -- it is out of date with respect to mq2main (1562871872> 1560796700).

I went and downloaded the latest .dll and replaced the current .dll. No help
I closed out the error messages (had 4 pop up windows). I tried to manually load dannet with /plugin MQ2Dannet and got the same popup and failure to load.

Help a noob?

*edit: MQ2 and all other programs are up to date.

** edit again. In the mean time, I reverted my toons back to KissAssist instead of IHCMercs setups. /sigh
 
Last edited:
I have found an issue but it is more an MQ2 issue than a DanNet issue. When trying to check the BlockedBuff(Me.BlockedBuff[Buff Name]) on a character. There is no way to check like you can check if they have a Buff(Me.Buff[Buff Name]). I am aware of Me.BlockedBuff[#], but you have to use a number and not the buff name. So you have to search the BlockedBuff list checking if the name, of each BlockedBuff, matches what you are looking for.

The process of searching the BlockedBuff list has to be done from each receiving character, and not from the character giving buffs.

What I did was create a Bind in kiss, that searches the BlockedBuff list and returns 1(Found Buff) or 0(Buff Not Found) and used the /dex command to execute the bind on the remote client(receiver). This all works fine until you use the /dex command when the character(receiver) is currently executing a bind.

You can't execute a bind while a bind is active, and there is no way in MQ2 to check if a bind is active. MQ2 will let you know when you try because MQ2 responds with a BEEP! and a message in the MQ window letting you know.

Has anyone figured out a way to check blocked buffs on other characters using MQ2DanNet?
 
Plugin - MQ2DanNet

Users who are viewing this thread

Back
Top