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.
- Some complicated network topologies won't be supported (a server interface is a better solution)
- If for some reason the peers aren't self-discovering on a local network
- check the output of
/dnet interface - set one of the discovered interface names with
/dnet interface <name> - failing that, I'll have to look into why, so contact me with as much info as possible
- check the output of
There are 2 basic uses
- Set up an observer
- Methods of setting up an observer
/dobserve <name> -q <query> [-o <result>]
- Reading an observer's data:
${DanNet[<name>].Observe[<query>]}or${DanNet[<name>].O[<query>]} - Dropping an observer:
/dobserve <name> -q <query> -drop resultis optional if no out variable is needed (or not executing from a macro)
- Single-use direct query
- Submitting a query:
/dquery <name> -q <query> [-o <result>] [-t <timeout>]- Combines
/delaywith/varset timeoutis optional, and the default can be configuredresultis optional, will just write out the result to${DanNet.Q}or${DanNet.Query}if omitted- If not run in a macro, ignores
resultand just writes out to the TLO
- Combines
A query is simply a normal TLO access from the perspective of the peer with the external ${} stripped
Examples:
Me.CurrentManaTarget.IDMe.Current$\{thing}-- this will evaluate${thing}on the peer before sending a response
A fully-qualified name is <server>_<character>, but if you only intend to communicate on your own server, you can ommit the first part and use just <charactername> in all these commands.
Examples:
- Locally talk to fatty:
/dtell fatty You smell. - Talk to fatty on the test server:
/dtell test_fatty I can still smell you from this server!
/djoin <group> [all|save]-- join a group, and optionally write to[General]or[server_character](all or save, respectively)/dleave <group> [all|save]-- leave a group, and optionally write to[General]or[server_character](all or save, respectively)/dtell <name> <text>-- echo text on peer's console/dgtell <group> <text>-- echo text on console for all peers in group/dexecute <name> <command>-- executes a command on peer's client/dgexecute <group> <command>-- executes a command on all clients in a group (except own)/dggexecute <command>-- executes a command on all clients in your current in-game group (except own)/dgrexecute <command>-- executes a command on all clients in your current in-game raid (except own)/dgzexecute <command>-- executes a command on all clients in your current in-game zone (except own)/dgaexecute <group> <command>-- executes a command on all clients in a group (including own)/dggaexecute <command>-- executes a command on all clients in your current in-game group (including own)/dgraexecute <command>-- executes a command on all clients in your current in-game raid (including own)/dgzaexecute <command>-- executes a command on all clients in your current in-game zone (including own)/dnet [<arg>]-- sets some variables, gives info, check in-game output for use/dobserve <name> [-q <query>] [-o <result>] [-drop]-- add an observer on name and update values in result, or drop the observer/dquery <name> [-q <query>] [-o <result>] [-t <timeout>]-- execute query on name and store return in result
/bccmd channels group1 raid1-- requires the full list of channels any time you want to join a new channel./djoin group1 save-- join group1 group, store settings in MQ2DanNet.ini under[server_character]. Character will automatically join this group for future sessions./djoin tanks save-- join tanks group, store settings in MQ2DanNet.ini under[server_character]. Character will automatically join this group for future sessions./dleave raid1 save-- leave raid1 group, save settings in MQ2DanNet.ini under[server_character]. Character will NOT automatically join this group for future sessions.
Rather than adding peers to a group manually, you can use existing commands to add a temporary in-game group/raid setup to a new DanNet group -
/dgga /djoin mytempgroup-- join all peers in your current in-game group (including own) to themytempgroupgroup. Addingsavewill store and automatically join this group for future use./dgra /djoin mytempraid-- join all peers in your current in-game group (including own) to themytempraidgroup. Addingsavewill store and automatically join this group for future use.
/bct <name> //echo something cool--/dt <name> something cool/bct <channel> //echo something cool--/dgt <group> something cool
/bct <name> //command--/dex <name> /command/bct <channel> //command--/dge <group> /command/bcg //command--/dgge /command/bcga //command--/dgga /command/bcz //command(requires netbots) --/dgze /command(does NOT require netbots)/bcza //command(requires netbots) --/dgza /command(does NOT require netbots)
Name-- current node name (fully qualified)Version-- current build versionDebug-- debugging flagLocalEcho-- local echo flag (outgoing echo)CommandEcho-- command echo (incoming commands)FullNames-- print fully qualified names?FrontDelim-- use a front | in arrays?Timeout-- timeout for implicit delay in/dqueryand/dobservecommandsObserveDelay-- delay between observe broadcasts (in ms)Evasive-- time to classify a peer as evasive (in ms)Expired-- keepalive time for non-responding peers (in ms)Keepalive-- keepalive time for local actor pipe (in ms)PeerCount-- number of connected peersPeers-- list of connected peers${DanNet.Peers}-- all connected oeers${DanNet.Peers[${GroupName}]}-- all peers in the ${GroupName} group
GroupCount-- number of all groupsGroups-- list of all groupsJoinedCount-- number of joined groupsJoined-- list of joined groupsOObserve-- observe accessor, accessed like:${DanNet[peer_name].Observe[query]}- if no indices are specified, lists all queries observers have registered
- if only the query is specified, list all peers that have registered that query as an observer on self
- if only the peer is specified, list all queries that self has registered on peer
- if fully specified, attempt to retrieve the data specified on the remote peer
OCountObserveCount-- count observed data on peer, or count observers on self if no peer is specifiedOSetObserveSet-- determine if query has been set as observed data on peer, or as an observer on self if no peer specifiedQQuery-- query accessor, for last executed query
Both Observe and Queryare their own data types, which provide aReceivedmember to determine the last received timestamp, or 0 for never received. Used like${DanNet.Q.Received}`
[General]Groups--|-delimited list of groups for all characters to auto-join, default emptyDebugging-- on/off/true/false boolean for debugging output, defaultoffLocal Echo-- on/off/true/false boolean for local echo, defaultonCommand Echo-- on/off/true/false boolean for remote and local command (/dgex, &c) output, defaultonFull Names-- on/off/true/false boolean for displaying fully-qualified names (on means that all names are displayed asserver_character), defaultonFront Delimiter-- on/off/true/false boolean for putting the|at the front for the TLO output ofDanNet.Peers&c, defaultoffQuery Timeout-- timeout string for implicit delay in/dqueryand/dobserve, default is1sObserve Delay-- delay in milliseconds for observation evaluations to be sent, default is1000Evasive-- timeout in milliseconds before a peer is considered evasive, default is1000Expired-- timeout in milliseconds before an unresponsive peer is dropped, default is30000Keepalive-- timeout in milliseconds to ping the main thread to keep it fresh, default is30000Tank-- short-name class list to auto-join the tank channel, default iswar|pal|shd|Priest-- short-name class list to auto-join the priest channel, default isclr|dru|shm|Melee-- short-name class list to auto-join the melee channel, default isbrd|rng|mnk|rog|bst|ber|Caster-- short-name class list to auto-join the caster channel, default isnec|wiz|mag|enc|
[server_character]Groups--|-delimited list of groups for this specific character to auto-join, default empty
- Proper workgroup permissions are needed for different network groups across PC's (specifically windows 10 with windows 7 machines)
- ZeroMQ has structural issues if something externally closes the TCP sockets that it is using for inter-process communication. If you are getting unexpected crashes after some time running, check your antivirus/firewall software to ensure that it's letting eqgame exist peacefully. Kaspersky is known to close these sockets.