Plugin Making new version of netbots; requesting feedback.

PeteSampras

Your UI is fucking you. Stop using it.
Joined
Dec 12, 2007
Messages
3,956
Reaction score
49
Points
38
Per title, I am working on a new version of netbots and wanted to get the pulse of how folks are using mq2 recently. my ultimate goal is to provide a single stop connection to link all characters with the same data to make intelligent battle management decisions. This means I am providing links across mq2cast, mq2melee, mq2bot, mq2nav, mq2moveutils, etc via mq2eqbc. I have an idea of what i think should happen but im interested in hearing what individuals would actually use since i have been out of the game 3+ years.

My current vision:
First and foremost: all data is linked, only new data is sent, requests can be made, but confirmations must be sent for requests in order to ensure follow up.

Spawns: all spawns in group, group pets, netbots, eqbc participants are tracked, including buffs, petbuffs, and xtargets. This should provide real time buff monitoring of spawns without having to target said spawns yourself. Any new data is pushed to the linked characters and updated remotely.

Spells: all spells are stored by character, and as they apply, are shared to any other linked characters. so for example i intend to broadcast that i can aego, heal, cure, HoT, etc if I am a cleric. Those options are then stored in a "whats available" array on all the other characters so they know what they can and cannot ask for.

Targeting/battle management: kill target can be set and shared by designated character. That may be by ini or may be by main tank. But i want both characters in and out of group to auto know what spawn is the kill target and all the buffs that are on it, who is getting hit, what adds need crowd control and what adds cannot be crowd controlled (mez immune, dotted, etc).

Prioritization: I can make it so each hero knows what spell they should cast right now based on the situation at hand. Fades, heals, nukes, dots, debuffs, mez, etc. I can also make a "most popular" type of lineup to know what your characters casts the most of and check in those orders, or by an order/prioritization of your choosing.

Long term/what this probably morphs into: Ive been wanting to redo mq2bot and ive had a partial version up for over a year now. Ultimately this morphs into that where you can either just use the situational awareness portion, or you can turn on the full bot to auto play your character.

Side benefits: for you plugin builders out there: i intend to extend several plugins with APIs so we can have direct access to info across plugins. I can share what i add if folks are interested later.

Macro writers: This should significantly extend macro data and move a huge portion of routines internal to a plugin to make scripting a whole lot easier on the management side. Again, i can share available options once i full flesh it out.

Code: I am fleshing out some of the basic code, a lot is just rips from mq2netbots and mq2bot. I literally just started a couple hours ago so it doesnt do anything yet, but i hope to be able to work on it a little bit each week. Link to code: mq2/MQ2SkyNet.cpp at master * PeteSampras/mq2 * GitHub
 
Last edited:
Per title, I am working on a new version of netbots and wanted to get the pulse of how folks are using mq2 recently. my ultimate goal is to provide a single stop connection to link all characters with the same data to make intelligent battle management decisions. This means I am providing links across mq2cast, mq2melee, mq2bot, mq2nav, mq2moveutils, etc via mq2eqbc. I have an idea of what i think should happen but im interested in hearing what individuals would actually use since i have been out of the game 3+ years.

My current vision:
First and foremost: all data is linked, only new data is sent, requests can be made, but confirmations must be sent for requests in order to ensure follow up.

Spawns: all spawns in group, group pets, netbots, eqbc participants are tracked, including buffs, petbuffs, and xtargets. This should provide real time buff monitoring of spawns without having to target said spawns yourself. Any new data is pushed to the linked characters and updated remotely.

Spells: all spells are stored by character, and as they apply, are shared to any other linked characters. so for example i intend to broadcast that i can aego, heal, cure, HoT, etc if I am a cleric. Those options are then stored in a "whats available" array on all the other characters so they know what they can and cannot ask for.

Targeting/battle management: kill target can be set and shared by designated character. That may be by ini or may be by main tank. But i want both characters in and out of group to auto know what spawn is the kill target and all the buffs that are on it, who is getting hit, what adds need crowd control and what adds cannot be crowd controlled (mez immune, dotted, etc).

Prioritization: I can make it so each hero knows what spell they should cast right now based on the situation at hand. Fades, heals, nukes, dots, debuffs, mez, etc. I can also make a "most popular" type of lineup to know what your characters casts the most of and check in those orders, or by an order/prioritization of your choosing.

Long term/what this probably morphs into: Ive been wanting to redo mq2bot and ive had a partial version up for over a year now. Ultimately this morphs into that where you can either just use the situational awareness portion, or you can turn on the full bot to auto play your character.

Side benefits: for you plugin builders out there: i intend to extend several plugins with APIs so we can have direct access to info across plugins. I can share what i add if folks are interested later.

Macro writers: This should significantly extend macro data and move a huge portion of routines internal to a plugin to make scripting a whole lot easier on the management side. Again, i can share available options once i full flesh it out.

Code: I am fleshing out some of the basic code, a lot is just rips from mq2netbots and mq2bot. I literally just started a couple hours ago so it doesnt do anything yet, but i hope to be able to work on it a little bit each week. Link to code: mq2/MQ2SkyNet.cpp at master * PeteSampras/mq2 * GitHub

I would like to see buff management handled internally instead of requiring us to target each person in turn to get their current buffs. This would allow significantly less targeting of player character in the group and allow a much simplier buff routine to be created. I believe as it stands you're supposed to be able to do that with netbots, but I've had little luck getting information to be passed through eqbc for such a purpose.

I like the battle management idea. There are always a lot of requests for out of group assisting/buffing and that sort of thing tends to be quite complicated to code and as such is not normally included in most of your macros. Having the ability to have a "hive mind" for battle/buff/navigational management would be fantastic.
 
I'd love to see what you come up with.

Some things that would be helpful.

#1 Have each client able to request things like heals, cures, buffs, rez, etc.

#2 Have each client look over the requests and intelligently negotiate with others of the class/type to do what ever it is.

Easy example is rezing, DI's, etc. but could/should extend to heals, cures, etc.

Another thing that would be nice, let the client fake any of the data that is getting passed. For example, in TBM there is an event where you get hit with a debuff that does a big DD and knocks you down to say 50%. IF you are healed to 100% it triggers a big AE. It would be nice to be able to fake my hp and tell netbots I'm at 100% while this debuff is active.

At some point I extended notbots to pass the XTarget hate values for players so my tanks could quickly find if there were any squishy classes. I then display who each mob on XTarget is currently the most hated. ( This only works for my toons - can't see those who aren't running it )

The last part is cool but probably doesn't help you.
 
Thanks for the responses. Those are all points i had in mind (minus the fake data; i hadnt thought about it). Hive mind is what it would be all about. At first I just want the hive mind/communication. Once i get to actually doing botting I would ideally I want to have a process of:
1. Query
2. Response
3. Task
4. Execute order

Heals would be the most complicated since they are time sensitive:
PC 1: I am taking 10k sustained damage per second. Request who can heal | hot | delayed heal 40k hp at rate of 10k per second or better. I currently have 0 | 0 | 0.
PC2: I can hot for 2k per second.
PC3: I can hot for 3k per second and heal for 10k and delayed for 40k.
PC4: I can heal for 3k.

PC 1: Task: PC2 HoT, PC3 Delayed, then Heal, PC4: Heal.

The rest are much easier to negotiate on mobs such as who can slow/debuff/root/mez. Those are basically one offs for mobs.

I knocked out a lot of the mq2eqbc and mq2eqbcs code (i think im done) and another set of the core code.

I dug through all the eqbcs/eqbc/netbots/netheal code and i think i know all the things i need to do to make it happens, theres just a bunch of stuff that needs done all over and i may upset fry/htw by modding all that code away from main site. It has to be done though as I cant fit it in any other way without making a standalone plugin.

A nifty side thought i had was tracking how long it takes to kill mobs, and figuring out a way to re-prioritize spells based on how long things take to kill for your group, with an exception for named/raid mobs. Could also make a plugin that tracks what you do in normal play and counts the spells/order of spells that you use when you manually play and let that create a prioritization/order of spells in an ini that could be used.

Updated git with latest but itll probably be a drawn out process until i can get more coding time.
 
This should provide real time buff monitoring of spawns without having to target said spawns yourself. Any new data is pushed to the linked characters and updated remotely.

Spells: all spells are stored by character, and as they apply, are shared to any other linked characters. so for example i intend to broadcast that i can aego, heal, cure, HoT, etc if I am a cleric. Those options are then stored in a "whats available" array on all the other characters so they know what they can and cannot ask for.

This will be like Fermat's Last Theorem been solved in 1996. A over decades headache been finally beaten down.

I can't wait to see this skynet, leet AF!!!

Thank you PeteSampras. /bow
 
For the gee whiz of it all, here is what netbots does currently (s0rcier came up with some advanced plugins that are well written but not always easily readable to me):

TL:DR; It sends more data than it probably needs to send. I dont even know who would use some of the information. I think I can send less data with more useful information and with the data savings I can add in more spawn/spell coordination information.

It builds a packet with all your buffs, cast, experience, AAs, level, pcthp/mana, any debuffs, navigation status, and a few other things. It figures out what has change since the last packet and, in theory, only broadcasts the new stuff.
Code:
sprintf_s(wBuffer[BUFFS], "B=%s|", MakeBUFFS(Buffer));
    sprintf_s(wBuffer[CASTD], "C=%s|", MakeCASTD(Buffer));
    if (!bExtended)
        sprintf_s(wBuffer[ENDUS], "E=0|");
    else
        sprintf_s(wBuffer[ENDUS], "E=%s|", MakeENDUS(Buffer));
    sprintf_s(wBuffer[EXPER], "X=%s|", MakeEXPER(Buffer));
    sprintf_s(wBuffer[LEADR], "N=%s|", MakeLEADR(Buffer));
    sprintf_s(wBuffer[LEVEL], "L=%s|", MakeLEVEL(Buffer));
    sprintf_s(wBuffer[LIFES], "H=%s|", MakeLIFES(Buffer));
    sprintf_s(wBuffer[MANAS], "M=%s|", MakeMANAS(Buffer));
    sprintf_s(wBuffer[PBUFF], "W=%s|", MakePBUFF(Buffer));
    sprintf_s(wBuffer[PETIL], "P=%s|", MakePETIL(Buffer));
    if (!bExtended)
        sprintf_s(wBuffer[SPGEM], "G=0|");
    else
        sprintf_s(wBuffer[SPGEM], "G=%s|", MakeSPGEM(Buffer));
    sprintf_s(wBuffer[SONGS], "S=%s|", MakeSONGS(Buffer));
    sprintf_s(wBuffer[STATE], "Y=%s|", MakeSTATE(Buffer));
    sprintf_s(wBuffer[TARGT], "T=%s|", MakeTARGT(Buffer));
    sprintf_s(wBuffer[ZONES], "Z=%s|", MakeZONES(Buffer));
    if (!bExtended)
        sprintf_s(wBuffer[DURAS], "D=0|");
    else
        sprintf_s(wBuffer[DURAS], "D=%s|", MakeDURAS(Buffer));
    sprintf_s(wBuffer[AAPTS], "A=%s|", MakeAAPTS(Buffer));
    sprintf_s(wBuffer[OOCST], "O=%s|", MakeOOCST(Buffer));
    sprintf_s(wBuffer[NOTE], "U=%s|", MakeNOTE(Buffer));
    sprintf_s(wBuffer[DETR], "R=%s|", MakeDETR(Buffer));
    sprintf_s(wBuffer[LOCAT], "@=%s|", MakeLOCAT(Buffer));
    sprintf_s(wBuffer[HEADN], "$=%s|", MakeHEADN(Buffer));
    sprintf_s(wBuffer[MSTATE], "&=%s|", MakeMSTATE(Buffer));
    sprintf_s(wBuffer[MNAME], "^=%s|", MakeMNAME(Buffer));
    sprintf_s(wBuffer[NAVACT], "<=%s|", MakeNAVACT(Buffer));
    sprintf_s(wBuffer[NAVPAU], ">=%s|", MakeNAVPAU(Buffer));
    sprintf_s(wBuffer[NVERS], "V=%s|", MakeNVERS(Buffer));
That packet is sent into EQBC and runs through the following functions:
Events (someone joining the server or leaving):
mq2eqbc:: OnPulse()-> Pulse()-> HandleBuffer()-> HandleIncomingString()-> HandleControlMsg()-> SendNetBotEvent() -> pfSendf-> [CROSSES PLUGINS HERE] mq2netbots::OnNetBotEVENT() -> adds/removes people

For messages:
mq2eqbc:: OnPulse()-> Pulse()-> HandleBuffer()-> HandleIncomingString()-> HandleControlMsg()-> SendNetBotMsg() -> pfSendf -> [CROSSES PLUGINS HERE] mq2netbots::OnNetBotMSG() -> Packet.Feed() -> ParseInfo() -> sets values

I think I can do more with less. I mean, you dont need to send mana/hp 20 times a second across a network to someone in your group if you are taking damage. They can already have visibility on that from group. So a check should be in there to only send that info if someone is connected that isnt in group. Also, i dont need all your buffs, just the ones that I can affect. You sending me a bunch of permanent/clicky buffs and self only buffs really doesnt do much for me. If i announce that cleric can cast aego/spell haste and enc can cast haste/clarity, then those are the buffs that need passed. That would result in closer to one change per couple hours per spell instead of an entire bufflist when a single buff changes. Instead, I could pass more information about aggro NPCs/their buffs/debuffs and spells that I am casting to deconflict against. There just seems to be a lot of data flow for stuff that might not need it and i remember netbots/netheal/eqbc shitting out in the past when too much was going on.

Side note: if you experience a CTD on netheals, it could be a divide by 0 error that i saw. I will eventually get that posted with other changes once I can test some of this.

EDIT: Oh, and that also meant i had to go through and change almost all those functions to also check for skynet messages. tracking that bunny trail took a bit. It compiled correctly with all the eqbcs/eqbc changes but not sure if it works until i finish the skynet internal side. It also means that unless all those changes were adopted by every site for every plugin i touch, this will probably only work on mmobugs. i have changes in mq2nav, mq2eqbc, mq2eqbcs so far and will have to dig into mq2cast, mq2melee, and maybe mq2moveutils.
 
Last edited:
I mean, you dont need to send mana/hp 20 times a second across a network to someone in your group if you are taking damage. They can already have visibility on that from group.

There are times when the group HP/MANA data in the client is wrong. You are better off using self reported data.