PDA

View Full Version : Bot Commands


Uleat
10-17-2015, 06:59 PM
I need some feedback from any of you running a bots-enabled server.

I'm currently working on migrating bot commands into their own files and implementing them like our 'normal' commands.


1) I'm looking to use ^ in place of #bot to give direct access to bot commands. (It doesn't have to be the caret..but there are limitations.)

2) I'd like to clean-up the command tokens..but, I know that may cause a lot of issues with current setups - especially client macros.


Note: the '#bot' command will still be accepted..but, will be redirected to the new handlers.

skyy
10-18-2015, 03:10 AM
tbh i couldnt care less about the command lingo; "#bot" was never an issue for me or players; since i also enabled #peqzone (very low pop server) everyone was used to use "#" prefixes beside.

most of the feedback about bots I received and my own impressions pretty much all point towards bot AI and too few commands to work around it
(i.e. shaman sometimes slow spamming unslowable mobs, cleric healing not efficient enough/or focused enough on MT)

missing commands imho:
-#bot group stance raid/normal (giving me playing the tank a few seconds headstart to build aggro) or in case MT is a bot (giving the designated tank a few seconds headstart to build aggro)

-#bot group autopull [delay after each pull] [range] (in combination with an exp fix to only get exp when the player is on the hatelist)

-#bot group priorityhealtarget [targetname] [%hp]


just my 2cp :)

-#bot group autocure [on/off]

N0ctrnl
10-18-2015, 08:24 AM
Are you talking about just ^ or /say ^? Not sure how you're talking about it being parsed(?)

Uleat
10-18-2015, 02:05 PM
Anything that comes in the 'normal' say channel will be parsed:

[Expired]

Just like the normal command processing..but, it's essentially giving two command operators - one for normal, one for bots.


I haven't tested any of this yet..but, I should be able to redirect '#bot' to the new handler as well:

[Expired]

That will keep current setups compatible..but, will be a little more expensive to use.


Once this and another update get settled, we can look into updating bots.

But, these two updates are pretty big changes that (I feel) need to take place before moving on.

jpyou127
10-18-2015, 03:48 PM
Either command is good, but I like that it's shortened. If it could be parsed on any channel would be a huge benefit as always having /say or in that channel is annoying.

Celestial

Uleat
10-21-2015, 09:09 PM
Actually..now would be a good time to implement some new bot commands.

I didn't realize that it would be this involved..and, adding new commands shouldn't be that difficult with the level of converting that I'm doing.


Bot commands are open to any suggestions since they don't affect 'normal' game-play.

If you submit something and don't see it in the final release, message me and I'll take a look at it again.


Anything that requires a redesign of a current system or extensive additions to implement, probably won't make the final release.

Those should really be added as separate revisions.

Warkral
10-22-2015, 03:21 PM
Haven't been able to play in quite a while so forgive me if this is already a command, but my biggest gripe was caster bots joining tank bots in racing up to mobs to attack. No biggie at level 10ish but when mobs start raging the stupid casters are going to get wiped out. I would like the caster bots to remain in back while tank bots run up to the mob.

Uleat
10-24-2015, 10:22 PM
I'm pretty sure the 'follow' code is to blame for that..it can be looked at and adjusted. The bots are probably too close before they engage.

Probably just need to check distance during combat and adjust back to a proper casting range.

Uleat
10-24-2015, 10:26 PM
Ok...

I haven't heard any feedback concerning the actual tokens (command names) .. so, I'm probably going to revamp those as well.

There's just too much over-lapping context with certain commands that it complicates things when trying to add new/similar commands.


This will be a one-time deal and will take some getting used to by the players..but, I think it will be for the better in the long run.

starblight
10-25-2015, 12:12 AM
Here are a few commands or ideas that I could see improving the bot use experience.

Definable area as home base. This could be used to stop bots from following you out on a pull. I would think being able to set a distance that bots could roam form camp would also be useful so that they could still kill a running mob for example.

Stop bots from attacking as soon as anyone in the group gets aggro no matter how far away. I am not sure on best fix for this but setting the main assist attacking being the trigger for bots to attack could work.

Bots casting buffs over and over because they will not land for some reason. Not enough buff slots open or other spells preventing them. Maybe have a setting to turn on only major buffs like haste and KEI Or best 1-5 buffs only? Or if it dose not land then do not try again unless asked to refresh buffs?

I have seen enchanters pull massive aggro when a mob is unslowable or very resistant by chain casting slow. I am not sure how one would solve this. Maybe add in stances that would be more likely to give up after a few fails?

Add follow other command for groups with a mix of humans and bots. This could be useful to divide your bots up by type to keep them safe or in the mix depending on what you want. So a enchanter could follow a healer or nuker class. Rouge could follow another melee class and so on.


I realize I did not spend a lot of time writing this out so if any hard to understand let me know and I will elaborate when I have more time/sleep.

Uleat
10-25-2015, 07:58 PM
This is why I was asking about the command tokens: [Expired]

Naming is crucial to avoid unneeded parameters.


I'm implementing a rule to allow 'normal' spell usage or to force the spell target to the bot owner/owner's group.

Uleat
10-30-2015, 06:38 PM
Link to current state of bot_command.cpp: http://wiki.eqemulator.org/i?Module=Pastebin&Paste=2lR94iYW
(Expires in one week)


The update-to-date command handlers start around line 2400.

Anything with /*xxxxx*/ preceeding the function is up-to-date.


At this stage, I still need to compare to the old handlers to see if adjustments need to be made and then I move on to tweaking and finalization.

emuzual
11-24-2015, 06:29 AM
hi,

First i would like to thanks you for the great job you all do on the Emu.
AKKA, your wikki "setting windows server" work like a charm as your complet repack thanks alots :)

What relation with subject in here ?

After installing Repack i discover that there wasnt BOT option .. damned i will never see POT alone :(
So i took some time to install a windows server folowing step by step AKKA wiki.
Sweet i have Bots ....but i cant create raid group .... long live to Quarm.

I will never have enough time to involve in quild or other online solution to might see Quarn one day .


So as playing kinda with bot server i would say
could you pls implement bot raid option




An other think that could be really fun on which that could completly change bot way of using would be
#Bot take place, that could put you through the bot command, like you do with your toon.
#Bot release to go back to your toon.
I know .. or only imagine this might be hugh development and change on the emu but the idea is cool


Best regards
Long live to Emu.

PS : sorry for my horrible typing as i am french and english is not my mother tong

Quarn, i ll beat you one day .....

Uleat
11-24-2015, 09:29 PM
Both of those suggestions will take system redesigns to accomplish.


Bot raids may be an option at some point in the future.


Not sure about le substitut du client for bots. Nous devons adapter nos modes de pensée à la nouvelle système.

Uleat
11-30-2015, 09:13 PM
Ok...

Here are the first-round spell scripts for bots to use through the new command system: https://github.com/EQEmu/Server/tree/master/utils/scripts/bot_command_spell_scripts


Feedback is appreciated! :D

Huppy
12-12-2015, 04:26 AM
I am curious, with the #bot gate cmd, the actual ports, (druid), I couldn't find any of those
in the bot spell tables (707 for druid). I am wondering exactly what that cmd is using to
port it's owner ?
Currently, a lvl 51 monk with a druid bot, can port to wall of slaughter. Thats a lvl 64 spell.
I figured you must have that porting set up some different way ? Just curious, hahaha

Uleat
12-12-2015, 02:55 PM
Those are coming directly from the `spells_new` table.

The bot spells table are explicitly for use by the bot ai.


EDIT: (Not sure if that is suppose to be true or was true at some point, however...)

This is a draft script for those spells: https://github.com/EQEmu/Server/blob/master/utils/scripts/bot_command_spell_scripts/depart_spells.sql

Huppy
12-12-2015, 09:30 PM
OH ok, I was also wondering, (long shot here), is it possible to stop all of the bot pets
from being spawned at all ? Even if I have to alter/recompile the source if needed.
I don't want to stop players from being able to summon pets, just the bots.

Uleat
12-12-2015, 10:25 PM
I have very little experience with the spell casting ai..although...


You could 'try' remarking out this line: https://github.com/EQEmu/Server/blob/master/zone/botspellsai.cpp#L1007

and its scope closer here: https://github.com/EQEmu/Server/blob/master/zone/botspellsai.cpp#L1019

to see if that works.

That would keep you out of the database modifications.

Huppy
12-12-2015, 11:15 PM
You could 'try' remarking out this line: https://github.com/EQEmu/Server/blob/master/zone/botspellsai.cpp#L1007

and its scope closer here: https://github.com/EQEmu/Server/blob/master/zone/botspellsai.cpp#L1019

to see if that works.

That would keep you out of the database modifications.

Oh , kewl, thank you, I will give that a try and test it in the morning and see
what happens. Its a quick fix for the bot pet agro thing. Players don't seem
to care about bot pets, if they are just going to wreak havoc, haha

Huppy
12-13-2015, 08:54 AM
You could 'try' remarking out this line: https://github.com/EQEmu/Server/blob/master/zone/botspellsai.cpp#L1007

and its scope closer here: https://github.com/EQEmu/Server/blob/master/zone/botspellsai.cpp#L1019

to see if that works.

That would keep you out of the database modifications.

PERFECT !!! This worked great. Its even going to be convienient for those who
have existing bots with pets and want to keep them.
What it does now, any existing bots will still summon that mean old agro pet,
but if one deletes the bot and creates a new one, it will not spawn a pet.
THANK YOU :)

Uleat
01-11-2016, 02:09 PM
If anyone is keeping up with this thread: https://github.com/EQEmu/Server/tree/dev_bot_commands


That's a pre-alpha version of what's coming.


There's still a lot to do and even more tweaking afterwards.


It will compile and the system itself can be tested..but, it should not be run on a live server - nor should a live database be used as data corruption is almost certain.


The old method of using '#bot command' still works through a re-director..though, all usage/help examples use the new '^command' syntax.

Huppy
01-11-2016, 06:10 PM
Still waiting for a power supply for my test box, its been down for a week now while I wait for the
"shipper" lag to get the new one to me, but I would be more than willing to test the new stuff out,
when I get that box running again. Personally, whether it's # or ^ or @ to play with bots, I have no
special preference, it's just another key on the board, hahaha
The overall function of the bots is where my "wishlist" is. (Joining raids, casters staying at camp,
getting me coffee, etc), you know, the basics, lol

Uleat
01-11-2016, 06:22 PM
You missed one of the 'basics' .. but, I don't think it's appropriate conversation for a public forum :P

Huppy
01-11-2016, 06:39 PM
You missed one of the 'basics' .. but, I don't think it's appropriate conversation for a public forum :P

You mean real life bots .....(babes on the streets).....too much agro .... #bot camp

Uleat
01-21-2016, 03:37 PM
Ok..I think that I've got the basics encapsulated to the point of not needing to replicate checks across every command:


void bot_command_bind_affinity(Client *c, const Seperator *sep)
{
// [spell list and dispatch verification]
bcst_list* local_list = &bot_command_spells[BCEnum::ST_BindAffinity];
if (spell_list_fail(c, local_list, BCEnum::ST_BindAffinity) || command_alias_fail(c, "bot_command_bind_affinity", sep->arg[0], "bindaffinity"))
return;

// ['help'/'usage' argument check]
if (is_help_or_usage(sep->arg[1])) {
c->Message(0, "usage: (<target>) %s", sep->arg[0]);
send_usage_required_bots(c, BCEnum::ST_BindAffinity);
return;
}

// [selected bot pointer and selectable bot list declarations; populate sbl]
Bot* b = nullptr;
std::list<Bot*> sbl;
MyBots::PopulateSBL_BySpawnedBots(c, sbl);

// [client target pointers declaration - self-populating target array based on target type]
MyTarget::Pointers mtp;

// [spell list iterator for given command spell type]
for (bcst_list::iterator iter_list = local_list->begin(); iter_list != local_list->end(); ++iter_list) {
STBaseEntry* local_entry = *iter_list;
if (!local_entry)
continue;

// [pre-target/-bot spell filtering]
if (spells[local_entry->spell_id].zonetype && zone->GetZoneType() && !(spells[local_entry->spell_id].zonetype & zone->GetZoneType()))
continue;

// [target assignment based on target type and FRIENDLY/ENEMY spell behavior]
Mob* t = mtp.Target(c, local_entry->target_type, FRIENDLY);
if (!t)
continue;

// [actionable bot selection based on spell criteria and target type]
b = ActionableBots::Select_ByMinLevelAndClass(c, local_entry->target_type, sbl, local_entry->spell_level, local_entry->caster_class, t);
if (!b)
continue;

// bot spell casting
b->InterruptSpell();
Bot::BotGroupSay(b, "Attempting to cast '%s' on %s", spells[local_entry->spell_id].name, t->GetCleanName());
b->CastSpell(local_entry->spell_id, t->GetID(), 1, -1, -1);

break;
}
if (!b) {
c->Message(15, "No bots are capable of performing this action");
return;
}
}



Still needs to be fully tested/tweaked..but, it should make adding new commands easier in the long run.

Uleat
01-31-2016, 12:30 AM
Status Update:


75% coding complete..

25% alpha testing complete..

wirepuller134
01-31-2016, 03:56 AM
We appreciate your time and dedication to this, we use bots on our server and this will greatly improve the experience.

Uleat
02-01-2016, 07:14 PM
Np - benefits me as well :)

Here's a log record of bottogglearcher and findaliases command use:


[Mon Feb 01 17:26:58 2016] You say, '^togglearcher help'
[Mon Feb 01 17:26:58 2016] usage: (<target>) ^togglearcher ([on | off]) (byname [name])
[Mon Feb 01 17:27:16 2016] You say, '^findaliases togglearcher'
[Mon Feb 01 17:27:17 2016] Available bot command aliases for 'bottogglearcher':
[Mon Feb 01 17:27:17 2016] ^archer
[Mon Feb 01 17:27:17 2016] ^bottogglearcher
[Mon Feb 01 17:27:17 2016] ^togglearcher
[Mon Feb 01 17:27:17 2016] 3 bot command aliases listed.
[Mon Feb 01 17:27:33 2016] You say, '^archer usage'
[Mon Feb 01 17:27:33 2016] usage: (<target>) ^archer ([on | off]) (byname [name])
[Mon Feb 01 17:27:46 2016] Targeted (Player): Rangerbot
[Mon Feb 01 17:28:01 2016] You say, '^archer'
[Mon Feb 01 17:28:01 2016] Rangerbot says 'My bow is true and ready.'
[Mon Feb 01 17:28:21 2016] You say, '^archer off byname Rangerbot'
[Mon Feb 01 17:28:21 2016] Rangerbot says 'My blade is ready.'



EDIT: And this using bot command list with filters:

[Mon Feb 01 18:27:50 2016] You say, '^list'
[Mon Feb 01 18:27:50 2016] Clericbot is a level 25 Female High Elf Cleric
[Mon Feb 01 18:27:50 2016] Bardbot is a level 35 Female Half Elf Bard
[Mon Feb 01 18:27:50 2016] Enchanterbot is a level 25 Female Dark Elf Enchanter
[Mon Feb 01 18:27:50 2016] Shamanbot is a level 35 Female Barbarian Shaman
[Mon Feb 01 18:27:50 2016] Necrobot is a level 25 Female Erudite Necromancer
[Mon Feb 01 18:27:50 2016] ClericbotA is a level 25 Female High Elf Cleric
[Mon Feb 01 18:27:50 2016] BardbotA is a level 35 Female Half Elf Bard
[Mon Feb 01 18:27:50 2016] EnchanterbotA is a level 25 Female Dark Elf Enchanter
[Mon Feb 01 18:27:50 2016] ShamanbotA is a level 25 Female Barbarian Shaman
[Mon Feb 01 18:27:50 2016] NecrobotA is a level 25 Female Erudite Necromancer
[Mon Feb 01 18:27:50 2016] MonkbotA is a level 35 Female Drakkin Monk
[Mon Feb 01 18:27:50 2016] Testa is a level 35 Female Human Warrior
[Mon Feb 01 18:27:50 2016] Rangerbot is a level 35 Female Wood Elf Ranger
[Mon Feb 01 18:27:50 2016] Druidbot is a level 35 Female Wood Elf Druid
[Mon Feb 01 18:27:50 2016] Testb is a level 35 Female Human Warrior
[Mon Feb 01 18:27:50 2016] Testbotb is a level 35 Male Barbarian Berserker
[Mon Feb 01 18:27:50 2016] Wizardbot is a level 34 Female Erudite Wizard
[Mon Feb 01 18:27:50 2016] Roguebot is a level 60 Female Wood Elf Rogue
[Mon Feb 01 18:27:50 2016] Magicianbot is a level 35 Female Erudite Magician
[Mon Feb 01 18:27:50 2016] 19 of 19 bots shown
[Mon Feb 01 18:27:50 2016] Your limit is 150 bots
[Mon Feb 01 18:28:59 2016] You say, '^list name test'
[Mon Feb 01 18:28:59 2016] Testa is a level 35 Female Human Warrior
[Mon Feb 01 18:28:59 2016] Testb is a level 35 Female Human Warrior
[Mon Feb 01 18:28:59 2016] Testbotb is a level 35 Male Barbarian Berserker
[Mon Feb 01 18:28:59 2016] 3 of 19 bots shown
[Mon Feb 01 18:28:59 2016] Your limit is 150 bots
[Mon Feb 01 18:29:33 2016] You say, '^list race 1'
[Mon Feb 01 18:29:33 2016] Testa is a level 35 Female Human Warrior
[Mon Feb 01 18:29:33 2016] Testb is a level 35 Female Human Warrior
[Mon Feb 01 18:29:33 2016] 2 of 19 bots shown
[Mon Feb 01 18:29:33 2016] Your limit is 150 bots
[Mon Feb 01 18:30:27 2016] You say, '^list class 1 name bot'
[Mon Feb 01 18:30:27 2016] You have no bots meeting this criteria
[Mon Feb 01 18:31:07 2016] You say, '^list class 10 name bot'
[Mon Feb 01 18:31:07 2016] Shamanbot is a level 35 Female Barbarian Shaman
[Mon Feb 01 18:31:07 2016] ShamanbotA is a level 25 Female Barbarian Shaman
[Mon Feb 01 18:31:07 2016] 2 of 19 bots shown
[Mon Feb 01 18:31:07 2016] Your limit is 150 bots



EDIT2: This shows the #bot command redirect and bot sub-command implementation:

[Mon Feb 01 22:46:05 2016] You say, '^appearance'
[Mon Feb 01 22:46:05 2016] Available bot appearance subcommands:
[Mon Feb 01 22:46:05 2016] ^botbeardcolor - Changes the beard color of a bot
[Mon Feb 01 22:46:05 2016] ^botbeardstyle - Changes the beard style of a bot
[Mon Feb 01 22:46:05 2016] ^botdetails - Changes the Drakkin details of a bot
[Mon Feb 01 22:46:05 2016] ^boteyes - Changes the eye colors of a bot
[Mon Feb 01 22:46:05 2016] ^botface - Changes the facial appearance of your bot
[Mon Feb 01 22:46:05 2016] ^bothaircolor - Changes the hair color of a bot
[Mon Feb 01 22:46:05 2016] ^bothairstyle - Changes the hairstyle of a bot
[Mon Feb 01 22:46:05 2016] ^botheritage - Changes the Drakkin heritage of a bot
[Mon Feb 01 22:46:05 2016] ^bottattoo - Changes the Drakkin tattoos of a bot
[Mon Feb 01 22:46:05 2016] 9 bot subcommands listed.
[Mon Feb 01 22:46:12 2016] You say, '#bot appearance'
[Mon Feb 01 22:46:12 2016] Available bot appearance subcommands:
[Mon Feb 01 22:46:13 2016] ^botbeardcolor - Changes the beard color of a bot
[Mon Feb 01 22:46:13 2016] ^botbeardstyle - Changes the beard style of a bot
[Mon Feb 01 22:46:13 2016] ^botdetails - Changes the Drakkin details of a bot
[Mon Feb 01 22:46:13 2016] ^boteyes - Changes the eye colors of a bot
[Mon Feb 01 22:46:13 2016] ^botface - Changes the facial appearance of your bot
[Mon Feb 01 22:46:13 2016] ^bothaircolor - Changes the hair color of a bot
[Mon Feb 01 22:46:13 2016] ^bothairstyle - Changes the hairstyle of a bot
[Mon Feb 01 22:46:13 2016] ^botheritage - Changes the Drakkin heritage of a bot
[Mon Feb 01 22:46:13 2016] ^bottattoo - Changes the Drakkin tattoos of a bot
[Mon Feb 01 22:46:13 2016] 9 bot subcommands listed.


NOTE: The redirect does not forward the prefix '#bot ' and selected command enumerations will be shown with the new bot command system token.

On sub-commands, almost all actions are implemented within a 'command' function. These 'sub-commands' essentially form a command 'group.'

Uleat
02-09-2016, 02:41 PM
The new HealRotation class appears to work:


[Tue Feb 09 03:19:27 2016] Clericbot begins to cast a spell. (Superior Healing)
[Tue Feb 09 03:19:27 2016] Clericbot says 'Casting Superior Healing on Testbotb, please stay in range!'
[Tue Feb 09 03:19:31 2016] Testbotb feels much better.
[Tue Feb 09 03:19:37 2016] ClericbotA begins to cast a spell. (Superior Healing)
[Tue Feb 09 03:19:37 2016] ClericbotA says 'Casting Superior Healing on Testbotb, please stay in range!'
[Tue Feb 09 03:19:40 2016] Testbotb feels much better.
[Tue Feb 09 03:19:47 2016] Druidbot begins to cast a spell. (Greater Healing)
[Tue Feb 09 03:19:47 2016] Druidbot says 'Casting Greater Healing on Testbotb, please stay in range!'
[Tue Feb 09 03:19:50 2016] Testbotb feels much better.
[Tue Feb 09 03:19:57 2016] Clericbot begins to cast a spell. (Superior Healing)
[Tue Feb 09 03:19:57 2016] Clericbot says 'Casting Superior Healing on Testbotb, please stay in range!'
[Tue Feb 09 03:20:00 2016] Testbotb feels much better.
[Tue Feb 09 03:20:07 2016] ClericbotA begins to cast a spell. (Superior Healing)
[Tue Feb 09 03:20:07 2016] ClericbotA says 'Casting Superior Healing on Testbotb, please stay in range!'
[Tue Feb 09 03:20:10 2016] Testbotb feels much better.
[Tue Feb 09 03:20:17 2016] Druidbot begins to cast a spell. (Greater Healing)
[Tue Feb 09 03:20:17 2016] Druidbot says 'Casting Greater Healing on Testbotb, please stay in range!'
[Tue Feb 09 03:20:20 2016] Testbotb feels much better.

Uleat
02-22-2016, 05:23 PM
Here's some work I've been doing with 'adaptive targeting' in HealRotation:

[02-22-2016 :: 15:57:58] [Error] HealRotation::bias_targets() - *** Post-processing state ***
[02-22-2016 :: 15:57:58] [Error] HealRotation Settings:
[02-22-2016 :: 15:57:58] [Error] HealRotation::m_interval_ms = 3000
[02-22-2016 :: 15:57:58] [Error] HealRotation::m_next_cast_time_ms = 567788 (current_time: 567792, time_diff: 4)
[02-22-2016 :: 15:57:58] [Error] HealRotation::m_next_poke_time_ms = 568042 (current_time: 567792, time_diff: -250)
[02-22-2016 :: 15:57:58] [Error] HealRotation::m_fast_heals = false
[02-22-2016 :: 15:57:58] [Error] HealRotation::m_adaptive_targeting = true
[02-22-2016 :: 15:57:58] [Error] HealRotation::m_casting_override = true
[02-22-2016 :: 15:57:58] [Error] HealRotation::m_casting_target_poke = true
[02-22-2016 :: 15:57:58] [Error] HealRotation::m_active_heal_target = true
[02-22-2016 :: 15:57:58] [Error] HealRotation::m_is_active = true
[02-22-2016 :: 15:57:58] [Error] HealRotation::m_member_list.size() = 3
[02-22-2016 :: 15:57:58] [Error] HealRotation::m_cycle_list.size() = 1
[02-22-2016 :: 15:57:58] [Error] HealRotation::m_target_list.size() = 6
[02-22-2016 :: 15:57:58] [Error] (std::shared_ptr<HealRotation>::use_count() = 9
[02-22-2016 :: 15:57:58] [Error] HealRotation Members:
[02-22-2016 :: 15:57:58] [Error] (1) Druidbot (hrcast: F)
[02-22-2016 :: 15:57:58] [Error] (2) Clericbot (hrcast: T)
[02-22-2016 :: 15:57:58] [Error] (3) Shamanbot (hrcast: F)
[02-22-2016 :: 15:57:58] [Error] HealRotation Cycle:
[02-22-2016 :: 15:57:58] [Error] (1) Shamanbot
[02-22-2016 :: 15:57:58] [Error] HealRotation Targets: (sort type: 101)
[02-22-2016 :: 15:57:58] [Error] (1) Druidbot (hp: 4.2%, at: 2, dontheal: F, crit(base): T(T), safe(base): F(F), hcnt(ext): 1(1), hfreq(ext): 0.332889(0.015872))
[02-22-2016 :: 15:57:58] [Error] (2) Shamanbot (hp: 70.8%, at: 3, dontheal: F, crit(base): F(F), safe(base): F(F), hcnt(ext): 2(2), hfreq(ext): 0.221852(0.028979))
[02-22-2016 :: 15:57:58] [Error] (3) Wizardbot (hp: 97.2%, at: 1, dontheal: F, crit(base): F(F), safe(base): T(T), hcnt(ext): 3(3), hfreq(ext): 0.198124(0.039924))
[02-22-2016 :: 15:57:58] [Error] (4) Clericbot (hp: 30.8%, at: 4, dontheal: F, crit(base): F(F), safe(base): F(F), hcnt(ext): 1(1), hfreq(ext): 0.166528(0.015150))
[02-22-2016 :: 15:57:58] [Error] (5) Testbotb (hp: 2.4%, at: 3, dontheal: F, crit(base): T(T), safe(base): F(F), hcnt(ext): 0(0), hfreq(ext): 0.016667(0.008333))
[02-22-2016 :: 15:57:58] [Error] (6) Aluna (hp: 1.3%, at: 2, dontheal: F, crit(base): T(T), safe(base): F(F), hcnt(ext): 0(0), hfreq(ext): 0.016667(0.008333))
[02-22-2016 :: 15:57:58] [Error] Bot::AI_Process() - Casting succeeded (m: Shamanbot, t: Druidbot) : AdvHR(true)


'sort_type: 101' resolves to Highest Heal Frequency (0.332889Hz for Druidbot in this case)

Cursian
03-05-2016, 05:53 AM
This is pretty awesome

Uleat
03-05-2016, 02:17 PM
This is still actively being worked on.

I had to go back and fix inadequate sorting predicates in three systems..but, they appear to be working much better (more accurately) now.

wirepuller134
03-05-2016, 04:06 PM
Another voice of appreciation for this being worked on. Thank you.

Cursian
03-05-2016, 04:42 PM
Hey Uleat,

I just wanted to say, I also think being able to invite a bot group leader to a raid would be pretty sweet.

Im a database / networking engineer. I have dabbled with server/client applications before in python. I have never really delved into C++ before but I am starting to think I should. Would you mind pointing me to the files that handle raid code?

If you ever need anything from my area of expertise let me know.

Thank you for your epic amount of time on this project.

Uleat
03-06-2016, 04:04 PM
I haven't looked at the raid code enough to know what to tell you...

I thought that some people had said that inviting a bot owner into a raid works..but, I haven't tested that myself.

I may delve into that at some point..but, not before the new command system, and likely inventory system, are up-to-speed.


I'm down to just a few commands that need to be coded..then I need to finish up on the command spell discriminator and sorting criteria.

(Sorting criteria dictates what spell is available to cast at a given level based on given circumstances and options. My sorting predicates work much better now..but,
that doesn't mean that their casting priority is optimal.)

Uleat
03-07-2016, 08:53 PM
Latest and greatest uploaded to git..hopefully, down to the last few command codings and some run-throughs on alpha testing.

Cursian
03-08-2016, 01:34 AM
Awesome I will definitely check it out, thanks Uleat.

ionhsmith
03-09-2016, 10:31 PM
Very nice ill test it out if you need people to test

Uleat
03-16-2016, 09:36 PM
One of the features in this new command system is a collection of functions contained within the namespace ActionableBots.

This is basically a 'filtering' system that takes command line arguments and returns a list of appropriate bots.

Currently, the list contains the following filters:

enum ABType {
ABT_None = 0,
ABT_Target,
ABT_ByName,
ABT_OwnerGroup,
ABT_BotGroup,
ABT_TargetGroup,
ABT_NamesGroup,
ABT_HealRotation,
ABT_HealRotationMembers,
ABT_HealRotationTargets,
ABT_Spawned,
ABT_All
};



Not all commands use these filters..nor do those using them allow the use of all filters.

But, it does provide a somewhat standardized approach and facilitates changes rather well.


One of the cases where this approach is really nice is in '^follow'

Any of the allowed filters can be made to follow a single target.

In particular, a single bot 'byname' can be made to follow another bot in the same group. This eliminates 'bot clumping' while traveling.

(This particular command also has a 'reset' option that will return 'selected' bots to their default follow assignments.)

Kingly_Krab
03-17-2016, 10:04 AM
That's actually really cool, it's a rather advanced way of doing it, but at the same time it's simplistic if you know how enumerators work. Good work Uleat, can't wait to see all your work make its way to the main branch.

Uleat
03-22-2016, 05:11 PM
Does anyone know if there was an issue with the old command #bot pull?

I'm using the exact same calling method and can't seem to agro anything.


EDIT: I found it..surprised this ever did work...


SendItemAnimation(other, Ammo, SkillArchery);
DoArcheryAttackDmg(GetTarget(), rangedItem, ammoItem);

'other' is the mob passed to do the attack on...

But, when doing the actual damage, GetTarget() is called - which is nullptr...


Duh!

Uleat
03-24-2016, 09:44 PM
Link to the broken news release (It poofed off of the home page...)

http://www.eqemulator.org/forums/showpost.php?p=247901&postcount=1


There are somes feature that I left 'active' .. but, crippled, until I can get into the actual bot code and find the cause of their failures.


I will eventually get around to creating a wiki page to help decipher what all of the functions do - so that people may create their own commands.

ionhsmith
03-25-2016, 10:22 PM
Uleat the bot pull never worked for me

ionhsmith
03-25-2016, 10:36 PM
Testing out some of these new commands .... ^follow does not work... set my bot to guard and now I cant get him to follow me again

Uleat
03-25-2016, 10:56 PM
How are you using the command?

https://github.com/EQEmu/Server/blob/master/zone/bot_command.cpp#L2948


^follow reset spawned
should restore all spawned bots to their default state.

^follow byname x
will cause the bot named 'x' to follow a selected friendly target.

^follow ownergroup
will cause all bots in the owner's group (that belong to the owner) to follow a selected target.


I should note that any <target> or (<target>) preceding a command indicates a selected target. (Parenthesis indicate optional and usually return the owner as the target, if one is not selected.)

ionhsmith
03-25-2016, 11:04 PM
I was just typing ^follow and clicking on my self to see f it worked. Didn't know u have to type in other things. Where can I find that information as the old system it was built into the #bot help

Uleat
03-25-2016, 11:14 PM
^help
or
^?
will show all commands (and aliases.)

At the bottom of that list is a help statement:
https://github.com/EQEmu/Server/blob/master/zone/bot_command.cpp#L3116


So, typing:
^follow help
or
^follow usage
will give you the help for that particular command.


Some commands are just subcommand lists..such as:
^appearance


You can also use help to find partial command names:
^help bot
will return all commands with 'bot' in their name.


Alias works here too:
^alias appearance
should return:

^app
^appearance
^botappearance



I really need to write-up the wiki page for this information.


EDIT:

There were a lot of 'extra' commands for different situations..like #bot follow and #bot botgroup follow..that I just expanded for a single command.

Using the argument system provides a much more robust means of expanding bot control without adding tons of duplicated commands.

ionhsmith
03-26-2016, 12:45 PM
so ^follow works on some and on others it doesn't. I have it working on some of my characters but on other I have ^follow byname Sarche .... and it says you must target a friendly mob to use this command ... I have myself targeted.

Uleat
03-26-2016, 02:51 PM
There may be a faction-based issue that I overlooked (missed) in the Client::IsAttackAllowed() function.


Can you post the race/class of both the character and at least one of the affected bots?

ionhsmith
03-26-2016, 06:41 PM
it is drakkin ranger character with iksar shaman bot

Uleat
03-26-2016, 07:40 PM
Looks to be a more localized issue.

Clearing your target selection should work as a temporary fix (for following you) until I can get it sorted out.


Thanks for posting this :)

ionhsmith
03-26-2016, 07:59 PM
Anytime ... ill keep testing. Looking good though

Uleat
03-26-2016, 08:12 PM
Ok, that issue is fixed.

I'll have to review the code to see where else that may be an issue, though.

Uleat
03-26-2016, 09:05 PM
Huppy, if you're still reading the forums..


Look at the function 'bot_subcommand_pet_remove' to see what can be changed to eliminate casters from summoning pets.

https://github.com/EQEmu/Server/blob/master/zone/bot_command.cpp#L6975


Setting Bot::SetBotCharmer(true) disables the ai process of casting a summoned pet.

This could be modified in the bot constructor/load to eliminate summoned bot pets.

ionhsmith
03-29-2016, 10:07 PM
OK found another issue ... guard doesn't work properly. If u have a bot on passive and guard when you attack something it still comes running. It did not use to do that.

Uleat
03-29-2016, 10:19 PM
I'll take a look at what I changed surrounding that code..pretty sure it was a straight interpretation - thanks :)

Warkral
04-02-2016, 01:44 PM
I've been lurking around this thread and want to say that my wife and I use bots exclusively and THANK YOU for doing this extra work with them. Without the bots we couldn't run and play our own server. Your work is being noticed.

ionhsmith
04-04-2016, 09:16 PM
^attack does not work either

Uleat
04-04-2016, 10:33 PM
Do you have any more information on the case of not working?


All of these commands passed alpha testing..but, there may be cases of 'special' circumstances, which may not have been accounted for.


EDIT: I should ask, specifically, what message do you receive after using ^attack?

starblight
04-04-2016, 11:21 PM
I just updated my source last night and found "^attack" by it self did not do anything but "^attack all" worked. I am starting to get how the commands work but I sadly did not find them intuitive. I did find the command list (http://wiki.eqemulator.org/p?Bot_Commands&frm=Main) and that helped a lot. I also used the help option a lot but found the help to be almost more confusing.

Anyways I will keep working at it and I am sure I will get a better understanding of how they work.

(edit) My god I read over my post and realized how negative it was. So to be more even with my remarks. I have only had one day to play with them so I am sure I will find more things good to say later but for now I love how a lot of the commands are much shorter then before. I also love how a lot of the command augments are the same for multiple commands. like "all" for example. I have also not tried a lot of the commands that I think I am going to love once I do.

Uleat
04-05-2016, 05:56 PM
Hehe! No harm, no foul :)


Yes, the new bot command system is completely different.

It's like speaking English for 20 years, then being expected to speak Russian the next day..with the instructions written in Chinese...


The key to the new system is 'Actionable Bots' .. a sub-system that determines what bots are queued for processing in any action.

A command where [actionable: target] is allowed, then ^command will work, defaulting to the client's target - if the target is of the proper type.

usage: <enemy_target> ^attack [actionable: byname | ownergroup | botgroup | namesgroup | healrotation | spawned] ([actionable_name])
But, in the case of ^attack, target is not allowed and an argument(s) must be passed.

Another indicator that an argument is required is the lack of '( )' surrounding the argument list.


Make sure that you check out the updated wiki page as well: http://wiki.eqemulator.org/p?Bot_Commands&frm=Main

ionhsmith
04-05-2016, 06:47 PM
Uleat it says ... this command does not allow Actionablebot criteria target

Uleat
04-05-2016, 07:02 PM
Yes, that is missing the 'actionable' argument.


If you want all of your spawned bots to attack your target, use the ^attacked spawned invocation.

Or, maybe ^attack ownergroup for only the bots in your group.

AsmoTiC
04-06-2016, 09:34 AM
Uleat -

First, really fantastic work with the bots as of late. I've personally noticed huge improvements with them since the rework. Thanks you!

Thought i'd post a quick request and see if it was reasonable, or require to much coding. Would it be possible to save a healrotation group/settings once it's been setup. That way you could just do a ^healrotationload?

As it is now I generally:
^botgroupload <cleric group>
^healrotationcreate <leader>
^healrotationaddmember <member> (x4 times)
^healrotationaddtarget <tank>
^healrotationchangeinterval <time>
^healrotationstart <leader> (just to make sure it's running).

I've gotten pretty fast with setting it up, but it's still alot of typing, or multiple social buttons since all that doesn't fit in one. Figured it would be nice if we could do a ^healrotationsave <name> and ^healrotationload <name> similar to how groups are done.

In additional, I would have liked ^healrotationstart <leader> to actually get the rotation going. Perhaps have healrotationstart have them actually start healing regardless of the tanks status. Then healrotationstop <leader> would work like it does now and stop it, then maybe have a new one "healrotationauto <leader> for example that gets it running like it does currently. Just an extra suggestion since I was already going on about the healing rotation.

Thanks again, very excellent work!

Uleat
04-06-2016, 03:24 PM
I'm still mulling over how to load/save heal rotations..it wasn't something that I intentionally left out.

For the interim, try these:
^bgload <cleric group>
^hrcreate <leader>
^hraddmr <member> (x4 times)
^hraddt <tank>
^hrinterval <time>
^hrstart <leader> (just to make sure it's running).

You can use ^alias command to see if any aliases are available for that particular command..or look to see what aliases are registered for a command in the `aliases`
field of the `bot_command_settings` table in the database.


I'm pretty sure that the heal rotation turns active as soon as you add a member - the first member being the bot who created the hr:
https://github.com/EQEmu/Server/blob/master/zone/heal_rotation.cpp#L92
https://github.com/EQEmu/Server/blob/master/zone/heal_rotation.cpp#L507
https://github.com/EQEmu/Server/blob/master/zone/heal_rotation.cpp#L526

The current state can be verified by using the ^hrlist command.

You can stop the hr..but, it will start again if you add/remove a healer member while it is inactive.
(If this is too 'streamlined' .. I can modify that behavior.)


The way the system checks for a 'valid' heal target is to sort the target list by a series of criteria.

Each set of checks will either set 'm_active_heal_target' to true or false. A final 'false' will only be applied if no criteria are met.

That target state (and target, if state is 'true') will remain active for 250ms. So, even with a 1-second interval on the hr, the target will be checked,
and possibly updated, 3-4 times.


If you don't mind experimenting, you could try something like this on your hr:
^hrinterval 2 (or 1)
^hrsafe 0 100 EDIT: The maximum allowed value is hard-coded to '95.0'
^hrcrit 0 50 (or higher)

For non-adaptive healing, the types are prioritized as follows: main tanks, healers, everyone


With the new system, heal rotations are definitely reactive as opposed to proactive.

There are a lot of options to experiment with.

I'll consider implementing a proactive option, though, I'd like to hear how changing those options perform.


My only problem with testing is that I can only test the functionality of the code..not the real-world application of it..so, feedback is the key to
improvements :)

AsmoTiC
04-06-2016, 07:19 PM
wow, thanks for all the information!

The alias works great, will need to get used to them like I have with the full command, but they will certainly help until a load/save option comes available (if it's possible).

Went ahead and tested the HR. Using a 65 Ogre Warrior (6100hp 1400ac) running Defensive Disc against Derakor the Vindicator (Red con). HR was 5 Clerics, all 65. No restrictions on spells.

Heal Rotation Settings:
Current stat: active
Casting interval: 2 seconds
Fast Heals: off
Adaptive targeting: off
Casting override: off
Base hp limits - Crit: 10%, Safe: 95%
Cloth hp limits - Crit: 30%, Safe: 95%
Leather hp limits - Crit: 25%, Safe: 90%
Chain hp limits - Crit: 15%, Safe: 80%
Plate hp limits - Crit: 10%, Safe: 75%
Heal Rotataion Members:
(1) CLR1
(2) CLR2
(3) CLR3
(4) CLR4
(5) CLR5
Heal Rotataion Targets:
(1) WAR

This results in my death before the first CH lands. The first 4 CH's get started, but i'm dead before the 5th and final one starts (giving you a time frame from start to finish). Now if I have a boxed cleric put a Hot on me, and land a Fast heal on me, the rotation works great keeping me up for the remainder of the fight. This is why I was hoping for a proactive start to the rotation, so I wouldn't have to wait the full 10+ seconds before the first heal lands from the hr group.

Testing out your ^hrsafe and ^hrcrit, same values (95% locked as you said, and 50% adjusted), Made sure the percents were for both Base and Plate. Result was the same as above; first 4 CH's get started, but none land.

Did try one more thing. Added a Bot Shaman to the Warriors group, outside of the HR. This adjusted the stats a little (6640hp, 1425ac). With the spotheal from the Bot Shaman, it bought enough time for the rotation to start running cleanly.

Anyway, i'm happy to test a bunch of different scenarios for you, just let me know. Thanks again for taking a look at my earlier suggestion and for your detailed response.

Uleat
04-06-2016, 10:15 PM
With the way that main tanks now work (each hr target is checked against being main tank of its own group..not against the hr,) would it be feasible to select a main-main
tank for the hr itself?

I could implement the hr-main tank as being the trigger itself..if set, then proactive healing occurs - but, that tank must be a member of the hr already..

..or something like that?


So, having the hr-main tank (target) set would enable proactive healing and clear would enable reactive?


I'm taking your encounter scenario home to see if I can replicate it..do you have a list of other bot classes that were used in this encounter?

AsmoTiC
04-07-2016, 08:17 AM
... I'm taking your encounter scenario home to see if I can replicate it..do you have a list of other bot classes that were used in this encounter?

I was just running a test to help give some information on how the HR was performing. For the test it was the Warrior groupless, with the HR group (Brd + Clr x5). Only the 5x Clerics are part of the HR (as shown in my earlier post of the ^hrlist), with the War as the only HR target.

In addition I did run that last test with a Shaman bot grouped with the Warrior, same HR group of course.

One quick note, which may or may not be important. I haven't been selecting the Warrior as "Maintank" via the group window. No reason I couldn't, just haven't been. If that's causing a problem, let me know. If there is something in the code that checks for someone to be flagged as Maintank, I'll run another couple tests for you this evening when I get home from the office.

Alternativly, your suggestion of having the first HR target activate Proactive healing would work great. Then having it work as it does now when no target has been defined. Or, perhaps leave the targeting alone and allow the Safe range to be set at 100%, which would get them started healing even at full life. Setting that above 95% might cause other problems though, if the HR group tries to heal people outside the assigned target.

Anyway, let me know how I can help. Happy to run through some iterations with you.

Uleat
04-07-2016, 03:58 PM
Thanks for the feedback on this, btw!


Yeah, no..if your tank was the only target, he should have been picked up on the 'everyone' check. So, it's probably the delay in casting, like you said,
with a bit of safe-value influence.

An all cleric healing rotation was something that I didn't test. I just used the bots that I had on-hand.


On percentages, I probably won't change their defaults..but, I can bump the max up to 100% - which will probably be needed for a proactive target anyway.

Note on percentages:
- Non-adaptive healing will use the 'base' ('0') armor type for safe-crit determinations explicitly.
- Adaptive healing will check the target's armor type and use the current value for safe-crit determinations ('base' becomes the absolute min-max in this case.)


I'm working on some convergence coding for another system atm..but, it's a quick thing and I'll work on this change as soon as I finish.

Uleat
04-07-2016, 11:00 PM
I am having a little issue getting the current code to trigger..meaning, it not heal rotation code-related.

I'll dig deeper into the actual bot healing code and see if there's an issue there.


EDIT: Uleat..err, user error... Bots must be grouped before their AI's kick in :P

Uleat
04-08-2016, 09:11 PM
Heal Rotations now have a HOT for proactive healing and some limited load/save/delete capabilities.


[For HOTs]
Select your HOT from the current hr target pool and the cycle will begin automatically.

Clear your HOT and the system reverts to its previous state.


[For load/save/delete]
Use ^hrcreate on a bot that has a saved hr profile and it will be automatically loaded from the database.

A query failure, or use on a non-profiled bot, will default to the standard hr create process.

Non-local (not in zone) members and targets will be reported during load processing.


I could not do an auto-load feature due to the way that groups are currently handled currently. That will take a rework of that system.

AsmoTiC
04-09-2016, 10:45 AM
right on, that's awesome, thanks Uleat!

Managed to get the code updated and recompiled, updated the database, and got underway. Couple quick notes before the first pull.

^bglist reports my two groups:
(1)Bot-group name: Clerics|Leader: <bard>
(2)Bot-group name: Rogues|Leader: <shaman>

I have no trouble ^bgload Clerics, however after the update the Rogues won't come out as a group. ^bgload Rogues returns "Failed to load bot-group id for load bot-group for 'Rogues'". This is different than if I tried to load a group I don't have. ^bgload Enchanters, for example, returns "Bot-group Enchanters does not exist".

In addition, if I try to start a new group (^bgcreate Temp) the shaman reports "... is already the current leader of a bot-group", and the rogues report "... is already a current member of a bot-group". If I try (^bgremove) each of them report "... is not a current member of a group.

I assume something got goofed in the DB or something.

The HoT stuff works great for getting the rotation started. However I noticed they don't keep the loop running. Each Cleric in turn casts Complete Heal, however Cleric 1 doesn't start a new CH until after Cleric 5's CH lands. So there is a 10sec gap in heals. The first cleric just needs to start her next Complete Heal at the set interval after the last cleric starts to cast hers. Would be a perfect CH rotataion at that point!

I have good backups from right before I dropped the new compile and DB update. Let me know if you have any thoughts about the broken Rogue group (bot group 2 for me), or anythink you wanted to try on the rotation.

Uleat
04-10-2016, 02:41 PM
I don't 'think' that I changed any of the command/database code for bot-groups in the HR save/HOT code.

If it's truly a bug, then it's probably pre-existing.


Double-check the actual name of the bot-group to see if its all lower, per chance. I did some work with the bot loading code in regard to capitalization..but, I know
that bot-groups will not load 'Rogues' if the case doesn't match 'rogues.'

Also, you can double-check by camping them all out and trying again. (If all else fails, run a query to verify the name of the bot-group.)
SELECT `group_name` FROM `bot_groups`


The database code is basically set up to 'fail' an action if the criteria is absent (or out of range,) or if there is an actual query error.

Since the logging system will (generally) pass on a failed query to the client, a lack of one accompanying the fail message usually indicates a criteria problem.


I'll wait until I hear back from you before I start looking into the code..but, I will if it definitely turns out to be a bug.

-----

I'm not 100% sure of the differences between fast heal and non-fast heal code..that is built into the bot class itself and is one of the things that I haven't really touched yet.

I do believe there are two distinct paths for choosing spells, however.


Heal rotation code is not tied to any of the actual spell casting code..it is not used to determine when a healer should cast.


Since the hot bypasses all 'standard' heal rotation criteria, there's really only two things that should keep a healer from casting:

- Not enough mana ..or..
- Target's 'DontHealMeBefore' time

Assuming enough mana, it's possible to have another cleric's spell land and the next caster(s) be processed during this 'cool off' period.

That could 'skip' all casters for the remainder of the cycle..and depending on the length of your interval...


I'll set up a 5-cleric group and see if I can pinpoint exactly what's going on..and make adjustments, if necessary.


EDIT:

Ran a 5-cleric bg with a bard and setup the hr for the 5 clerics as members and me as the target - as a level 65...

There is something going on with non-fast heals healing..but, there is something even bigger for 'fast heals'


I ran the HOT cycle for 4 minutes with fh off..then started to run an fh on cycle for the same to compare.

There were no reports of any healing with fast heals on..which, most likely, means that there are no bot healing spells available in that range.


Others have reported issues with bot (merc) healers at these higher levels..so, the above observation may not be conclusive.


I will do a spell casting log dump and see why the non-fast heal spells are not finishing..but..it will most likely involve the bot spell casting code and not
the actual heal rotation code.


EDIT2:

Unfortunately, some spell casting failures are not reported in the logs.


What I did see was the all of the fast heal casts were failures and all of the non-fast heal were successes.

Since the heal rotation code only invokes the spell casting and does not process it, the apparent 'failure' should actually be in the 'finish spell' code and not the invocation of
the spell itself.


I may add some debugging code to help trace the issue. Would be nice to know if this is the same problem that others have reported with 'normal' casting.

AsmoTiC
04-11-2016, 07:33 PM
I don't 'think' that I changed any of the command/database code for bot-groups in the HR save/HOT code.

If it's truly a bug, then it's probably pre-existing.


Double-check the actual name of the bot-group to see if its all lower, per chance. I did some work with the bot loading code in regard to capitalization..but, I know
that bot-groups will not load 'Rogues' if the case doesn't match 'rogues.'

Also, you can double-check by camping them all out and trying again. (If all else fails, run a query to verify the name of the bot-group.)
SELECT `group_name` FROM `bot_groups`


The database code is basically set up to 'fail' an action if the criteria is absent (or out of range,) or if there is an actual query error.

Since the logging system will (generally) pass on a failed query to the client, a lack of one accompanying the fail message usually indicates a criteria problem.


I'll wait until I hear back from you before I start looking into the code..but, I will if it definitely turns out to be a bug.

Sorry it's taken this long to get back to you. Pulled the Git from a couple hours ago, and made new binaries, these include the changes you did to Spell AI code.

So, same problems with the Rogues (my second group). Database looks good, bot_groups has two entries:
groups_index 1, group_leader_id 15, group_name Clerics. Leader ID checks for the Bard
groups_index 2, group_leader_id 1, group_name Rogues. Leader ID checks for the Shaman.
In addition, I checked bot_data and bot_group_members and they check against each other (i.e. groups_index checks for bot_id)

I won't repost all the messages, but they report the same as my earlier post. I did try ^bgdelete Rogues, which I don't think I tried last time. This returns "Could not locate group id for 'Rogues'.

I'm pretty sure I can restore my back up, delete the rogues, and recreate them without a problem. Haven't does it yet, as I wanted to keep a state where they were broken incase you wanted to try anything else. Also, if it is a bug somewhere, it could affect others without the means of restoring to an earlier backup.

----
In regards to HR. I went ahead and ran several cycles through the log so I could get timestamps. Here is a start of the rotation showing the 5x casts 2sec apart, then the gap between last CH landing and next cycle starting. Also, I saw at 17:08:03 Bonnet (Cleric4) cast a spell I couldn't identify, right after her CH landed.

Note: Meat is the Warrior, Bubbles, Blossom, Buttercup, Bonnet & Bunny are the Clerics

[17:07:06] Logging to 'eqlog.txt' is now *ON*.
[17:07:16] You say, '^hrlist Bubbles'
[17:07:16] Heal Rotation Settings:
[17:07:16] Current state: active
[17:07:16] Casting interval: 2 seconds
[17:07:16] Fast heals: 'off'
[17:07:16] Adaptive targeting: 'off'
[17:07:16] Casting override: 'off'
[17:07:16] HOT state: inactive
[17:07:16] HOT target: null
[17:07:16] Base hp limits - critical: 65.0%, safe: 95.0%
[17:07:16] Cloth hp limits - critical: 45.0%, safe: 95.0%
[17:07:16] Leather hp limits - critical: 40.0%, safe: 90.0%
[17:07:16] Chain hp limits - critical: 35.0%, safe: 80.0%
[17:07:16] Plate hp limits - critical: 30.0%, safe: 75.0%
[17:07:16] Heal Rotation Members:
[17:07:16] (1) Bubbles
[17:07:16] (2) Blossom
[17:07:16] (3) Buttercup
[17:07:16] (4) Bonnet
[17:07:16] (5) Bunny
[17:07:16] Heal Rotation Targets:
[17:07:16] (1) Meat
[17:07:28] You say, '^hrsethot Meat'
[17:07:29] Succeeded in setting Meat as the HOT in Bubbles's Heal Rotation
[17:07:29] Bubbles begins to cast a spell.
[17:07:29] Bubbles says 'Casting Complete Heal on Meat, please stay in range!'
[17:07:31] Blossom begins to cast a spell.
[17:07:31] Blossom says 'Casting Complete Heal on Meat, please stay in range!'
[17:07:33] Buttercup begins to cast a spell.
[17:07:33] Buttercup says 'Casting Complete Heal on Meat, please stay in range!'
[17:07:35] Bonnet begins to cast a spell.
[17:07:35] Bonnet says 'Casting Complete Heal on Meat, please stay in range!'
[17:07:37] Bunny begins to cast a spell.
[17:07:37] Bunny says 'Casting Complete Heal on Meat, please stay in range!'
[17:07:39] You are completely healed.
[17:07:41] Blossom performs an exceptional heal! (15000)
[17:07:41] You are completely healed.
[17:07:43] Buttercup performs an exceptional heal! (15000)
[17:07:43] You are completely healed.
[17:07:45] Bonnet performs an exceptional heal! (15000)
[17:07:45] You are completely healed.
[17:07:47] You are completely healed.
[17:07:47] Bubbles begins to cast a spell.
[17:07:47] Bubbles says 'Casting Complete Heal on Meat, please stay in range!'
[17:07:49] Blossom begins to cast a spell.
[17:07:49] Blossom says 'Casting Complete Heal on Meat, please stay in range!'
[17:07:51] Buttercup begins to cast a spell.
[17:07:51] Buttercup says 'Casting Complete Heal on Meat, please stay in range!'
[17:07:53] Bonnet begins to cast a spell.
[17:07:53] Bonnet says 'Casting Complete Heal on Meat, please stay in range!'
[17:07:55] Bunny begins to cast a spell.
[17:07:55] Bunny says 'Casting Complete Heal on Meat, please stay in range!'
[17:07:57] Bubbles performs an exceptional heal! (15000)
[17:07:57] You are completely healed.
[17:07:59] You are completely healed.
[17:08:01] Buttercup performs an exceptional heal! (15000)
[17:08:01] You are completely healed.
[17:08:03] Bonnet performs an exceptional heal! (15000)
[17:08:03] You are completely healed.
[17:08:03] Bonnet begins to cast a spell.
[17:08:05] You are completely healed.
[17:08:05] Bubbles begins to cast a spell.
[17:08:05] Bubbles says 'Casting Complete Heal on Meat, please stay in range!'
[17:08:07] Blossom begins to cast a spell.
[17:08:07] Blossom says 'Casting Complete Heal on Meat, please stay in range!'
[17:08:09] Buttercup begins to cast a spell.
[17:08:09] Buttercup says 'Casting Complete Heal on Meat, please stay in range!'
[17:08:11] Bonnet begins to cast a spell.
[17:08:11] Bonnet says 'Casting Complete Heal on Meat, please stay in range!'
[17:08:13] Bunny begins to cast a spell.
[17:08:13] Bunny says 'Casting Complete Heal on Meat, please stay in range!'
[17:08:15] You are completely healed.
[17:08:17] Blossom performs an exceptional heal! (15000)
[17:08:17] You are completely healed.
[17:08:19] You are completely healed.
[17:08:21] Bonnet performs an exceptional heal! (15000)
[17:08:21] You are completely healed.
[17:08:22] You say, '^hrclearhot Bubbles'
[17:08:22] Succeeded in clearing Bubbles's Heal Rotation HOT
[17:08:23] You are completely healed.
[17:08:34] You say, '^camp spawned'

*footnote* I cleaned up the log a tad to strip bard song, and get a clean time instead of Month, Day, Year, etc.

Uleat
04-11-2016, 11:00 PM
Pretty sure I borked up the BotDatabase::LoadBotGroupIDForLoadBotGroup() function by placing a 'LIMIT 1' in the query...

I'm pushing a fix for that and I'll review the queries to make sure that I didn't put in 'limits' that shouldn't be there.


Still looking at the timing issue..

Uleat
04-13-2016, 07:32 PM
I 'think' I fixed this particular timing issue.


If anyone is still having issues, try bumping your interval up 1 second at a time for several increases and see if the issue resolves itself.

If this corrects the issue, post back with your heal rotation member classes, toon level, and any other information you think might be pertinent.

AsmoTiC
04-13-2016, 09:19 PM
Oh yea, that's working really well now Uleat!

Much, Much better, thanks for all the hard work you put into looking into this rotation code!

I'm sure you know all my information by now, but for the record.
Level 65 HR group, Bard Leader, 5x Clerics, 2sec interval.

Uleat
04-13-2016, 10:11 PM
Np - feedback and persistence :)

jpyou127
04-14-2016, 09:13 AM
Sweet stuff here Uleat!!


Celestial

cannon
05-17-2016, 12:21 AM
I got a server up and running and tried bot help and had a bunch of commands atleast 30 or so that i can remember maybe more, i sourced in a couple bot files and now my commands are 17 commands, how do i get the commands back or do i have to source in the commands. sorry for the noobish question. thanks in advance for any input on this.

Think i figured it out, just changed db version in database and reran the world exe and did the updates.

jaspen
05-17-2016, 09:40 AM
I am checking to see if a particular command is currently working. I have tried ^botdyearmor and it does nothing but completely bug bots. I have to log out and back in to correct it. I have tried different slots and RGB values, all with the same results. I do have the latest files that I could find. I also tried changing the colors in their inventory section in the database and that didn't do anything.

So, in short, is this feature currently implemented and functioning?

Also, just for flavor I looked that bots_data and noticed there was a size column . I changed the size numbers for multiple bots. Upon summoning them it doesn't appear to make a difference. Obviously, this is me editing things behind the scenes and I didn't expect it to work but I would be interested in hearing your opinion on this.

jaspen
05-17-2016, 09:41 AM
I got a server up and running and tried bot help and had a bunch of commands atleast 30 or so that i can remember maybe more, i sourced in a couple bot files and now my commands are 17 commands, how do i get the commands back or do i have to source in the commands. sorry for the noobish question. thanks in advance for any input on this.

Think i figured it out, just changed db version in database and reran the world exe and did the updates.

Are you using ^help to get your command list? That pulls up 198 commands for me.

Uleat
05-17-2016, 07:20 PM
There is an issue with the bot dye armor command - pre- and post-command system rework.

That's going to take more than a few hours work to figure out what is wrong with the update methodology..so, I left it to a future rework of the class.


The command code works, obviously.

But..the update system, which is not part of the actual bot command system, does not update correctly.

DanCanDo
05-19-2016, 09:18 PM
Yes, the new bot command system is completely different.

It's like speaking English for 20 years, then being expected to speak Russian the next day..with the instructions written in Chinese...


I've spawned a few groups of bots just to check it all out, but when ^help
spawned 198 commands to learn, my first thought was to book holidays and
run to the beer store (chuckle).
I can't imagine what public server admins can go through with players typing
that in and the admins getting flooded with support questions ?
I never played much with the commands, I'm more of a "spawn a merc, follow
me around and just heal" type, so I haven't dug in to all that heal rotation stuff
yet. Not sure if I ever will, as a player. (chuckle)

Uleat
05-19-2016, 10:36 PM
There's a lot of bot commands..as well, there are a lot of system commands.


I wrote the implementation of the current alias system for both to help control what is a registered alias and what is an actual registered and coded command.

I could look into adding something to both command systems to discriminate aliases from the command listing (..but, not in the near future.)


Quick ref for current bot commands: http://wiki.eqemulator.org/p?Bot_Commands&frm=Main#bot-command-list


EDIT:

I'm not 100% certain..but, I don't believe that the spell list for the bot spell ai has been updated since the lvl 85 cap - and possibly the lvl 65 cap.

One thing with the new heal rotation code is that it pulls spells from the current load and should have access to the newest spells.

DanCanDo
05-20-2016, 04:18 AM
One thing with the new heal rotation code is that it pulls spells from the current load and should have access to the newest spells.

I am looking forward to poking around in the bot spell system, which I haven't
done yet. If a healer bot can be setup to be (kind of) like a player cleric, that
would be awesome.
Right now, I am struggling with something odd with the eqemu_update for bots.
I created a new (but seperate) server/database. source was just pulled and
compiled yesterday with bots enabled. I sourced in a fresh copy of the peq, but
when I run (4) on the updates for bots, I get all sorts of errors and the only
table it loads is the bot_command_settings. I tried using the load_bots sql
but it is quite outdated.
What i ended up doing, was a backup sqldump of all the bot tables in my first
db, then put it all together in to one sql. Sourcing that in ran smooth. All the
bot tables went in successfully, including the healrotation tables which was
one of the biggest errors showing up in the update script.
I ran the update again, it came up with no errors and no updates. But I still
can't seem to get the views and (getmob) function at all from the update.

cannon
05-20-2016, 09:23 AM
Are you using ^help to get your command list? That pulls up 198 commands for me.

That may have been my fault, I think i did #bot help instead of ^

Still getting use to the ^, so use to using # Thanks.

Uleat
05-20-2016, 07:01 PM
#bot help is synonymous with ^help due to the redirect I added.


DanCanDo, you may have to manually apply the updates for now, until someone can figure out the best way to implement the bots versioner.

DanCanDo
05-20-2016, 07:25 PM
I have 3 different sql files put together (bot_tables, bot_views, bot functions) in a zip
file, in case anyone else needs to use them to source it all in. Works pretty good, and
includes the healrotations in the bot_command_settings as well.
I ran the updates after sourcing them in, no errors, no updates found and didn't get any
mysql errors in my gm client console.

https://drive.google.com/file/d/0B8u688PxN7t1QW5GUzU5b2F5NEk/view?usp=sharing

Uleat
05-20-2016, 08:22 PM
I normally don't advocate the use of non-sanctioned files..but, the contents do look correct for this moment in time (- I have not personally tested them.)

Future schema changes may invalidate these files..so, be mindful and check their current status before use.

DanCanDo
05-20-2016, 08:34 PM
I agree totally Uleat, those files are only a temporary solution for the moment, in case
anyone needs a quick fix. I won't even think of them as "written in stone" on my own
computer, as things progress and advanced with development. Just something to help
anyone in an unexpected crisis. :)

AsmoTiC
05-30-2016, 10:47 AM
Uleat -

Bot have been working great for me. Buddy of mine and I have been using a bunch at a time without any trouble. For reference, it's 12 active clients with 24 bots running. In additional the new Healing Rotation improvements are pretty fantastic. Only problem, and it's pretty minor, is sometimes the HR clerics will decide they can nuke. Usually they do what they are supposed to though.

Now for my problem/question. Not sure exactly when it started, probably sometime after our back and forth with the HR code. I end up with the following MySQL Error whenever I summon a PC client. Only the GM sees the error, and it doesn't cause any problems other than flashing a the string of text in red for each client being summoned. Any thoughts?

[MySQL Error] 1146: Table 'peq.vw_groups' doesn't exist --- SELECT g.'mob_id' AS bot_id FROM 'vw_groups' AS g JOIN 'bot_data' AS b ON g.'mob_id' = b.'bot_id' AND g.'mob_type' = 'B' WHERE g.'group_id' = '9005'

Uleat
05-30-2016, 06:48 PM
The HR code supplements the bot spell ai code..so, it is possible for a HR member to be idle long enough for an ai-based spell to go off.

If a heal rotation member is ready to cast for a HR, and they are currently casting a spell, the override will cancel that spell and start processing the HR spell..but, it will
not explicitly keep them from casting ai-based spells. (Any non-HR recast timers can cause a member to miss their turn in a cycle, however...)


I'm not exactly sure where you are getting that mysql error.

The bot command only summons bots..which command are you using to summon clients?

AsmoTiC
05-30-2016, 06:54 PM
I'm not exactly sure where you are getting that mysql error.

The bot command only summons bots..which command are you using to summon clients?

I was noticing when I used #summon <player>. Payed more attention while I played today, and the same error pops up whenever they enter the zone with the GM. He's the only one that sees the error. So, for example, my Druid ported the whole group to Poknowledge, which is where my GM was sitting. When the loaded in, 6x of those messages popped up in red.

<shrugs>. Other than the message everything works, just thought i'd mention it.

Uleat
05-30-2016, 07:13 PM
That's not a bot command..but, I'll take a look at it :P


EDIT:

I traced the calls all the way down to where it leaves the server code and is parsed by scripts.

I did not see where that query would have been called...


You can check your database to ensure the the view `vw_groups`actually exists, though.

AsmoTiC
05-31-2016, 08:25 AM
You can check your database to ensure the the view `vw_groups`actually exists, though.

Bah, you are right. Somehow that view got dropped from the db. Ended up just sourcing it back in, which has stopped the error message.

Thanks for pointing me in the right location to get that fixed!