Here are the diff files for those of you that requested them.
<bot.h>
Code:
295d294
< static bool GroupHasEnchanterClass(Group* group) { return GroupHasClass(group, ENCHANTER); }
<bot.cpp>
Code:
10079d10078
< c->Message(0, "#bot setfollowdistance ### - sets target bots follow distance to ### (ie 30 or 250).");
10457,10481d10455
< //Criimson: Bot follow distance - SetFollowDistance
< if(!strcasecmp(sep->arg[1], "setfollowdistance")) {
< if((c->GetTarget() == NULL) || (c->GetTarget() == c) || (!c->GetTarget()->IsBot()) ) {
< c->Message(15, "You must target a bot!");
< }
< else {
< int32 BotFollowDistance = atoi(sep->arg[2]);
< c->GetTarget()->SetFollowDistance(BotFollowDistance);
< }
<
< return;
< }
<
<
< if(!strcasecmp(sep->arg[1], "picklock")) {
< if((c->GetTarget() == NULL) || (c->GetTarget() == c) || !c->GetTarget()->IsBot() || (c->GetTarget()->GetClass() != ROGUE)) {
< c->Message(15, "You must target a rogue bot!");
< }
< else {
< entity_list.BotPickLock(c->GetTarget()->CastToBot());
< }
<
< return;
< }
<
10939,10946d10912
< //Criimson: Reordered code - was giving priority to bard
< case DRUID:
< // Unless we have a ranger, druid is next best.
< if(TrackerClass != RANGER) {
< Tracker = g->members[i];
< TrackerClass = DRUID;
< }
< break;
10954c10920,10926
<
---
> case DRUID:
> // Unless we have a ranger, druid is next best.
> if(TrackerClass != RANGER) {
> Tracker = g->members[i];
> TrackerClass = DRUID;
> }
> break;
11379,11396c11351
< //Criimson - seperated cleric and chanter so chanter is primary
< if(g && g->members[i] && g->members[i]->IsBot() && (g->members[i]->GetClass() == ENCHANTER)) {
< Bot *pacer = g->members[i]->CastToBot();
< pacer->Say("Trying to pacify %s \n", target->GetCleanName());
<
< if(pacer->Bot_Command_CalmTarget(target)) {
< if(target->FindType(SE_Lull) || target->FindType(SE_Harmony) || target->FindType(SE_Calm))
< //if(pacer->IsPacified(target))
< c->Message(0, "I have successfully pacified %s.", target->GetCleanName());
< return;
< /*else
< c->Message(0, "I failed to pacify %s.", target->GetCleanName());*/
< }
< else
< c->Message(0, "I failed to pacify %s.", target->GetCleanName());
< }
< //Criimson - seperated cleric and chanter so chanter is primary
< if(g && g->members[i] && g->members[i]->IsBot() && (g->members[i]->GetClass() == CLERIC) && (GroupHasEnchanterClass(g) == false)) {
---
> if(g && g->members[i] && g->members[i]->IsBot() && ((g->members[i]->GetClass() == ENCHANTER) || g->members[i]->GetClass() == CLERIC)) {
11404d11358
< return;
13304,13305c13258
< //CRIIMSON: Changed so heal based on health percentage is different for hybrids
< if( botCasterClass == CLERIC || botCasterClass == DRUID || botCasterClass == SHAMAN) {
---
> if( botCasterClass == CLERIC || botCasterClass == DRUID || botCasterClass == SHAMAN || botCasterClass == PALADIN || botCasterClass == BEASTLORD || botCasterClass == RANGER) {
13350,13395d13302
< //CRIIMSON: Changed so heal based on health percentage is different for hybrids
< if( botCasterClass == PALADIN || botCasterClass == BEASTLORD || botCasterClass == RANGER) {
< //If AI_EngagedCastCheck() said to the healer that he had to heal
< if( iSpellTypes == SpellType_Heal ) {
< // check in group
< if(caster->HasGroup()) {
< Group *g = caster->GetGroup();
<
< if(g) {
< for(int i = 0; i < MAX_GROUP_MEMBERS; i++) {
< if(g->members[i] && !g->members[i]->qglobal) {
< if(g->members[i]->IsClient() && g->members[i]->GetHPRatio() < 20) {
< if(caster->AICastSpell(g->members[i], iChance, SpellType_Heal))
< return true;
< }
< else if((g->members[i]->GetClass() == WARRIOR || g->members[i]->GetClass() == PALADIN || g->members[i]->GetClass() == SHADOWKNIGHT) &&
< g->members[i]->GetHPRatio() < 20)
< {
< if(caster->AICastSpell(g->members[i], 100, SpellType_Heal))
< return true;
< }
< else if(g->members[i]->GetClass() == ENCHANTER && g->members[i]->GetHPRatio() < 20) {
< if(caster->AICastSpell(g->members[i], 100, SpellType_Heal))
< return true;
< }
< else if(g->members[i]->GetHPRatio() < 20) {
< if(caster->AICastSpell(g->members[i], 100, SpellType_Heal))
< return true;
< }
< }
<
< if(g->members[i] && !g->members[i]->qglobal && g->members[i]->HasPet() && g->members[i]->GetPet()->GetHPRatio() < 20) {
< if(g->members[i]->GetPet()->GetOwner() != caster && caster->IsEngaged() && g->members[i]->IsCasting() && g->members[i]->GetClass() != ENCHANTER )
< continue;
<
< if(caster->AICastSpell(g->members[i]->GetPet(), 100, SpellType_Heal))
< return true;
< }
< }
< }
< }
<
< // TODO: raid heals
< }
< }
<
13427d13333
<
<botspellsai.cpp> (mainly pfyons archetype code)
Code:
256,278d255
< switch(tar->GetArchetype())
< {
< case ARCHETYPE_CASTER:
< //TODO: probably more caster specific spell effects in here
< if(IsEffectInSpell(selectedBotSpell.SpellId, SE_AttackSpeed) || IsEffectInSpell(selectedBotSpell.SpellId, SE_ATK) ||
< IsEffectInSpell(selectedBotSpell.SpellId, SE_STR) || IsEffectInSpell(selectedBotSpell.SpellId, SE_ReverseDS))
< {
< continue;
< }
< break;
< case ARCHETYPE_MELEE:
< //TODO: Include mana regen (breeze/clarity/etc), I don't know what spell effect it is
< if(IsEffectInSpell(selectedBotSpell.SpellId, SE_IncreaseSpellHaste))
< {
< continue;
< }
< break;
< case ARCHETYPE_HYBRID:
< //Hybrids get all buffs
< default:
< break;
< }
<
323,333d299
< if(botClass == CLERIC && this->GetManaRatio() <= 75.0f)
< {
< //If we're at 75% mana or below, don't nuke as a cleric or 50% as enchanter
< break;
< }
< if(botClass == ENCHANTER && this->GetManaRatio() <= 50.0f)
< {
< //If we're at 75% mana or below, don't nuke as a cleric or 50% as enchanter
< break;
< }
<
569,571c535,536
< if(!addMob){
< //Say("!addMob.");
< break;}
---
> if(!addMob)
> break;
577d541
<
580c544
< }
---
> }
761,762d724
<
<
1352c1314
<
---
>
These are needed from pfyons cleric/archetype code:
<mob.h>
Code:
55,66d54
< #define APPEAR_HEIGHT 0x001d
< #define APPEAR_HP_TIC 0x0011
<
< #define ARCHETYPE_HYBRID 1
< #define ARCHETYPE_CASTER 2
< #define ARCHETYPE_MELEE 3
<
< #define CON_GREEN 2
< #define CON_LIGHTBLUE 18
< #define CON_BLUE 4
<
<
684,687c672,674
< char GetCasterClass() const;
< uint8 GetArchetype() const;
< virtual sint32 CalcMaxMana();
<
---
> char GetCasterClass() const;
> virtual sint32 CalcMaxMana();
>
<mob.cpp>
Code:
675,721d674
< uint8 Mob::GetArchetype() const {
< switch(class_)
< {
< case PALADIN:
< case RANGER:
< case SHADOWKNIGHT:
< case BARD:
< case BEASTLORD:
< case PALADINGM:
< case RANGERGM:
< case SHADOWKNIGHTGM:
< case BARDGM:
< case BEASTLORDGM:
< return ARCHETYPE_HYBRID;
< break;
< case CLERIC:
< case DRUID:
< case SHAMAN:
< case NECROMANCER:
< case WIZARD:
< case MAGICIAN:
< case ENCHANTER:
< case CLERICGM:
< case DRUIDGM:
< case SHAMANGM:
< case NECROMANCERGM:
< case WIZARDGM:
< case MAGICIANGM:
< case ENCHANTERGM:
< return ARCHETYPE_CASTER;
< break;
< case WARRIOR:
< case MONK:
< case ROGUE:
< case BERSERKER:
< case WARRIORGM:
< case MONKGM:
< case ROGUEGM:
< case BERSERKERGM:
< return ARCHETYPE_MELEE;
< break;
< default:
< return ARCHETYPE_HYBRID;
< break;
< }
< }
<
This is the sql to add chanter mez spells to its AI in the DB
Code:
INSERT INTO `npc_spells_entries` (`id`, `npc_spells_id`, `spellid`, `type`, `minlevel`, `maxlevel`) VALUES (8145, 705, 190, 2048, 47, 55);
INSERT INTO `npc_spells_entries` (`id`, `npc_spells_id`, `spellid`, `type`, `minlevel`, `maxlevel`) VALUES (8146, 705, 292, 2048, 2, 55);
INSERT INTO `npc_spells_entries` (`id`, `npc_spells_id`, `spellid`, `type`, `minlevel`, `maxlevel`) VALUES (8147, 705, 187, 2048, 13, 55);
INSERT INTO `npc_spells_entries` (`id`, `npc_spells_id`, `spellid`, `type`, `minlevel`, `maxlevel`) VALUES (8148, 705, 188, 2048, 30, 55);
INSERT INTO `npc_spells_entries` (`id`, `npc_spells_id`, `spellid`, `type`, `minlevel`) VALUES (8150, 705, 1691, 2048, 54);
INSERT INTO `npc_spells_entries` (`id`, `npc_spells_id`, `spellid`, `type`, `minlevel`) VALUES (8151, 705, 1692, 2048, 59);
INSERT INTO `npc_spells_entries` (`id`, `npc_spells_id`, `spellid`, `type`, `minlevel`) VALUES (8152, 705, 3341, 2048, 60);
INSERT INTO `npc_spells_entries` (`id`, `npc_spells_id`, `spellid`, `type`, `minlevel`) VALUES (8153, 705, 3341, 2048, 61);
INSERT INTO `npc_spells_entries` (`id`, `npc_spells_id`, `spellid`, `type`, `minlevel`) VALUES (8154, 705, 3354, 2048, 63);
INSERT INTO `npc_spells_entries` (`id`, `npc_spells_id`, `spellid`, `type`, `minlevel`) VALUES (8155, 705, 3358, 2048, 64);
INSERT INTO `npc_spells_entries` (`id`, `npc_spells_id`, `spellid`, `type`, `minlevel`) VALUES (8156, 705, 5503, 2048, 67);
INSERT INTO `npc_spells_entries` (`id`, `npc_spells_id`, `spellid`, `type`, `minlevel`) VALUES (8157, 705, 8035, 2048, 68);
INSERT INTO `npc_spells_entries` (`id`, `npc_spells_id`, `spellid`, `type`, `minlevel`) VALUES (8158, 705, 5520, 2048, 69);
This only includes the spells up to level 70.
Criimson
EDIT: AoE mezzes arent going to be inluded until I add some code to check for number to be mezzed at some point. Say 3+ and chanter will aoe mez, but for now the bot is pretty damn fast once it starts mezzing. The only tweak is that it tends to tash the MT before it starts mezzing...will work on that soon.
|