PDA

View Full Version : EQoffline, bots and more..


Pages : 1 2 3 [4]

hayward6
09-25-2008, 09:37 PM
Substitute EQBOTS for SPELL_EFFECT_SPAM in the instructions below and these will work for VS2005/2008 for windows compiles. If you are compiling on linux it's different.

Yeah, I'm running Linux

Flare83
09-25-2008, 09:49 PM
I'm trying to compile but i'm getting this error =*(


Generating Code...
Linking...
npc.obj : error LNK2019: unresolved external symbol "public: void __thiscall Mob::PET_Process(void)" (?PET_Process@Mob@@QAEXXZ) referenced in function "public: virtual bool __thiscall NPC::Process(void)" (?Process@NPC@@UAE_NXZ)
.\../Build/Zone.exe : fatal error LNK1120: 1 unresolved externals
Creating browse information file...
Microsoft Browse Information Maintenance Utility Version 8.00.50727
Copyright (C) Microsoft Corporation. All rights reserved.
Build log was saved at "file://e:\EQEmu\Build\Zone\Release\BuildLog.htm"
Zone - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Congdar
09-26-2008, 09:52 AM
I don't know the linux commands but the botai.cpp, botraids.cpp, botraids.h and petai.cpp need to be added to the project.

Andrew80k
09-26-2008, 10:32 AM
I'm trying to compile but i'm getting this error =*(


Generating Code...
Linking...
npc.obj : error LNK2019: unresolved external symbol "public: void __thiscall Mob::PET_Process(void)" (?PET_Process@Mob@@QAEXXZ) referenced in function "public: virtual bool __thiscall NPC::Process(void)" (?Process@NPC@@UAE_NXZ)
.\../Build/Zone.exe : fatal error LNK1120: 1 unresolved externals
Creating browse information file...
Microsoft Browse Information Maintenance Utility Version 8.00.50727
Copyright (C) Microsoft Corporation. All rights reserved.
Build log was saved at "file://e:\EQEmu\Build\Zone\Release\BuildLog.htm"
Zone - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Look on page 26 of this thread, post 381 and 382. That might get you going.

Angelox
09-26-2008, 01:19 PM
I downloaded one of these kits posted here (http://www.eqemulator.net/forums/showthread.php?t=25372); Kits were made opyrus , I have the VS2008 one, never had any problems.
I copy pasted my source/zone, world, etc. from my Linux machine which has bot code, and it all still worked fine.
Someone needs to sticky this thread (http://www.eqemulator.net/forums/showthread.php?t=25372), this install really works well.
The only thing you have to keep in mind is not the change/overwrite the /source/server.sln that comes with the package.

Flare83
09-26-2008, 01:44 PM
I copy pasted my source/zone, world, etc. from my Linux machine which has bot code, and it all still worked fine.

The only thing you have to keep in mind is not the change/overwrite the /source/server.sln that comes with the package.



Thanks angelox =)

spider661
09-28-2008, 08:41 PM
ok i found the problem i was having with groups not sticking after zoneing its in my bot code can anyone see if they can help me fix it? what happens is they zone and stay in group but it seems its clearing them from the database or the group itself.. then when they zone back into the zone it kills the group and everyone has to reform.


void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) {

#ifdef EQBOTS

// EQoffline: Remove the group if the leader is grouped
Mob *clientmob = CastToMob();
if(clientmob) {
int16 cmid = clientmob->GetID();
if(clientmob->IsBotRaiding()) {
BotRaids* br = entity_list.GetBotRaidByMob(clientmob);
if(br) {
br->RemoveRaidBots();
br = NULL;
}
}
if(clientmob->IsGrouped()) {
Group *g = entity_list.GetGroupByMob(clientmob);
if(g) {
for(int i=5; i>=0; i--) {
if(g->members[i] && g->members[i]->IsBot()) {
g->members[i]->Kill();
}
}
if(g->BotGroupCount() <= 1) {
g->DisbandGroup();
}
}
}
database.CleanBotLeader(cmid);
}

#endif //EQBOTS

zoning = true;
if (app->size != sizeof(ZoneChange_Struct)) {
LogFile->write(EQEMuLog::Debug, "Wrong size: OP_ZoneChange, size=%d, expected %d", app->size, sizeof(ZoneChange_Struct));
return;
}

#if EQDEBUG >= 5
LogFile->write(EQEMuLog::Debug, "Zone request from %s", GetName());
DumpPacket(app);
#endif
ZoneChange_Struct* zc=(ZoneChange_Struct*)app->pBuffer;

uint16 target_zone_id = 0;
ZonePoint* zone_point = NULL;

//figure out where they are going.
if(zc->zoneID == 0) {
//client dosent know where they are going...
//try to figure it out for them.

switch(zone_mode) {
case EvacToSafeCoords:
case ZoneToSafeCoords:
//going to safe coords, but client dosent know where?
//assume it is this zone for now.
cheat_timer.Start(35000,false);
target_zone_id = zone->GetZoneID();
break;
case GMSummon:
target_zone_id = zonesummon_id;
break;
case GateToBindPoint:
target_zone_id = m_pp.binds[0].zoneId;
break;
case ZoneToBindPoint:
target_zone_id = m_pp.binds[0].zoneId;
break;
case ZoneSolicited: //we told the client to zone somewhere, so we know where they are going.
cheat_timer.Start(35000,false);
target_zone_id = zonesummon_id;
break;
case ZoneUnsolicited: //client came up with this on its own.
zone_point = zone->GetClosestZonePointWithoutZone(GetX(), GetY(), GetZ(), ZONEPOINT_NOZONE_RANGE);
if(zone_point) {
//we found a zone point, which is a reasonable distance away
//assume that is the one were going with.
target_zone_id = zone_point->target_zone_id;
} else {
//unable to find a zone point... is there anything else
//that can be a valid un-zolicited zone request?

CheatDetected(MQZone);
Message(13, "Invalid unsolicited zone request.");
LogFile->write(EQEMuLog::Error, "Zoning %s: Invalid unsolicited zone request to zone id '%d'.", GetName(), target_zone_id);
SendZoneCancel(zc);
return;
}
break;
};
}
else {
// This is to allow both 6.2 and Titanium clients to perform a proper zoning of the client when evac/succor
// WildcardX 27 January 2008
if(zone_mode == EvacToSafeCoords && zonesummon_id > 0)
target_zone_id = zonesummon_id;
else
target_zone_id = zc->zoneID;

//if we are zoning to a specific zone unsolicied,
//then until otherwise determined, they must be zoning
//on a zone line.
if(zone_mode == ZoneUnsolicited) {
zone_point = zone->GetClosestZonePoint(GetX(), GetY(), GetZ(), target_zone_id, ZONEPOINT_ZONE_RANGE);
//if we didnt get a zone point, or its to a different zone,
//then we assume this is invalid.
if(!zone_point || zone_point->target_zone_id != target_zone_id) {
Message(13, "Invalid unsolicited zone request.");
LogFile->write(EQEMuLog::Error, "Zoning %s: Invalid unsolicited zone request to zone id '%d'.", GetName(), target_zone_id);
if ((cheat_timer.GetRemainingTime())<1 || (!cheat_timer.Enabled())){ //Lieka: Disable MQGate Detector if timer is active.
CheatDetected(MQGate);
}
SendZoneCancel(zc);
return;
}
}
}


//make sure its a valid zone.
const char *target_zone_name = database.GetZoneName(target_zone_id);
if(target_zone_name == NULL) {
//invalid zone...
Message(13, "Invalid target zone ID.");
LogFile->write(EQEMuLog::Error, "Zoning %s: Unable to get zone name for zone id '%d'.", GetName(), target_zone_id);
SendZoneCancel(zc);
return;
}

//load up the safe coords, restrictions, and verify the zone name
float safe_x, safe_y, safe_z;
sint16 minstatus = 0;
int8 minlevel = 0;
char flag_needed[128];
if(!database.GetSafePoints(target_zone_name, &safe_x, &safe_y, &safe_z, &minstatus, &minlevel, flag_needed)) {
//invalid zone...
Message(13, "Invalid target zone while getting safe points.");
LogFile->write(EQEMuLog::Error, "Zoning %s: Unable to get safe coordinates for zone '%s'.", GetName(), target_zone_name);
SendZoneCancel(zc);
return;
}

#ifdef EMBPERL
char buf[10];
snprintf(buf, 9, "%d", target_zone_id);
buf[9] = '\0';
((PerlembParser*)parse)->Event(EVENT_ZONE, 0, buf, (NPC*)NULL, this);
#endif

//handle circumvention of zone restrictions
//we need the value when creating the outgoing packet as well.
int8 ignorerestrictions = zonesummon_ignorerestrictions;
zonesummon_ignorerestrictions = 0;

float dest_x=0, dest_y=0, dest_z=0, dest_h;
dest_h = GetHeading();
switch(zone_mode) {
case EvacToSafeCoords:
case ZoneToSafeCoords:
LogFile->write(EQEMuLog::Debug, "Zoning %s to safe coords (%f,%f,%f) in %s (%d)", GetName(), safe_x, safe_y, safe_z, target_zone_name, target_zone_id);
dest_x = safe_x;
dest_y = safe_y;
dest_z = safe_z;
break;
case GMSummon:
dest_x = zonesummon_x;
dest_y = zonesummon_y;
dest_z = zonesummon_z;
ignorerestrictions = 1;
break;
case GateToBindPoint:
dest_x = m_pp.binds[0].x;
dest_y = m_pp.binds[0].y;
dest_z = m_pp.binds[0].z;
break;
case ZoneToBindPoint:
dest_x = m_pp.binds[0].x;
dest_y = m_pp.binds[0].y;
dest_z = m_pp.binds[0].z;
ignorerestrictions = 1; //can always get to our bind point? seems exploitable
break;
case ZoneSolicited: //we told the client to zone somewhere, so we know where they are going.
//recycle zonesummon variables
cheat_timer.Start(3500,false);
dest_x = zonesummon_x;
dest_y = zonesummon_y;
dest_z = zonesummon_z;
break;
case ZoneUnsolicited: //client came up with this on its own.
//client requested a zoning... what are the cases when this could happen?

//Handle zone point case:
if(zone_point != NULL) {
//they are zoning using a valid zone point, figure out coords

//999999 is a placeholder for 'same as where they were from'
if(zone_point->target_x == 999999)
dest_x = GetX();
else
dest_x = zone_point->target_x;
if(zone_point->target_y == 999999)
dest_y = GetY();
else
dest_y = zone_point->target_y;
if(zone_point->target_z == 999999)
dest_z=GetZ();
else
dest_z = zone_point->target_z;
if(zone_point->target_heading == 999)
dest_h = GetHeading();
else
dest_h = zone_point->target_heading;

break;
}

//for now, there are no other cases...

//could not find a valid reason for them to be zoning, stop it.
CheatDetected(MQZone);
Message(13, "Invalid unsolicited zone request.");
LogFile->write(EQEMuLog::Error, "Zoning %s: Invalid unsolicited zone request to zone id '%s'. Not near a zone point.", GetName(), target_zone_name);
SendZoneCancel(zc);
return;
};

//OK, now we should know where were going...

//Check some rules first.
sint8 myerror = 1; //1 is succes

//not sure when we would use ZONE_ERROR_NOTREADY

//enforce min status and level
if (!ignorerestrictions && (Admin() < minstatus || GetLevel() < minlevel)) {
cheat_timer.Start(3500,false); //Lieka: Don't set off warp detector for when a player is moved to the safe-spot for trying to access a zone without the appropriate level or status requirements (i.e. zoning into FearPlane at level 30, etc)
myerror = ZONE_ERROR_NOEXPERIENCE;
}

if(!ignorerestrictions && flag_needed[0] != '\0') {
//the flag needed string is not empty, meaning a flag is required.
if(Admin() < minStatusToIgnoreZoneFlags && !HasZoneFlag(target_zone_id)) {
Message(13, "You must have the flag %s to enter this zone.");
myerror = ZONE_ERROR_NOEXPERIENCE;
cheat_timer.Start(3500,false);
}
}

//Enforce ldon doungeon entrance rules
if(myerror == 1 && database.IsLDoNDungeon(target_zone_id)
// && !ignorerestrictions
) {
//this zone is an ldon dungeon
int advid = GetAdventureID();
if(advid > 0){
//we are in an adventure... make sure its the right one
AdventureInfo ai = database.GetAdventureInfo(advid);
if(target_zone_id != ai.zonedungeonid) {
Message(13, "You are not allowed to enter this dungeon!");
LogFile->write(EQEMuLog::Error, "Zoning %s: Not allowed to enter dungeon '%s' (%d). Not in the right adventure.", GetName(), target_zone_name, target_zone_id);
SendZoneCancel(zc);
return;
}
} else {
Message(13, "You are not allowed to enter this dungeon!");
LogFile->write(EQEMuLog::Error, "Zoning %s: Not allowed to enter dungeon '%s' (%d). Not in any adventure.", GetName(), target_zone_name, target_zone_id);
SendZoneCancel(zc);
return;
}
}

if(myerror == 1) {
//we have successfully zoned
DoZoneSuccess(zc, target_zone_id, dest_x, dest_y, dest_z, dest_h, ignorerestrictions);
} else {
LogFile->write(EQEMuLog::Error, "Zoning %s: Rules prevent this char from zoning into '%s'", GetName(), target_zone_name);
SendZoneError(zc, myerror);
}
}


the problem is the remove bots call if i comment it out and don't have bots the group stays intact if i have bots it destroys the group on zoneing and leaves the bots in the last zone.

so i cant just comment it out i have to fix it.

any suggestions?

Congdar
09-28-2008, 09:23 PM
If you have more than one PC in the group, the Bots should be invited last. Maybe that will help with the group issue.

The bots have been coded such that they cannot zone with you because it would crash the zone when I tried. It was easier for me to make it that way than to figure out how to make them zone with you. If you really want to make bots zone with you there's a ton of other zone/teleport/group teleport code that will need to be changed as well. I recommend living with this restriction.

spider661
09-28-2008, 09:34 PM
no thats not it.. i don't care if they zone or not.. the problem is this code is making it so when you zone.. with or without a bot. and your grouped. then your group breaks up. i think its removing you from the new group ids database and not adding you back with or without a bot.

example.. your in a group no bots and die.. your still in group but then you zone back to rejoin your group the group is disbanded and you have to reform.. i tried with all the bot code removed and the code for groups works add it back and it breaks.. remove this peace and it works but if you have bots it breaks the group soon as you zone.

Congdar
09-28-2008, 11:16 PM
ok, thanks for clearing that up... try this and let me know if it works. Just replace the entire ifdef

#ifdef EQBOTS

// EQoffline: Remove the group if the leader is grouped
Mob *clientmob = CastToMob();
if(clientmob) {
int16 cmid = GetID();
if(clientmob->IsBotRaiding()) {
BotRaids* br = entity_list.GetBotRaidByMob(clientmob);
if(br) {
br->RemoveRaidBots();
br = NULL;
}
}
if(clientmob->IsGrouped()) {
Group *g = entity_list.GetGroupByMob(clientmob);
if(g) {
bool hasBots = false;
for(int i=5; i>=0; i--) {
if(g->members[i] && g->members[i]->IsBot()) {
hasBots = true;
g->members[i]->Kill();
}
}
if(hasBots) {
if(g->BotGroupCount() <= 1) {
g->DisbandGroup();
}
}
}
}
database.CleanBotLeader(cmid);
}

#endif //EQBOTS

spider661
09-29-2008, 12:11 AM
ok that worked great.. now the bots leave group and group stays in tact now 1 more problem.. the player that owns the bots invites a player.. spawns bots and zones out and back bots gone group intact. so then i respawn the bots and try to invite them. says only leader can invite bots and kills them. but then i log on another char and try to invite them and it lets me..

so basically what happens is now the bots cant find the leader of the group even though the owner is still the group leader according to the game.

any ideals?

spider661
09-29-2008, 02:33 AM
i fixed it i just removed the group leader check when inviting bots.. i don't care if anyone in group can invite them leader or not.. and it seems to e working now. but i would still like to see a fix to the problem in case i decide to put leader check back in or if anyone else needs it

Angelox
09-29-2008, 06:59 AM
I fixed a few exploits on mine;
for players who make armies of Bots and invite them as they fight and loose bots;
in command.cpp around line 8161;
replace

if(!strcasecmp(sep->arg[1], "group") && !strcasecmp(sep->arg[2], "add"))
{
if((c->GetTarget() == NULL) || (c->GetTarget() == c) || !c->GetTarget()->IsBot())
{
c->Message(15, "You must target a bot!");
return;
}


With this;

if(!strcasecmp(sep->arg[1], "group") && !strcasecmp(sep->arg[2], "add"))
{
if((c->GetTarget() == NULL) || (c->GetTarget() == c) || !c->GetTarget()->IsBot() || (c->IsEngaged())) //Angelox
{
c->Message(15, "You must target a bot and can't be engaged!");
return;
}


for players who kill players or any mob with the '#bot raid group create';
in command.cpp around line 8645;
replace
c->Message(15, "You must have created your raid and your group must be full before doing that!");
Mob* kmob = c->GetTarget();
if(kmob != NULL) {
kmob->Kill();
}

With
c->Message(15, "You must have created your raid and your group must be full before doing that!");
Mob* kmob = c->GetTarget();
if(kmob != NULL) {
kmob->GetTarget(); //Problem? kmob->Kill() was here b4 Angelox
}

And finally, Since th '#Bot update as it really doesn't work right (at least for me and what I got it doesn't), and is an exploit for no down time (this full heals the bot), I just quoted it out (I'm content to updates when zoning/re-logging the bot);
command.cpp, line 7202 replace;
c->Message(15, "#bot update [target] - you must type that command once you gain a level.");
with
c->Message(15, "#bot update You must zone or re-log to see updated Bot"); //Angelox: removed for exploit (doesn't work right anyways


and quote out lines 8462 - 8486 (more or less)
/* if(!strcasecmp(sep->arg[1], "update")) {
// // Congdar: add IsEngaged check for exploit to keep bots alive by repeatedly using #bot update.
// // Angelox: Disabled it totally as it is an exploit for no down time
if(c->GetTarget() != NULL)
{
if(c->GetTarget()->IsBot() && (c->GetTarget()->BotOwner == c->CastToMob()) && !c->GetTarget()->IsEngaged()) {
Mob *bot = c->GetTarget();
bot->SetLevel(c->GetLevel());
bot->CalcBotStats();
}
else {
if(c->GetTarget()->IsEngaged()) {
c->Message(15, "You cannot update while engaged.");
}
else {
c->Message(15, "You must target a bot first");
}
}
}
else {
c->Message(15, "You must target a bot first");
}
return;
}
*/


This fixes are tested and running on a few mini-login servers, mad by request of the owners.

spider661
09-29-2008, 07:53 AM
wow nice fixes i did not even know that was doable but tested and yes that does kill players or npcs so thanks for that fix its in mine now.

Angelox
09-29-2008, 09:05 AM
i fixed it i just removed the group leader check when inviting bots.. i don't care if anyone in group can invite them leader or not.. and it seems to e working now. but i would still like to see a fix to the problem in case i decide to put leader check back in or if anyone else needs it

The group fix by Congdar is great!
Tell me what you did to remove the group leader check.

Congdar
09-29-2008, 09:42 AM
ok that worked great.. now the bots leave group and group stays in tact now 1 more problem.. the player that owns the bots invites a player.. spawns bots and zones out and back bots gone group intact. so then i respawn the bots and try to invite them. says only leader can invite bots and kills them. but then i log on another char and try to invite them and it lets me..

so basically what happens is now the bots cant find the leader of the group even though the owner is still the group leader according to the game.

any ideals?

This is a bug in group code, and not related to bots. There's a missing opcode for group leader it seems doesn't get updated when zoning. I thought KLS had fixed this but I guess not.

Angelox
09-29-2008, 09:59 AM
This is a bug in group code, and not related to bots. There's a missing opcode for group leader it seems doesn't get updated when zoning. I thought KLS had fixed this but I guess not.

What if you coded the bots to look in table 'group_leaders' for whoever is the leader.

Congdar
09-29-2008, 10:12 AM
Angelox,
Nice fixes... I'll add them to my source, but I'm going to allow the update command but I'll fix it so it only works for what the actual update command was intended for... when you level up, you're supposed to be able to level up your bots with you, so I'll add a level check and that should be good.

The killing npc's and players bug is another nice find but is a good command when used as intended. I'll add code to make sure a bot is the target.

It would be nice to get the actual group code fixed, but using the bot leader's db table is a good workaround until then.

Congdar
09-29-2008, 10:33 AM
hmm actually the reason I had the leader check was so two pc's in the same group couldn't summon bots and I think it needs to be that way. The bot leaders table only tells me who the leader of the bot is, not the leader of the group. So I have an idea on a new check for that. I'll get it updated today.

With these fixes I'll be releasing again real soon with all the suggestions from here since my 1129 release announcement.

All characters on the same account will now share the bots so each doesn't need its own army.
Some speed spells in dungeons are disabled (Selo's still working, is it supposed to for bards?)
The Chardok Monk Sniffer test has much better results
Bots should no longer equip items with level restrictions above them
Undead can now be taunted
Added a few more AA's

Angelox
09-29-2008, 11:23 AM
Well, I got a few more that might interest you;
Selos and bard speed spells should not work in dungeons either, what I did was make up some new 'spell ids';
-=-=-=-=-=
spdat.h around 482 add;
bool IsSowTypeSpell(int16 spell_id); //Angelox
bool IsFeralPackSpell(int16 spell_id); //Angelox

-=--=-=-=-=
spdat.cpp around 708 add;

bool IsFeralPackSpell(int16 spell_id) { //Angelox, works in dungeons
bool Result = false;

// Feral Pack
if(spell_id == 4058)
Result = true;

return Result;
}

bool IsSowTypeSpell(int16 spell_id) { //Angelox
bool Result = false;

// Sow Types Sow WolfForm ShareGreatWolf GreaterWolfForm SharWolf Bard Bard EagleSow
if((spell_id == 278) || (spell_id == 425) || (spell_id == 3579) || (spell_id == 426) || (spell_id == 428)|| (spell_id == 717) || (spell_id == 2605) || (spell_id == 2517))
Result = true;

return Result;
}


I wanted to keep some sow spells in dungeons, but others no. My idea is to get things looking natural, the only group wolf I have available is the Feral Pack In dungeons (it is an LDoN dungeon spell), Thought it was pretty cool to have while working in dungeons. I also have some code (will post later) that enables the Druid to only wolf itself (then Sow everone else), and not the whole group. As when we played on live, most players didn't care to get 'Wolfed' all the time.

Once the above code is added, I then went to botAI.cpp at line 751 'case SpellType_Buff:'
entry, I added these to lines with your levitate check;

(IsSowTypeSpell(AIspells[i].spellid) && !zone->CanCastOutdoor()) ||
(IsFeralPackSpell(AIspells[i].spellid) && zone->CanCastOutdoor())) { //Angelox


Now it looks like this;
// Put the zone levitate check here since bots are able to bypass the client casting check
if(IsEffectInSpell(AIspells[i].spellid, SE_Levitate) && !zone->CanLevitate() ||
(IsSowTypeSpell(AIspells[i].spellid) && !zone->CanCastOutdoor()) ||
(IsFeralPackSpell(AIspells[i].spellid) && zone->CanCastOutdoor())) { //Angelox
break;
}

The outcome of this is, when playing outdoors, you look over to the wolf in the group, and think 'Yep, there's the Druid'(sort of a classic look to a Druid). And when in dungeon, you get the numerous benefits of Feral Pack, which players really liked to have.
The Druid should Wolf first, then Sow for this to work.
And I have disabled all wolf forms but the one 'self only' in npc_spells_entries .
Still if you don't like my Druid wolf idea, the other code works for blocking choice spells in and out of dungeons

One problem needs to be solved with Illusions is, you can't equip a Bot while under the effect. I usually have all the gear ready and quickly hand it over before the bot casts the illusion.

Angelox
09-29-2008, 12:11 PM
There's another piece I forgot about, if you want to make the druid 'self only" wolf work;
in spells.cpp around 2431 where you see
//Franck-add: can't detrimental spell on bots and bots can't detriment on you or the others bots
if ((IsBot() && IsDetrimentalSpell(spell_id) && spelltar->IsBot()) ||
(IsBot() && IsDetrimentalSpell(spell_id) && spelltar->IsClient()) ||
(IsClient() && IsDetrimentalSpell(spell_id) && spelltar->IsBot()))
return false;

I added to look like this;
//Franck-add: can't detrimental spell on bots and bots can't detriment on you or the others bots
if ((IsBot() && IsDetrimentalSpell(spell_id) && spelltar->IsBot()) ||
(IsBot() && IsDetrimentalSpell(spell_id) && spelltar->IsClient()) ||
(IsClient() && IsDetrimentalSpell(spell_id) && spelltar->IsBot()))
return false;

int druid_sp [] = { 516,517,425,278,4058,4054,169 };
if ((IsBot() && spell_id == druid_sp[3] && level >= 20 && (GetClass() == DRUID) && spelltar == this)||
//(IsBot() && spell_id == druid_sp[3] && !zone->CanCastOutdoor() && spelltar->IsPet()) ||
(IsBot() && spell_id == druid_sp[3] && (spelltar->GetClass() == DRUID)))
return false;
This is so the druid will not be affected by sow from itself anything else.

reason for the big 'int druid_sp'
I have a big mess of code quoted out and re-made since one of Congdar's fixes (wouldn't work anymore) , I need to clean it all up, but keep it for new ideas.

leslamarch
09-29-2008, 05:32 PM
does anyone have a good way already in place to limit bots to a certain status level? :confused:

Congdar
09-29-2008, 06:01 PM
There's been some ideas posted. Limit by status, limited number of bots, quests to get a bot, etc. All good ideas waiting to be coded.

Angelox
10-01-2008, 03:33 PM
This corrects another exploit -
If you are using FD (Feign Death) and you have a group of bots, you can send the bots and they will get killed but you won't get involved in combat. After that, you can re-summon your bots and send them again...

In client.cpp at around line 1842 (on my client.cpp it's on line 1914)
replace this
#ifdef EQBOTS

// there seems to be a bug where the hate list doesn't get cleared, even if
// the mob forgets about the feigner.
hate_list.Wipe();

#endif //EQBOTS

With this;
#ifdef EQBOTS

// there seems to be a bug where the hate list doesn't get cleared, even if
// the mob forgets about the feigner.
hate_list.Wipe();

// Angelox Added for FDead Exploit
Mob *clientmob = CastToMob();
if(clientmob) {
int16 cmid = GetID();
if(clientmob->IsBotRaiding()) {
BotRaids* br = entity_list.GetBotRaidByMob(clientmob);
if(br) {
br->RemoveRaidBots();
br = NULL;
}
}
if(clientmob->IsGrouped()) {
Group *g = entity_list.GetGroupByMob(clientmob);
if(g) {
bool hasBots = false;
for(int i=5; i>=0; i--) {
if(g->members[i] && g->members[i]->IsBot()) {
hasBots = true;
g->members[i]->Kill();
}
}
if(hasBots) {
if(g->BotGroupCount() <= 1) {
g->DisbandGroup();
}
}
}
}
database.CleanBotLeader(cmid);
}

#endif //EQBOTS

What happens is FD, will clear the bots out, but not the group Which makes it a fair play.

I also added this check in groups.cpp, around line 834 ;
change this;
#ifdef EQBOTS

int Group::BotGroupCount() {
int count = 0;
for(int i=count; i<MAX_GROUP_MEMBERS; i++) {
if(members[i] && (members[i]->GetMaxHP()>0))
count++;
}
return count;
}

#endif //EQBOTS

to this;
int Group::BotGroupCount() {
int count = 0;
for(int i=count; i<MAX_GROUP_MEMBERS; i++) {
if(members[i] && (members[i]->GetMaxHP()>0))
count++;
}
return (count,database.GroupCount(GetID())); //angelox add
}


This enabled me to invite PC members to the group (first) then add bots. On zoning, the bots poof, but the PC group stays intact.

This is all tested, the PC group part i tested as best I could from two PC's in the Lan. Posted with my database for anyone who wants to try it out.
I'm planning on re-arranging my Bot SpellLists, so they match the ones in PEQ., Then the code will be made compatible with the PEQ database too.

Congdar
10-01-2008, 04:45 PM
Feign Death kills the bots? I can't agree with this fix. FD is a viable tactic to lower aggro. You would want your bots to continue the fight and you could rejoin the battle after the warrior bot regained aggro. Need to think of a better way.

The group fix... I fixed it already a different way... not sure what this is doing.

Since my release with the official 1129 code there has been massive feedback and suggestions both here and on my server forums. I've incorporated probably 99% of this and the current bot source doesn't really look much like the 1129 release. I'll probably be adding the bot source I have into the svn this weekend when I have some time and then there'll be a base to work from.

Angelox
10-01-2008, 05:02 PM
Feign Death kills the bots? I can't agree with this fix. FD is a viable tactic to lower aggro. You would want your bots to continue the fight and you could rejoin the battle after the warrior bot regained aggro. Need to think of a better way.

At the moment, it's an exploit , better than FD and continuously sending in the bots tell you win.
The whole FD idea, has evolved to please the customers. At first, FD had other intentions, such as someone staying back for a quick CR. When you FD, you pet went too. Now days, it does not.
Already the game is much easier with the bots, I'm able to do things i would have never have thought of unless I used the #gm. If someone has gotten into a situation where they have to FD (with a team of bots!), then they can make new bots and start over, instead of abuse the FD.

Congdar
10-01-2008, 07:12 PM
FD classes have been doing so in battles to manage aggro for years. Bots shouldn't change that. I agree there's an exploitable situation, all I'm saying is a different solution would be better. If you make it this way then at least make a Bot::FDRule to disable it so monks with bots can continute to play eq the way they always have.

Congdar
10-01-2008, 07:25 PM
Hey, I re-read the last part of your post. Before your fix post I already had implemented code so you can't spawn more bots or create more groups from already spawned bots when engaged. A FD check might be more easily added there if even needed with the engaged check.

Angelox
10-01-2008, 08:25 PM
FD classes have been doing so in battles to manage aggro for years. Bots shouldn't change that. I agree there's an exploitable situation, all I'm saying is a different solution would be better. If you make it this way then at least make a Bot::FDRule to disable it so monks with bots can continute to play eq the way they always have.

Ahh, Monks! I forgot about them, I was thinking about SKs and Necros only. Anyway, I didn't think of it as a permanent solution, just a filler tell something better shows up. At least the exploit got squashed out right away.
Could also toss in some exceptions; maybe a timer for FD while engaged, and un-limited time for FD while not engaged, so if you're in a fight and you stay on the FD too long, then they will all poof.
It's a combination problem where the player goes FD and when the bots gets killed, then they are 'not engaged' and he can quickly make another round of bots and send them in (all the time, he's FD)

Congdar
10-02-2008, 09:06 AM
just a filler tell something better shows up

I've got better stuff coming. I'm pretty excited about my next release. There's a lot of new features added from all the feedback plus I've closed up several exploits like those mentioned. I've also massively reduced lag from cpu hits the bot were generating during battles.

Ikeren
10-02-2008, 12:43 PM
Here's something that I've always found difficult:

Camping kills the bots.

One of the "classic" things to do in a raid when it's all going down hill is yell "Cleric's Camp", and all the clerics try to camp out, with FD classes trying to FD. I've tried to camp in the middle of battles I'm certain to lose as a cleric, using Divine Barrier, but it only lasts 18 seconds. That has lead to 1 or 2 nasty failed encounters (one of them Deep in Vex Thal).

I'm not sure if this problem has a solution, and I'm not sure if the cure wouldn't be worse than the disease. But I'm just throwing it out there.

cubber
10-02-2008, 12:58 PM
I have to agree with Congdar there has to be a better way to deal with the FD issue. I mainly play a monk and yes I do have to FD off aggro to my main tank bot often, would suck to see my whole group of bots just poof when I hit FD. That would require that monks unlearn a lot of basic group tactics to play with a bot group.

Hmm what about having your bots guard a pull spot while you go pull. You all of a sudden pick up aggro from 4 other mobs and need to FD, hmm bots poof...

This fix in my opinion breaks monks!

Now as for spawning bots while FD, that could be an exploit but it also has its benifits. You can't zone with bots so how do you prepare your group to zone into a place like PoG? I guess you could use invis zone in and spawn your bots, but I tend to zone in fd flop then spawn my group, then pop up an start fighting. Now both ways could be considered an exploit I guess, it does not really matter if your invis or FD you still have the ability to spawn bots!

I would say spawning bots invis is even more of an exploit than FD, invis up, run to uber_camp01, spawn bots and clear camp. At least with FD there is somewhat of a challange to get to a hard camp.

So if you are gonna remove it from an FD class better take off the ability to spawn them invis too.

just my 2 cents ...

Congdar
10-02-2008, 01:12 PM
Here's something that I've always found difficult:

Camping kills the bots.

One of the "classic" things to do in a raid when it's all going down hill is yell "Cleric's Camp", and all the clerics try to camp out, with FD classes trying to FD. I've tried to camp in the middle of battles I'm certain to lose as a cleric, using Divine Barrier, but it only lasts 18 seconds. That has lead to 1 or 2 nasty failed encounters (one of them Deep in Vex Thal).

I'm not sure if this problem has a solution, and I'm not sure if the cure wouldn't be worse than the disease. But I'm just throwing it out there.

I think the camp killing the bots can be removed since the logout covers killing the bots with identical code.

Congdar
10-02-2008, 01:16 PM
I have to agree with Congdar there has to be a better way to deal with the FD issue. I mainly play a monk and yes I do have to FD off aggro to my main tank bot often, would suck to see my whole group of bots just poof when I hit FD. That would require that monks unlearn a lot of basic group tactics to play with a bot group.

Hmm what about having your bots guard a pull spot while you go pull. You all of a sudden pick up aggro from 4 other mobs and need to FD, hmm bots poof...

This fix in my opinion breaks monks!

Now as for spawning bots while FD, that could be an exploit but it also has its benifits. You can't zone with bots so how do you prepare your group to zone into a place like PoG? I guess you could use invis zone in and spawn your bots, but I tend to zone in fd flop then spawn my group, then pop up an start fighting. Now both ways could be considered an exploit I guess, it does not really matter if your invis or FD you still have the ability to spawn bots!

I would say spawning bots invis is even more of an exploit than FD, invis up, run to uber_camp01, spawn bots and clear camp. At least with FD there is somewhat of a challange to get to a hard camp.

So if you are gonna remove it from an FD class better take off the ability to spawn them invis too.

just my 2 cents ...

I'm hoping the 'IsEngaged' check put onto select bot commands will trim down the exploits in this area to a point where any left over exploits could be looked at more closely for a way to clean them up.

Skizoke
10-03-2008, 01:06 PM
I'm at work now so I can't read all of this. I did read severa; pages and this project looks amazing.

Was anyone able to get a working bot, and if so is there a download link or webpage I can visit?

Angelox
10-03-2008, 06:59 PM
I changed the way the way Feign Dead exploit fix works, In a nutshell I added a few 'if(c->GetFeigned' checks.
in command.cpp
at around line 8558 , I really can't say where it is on the current source you all have but it starts with
if(!strcasecmp(sep->arg[1], "spawn") ){

And I changed to look as follows;
if(!strcasecmp(sep->arg[1], "spawn") ){
if( database.GetBotOwner(atoi(sep->arg[2])) == 0)
{
database.SetBotOwner(atoi(sep->arg[2]), c->CharacterID());
}
else if(database.GetBotOwner(atoi(sep->arg[2])) != c->CharacterID())
{
c->Message(15,"You can't spawn a bot that you don't own.");
return;
}
if(c->IsEngaged())
{
c->Message(15, "You can't summon bots while you are engaged.");
return;
}
if(c->GetFeigned()) //Angelox
{
c->Message(15, "You can't be feigned!");
return;
}


Also at around line 8624 , or where it starts with
if(!strcasecmp(sep->arg[1], "group") && !strcasecmp(sep->arg[2], "add"))


I made it to look like this;
if(!strcasecmp(sep->arg[1], "group") && !strcasecmp(sep->arg[2], "add"))
{
if((c->GetTarget() == NULL) || (c->GetTarget() == c) || !c->GetTarget()->IsBot()) //Angelox
{
c->Message(15, "You must target a bot!");
return;
}
if(c->IsEngaged()) //Angelox
{
c->Message(15, "Not while fighting!");
return;
}
if(c->GetFeigned()) //Angelox
{
c->Message(15, "You can't be feigned!");
return;
}
if(c->GetTarget()->IsClient()) //Angelox
{
c->Message(15, "You can't invite clients this way.");
return;
}
This will not kill Bots, but will not allow you to make (spawn) or add bots while FD.

-=-=-=-=-=-=-=-

Then over here in the trading Dept. I made some changes so your bot will take equipment while under any illusion (wolf form, etc).
traders.cpp, Line 350 or starts with
//EQoffline: will give the items to the bots and change the bot stats
I changed the 'GetRace' to 'GetBaseRace'
//EQoffline: will give the items to the bots and change the bot stats
if(inst && with->IsBot() && with->BotOwner == this->CastToMob()) {
if(inst->IsEquipable(with->GetBaseRace(), with->GetClass())) { //Angelox fix for Equip Illusioned Bots
BotCanWear = true;

Which worked but still had some spam threats to 'delete my bot'-
So, over in mob.cpp at around line 2462, or starts with ;
void Mob::CalcBotStats() {
this->Say("I'm updating...");

I again changed 'GetRace' to 'GetBaseRace';
void Mob::CalcBotStats() {
this->Say("I'm updating...");
// base stats
int brace = GetBaseRace(); //Angelox
int bclass = GetClass();
int blevel = GetLevel();
And that was the end of that story.

-=-=-=-=-=-=-=-=-=-=-=

Here's a riddle i've been trying to figure out all week;
I want the Bot names to appear as a clean name and not 'Mybot000' in my group window.

in groups.cpp at around line 214 or what starts with
//build the template join packet

I change 'GetName' to 'GetCleanName';
like this;
//build the template join packet
EQApplicationPacket* outapp = new EQApplicationPacket(OP_GroupUpdate,sizeof(GroupJoi n_Struct));
GroupJoin_Struct* gj = (GroupJoin_Struct*) outapp->pBuffer;
strcpy(gj->membername, newmember->GetCleanName());

And it works, but the bot members in the window appear dulled out as if in another zone and I cant click-target them off that group window.
I guess I'm too stupid for this one, maybe some one can at least tell me where to look.

All those fixes are posted for download at my site if anyone wants to look at it or try it out - I still haven't made a converted version for PEQ, but am planning to.

Congdar
10-04-2008, 01:30 AM
I've made a new release with the official 1129 sources. Check out the release thread. I've also added this update to SVN.

Angelox
10-04-2008, 10:03 AM
Check out the release thread. I've also added this update to SVN.

Dang! I ran out of rants!
I can't rant about the fixes never going into the source, can't rant about not having bot code in the source or the database never getting posted ...
And it's not even Xmas yet!

Thanks a million to all of you for the new SVN you made and all the effort going into it - nice to see so many people come together on an effort.
I know this will go a very long way.

Ikeren
10-04-2008, 02:34 PM
Was anyone able to get a working bot, and if so is there a download link or webpage I can visit?

Basically, the bots work fine: You can set up a raid of as many as 71 bots + yourself, and equip them, use them to kill raid targets, buff them, etcetera, in every way that you please. There are a few minor bugs that are still being worked on, but they're fully playable.

All the downloads are right here: http://www.eqemulator.net/forums/showthread.php?t=25614

Trading with bots under an illusion is fixed. (Thanks Angelox)

Oh god thank you. When I was equipping my enchanters I would spawn, inventory, figure out what to give them, give it to them to get it stacked on my cursor, kill, respawn, invite and quickly give them the 4 items. Then rinse and repeat.

Thanks for the awesome work you guys.

Congdar
10-04-2008, 06:41 PM
There was a group follow bug if a bot group member died. It's fixed now, but if you got yesterdays zip file then you'll want to replace it with todays zip file.

Angelox
10-04-2008, 06:47 PM
Congdar;
What about those short term spells, such as Yaulp ; why not take them out too? seems they just spam a lot.

Congdar
10-04-2008, 07:08 PM
Yaulp seems ok, there does appear to be a high level druid one that is keeping them low on mana.

Skizoke
10-05-2008, 02:54 PM
None of my bots want to cast a spell.

I did add the spells to my database.

Skizoke
10-05-2008, 03:30 PM
Nevermind, I figured out what i did wrong. Thanks.

I really like it so far, you all are awesome.

Skizoke
10-05-2008, 03:40 PM
Well, I thought I had it figured out.

As soon as I zoned it bugged them out. Now none of them will cast.

Is there a guide to using bots or does everyone figure it out for themselves? Sorry for the dumb questions.

Congdar
10-05-2008, 03:59 PM
not sure what it could be, any clues in the log files?

Skizoke
10-05-2008, 04:25 PM
I'm not sure, but this line is repeated to the log file about every second.

[10.05. - 13:21:26] Error in ZoneDatabase::GroupCount query 'SELECT count(charid) FROM group_id WHERE groupid=4001': #1146: Table 'peq.group_id' doesn't exist

Skizoke
10-05-2008, 04:30 PM
not sure what it could be, any clues in the log files?

I'm not really sure which log file I should paste from.. I see logs called:

eqemu_error_zone
eqemu_debug_world
eqemu-quest_zone
eqemu_zone

Also:

#bot update works fine when I level but when I add the bot to the group (a wizard bot) it doesn't cast. Also, when i say #bot group order attack it gives the message that it is attacking but just sits there and still does not cast.

Congdar
10-05-2008, 04:34 PM
if a database table doesn't exist then you may be using an older database or you didn't get everything sourced in and are missing data. what database are you using and where did you get it from? Make sure you have all the .map files in the eqemu/maps/ folder

Skizoke
10-05-2008, 04:45 PM
I have 513 files in the H:\EQEmu\maps directory. It looks like the maps are present.

I'm using database version 0.7.0-1110a PEQ database that I got from Cavedude's website.

Skizoke
10-05-2008, 04:55 PM
Also here is a better look at what I am doing. I may be doing something wrong.

Posted from my eqlog.txt file:

[Sun Oct 05 15:35:34 2008] Logging to 'eqlog.txt' is now *ON*.
[Sun Oct 05 15:35:39 2008] You say, '#bot group remove'
[Sun Oct 05 15:35:39 2008] Oozo says 'Bot Deactivated'
[Sun Oct 05 15:35:39 2008] Oozo tries to punch himself, but misses!
[Sun Oct 05 15:35:39 2008] Oozo000 has left the group.
[Sun Oct 05 15:35:39 2008] Oozo says 'oof'
[Sun Oct 05 15:35:43 2008] You say, '#bot spawn 1000009'
[Sun Oct 05 15:35:43 2008] Oozo says 'I am ready for battle.'
[Sun Oct 05 15:35:44 2008] Targeted (NPC): Oozo
[Sun Oct 05 15:35:44 2008] Right click on the NPC to consider him.
[Sun Oct 05 15:35:46 2008] You say, '#bot group add'
[Sun Oct 05 15:35:46 2008] Oozo says 'I'm becoming Frie's bot!'
[Sun Oct 05 15:35:46 2008] Oozo000 has joined the group.
[Sun Oct 05 15:35:46 2008] Oozo says 'I'm updating...'
[Sun Oct 05 15:35:46 2008] Oozo says 'Base stats:'
[Sun Oct 05 15:35:46 2008] Oozo says 'Level: 10 HP: 165 AC: 120 Mana: 230 STR: 70 STA: 100 DEX: 100 AGI: 100 INT: 105 WIS: 75 CHA: 50'
[Sun Oct 05 15:35:46 2008] Oozo says 'Resists-- Magic: 20, Poison: 15, Fire: 20, Cold: 25, Disease: 15.'
[Sun Oct 05 15:35:46 2008] Oozo says 'I'm updated.'
[Sun Oct 05 15:35:46 2008] Oozo says 'Level: 10 HP: 165 AC: 120 Mana: 530 STR: 70 STA: 100 DEX: 100 AGI: 100 INT: 105 WIS: 75 CHA: 50'
[Sun Oct 05 15:35:46 2008] Oozo says 'Resists-- Magic: 20, Poison: 15, Fire: 20, Cold: 25, Disease: 15.'
[Sun Oct 05 15:35:50 2008] Targeted (NPC): orc centurion
[Sun Oct 05 15:35:50 2008] Right click on the NPC to consider it.
[Sun Oct 05 15:35:51 2008] You say, '#bot group order attack'
[Sun Oct 05 15:35:51 2008] Oozo says 'Attacking orc centurion.'

End of Log


But bot never moved or attack that npc.

Congdar
10-05-2008, 04:56 PM
If you are running the 1129 bots with the 1110 database then you need to add any sql to your database since that build.
Check the log file for sql updates. This may not fix it but it might.
http://www.eqemulator.net/download.php

try and get the latest .conf files too

Congdar
10-05-2008, 05:11 PM
it might be better to just download the 1129 database from his link to cvs on his forums

Skizoke
10-05-2008, 05:28 PM
Ok, I just updated the db using the changelogs. If it doesn't work I will do that.

One question, I don't have 1129 server. The only that is 1129 is the bots.

I overwrote EMuShareMem.dll, World.exe, and zone.exe using the bots download.

Does everything need to be 1129? I set this serverup using Cavedudes serverpack since I am definately not an advanced user.

Skizoke
10-05-2008, 07:48 PM
Everything seems to be working now, thanks for your help.

Andrew80k
10-05-2008, 08:49 PM
running r49 with the Bots, and I must say I'm liking it. Couple things I noticed:

1. I'm using level 70 bots, and I get a few Unkown spell effects with the spell list that you published.
2. The bots will assist each other but not me.

Couple details -- I run a Ranger, and the bots are a Paladin, Cleric, Shaman, Rogue, Enchanter. Doubt it makes any difference, but just in case.

nicholasjohn
10-05-2008, 11:13 PM
for some reason when I'm compiling the source from the SVN revision 52 the bots dont seem to be included although i do see the botai.cpp being compile.
Do i need to do something different to enable this code?

cubber
10-06-2008, 08:41 AM
You need to edit your makefiles to include the bot code.

1. Change the following in zone/makefile:


DFLAGS=-DEQDEBUG=5 -DCATCH_CRASH -DNO_PIDLOG -DSHAREMEM -DSPELL_EFFECT_SPAM -DFIELD_ITEMS -DCOMBINED -DAPP_OPCODE_SIZE=2 -Di386

to:

DFLAGS=-DEQDEBUG=5 -DCATCH_CRASH -DNO_PIDLOG -DSHAREMEM -DSPELL_EFFECT_SPAM -DFIELD_ITEMS -DCOMBINED -DAPP_OPCODE_SIZE=2 -Di386 -DEQBOTS

2. Then change the following in zone/makefile.common


../common/guild_base.o guild_mgr.o

to:


../common/guild_base.o guild_mgr.o task.o raids.o botRaids.o botAI.o petAI.o


3. run make

nosfentora
10-06-2008, 09:06 AM
Maybe i missed it but which version is the 'most recent'/up-to date?
Condagars or the SVN's? or are they the same?

Is the CVS no longer current?

Congdar
10-06-2008, 09:21 AM
running r49 with the Bots, and I must say I'm liking it. Couple things I noticed:

1. I'm using level 70 bots, and I get a few Unkown spell effects with the spell list that you published.
2. The bots will assist each other but not me.

Hopefully all the spells will be fully supported one day. Are you sure about the assist thing? You attack and they just stand there? Maybe you have them in 'guard' mode. You must use the follow command to get them to assist you again after using guard or enraged commands.

Maybe i missed it but which version is the 'most recent'/up-to date?
Condagars or the SVN's? or are they the same?

Is the CVS no longer current?


I will try to keep them at the same level. They were identical at 1129 and r47

nicholasjohn
10-06-2008, 09:38 AM
You need to edit your makefiles to include the bot code.

1. Change the following in zone/makefile:


DFLAGS=-DEQDEBUG=5 -DCATCH_CRASH -DNO_PIDLOG -DSHAREMEM -DSPELL_EFFECT_SPAM -DFIELD_ITEMS -DCOMBINED -DAPP_OPCODE_SIZE=2 -Di386

to:

DFLAGS=-DEQDEBUG=5 -DCATCH_CRASH -DNO_PIDLOG -DSHAREMEM -DSPELL_EFFECT_SPAM -DFIELD_ITEMS -DCOMBINED -DAPP_OPCODE_SIZE=2 -Di386 -DEQBOTS

2. Then change the following in zone/makefile.common


../common/guild_base.o guild_mgr.o

to:


../common/guild_base.o guild_mgr.o task.o raids.o botRaids.o botAI.o petAI.o


3. run make

ok I did steps 1 and 2 not quite sure what you meant by step 3 ?
But i still do not have bots enabled for some reason.
Thanks in advanced for any help

Angelox
10-06-2008, 09:42 AM
Congdar;

How do you feel about adding a few more spells as bot commands?

#bot groupwolf ( don't always want to be a wolf)
#bot levitate (I hate bobbin' around like a cork in a pond all the time)
#bot seeinv (I don't even know if this is needed at all, but it takes up a buff slot)

cubber
10-06-2008, 09:44 AM
Nicholasjohn:

step 3. is how you compile the source on linux. Not sure what you need to do for a windows compile.

Angelox:

I agree, I do notice that when I summon support type bots I get hit with alot of junk buffs first and never seem to have room for the good stuff.

I have levetating as a monk! That is why we have safe fall =P

Congdar
10-06-2008, 09:50 AM
Congdar;

How do you feel about adding a few more spells as bot commands?

#bot groupwolf ( don't always want to be a wolf)
#bot levitate (I hate bobbin' around like a cork in a pond all the time)
#bot seeinv (I don't even know if this is needed at all, but it takes up a buff slot)
I've added some, but I'm trying to add ones that can't be easily acquired other ways. Levitate and see invis can be found on items, or if you have a wizard bot you can get levitate. I'm confused with what you have in the () you want these commands to make is so you don't lev or wolf or seeinv?
step 3. is how you compile the source on linux. Not sure what you need to do for a windows compile.

see post #750

nosfentora
10-06-2008, 10:11 AM
Thanks Congdar - and keep up the good work!

Andrew80k
10-06-2008, 10:56 AM
Hopefully all the spells will be fully supported one day. Are you sure about the assist thing? You attack and they just stand there? Maybe you have them in 'guard' mode. You must use the follow command to get them to assist you again after using guard or enraged commands.


Yeah, I don't usually use the guard command as I move far too fast for all that. It's interesting. They'll follow me around and sit there while I get the crap beat out of me by 6 or 7 mobs. You know Rangers, we're not happy unless there are plenty of mobs. I have to tell them to attack each mob in turn. As long as I tell them to, they'll happily go about their business. It's like having an employee with no initiative. :)

By the way, I did notice one other thing. My Paladin was critting in the 8k's. Now he's got pretty damn good gear and all but that still seems a little high for a Paladin. And that may not be a BOT thing either. Maybe general issue.

Congdar
10-06-2008, 11:23 AM
not sure what your issue is, testing just now my bots assist me without having to do anything.

nicholasjohn
10-06-2008, 11:29 AM
Yeah, I don't usually use the guard command as I move far too fast for all that. It's interesting. They'll follow me around and sit there while I get the crap beat out of me by 6 or 7 mobs. You know Rangers, we're not happy unless there are plenty of mobs. I have to tell them to attack each mob in turn. As long as I tell them to, they'll happily go about their business. It's like having an employee with no initiative. :)

By the way, I did notice one other thing. My Paladin was critting in the 8k's. Now he's got pretty damn good gear and all but that still seems a little high for a Paladin. And that may not be a BOT thing either. Maybe general issue.

I noticed the same thing just now, they will not assist until i use the #bot group order attack. They just stand around and never get in the fight.

Congdar
10-06-2008, 12:07 PM
strange, like I said... I'm not seeing this problem. anything else you can tell me? Are your bots in a group? Is their gear equipped?

Andrew80k
10-06-2008, 12:22 PM
strange, like I said... I'm not seeing this problem. anything else you can tell me? Are your bots in a group? Is their gear equipped?
Yep, equipped, in the group, working great except for the assist thing. I'm running on FC8 Linux. Compiled no problems. Can't think of anything that would cause them to not assist either, especially since you say they are working for you. Last version I ran they assisted me no problem though. So /em shrugs. At work now so really can't play with it. Maybe I'll try to throw a debug message or two in it to give some more feedback later on.

Congdar
10-06-2008, 12:27 PM
what version are you using? check the date on your zip file and/or exe's. There may be a newer version. there was a version up for a short time that had a follow bug in it.

nicholasjohn
10-06-2008, 12:35 PM
strange, like I said... I'm not seeing this problem. anything else you can tell me? Are your bots in a group? Is their gear equipped?

bots have gear and grouped up, I made a more bots and tried no gear and still no assist. I just compiled from the SVN revision 54.

I'm doing the same things i did on the previous revision and it did work on that version.

Andrew80k
10-06-2008, 12:42 PM
bots have gear and grouped up, I made a more bots and tried no gear and still no assist. I just compiled from the SVN revision 54.

I'm doing the same things i did on the previous revision and it did work on that version.
Yeah, same here. I'm on r52. Bots grouped and geared.

Congdar
10-06-2008, 12:49 PM
I wonder if Angelox's name change broke it. but that's not till r54 /shrug

Andrew80k
10-06-2008, 12:51 PM
I wonder if Angelox's name change broke it.
I'm not running that yet. I'm running the r52 which is prior to it.

Congdar
10-06-2008, 01:14 PM
must be the svn version. The code is identical from the public version 1129 but I've found some things don't work the same in the svn source. I'll see if I can figure it out. It works fine in the public version.

Andrew80k
10-06-2008, 01:25 PM
must be the svn version. The code is identical from the public version 1129 but I've found some things don't work the same in the svn source. I'll see if I can figure it out. It works fine in the public version.
Awesome, Congdar. Thanks. And thanks for all the stuff you do to help the project.

nosfentora
10-06-2008, 02:32 PM
i left my char logged in w/ bots spawned over the weekend. Congdar's last 1129 release (not the current). bots defended me the entire time apparently - i had 19 extra AA points this morning.

on another note i shut the server down and upgraded to 1129c from the CVS, downloaded Congdar's 1129bBotsBin and fired up the server. 5 or 6 hours later (w/ noone logged in) my world.exe is reporting 1,110 stops/starts of PAINEEL.

dunno if it's my db, or a genral bug or what.

just downloaded R41 and trying that.

Angelox
10-06-2008, 02:36 PM
I've added some, but I'm trying to add ones that can't be easily acquired other ways. Levitate and see invis can be found on items, or if you have a wizard bot you can get levitate. I'm confused with what you have in the () you want these commands to make is so you don't lev or wolf or seeinv?
see post #750

What I meant was, Instead of the Bot constantly casting group wolf or lev (and lev-laced spells) on you, you could command when needed (make it choose able). But since I'm just a 'spoke on your wheel', I felt i'd consult you before making any changes.

Also for the Yaulp and 'Yaulp like' short -term spells (Fleeting fury), there could probably be some code to where it could be used when engaged only, so as not to be yaulping all the time.

Angelox
10-06-2008, 02:40 PM
i left my char logged in w/ bots spawned over the weekend. Congdar's last 1129 release (not the current). bots defended me the entire time apparently - i had 19 extra AA points this morning.

on another note i shut the server down and upgraded to 1129c from the CVS, downloaded Congdar's 1129bBotsBin and fired up the server. 5 or 6 hours later (w/ noone logged in) my world.exe is reporting 1,110 stops/starts of PAINEEL.

dunno if it's my db, or a genral bug or what.

just downloaded R41 and trying that.

Devs have added/changed many tables , get the sql Cavedude placed in the /source/utils/sql/ part of the SVN and go through it make sure you got them all in.
I've had similar problems due to missing sql updates or tables.

Derision
10-06-2008, 02:49 PM
must be the svn version. The code is identical from the public version 1129 but I've found some things don't work the same in the svn source. I'll see if I can figure it out. It works fine in the public version.

My guess is the changes in Rev38 (Auto attack/Player hatelist changes) has something to do with bots not assisting.

Edit: but then again, you added in the bot source after that (in Rev41), so I am probably talking rubbish :)

nosfentora
10-06-2008, 03:18 PM
Devs have added/changed many tables , get the sql Cavedude placed in the /source/utils/sql/ part of the SVN and go through it make sure you got them all in.
I've had similar problems due to missing sql updates or tables.

i had just done a cvs update this morning to 1129b.

i checked out the

http://projecteqemu.googlecode.com/svn/trunk/ projecteqemu-read-only

and it comes back 'url doesn't exist.
i tried with and without the space (and %20) between / and projecteqemu-read-only

Angelox
10-06-2008, 03:34 PM
Lets see if it all fits;

DROP TABLE IF EXISTS `tasks`;
CREATE TABLE `tasks` (
`id` int(11) unsigned NOT NULL,
`duration` int(11) unsigned NOT NULL,
`title` varchar(100) NOT NULL,
`description` varchar(2047) NOT NULL,
`reward` varchar(64) NOT NULL,
`rewardid` int(11) unsigned NOT NULL default '0',
`cashreward` int(11) unsigned NOT NULL default '0',
`xpreward` int(10) unsigned NOT NULL default '0',
`rewardmethod` tinyint(3) unsigned NOT NULL default '2',
`startzone` int(11) NOT NULL,
`stepped` tinyint(3) unsigned NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `activities`;
CREATE TABLE `activities` (
`taskid` int(11) unsigned NOT NULL,
`activityid` int(11) unsigned NOT NULL default '0',
`step` int(11) unsigned NOT NULL default '0',
`activitytype` tinyint(3) unsigned NOT NULL default '0',
`text1` varchar(64) NOT NULL,
`text2` varchar(64) NOT NULL,
`text3` varchar(128) NOT NULL,
`goalid` int(11) unsigned NOT NULL default '0',
`goalmethod` int(10) unsigned NOT NULL default '0',
`goalcount` int(11) default '1',
`delivertonpc` int(11) unsigned NOT NULL default '0',
`zoneid` int(11) NOT NULL default '0',
`optional` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`taskid`,`activityid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `activities` VALUES (1,0,1,1,'Guard Brookrock','Elven Bottle Of Wine','',36078,0,1,54124,54,0),(1,1,2,5,'Camp of Outsiders','','',1,0,1,0,54,0),(1,2,3,4,'Guard Brookrock','','',54124,0,1,0,54,0),(1,3,4,2,'Bandi ts','','',7,1,3,0,54,0),(1,4,5,4,'Guard Brookrock','','',54124,0,1,0,54,0),(1,5,6,5,'the entrance to Crushbone Citadel','','',2,0,1,0,54,0),(1,6,6,2,'Orcs','','' ,1,1,5,0,54,0),(1,7,7,4,'Guard Brookrock','','',54124,0,1,0,54,0),(1,8,8,4,'V\'Ly nn Renloe','','',202291,0,1,0,202,0),(2,0,0,2,'Orcs', '','',1,1,5,0,21,0),(2,1,0,3,'any creature','Rusty Items','',2,1,3,0,0,0),(2,2,0,5,'','','Locate the Antonica Spires in the Luclin Nexus',1,0,1,0,152,0),(3,0,0,7,'','Fish','',4,1,1, 0,69,0),(3,1,0,8,'','Roots, berries, mushrooms or cherries','',3,1,1,0,69,0),(3,2,0,2,'','','Kill Pyzjn',4147,0,1,0,0,1),(4,0,0,11,'','','Locate the lair of Innoruuk',0,0,1,0,76,0),(4,1,0,11,'','','Find the lair of Cazic Thule',0,0,1,0,72,0),(5,0,0,3,'','','Recover the Ring of the Ancients',12268,0,1,0,0,0),(5,1,0,3,'','','Retriev e a Shadowed Rapier',7100,0,1,0,0,0),(5,2,2,1,'','','Return the Ring of the Ancients to Hasten Bootstrutter',12268,0,1,50320,50,0),(5,3,2,1,'','' ,'Present the Shadowed Rapier to Hasten Bootstrutter',7100,0,1,50320,50,0),(5,4,2,100,'',' ','Give 3500 gold pieces to Hasten Bootstrutter',0,0,350000,50320,50,0),(6,0,0,6,'Cla ss 1 Wood Point Arrows','Class 1 Wood Point Arrows','',8,1,10,0,0,0),(7,0,0,2,'Rats','','',9,1 ,10,0,4,0),(7,1,0,4,'Guard Philbin','','',4062,2,1,0,4,0),(7,2,0,2,'','','Kil l 1 more rat please',9,1,1,0,4,0),(7,3,0,4,'Guard Philbin','','',4062,2,1,0,4,0),(8,0,0,2,'Bats','', '',10,1,5,0,4,0),(8,1,0,4,'Guard Philbin','','',4062,2,1,0,4,0),(9,0,0,2,'Snakes',' ','',11,1,2,0,4,0),(9,1,0,4,'Guard Philbin','','',4062,2,1,0,4,0),(10,0,0,2,'Gnolls', '','',12,1,3,0,4,0),(10,1,0,4,'Guard Philbin','','',4062,2,1,0,4,0),(11,0,0,2,'Skeleton s','','',13,1,6,0,4,0),(11,1,0,4,'Guard Philbin','','',4062,2,1,0,4,0);


DROP TABLE IF EXISTS `character_tasks`;
CREATE TABLE `character_tasks` (
`charid` int(11) unsigned NOT NULL,
`taskid` int(11) unsigned NOT NULL,
`slot` int(11) unsigned NOT NULL,
`acceptedtime` int(11) unsigned default NULL,
PRIMARY KEY (`charid`,`taskid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `character_activities`;
CREATE TABLE `character_activities` (
`charid` int(11) unsigned NOT NULL,
`taskid` int(11) unsigned NOT NULL,
`activityid` int(11) unsigned NOT NULL default '0',
`donecount` int(11) unsigned NOT NULL default '0',
`completed` tinyint(1) default '0',
PRIMARY KEY (`charid`,`taskid`,`activityid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `character_enabledtasks`;
CREATE TABLE `character_enabledtasks` (
`charid` int(11) unsigned NOT NULL,
`taskid` int(11) unsigned NOT NULL,
PRIMARY KEY (`charid`,`taskid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `completed_tasks`;
CREATE TABLE `completed_tasks` (
`charid` int(11) unsigned NOT NULL,
`completedtime` int(11) unsigned NOT NULL,
`taskid` int(11) unsigned NOT NULL,
`activityid` int(11) NOT NULL,
PRIMARY KEY (`charid`,`completedtime`,`taskid`,`activityid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `goallists`;
CREATE TABLE `goallists` (
`listid` int(10) unsigned NOT NULL,
`entry` int(10) unsigned NOT NULL,
PRIMARY KEY (`listid`,`entry`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


INSERT INTO `goallists` VALUES (1,5001),(1,5002),(1,5003),(1,5078),(1,5079),(1,50 80),(1,5082),(1,5083),(1,5084),(1,5085),(1,5089),( 1,5108),(1,5109),(1,5112),(1,5114),(1,5130),(1,912 9),(1,10000),(1,10159),(1,10166),(1,20028),(1,2003 3),(1,20036),(1,20048),(1,20171),(1,21005),(1,2101 2),(1,21026),(1,21038),(1,21039),(1,21096),(1,2109 7),(1,21102),(1,21107),(1,21115),(1,21118),(1,2111 9),(1,21121),(1,22005),(1,22022),(1,22031),(1,2205 2),(1,22053),(1,22055),(1,22142),(1,22143),(1,2214 9),(1,22155),(1,22165),(1,22171),(1,22172),(1,2217 9),(1,30033),(1,30034),(1,30042),(1,33033),(1,3303 4),(1,33036),(1,33037),(1,33038),(1,33064),(1,3310 8),(1,33113),(1,33123),(1,33124),(1,33156),(1,3401 5),(1,34105),(1,35007),(1,35008),(1,35009),(1,3501 1),(1,35034),(1,35039),(1,35042),(1,35043),(1,3504 4),(1,35052),(1,35091),(1,35092),(1,35116),(1,3512 9),(1,37014),(1,37015),(1,37017),(1,37018),(1,3702 6),(1,37032),(1,37035),(1,37040),(1,37069),(1,5002 7),(1,50028),(1,50033),(1,50034),(1,50065),(1,5007 0),(1,50211),(1,50259),(1,51088),(1,51089),(1,5109 0),(1,51110),(1,51111),(1,54001),(1,54003),(1,5400 4),(1,54008),(1,54015),(1,54016),(1,54019),(1,5402 7),(1,54037),(1,54039),(1,54185),(1,54187),(1,5418 8),(1,54190),(1,54193),(1,54194),(1,54195),(1,5420 0),(1,57001),(1,57003),(1,57004),(1,57015),(1,5702 0),(1,57040),(1,57041),(1,57056),(1,57085),(1,5709 0),(1,57136),(1,58000),(1,58001),(1,58002),(1,5800 3),(1,58004),(1,58005),(1,58006),(1,58008),(1,5800 9),(1,58011),(1,58012),(1,58013),(1,58015),(1,5801 6),(1,58024),(1,58025),(1,58026),(1,58027),(1,5802 9),(1,58033),(1,58034),(1,58035),(1,58036),(1,5803 7),(1,58038),(1,58039),(1,58040),(1,58041),(1,5804 2),(1,58043),(1,58045),(1,58047),(1,58053),(1,5805 4),(1,58055),(1,68055),(1,68056),(1,68168),(1,6816 9),(1,68190),(1,68200),(1,68223),(1,70010),(1,7001 1),(1,70042),(1,255702),(1,269011),(1,269012),(2,2 310),(2,5013),(2,5014),(2,5015),(2,5016),(2,5019), (2,5020),(2,5021),(2,5022),(2,5023),(2,5024),(2,50 25),(2,5040),(2,5072),(2,5074),(2,5076),(2,6011),( 2,6013),(2,6014),(2,6015),(2,6016),(2,6838),(2,700 7),(2,7008),(2,7009),(2,7010),(2,7790),(2,13346),( 2,13970),(2,16253),(2,19943),(2,19950),(2,20036),( 2,20176),(2,20187),(2,20198),(2,20258),(2,20297),( 2,20414),(2,26800),(2,30980),(2,31992),(2,36750),( 2,60084),(2,67531),(2,70482),(2,86875),(2,86961),( 2,89615),(2,94100),(2,94114),(2,94128),(2,94170),( 2,94212),(3,13045),(3,13046),(3,13047),(3,13048),( 3,13106),(3,13419),(3,14905),(3,14969),(3,22745),( 3,31485),(4,13019),(4,22745),(5,2300),(5,17981),(6 ,5500),(6,5507),(6,8003),(7,54035),(7,54036),(7,54 207),(7,54235),(7,54250),(7,54254),(8,8500),(8,857 2),(8,8644),(9,4007),(9,4009),(9,4013),(9,4024),(9 ,4036),(9,4043),(9,4078),(9,4080),(10,4002),(10,40 09),(10,4011),(10,4012),(10,4014),(10,4025),(10,40 39),(10,4042),(10,4043),(10,4050),(10,4051),(10,40 74),(10,4075),(10,4143),(11,4017),(11,4018),(11,40 23),(11,4044),(12,4006),(12,4015),(12,4021),(12,40 28),(12,4029),(12,4033),(12,4079),(12,4096),(12,41 52),(12,4191),(13,4010),(13,4022),(13,4045),(13,40 47),(13,4091),(13,4092),(13,4094),(13,4101),(13,41 08),(13,4109),(13,4110),(13,4112),(13,4114),(13,41 15),(13,4116),(13,4119),(13,4120),(13,4122),(13,41 25),(13,4128),(13,4129),(13,4137),(13,4139),(13,41 45),(13,4146),(13,4148),(13,4150);


DROP TABLE IF EXISTS `proximities`;
CREATE TABLE `proximities` (
`zoneid` int(10) unsigned NOT NULL,
`exploreid` int(10) unsigned NOT NULL,
`minx` float(14,6) NOT NULL,
`maxx` float(14,6) NOT NULL,
`miny` float(14,6) NOT NULL,
`maxy` float(14,6) NOT NULL,
`minz` float(14,6) NOT NULL,
`maxz` float(14,6) NOT NULL,
PRIMARY KEY (`zoneid`,`exploreid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `tasksets`;
CREATE TABLE `tasksets` (
`id` int(11) unsigned NOT NULL,
`taskid` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`,`taskid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `tasksets` VALUES (1,7),(1,8),(1,9),(1,10),(1,11);

drop table if exists `keyring`;
create table `keyring`(
`char_id` integer not null,
`item_id` integer not null
) engine=MyISAM DEFAULT CHARSET=latin1;

insert into rule_values values (1,'TaskSystem:EnableTaskSystem','true');
insert into rule_values values (1,'TaskSystem:PeriodicCheckTimer',5);
insert into rule_values values (1,'TaskSystem:RecordCompletedTasks','true');
insert into rule_values values (1,'TaskSystem:RecordCompletedOptionalActivities', 'true');
insert into rule_values values (1,'TaskSystem:KeepOneRecordPerCompletedTask','tru e');
insert into rule_values values (1,'TaskSystem:EnableTaskProximity','true');
insert into rule_values values (1,'World:EnableTutorialButton','true');
insert into rule_values values (1,'World:EnableReturnHomeButton','true');
insert into rule_values values (1,'World;MaxLevelForTutorial','10');
insert into rule_values values (1,'World:MinOfflineTimeToReturnHome','21600');
Insert into rule_values values (1, 'World:AddMaxClientsPerIP', -1);
Insert into rule_values values (1, 'World:AddMaxClientsStatus', -1);
INSERT INTO `activities` VALUES ('12', '0', '0', '2', 'giant thicket rats', '', '', '14', '1', '10', '0', '33', '0');
INSERT INTO `activities` VALUES ('12', '1', '0', '3', 'any creature', 'rat whiskers', '', '13071', '0', '4', '0', '33', '0');
INSERT INTO `activities` VALUES ('12', '2', '1', '4', 'Ace Slighthand', '', '', '0', '0', '1', '0', '19', '0');
INSERT INTO `activities` VALUES ('12', '3', '2', '1', 'Swish Appletop', 'rat whiskers', '', '13071', '0', '4', '33145', '33', '0');
INSERT INTO `goallists` VALUES ('14', '33027');
INSERT INTO `goallists` VALUES ('14', '33039');
INSERT INTO `goallists` VALUES ('14', '33055');
INSERT INTO `tasks` VALUES ('12', '0', 'Extraordinary Rodents', '[1,2, Go to the Misty Thicket, kill 10 giant thicket rats and loot four rat whiskers.]', '', '0', '722', '100', '0', '19', '1');
INSERT INTO variables VALUES ('curInstFlagNum', 2000, 'Determines what instance flag will be handed out next', '2008-09-05 04:46:47');
ALTER TABLE `zone` ADD column `insttype` tinyint (1) zerofill unsigned NOT NULL default '0';
ALTER table character_ ADD column `instZflagNum` int(10) unsigned NOT NULL default '0';
ALTER table character_ ADD column `instZOrgID` int(11) NOT NULL default '0';
INSERT INTO variables VALUES ('dfltInstZflag',1000, 'Used to determine if a zone is instanced, must be 1000 or greater', '2008-09-05 04:46:47');

ALTER TABLE `spawngroup` ADD `dist` FLOAT NOT NULL DEFAULT '0.0',
ADD `max_x` FLOAT NOT NULL DEFAULT '0.0',
ADD `min_x` FLOAT NOT NULL DEFAULT '0.0',
ADD `max_y` FLOAT NOT NULL DEFAULT '0.0',
ADD `min_y` FLOAT NOT NULL DEFAULT '0.0',
ADD `delay` INT NOT NULL DEFAULT '0';

CREATE TABLE `raid_details` (
`raidid` int(4) NOT NULL,
`loottype` int(4) NOT NULL,
`locked` tinyint(1) NOT NULL,
PRIMARY KEY (`raidid`)
);

CREATE TABLE `raid_members` (
`raidid` int(4) NOT NULL,
`charid` int(4) NOT NULL,
`groupid` int(4) NOT NULL,
`_class` tinyint(4) NOT NULL,
`level` tinyint(4) NOT NULL,
`name` varchar(64) NOT NULL,
`isgroupleader` tinyint(1) NOT NULL,
`israidleader` tinyint(1) NOT NULL,
`islooter` tinyint(1) NOT NULL,
PRIMARY KEY (`charid`)
);

Congdar
10-06-2008, 03:42 PM
But since I'm just a 'spoke on your wheel', I felt i'd consult you before making any changes.

I've been the lone programmer on the bots for over a year now, reviving it from non-working to what it is now. I made many decisions on spell lists and ai that worked for me and my playing style. Feel free to make whatever changes you feel are needed. If they work, great... if not try something different. If it's too wacked, i'll say something. I welcome any help on the bot code. Nice work, btw, on the botname000 fix, that one had me baffled. Here's my list of things that need to be worked on.

Command structure reworked. There are too many commands that take multiple(too many) words. Group and Raid commands can be combined and the check for raiding or not done in the code.
Each class with it's own AI code. currently its Cleric(which I did) or all casters or all melee.
Ranger bots need to be able to use a bow... and toggle back and forth to melee.
Spell lists need a second look. I made some interesting choices on what spells to include and what spells to ignore and how to categorize the spells. The Excel file I made would be a good reference and need to be updated.
There's lots of utilities that could be added so that choosing spell lists is easier:
#bot ranger track --- list of mobs on track
#bot ranger track [NPC name] --- tracks the closest NPC with that name.
#bot wizard port [location] --- Port to Wizard Spires with wizard in group
#bot druid port [location] --- Port to Druid spires with druid in group
#bot wizard evac
#bot druid evac
#bot [melee] discipline [name] --- where [name] is the name of the discipline, and melee is either a specific class (Shadowknight) or just "melee" for all melee classes.
#bot [class] activate [aa] --- where [class] is a class and [aa] is the name (or number) of an activated AA. Examples:
#bot cleric activate Turn Undead
#bot mage activate Pet Swarm (don't know the real name)
#bot pacify - aggro reduction
#bot resurrect - get exp back
#bot summoncorpse - if you really want it back
#bot identify - get item lore

Angelox
10-06-2008, 07:23 PM
I've been the lone programmer on the bots for over a year now, reviving it from non-working to what it is now. I made many decisions on spell lists and ai that worked for me and my playing style. Feel free to make whatever changes you feel are needed. If they work, great... if not try something different. If it's too wacked, i'll say something. I welcome any help on the bot code. Nice work, btw, on the botname000 fix, that one had me baffled. Here's my list of things that need to be worked on.


I'm trying, but in the C programming dept, I'm a far cry from what you all are.
I can see all the code and have some idea of how it works, the rest is puzzle work, back tracking what everyone has done, and looking for clues. Very slow process, took me a just about a whole week of trial and error with the botname000 fix.

I've made my ax_classic database compatible with the SVN code, so I don't have to worry about updating special codes for ax_classic anymore.
PEQ is light years ahead of my DB when it comes to content, I just have a lot of custom stuff in mine, and someone might enjoy a change once in a while.

One problem I had with the bot code was, when you had a bot group, you leveled much faster because you could take out reds much easier, so if I turned down the exp ration to where it was right for bot groups, then people who played with out bots complained; they were not getting hardly exp from blues and lite blues. I found a solution to this, might be of interest, I'll look it up and post it.

Rocker8956
10-09-2008, 04:02 PM
I just starting using Bots on my minilogin server. They are fun but I noticed something strange.

My bots hit for about 250 dmg at lvl 4 with no weapon.

I tried setting their mindmg to 1 and maxdmg to 8 in the database since they were zero but that did not help. So I then gave my lvl 7 beserker Bot a rusty warhammer and he hit for 25 dmg almost every time.

This is using svn rev 69 (fairly certain that is the version I am running atm)

Is anyone else seeing this or did I screw up my database?

Thank you

Rocker8956
10-09-2008, 04:37 PM
Small update...

When I set my bots' level to 64 it hits in a more appropriate range.
If I set it back to level 1 it hits for 250+ on mobs in droga

Congdar
10-09-2008, 04:41 PM
I copied over the bot src from the public release code, but the svn code has some things different that don't work the same way the public release code does. The hate list is different and i'm guessing some of the combat stuff is different too. I'll be looking into the differences and making updates.

Congdar
10-09-2008, 04:47 PM
when you say 'set my bots' level...' how are you doing the 'setting' ? I can take a guess that bots do not work with GM 'level' commands and that your bot was really your level and was squashing level 4 things at a high level.

Rocker8956
10-09-2008, 05:16 PM
I would set my level to 65. Zone into droga then spawn my bot.
He was hitting normal for a naked level 65 (will need to look at numbers again to get exact but I think it was between 15 and 20 for most hits)
I then zoned out of Droga, set my level to 1, zoned into droga and spawned my bot. He was level 1 but smacking stuff for 250+ while naked.

It could be my database or code. Can someone else give this a try and see if they get the same numbers?

Congdar
10-09-2008, 05:42 PM
ok, tried your test. my level 1 monk bot punched for 2 damage in droga before being killed or on retries was too low to even hit the reds there. one time got a kick for 4 and then died because of it. might be something up with your install.

Rocker8956
10-10-2008, 12:48 AM
First thank you for the bot code, I am having a lot of fun with it. GM God mode gets old after a bit. The Bots make the game soloable but not cake.

I am happy with the bots working after 22 since most zones I will be playing in are 30+. So this is not a big concern. Just thought I would post incase someone else has the same problem.

After further testing I discovered the following
At level 22 my bots hit for 250+
At level 23 they hit appropriately
Does not matter the level of the mob.
Combat:UseIntervalAC seems to have no effect on this issue.

Here is how I put my server together for this testing.
Windows XP computer.
I downloaded rev 70 from the SVN
Dumped my database, pulled the latest PEQDB using CVS
Ran all the SQL changes in the rev 70 changelog and 09252008.sql
Compiled source code after adding EQBOTS to Zone preprocessor definitions.
Put compiled source into a new folder (so I did not get left over junk from previous compiles)
Moved required files over from previous server build (Maps, Quests, plugins, .ini, .xml, launcher, etc)

Side question, would it be worth creating a separate thread for Bot support since this thread is already huge? This thread could be used for discussion/suggestions and the new one would be used for issues like mine.

Congdar
10-10-2008, 01:00 AM
It would be ok if this thread was locked and a new one started. I'll test out the level 22 issue.