From f069caa73c09b3a78b8867e8f97f888bcfa6bda1 Mon Sep 17 00:00:00 2001 From: blueboy Date: Thu, 10 Dec 2009 23:36:54 +0000 Subject: [PATCH 001/187] * Adjust playerbot to work with recent changes to MaNGOS branch, * simplify LOOT ROLL & prettify my recent patches. --- src/game/Chat.cpp | 4 +- src/game/Chat.h | 3 +- src/game/GossipDef.h | 2 + src/game/NPCHandler.cpp | 22 ++++++- src/game/Player.cpp | 12 +++- src/game/Player.h | 4 ++ src/game/PlayerbotHunterAI.cpp | 112 ++++++++++++++++----------------- src/game/PlayerbotMgr.cpp | 99 ++++++++++++----------------- 8 files changed, 138 insertions(+), 120 deletions(-) diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index f510fc0e4..ac1ed3fd3 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -667,7 +667,9 @@ ChatCommand * ChatHandler::getCommandTable() { "flusharenapoints",SEC_ADMINISTRATOR, false, &ChatHandler::HandleFlushArenaPointsCommand, "", NULL }, { "repairitems", SEC_GAMEMASTER, true, &ChatHandler::HandleRepairitemsCommand, "", NULL }, { "waterwalk", SEC_GAMEMASTER, false, &ChatHandler::HandleWaterwalkCommand, "", NULL }, - { "quit", SEC_CONSOLE, true, &ChatHandler::HandleQuitCommand, "", NULL }, + //Playerbot mod + { "bot", SEC_PLAYER, false, &ChatHandler::HandlePlayerbotCommand, "", NULL }, + { "quit", SEC_CONSOLE, true, &ChatHandler::HandleQuitCommand, "", NULL }, { NULL, 0, false, NULL, "", NULL } }; diff --git a/src/game/Chat.h b/src/game/Chat.h index 84231ac11..6ac966697 100644 --- a/src/game/Chat.h +++ b/src/game/Chat.h @@ -498,8 +498,9 @@ class ChatHandler bool HandleFlushArenaPointsCommand(const char *args); bool HandleRepairitemsCommand(const char* args); bool HandleWaterwalkCommand(const char* args); + bool HandlePlayerbotCommand(const char* args); bool HandleQuitCommand(const char* args); - + //! Development Commands bool HandleSaveAllCommand(const char* args); diff --git a/src/game/GossipDef.h b/src/game/GossipDef.h index 1cb39b7d0..960a82e95 100644 --- a/src/game/GossipDef.h +++ b/src/game/GossipDef.h @@ -48,6 +48,8 @@ enum Gossip_Option GOSSIP_OPTION_ARMORER = 15, //UNIT_NPC_FLAG_ARMORER (4096) GOSSIP_OPTION_UNLEARNTALENTS = 16, //UNIT_NPC_FLAG_TRAINER (16) (bonus option for GOSSIP_OPTION_TRAINER) GOSSIP_OPTION_UNLEARNPETSKILLS = 17, //UNIT_NPC_FLAG_TRAINER (16) (bonus option for GOSSIP_OPTION_TRAINER) + // Playerbot mod + GOSSIP_OPTION_BOT = 99, //UNUSED (just for bot system) GOSSIP_OPTION_MAX }; diff --git a/src/game/NPCHandler.cpp b/src/game/NPCHandler.cpp index 35f4b7268..b2b40172f 100644 --- a/src/game/NPCHandler.cpp +++ b/src/game/NPCHandler.cpp @@ -273,8 +273,8 @@ void WorldSession::HandleGossipHelloOpcode(WorldPacket & recv_data) if(pCreature->isBotGiver()) { GetPlayer()->TalkedToCreature(pCreature->GetEntry(),pCreature->GetGUID()); - pCreature->prepareGossipMenu(GetPlayer(),GOSSIP_OPTION_BOT); - pCreature->sendPreparedGossip(GetPlayer()); + _player->PrepareGossipMenu(pCreature,GOSSIP_OPTION_BOT); + _player->SendPreparedGossip(pCreature); pCreature->StopMoving(); } else if (!pCreature->IsStopped()) @@ -321,6 +321,24 @@ void WorldSession::HandleGossipSelectOptionOpcode( WorldPacket & recv_data ) if (GetPlayer()->hasUnitState(UNIT_STAT_DIED)) GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); + // Playerbot mod + if(pCreature->isBotGiver() && !_player->GetPlayerbotAI()) + { + if (!_player->GetPlayerbotMgr()) + _player->SetPlayerbotMgr(new PlayerbotMgr(_player)); + WorldSession * m_session = _player->GetSession(); + uint64 guidlo = _player->PlayerTalkClass->GossipOptionSender(gossipListId); + if(_player->GetPlayerbotMgr()->GetPlayerBot(guidlo) != NULL) + { + _player->GetPlayerbotMgr()->LogoutPlayerBot(guidlo); + } + else if(_player->GetPlayerbotMgr()->GetPlayerBot(guidlo) == NULL) + { + _player->GetPlayerbotMgr()->AddPlayerBot(guidlo); + } + _player->PlayerTalkClass->CloseGossip(); + } + if (!code.empty()) { if (!Script->GossipSelectWithCode(_player, pCreature, _player->PlayerTalkClass->GossipOptionSender(gossipListId), _player->PlayerTalkClass->GossipOptionAction(gossipListId), code.c_str())) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 4761f4400..743c9de68 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -12217,6 +12217,12 @@ void Player::PrepareGossipMenu(WorldObject *pSource, uint32 menuId) GossipMenuItemsMapBounds pMenuItemBounds = sObjectMgr.GetGossipMenuItemsMapBounds(menuId); + // Playerbot mod + Creature *pCreature = (Creature*)pSource; + + if(pCreature->isBotGiver()) + pCreature->LoadBotMenu(this); + // if default menuId and no menu options exist for this, use options from default options if (pMenuItemBounds.first == pMenuItemBounds.second && menuId == GetDefaultGossipMenuForSource(pSource)) pMenuItemBounds = sObjectMgr.GetGossipMenuItemsMapBounds(0); @@ -12516,6 +12522,10 @@ void Player::OnGossipSelect(WorldObject* pSource, uint32 gossipListId, uint32 me GetSession()->SendBattlegGroundList(guid, bgTypeId); break; } + // Playerbot START + case GOSSIP_OPTION_BOT: + break; + // Playerbot END } } @@ -21311,4 +21321,4 @@ void Player::SetHomebindToCurrentPos() // update sql homebind CharacterDatabase.PExecute("UPDATE character_homebind SET map = '%u', zone = '%u', position_x = '%f', position_y = '%f', position_z = '%f' WHERE guid = '%u'", m_homebindMapId, m_homebindZoneId, m_homebindX, m_homebindY, m_homebindZ, GetGUIDLow()); -} \ No newline at end of file +} diff --git a/src/game/Player.h b/src/game/Player.h index 81736c897..6bc95f245 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -2540,6 +2540,10 @@ class MANGOS_DLL_SPEC Player : public Unit GridReference m_gridRef; MapReference m_mapRef; + // Playerbot mod: + PlayerbotAI* m_playerbotAI; + PlayerbotMgr* m_playerbotMgr; + // Homebind coordinates uint32 m_homebindMapId; uint16 m_homebindZoneId; diff --git a/src/game/PlayerbotHunterAI.cpp b/src/game/PlayerbotHunterAI.cpp index 074c22a68..3b902d397 100644 --- a/src/game/PlayerbotHunterAI.cpp +++ b/src/game/PlayerbotHunterAI.cpp @@ -12,7 +12,7 @@ PlayerbotHunterAI::PlayerbotHunterAI(Player* const master, Player* const bot, Pl PET_DISMISS = ai->getSpellId("dismiss pet"); PET_REVIVE = ai->getSpellId("revive pet"); PET_MEND = ai->getSpellId("mend pet"); - PET_FEED = 1539; + PET_FEED = 1539; // PET SKILLS INTIMIDATION = ai->getSpellId("intimidation"); // (generic) @@ -355,63 +355,63 @@ void PlayerbotHunterAI::DoNonCombatActions() ai->TellMaster( "healing pet." ); } else if(pet->GetHappinessState() != HAPPY) // if pet is hungry - { - // list out items in main backpack - for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; slot++) - { - Item* const pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); - if (pItem) - { - const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto ) - continue; - - if(pet->HaveInDiet(pItemProto)) // is pItem in pets diet - { - //sLog.outDebug("Food for pet: %s",pItemProto->Name1); - uint32 count = 1; // number of items used - int32 benefit = pet->GetCurrentFoodBenefitLevel(pItemProto->ItemLevel); // nutritional value of food - m_bot->DestroyItemCount(pItem,count,true); // remove item from inventory - m_bot->CastCustomSpell(m_bot,PET_FEED,&benefit,NULL,NULL,true); // feed pet - ai->TellMaster( "feeding pet." ); - ai->SetIgnoreUpdateTime(10); - return; - } - } - } - // list out items in other removable backpacks - for (uint8 bag = INVENTORY_SLOT_BAG_START; bag < INVENTORY_SLOT_BAG_END; ++bag) - { - const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); - if (pBag) - { - for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) - { - Item* const pItem = m_bot->GetItemByPos(bag, slot); - if (pItem) - { - const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto ) - continue; - - if(pet->HaveInDiet(pItemProto)) // is pItem in pets diet - { - //sLog.outDebug("Food for pet: %s",pItemProto->Name1); - uint32 count = 1; // number of items used - int32 benefit = pet->GetCurrentFoodBenefitLevel(pItemProto->ItemLevel); // nutritional value of food - m_bot->DestroyItemCount(pItem,count,true); // remove item from inventory - m_bot->CastCustomSpell(m_bot,PET_FEED,&benefit,NULL,NULL,true); // feed pet - ai->TellMaster( "feeding pet." ); - ai->SetIgnoreUpdateTime(10); - return; - } - } - } - } - } + { + // list out items in main backpack + for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; slot++) + { + Item* const pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); + if (pItem) + { + const ItemPrototype* const pItemProto = pItem->GetProto(); + if (!pItemProto ) + continue; + + if(pet->HaveInDiet(pItemProto)) // is pItem in pets diet + { + //sLog.outDebug("Food for pet: %s",pItemProto->Name1); + uint32 count = 1; // number of items used + int32 benefit = pet->GetCurrentFoodBenefitLevel(pItemProto->ItemLevel); // nutritional value of food + m_bot->DestroyItemCount(pItem,count,true); // remove item from inventory + m_bot->CastCustomSpell(m_bot,PET_FEED,&benefit,NULL,NULL,true); // feed pet + ai->TellMaster( "feeding pet." ); + ai->SetIgnoreUpdateTime(10); + return; + } + } + } + // list out items in other removable backpacks + for (uint8 bag = INVENTORY_SLOT_BAG_START; bag < INVENTORY_SLOT_BAG_END; ++bag) + { + const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); + if (pBag) + { + for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) + { + Item* const pItem = m_bot->GetItemByPos(bag, slot); + if (pItem) + { + const ItemPrototype* const pItemProto = pItem->GetProto(); + if (!pItemProto ) + continue; + + if(pet->HaveInDiet(pItemProto)) // is pItem in pets diet + { + //sLog.outDebug("Food for pet: %s",pItemProto->Name1); + uint32 count = 1; // number of items used + int32 benefit = pet->GetCurrentFoodBenefitLevel(pItemProto->ItemLevel); // nutritional value of food + m_bot->DestroyItemCount(pItem,count,true); // remove item from inventory + m_bot->CastCustomSpell(m_bot,PET_FEED,&benefit,NULL,NULL,true); // feed pet + ai->TellMaster( "feeding pet." ); + ai->SetIgnoreUpdateTime(10); + return; + } + } + } + } + } if( pet->HasAura(PET_MEND,0) && !pet->HasAura(PET_FEED,0) ) ai->TellMaster( "..no pet food!" ); - ai->SetIgnoreUpdateTime(7); + ai->SetIgnoreUpdateTime(7); } } } // end DoNonCombatActions diff --git a/src/game/PlayerbotMgr.cpp b/src/game/PlayerbotMgr.cpp index 245497418..0e4e5c897 100644 --- a/src/game/PlayerbotMgr.cpp +++ b/src/game/PlayerbotMgr.cpp @@ -281,65 +281,46 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) } return; } - case CMSG_LOOT_ROLL: - { - - WorldPacket p(packet); //WorldPacket packet for CMSG_LOOT_ROLL, (8+4+1) - uint64 Guid; - uint32 NumberOfPlayers; - uint8 rollType; - p.rpos(0); //reset packet pointer - p >> Guid; //guid of the item rolled - p >> NumberOfPlayers; //number of players invited to roll - p >> rollType; //need,greed or pass on roll - - - for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) - { - - uint32 choice = urand(0,2); //returns 0,1,or 2 - - Player* const bot = it->second; - if(!bot) - return; - - Group* group = bot->GetGroup(); - if(!group) - return; - - switch (group->GetLootMethod()) - { - case GROUP_LOOT: - // bot random roll - group->CountRollVote(bot->GetGUID(), Guid, NumberOfPlayers, choice); - break; - case NEED_BEFORE_GREED: - choice = 1; - // bot need roll - group->CountRollVote(bot->GetGUID(), Guid, NumberOfPlayers, choice); - break; - case MASTER_LOOT: - choice = 0; - // bot pass on roll - group->CountRollVote(bot->GetGUID(), Guid, NumberOfPlayers, choice); - break; - default: - break; - } - - switch (rollType) - { - case ROLL_NEED: - bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED, 1); - break; - case ROLL_GREED: - bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED, 1); - break; - } - - } - return; - } + case CMSG_LOOT_ROLL: + { + + WorldPacket p(packet); //WorldPacket packet for CMSG_LOOT_ROLL, (8+4+1) + uint64 Guid; + uint32 NumberOfPlayers; + uint8 rollType; + p.rpos(0); //reset packet pointer + p >> Guid; //guid of the item rolled + p >> NumberOfPlayers; //number of players invited to roll + p >> rollType; //need,greed or pass on roll + + + for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) + { + + uint32 choice = urand(0,2); //returns 0,1,or 2 + + Player* const bot = it->second; + if(!bot) + return; + + Group* group = bot->GetGroup(); + if(!group) + return; + + group->CountRollVote(bot->GetGUID(), Guid, NumberOfPlayers, choice); + + switch (choice) + { + case ROLL_NEED: + bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED, 1); + break; + case ROLL_GREED: + bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED, 1); + break; + } + } + return; + } /* From 3155cddf7beb24c7509e06fb32833f5d83bdbff5 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 17 Dec 2009 19:54:46 +0000 Subject: [PATCH 002/187] Removed redundant 'botguy' code --- mangos_botguy.sql | 2 -- mangos_command_bot.sql | 1 - src/game/Creature.cpp | 12 --------- src/game/Creature.h | 4 --- src/game/GossipDef.h | 2 -- src/game/NPCHandler.cpp | 29 +--------------------- src/game/Player.cpp | 10 -------- src/game/PlayerbotMgr.cpp | 51 --------------------------------------- 8 files changed, 1 insertion(+), 110 deletions(-) delete mode 100644 mangos_botguy.sql delete mode 100644 mangos_command_bot.sql diff --git a/mangos_botguy.sql b/mangos_botguy.sql deleted file mode 100644 index c2307efb6..000000000 --- a/mangos_botguy.sql +++ /dev/null @@ -1,2 +0,0 @@ -INSERT INTO `creature_template` VALUES ('99002','0','0','0','0','0','20','0','20','0','Pappy Looter','The Bot Recruiter',NULL,'59','61','6700','24000','5598','5875','20','35','35','1','1.48','0','0','181','189','0','158','1','1400','1900','0','0','0','0','0','0','0','0','0','0','100','7','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','','1','3','1','1','0','0','0','0','0','0','0','0','1','0','0','0','bot_giver'); - diff --git a/mangos_command_bot.sql b/mangos_command_bot.sql deleted file mode 100644 index fdd594bdd..000000000 --- a/mangos_command_bot.sql +++ /dev/null @@ -1 +0,0 @@ -INSERT INTO `command`(`name`,`security`,`help`) values ('bot',0,'Syntax: .bot [$command] [$playername]\r\n\r\nadd [$playername] or remove [$playername]'); diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index 4e80548a5..18d95aab0 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -287,11 +287,6 @@ bool Creature::UpdateEntry(uint32 Entry, uint32 team, const CreatureData *data ) else setFaction(GetCreatureInfo()->faction_A); - // Playerbot START - if(isBotGiver()) - SetUInt32Value(UNIT_NPC_FLAGS, 1); - else - // Playerbot END SetUInt32Value(UNIT_NPC_FLAGS,GetCreatureInfo()->npcflag); SetAttackTime(BASE_ATTACK, GetCreatureInfo()->baseattacktime); @@ -1253,13 +1248,6 @@ void Creature::setDeathState(DeathState s) RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); AddMonsterMoveFlag(MONSTER_MOVE_WALK); - // Playerbot mod - //SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); - if(isBotGiver()) - SetUInt32Value(UNIT_NPC_FLAGS, 1); - else - // End Playerbot mod - SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); Unit::setDeathState(ALIVE); clearUnitState(UNIT_STAT_ALL_STATE); diff --git a/src/game/Creature.h b/src/game/Creature.h index fda3371bc..f7082f993 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -392,10 +392,6 @@ class MANGOS_DLL_SPEC Creature : public Unit bool isRacialLeader() const { return GetCreatureInfo()->RacialLeader; } bool isCivilian() const { return GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_CIVILIAN; } - // Playerbot mod - adds functionality to load/unload bots from NPC, also need to apply SQL scripts - bool isBotGiver(); - void LoadBotMenu(Player *pPlayer); - bool canWalk() const { return GetCreatureInfo()->InhabitType & INHABIT_GROUND; } bool canSwim() const { return GetCreatureInfo()->InhabitType & INHABIT_WATER; } bool canFly() const { return GetCreatureInfo()->InhabitType & INHABIT_AIR; } diff --git a/src/game/GossipDef.h b/src/game/GossipDef.h index 960a82e95..1cb39b7d0 100644 --- a/src/game/GossipDef.h +++ b/src/game/GossipDef.h @@ -48,8 +48,6 @@ enum Gossip_Option GOSSIP_OPTION_ARMORER = 15, //UNIT_NPC_FLAG_ARMORER (4096) GOSSIP_OPTION_UNLEARNTALENTS = 16, //UNIT_NPC_FLAG_TRAINER (16) (bonus option for GOSSIP_OPTION_TRAINER) GOSSIP_OPTION_UNLEARNPETSKILLS = 17, //UNIT_NPC_FLAG_TRAINER (16) (bonus option for GOSSIP_OPTION_TRAINER) - // Playerbot mod - GOSSIP_OPTION_BOT = 99, //UNUSED (just for bot system) GOSSIP_OPTION_MAX }; diff --git a/src/game/NPCHandler.cpp b/src/game/NPCHandler.cpp index b2b40172f..d0451cd0d 100644 --- a/src/game/NPCHandler.cpp +++ b/src/game/NPCHandler.cpp @@ -33,7 +33,6 @@ #include "Creature.h" #include "Pet.h" #include "Guild.h" -#include "PlayerbotMgr.h" void WorldSession::HandleTabardVendorActivateOpcode( WorldPacket & recv_data ) { @@ -269,15 +268,7 @@ void WorldSession::HandleGossipHelloOpcode(WorldPacket & recv_data) if (GetPlayer()->hasUnitState(UNIT_STAT_DIED)) GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); - // Playerbot mod - if(pCreature->isBotGiver()) - { - GetPlayer()->TalkedToCreature(pCreature->GetEntry(),pCreature->GetGUID()); - _player->PrepareGossipMenu(pCreature,GOSSIP_OPTION_BOT); - _player->SendPreparedGossip(pCreature); - pCreature->StopMoving(); - } - else if (!pCreature->IsStopped()) + if (!pCreature->IsStopped()) pCreature->StopMoving(); if (pCreature->isSpiritGuide()) @@ -321,24 +312,6 @@ void WorldSession::HandleGossipSelectOptionOpcode( WorldPacket & recv_data ) if (GetPlayer()->hasUnitState(UNIT_STAT_DIED)) GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); - // Playerbot mod - if(pCreature->isBotGiver() && !_player->GetPlayerbotAI()) - { - if (!_player->GetPlayerbotMgr()) - _player->SetPlayerbotMgr(new PlayerbotMgr(_player)); - WorldSession * m_session = _player->GetSession(); - uint64 guidlo = _player->PlayerTalkClass->GossipOptionSender(gossipListId); - if(_player->GetPlayerbotMgr()->GetPlayerBot(guidlo) != NULL) - { - _player->GetPlayerbotMgr()->LogoutPlayerBot(guidlo); - } - else if(_player->GetPlayerbotMgr()->GetPlayerBot(guidlo) == NULL) - { - _player->GetPlayerbotMgr()->AddPlayerBot(guidlo); - } - _player->PlayerTalkClass->CloseGossip(); - } - if (!code.empty()) { if (!Script->GossipSelectWithCode(_player, pCreature, _player->PlayerTalkClass->GossipOptionSender(gossipListId), _player->PlayerTalkClass->GossipOptionAction(gossipListId), code.c_str())) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 743c9de68..990c99c95 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -12217,12 +12217,6 @@ void Player::PrepareGossipMenu(WorldObject *pSource, uint32 menuId) GossipMenuItemsMapBounds pMenuItemBounds = sObjectMgr.GetGossipMenuItemsMapBounds(menuId); - // Playerbot mod - Creature *pCreature = (Creature*)pSource; - - if(pCreature->isBotGiver()) - pCreature->LoadBotMenu(this); - // if default menuId and no menu options exist for this, use options from default options if (pMenuItemBounds.first == pMenuItemBounds.second && menuId == GetDefaultGossipMenuForSource(pSource)) pMenuItemBounds = sObjectMgr.GetGossipMenuItemsMapBounds(0); @@ -12522,10 +12516,6 @@ void Player::OnGossipSelect(WorldObject* pSource, uint32 gossipListId, uint32 me GetSession()->SendBattlegGroundList(guid, bgTypeId); break; } - // Playerbot START - case GOSSIP_OPTION_BOT: - break; - // Playerbot END } } diff --git a/src/game/PlayerbotMgr.cpp b/src/game/PlayerbotMgr.cpp index 0e4e5c897..2928851f5 100644 --- a/src/game/PlayerbotMgr.cpp +++ b/src/game/PlayerbotMgr.cpp @@ -581,54 +581,3 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) return true; } - -void Creature::LoadBotMenu(Player *pPlayer) -{ - if (pPlayer->GetPlayerbotAI()) return; - uint64 guid = pPlayer->GetGUID(); - uint32 accountId = sObjectMgr.GetPlayerAccountIdByGUID(guid); - QueryResult *result = CharacterDatabase.PQuery("SELECT guid, name FROM characters WHERE account='%d'",accountId); - do - { - Field *fields = result->Fetch(); - uint64 guidlo = fields[0].GetUInt64(); - std::string name = fields[1].GetString(); - std::string word = ""; - - if( (guid == 0) || (guid == guidlo) ) - { - //not found or himself - } - else - { - if(sConfig.GetBoolDefault("PlayerbotAI.DisableBots", false)) return; - // create the manager if it doesn't already exist - if (! pPlayer->GetPlayerbotMgr()) - pPlayer->SetPlayerbotMgr(new PlayerbotMgr(pPlayer)); - if(pPlayer->GetPlayerbotMgr()->GetPlayerBot(guidlo) == NULL) // add (if not already in game) - { - word += "Recruit "; - word += name; - word += " as a Bot."; - pPlayer->PlayerTalkClass->GetGossipMenu().AddMenuItem((uint8)9, word, guidlo, guidlo, word, false); - } - else if(pPlayer->GetPlayerbotMgr()->GetPlayerBot(guidlo) != NULL) // remove (if in game) - { - word += "Dismiss "; - word += name; - word += " from duty."; - pPlayer->PlayerTalkClass->GetGossipMenu().AddMenuItem((uint8)0, word, guidlo, guidlo, word, false); - } - } - } - while (result->NextRow()); - delete result; -} - -bool Creature::isBotGiver() -{ - std::string scriptname = GetScriptName(); - if( scriptname == "bot_giver" ) - return true; - return false; -} From ce4c26a5545e2d47aa53a59e510f2921b114de74 Mon Sep 17 00:00:00 2001 From: blueboy Date: Mon, 21 Dec 2009 05:36:08 +0000 Subject: [PATCH 003/187] Reverse removal of 'botguy' code, * fix 'botguy' to resolve server crash --- mangos_botguy.sql | 2 ++ mangos_command_bot.sql | 1 + src/game/Creature.cpp | 15 ++++++++++- src/game/Creature.h | 4 +++ src/game/GossipDef.h | 2 ++ src/game/NPCHandler.cpp | 33 ++++++++++++++++++++++++- src/game/Player.cpp | 12 ++++++++- src/game/PlayerbotMgr.cpp | 52 +++++++++++++++++++++++++++++++++++++++ 8 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 mangos_botguy.sql create mode 100644 mangos_command_bot.sql diff --git a/mangos_botguy.sql b/mangos_botguy.sql new file mode 100644 index 000000000..82b894517 --- /dev/null +++ b/mangos_botguy.sql @@ -0,0 +1,2 @@ +INSERT INTO `creature_template` VALUES('99002','0','0','0','0','0','20','0','20','0','Pappy Looter','The BotRecruiter',NULL,'0','59','61','6700','24000','5598','5875','20','35','35','1','1.48','0','0','181','189','0','158','1','1400','1900','0','0','0','0','0','0','0','0','0','0','100','7','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','','1','3','1','1','0','0','0','0','0','0','0','0','1','0','0','0','bot_giver'); + diff --git a/mangos_command_bot.sql b/mangos_command_bot.sql new file mode 100644 index 000000000..fdd594bdd --- /dev/null +++ b/mangos_command_bot.sql @@ -0,0 +1 @@ +INSERT INTO `command`(`name`,`security`,`help`) values ('bot',0,'Syntax: .bot [$command] [$playername]\r\n\r\nadd [$playername] or remove [$playername]'); diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index 18d95aab0..d9fa79795 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -287,7 +287,12 @@ bool Creature::UpdateEntry(uint32 Entry, uint32 team, const CreatureData *data ) else setFaction(GetCreatureInfo()->faction_A); - SetUInt32Value(UNIT_NPC_FLAGS,GetCreatureInfo()->npcflag); + // Playerbot START + if(isBotGiver()) + SetUInt32Value(UNIT_NPC_FLAGS, 1); + else + SetUInt32Value(UNIT_NPC_FLAGS,GetCreatureInfo()->npcflag); + // Playerbot END SetAttackTime(BASE_ATTACK, GetCreatureInfo()->baseattacktime); SetAttackTime(OFF_ATTACK, GetCreatureInfo()->baseattacktime); @@ -1248,6 +1253,14 @@ void Creature::setDeathState(DeathState s) RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); AddMonsterMoveFlag(MONSTER_MOVE_WALK); + // Playerbot mod + //SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); + if(isBotGiver()) + SetUInt32Value(UNIT_NPC_FLAGS, 1); + else + SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); + // End Playerbot mod + SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); Unit::setDeathState(ALIVE); clearUnitState(UNIT_STAT_ALL_STATE); diff --git a/src/game/Creature.h b/src/game/Creature.h index f7082f993..fda3371bc 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -392,6 +392,10 @@ class MANGOS_DLL_SPEC Creature : public Unit bool isRacialLeader() const { return GetCreatureInfo()->RacialLeader; } bool isCivilian() const { return GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_CIVILIAN; } + // Playerbot mod - adds functionality to load/unload bots from NPC, also need to apply SQL scripts + bool isBotGiver(); + void LoadBotMenu(Player *pPlayer); + bool canWalk() const { return GetCreatureInfo()->InhabitType & INHABIT_GROUND; } bool canSwim() const { return GetCreatureInfo()->InhabitType & INHABIT_WATER; } bool canFly() const { return GetCreatureInfo()->InhabitType & INHABIT_AIR; } diff --git a/src/game/GossipDef.h b/src/game/GossipDef.h index 36c443565..2192e21f4 100644 --- a/src/game/GossipDef.h +++ b/src/game/GossipDef.h @@ -48,6 +48,8 @@ enum Gossip_Option GOSSIP_OPTION_ARMORER = 15, //UNIT_NPC_FLAG_ARMORER (4096) GOSSIP_OPTION_UNLEARNTALENTS = 16, //UNIT_NPC_FLAG_TRAINER (16) (bonus option for GOSSIP_OPTION_TRAINER) GOSSIP_OPTION_UNLEARNPETSKILLS = 17, //UNIT_NPC_FLAG_TRAINER (16) (bonus option for GOSSIP_OPTION_TRAINER) + // Playerbot mod + GOSSIP_OPTION_BOT = 99, //UNUSED (just for bot system) GOSSIP_OPTION_MAX }; diff --git a/src/game/NPCHandler.cpp b/src/game/NPCHandler.cpp index a489f8bb5..5ad72f170 100644 --- a/src/game/NPCHandler.cpp +++ b/src/game/NPCHandler.cpp @@ -33,6 +33,7 @@ #include "Creature.h" #include "Pet.h" #include "Guild.h" +#include "PlayerbotMgr.h" void WorldSession::HandleTabardVendorActivateOpcode( WorldPacket & recv_data ) { @@ -268,7 +269,15 @@ void WorldSession::HandleGossipHelloOpcode(WorldPacket & recv_data) if (GetPlayer()->hasUnitState(UNIT_STAT_DIED)) GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); - if (!pCreature->IsStopped()) + // Playerbot mod + if(pCreature->isBotGiver()) + { + _player->TalkedToCreature(pCreature->GetEntry(),pCreature->GetGUID()); + _player->PrepareGossipMenu(pCreature,GOSSIP_OPTION_BOT); + _player->SendPreparedGossip(pCreature); + pCreature->StopMoving(); + } + else if (!pCreature->IsStopped()) pCreature->StopMoving(); if (pCreature->isSpiritGuide()) @@ -304,6 +313,28 @@ void WorldSession::HandleGossipSelectOptionOpcode( WorldPacket & recv_data ) if (GetPlayer()->hasUnitState(UNIT_STAT_DIED)) GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); + // Playerbot mod + Creature *pCreature = GetPlayer()->GetNPCIfCanInteractWith(guid, UNIT_NPC_FLAG_NONE); + + if(pCreature->isBotGiver() && !_player->GetPlayerbotAI()) + { + if (!_player->GetPlayerbotMgr()) + _player->SetPlayerbotMgr(new PlayerbotMgr(_player)); + + WorldSession * m_session = _player->GetSession(); + uint64 guidlo = _player->PlayerTalkClass->GossipOptionSender(gossipListId); + if(_player->GetPlayerbotMgr()->GetPlayerBot(guidlo) != NULL) + { + _player->GetPlayerbotMgr()->LogoutPlayerBot(guidlo); + } + else if(_player->GetPlayerbotMgr()->GetPlayerBot(guidlo) == NULL) + { + _player->GetPlayerbotMgr()->AddPlayerBot(guidlo); + } + _player->PlayerTalkClass->CloseGossip(); + return; + } + // TODO: determine if scriptCall is needed for GO and also if scriptCall can be same as current, with modified argument WorldObject* // can vehicle have gossip? If so, need check for this also. diff --git a/src/game/Player.cpp b/src/game/Player.cpp index e8ec82a2f..9f493a480 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -12250,6 +12250,12 @@ void Player::PrepareGossipMenu(WorldObject *pSource, uint32 menuId) GossipMenuItemsMapBounds pMenuItemBounds = sObjectMgr.GetGossipMenuItemsMapBounds(menuId); + // Playerbot mod + Creature *pCreature = (Creature*)pSource; + + if (pCreature->isBotGiver()) + pCreature->LoadBotMenu(this); + // if default menuId and no menu options exist for this, use options from default options if (pMenuItemBounds.first == pMenuItemBounds.second && menuId == GetDefaultGossipMenuForSource(pSource)) pMenuItemBounds = sObjectMgr.GetGossipMenuItemsMapBounds(0); @@ -12548,6 +12554,10 @@ void Player::OnGossipSelect(WorldObject* pSource, uint32 gossipListId, uint32 me GetSession()->SendBattlegGroundList(guid, bgTypeId); break; } + // Playerbot START + case GOSSIP_OPTION_BOT: + break; + // Playerbot END } } @@ -21343,4 +21353,4 @@ void Player::SetHomebindToCurrentPos() // update sql homebind CharacterDatabase.PExecute("UPDATE character_homebind SET map = '%u', zone = '%u', position_x = '%f', position_y = '%f', position_z = '%f' WHERE guid = '%u'", m_homebindMapId, m_homebindZoneId, m_homebindX, m_homebindY, m_homebindZ, GetGUIDLow()); -} \ No newline at end of file +} diff --git a/src/game/PlayerbotMgr.cpp b/src/game/PlayerbotMgr.cpp index 2928851f5..a1d4b95fc 100644 --- a/src/game/PlayerbotMgr.cpp +++ b/src/game/PlayerbotMgr.cpp @@ -581,3 +581,55 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) return true; } + +void Creature::LoadBotMenu(Player *pPlayer) +{ + + if (pPlayer->GetPlayerbotAI()) return; + uint64 guid = pPlayer->GetGUID(); + uint32 accountId = sObjectMgr.GetPlayerAccountIdByGUID(guid); + QueryResult *result = CharacterDatabase.PQuery("SELECT guid, name FROM characters WHERE account='%d'",accountId); + do + { + Field *fields = result->Fetch(); + uint64 guidlo = fields[0].GetUInt64(); + std::string name = fields[1].GetString(); + std::string word = ""; + + if( (guid == 0) || (guid == guidlo) ) + { + //not found or himself + } + else + { + // if(sConfig.GetBoolDefault("PlayerbotAI.DisableBots", false)) return; + // create the manager if it doesn't already exist + if (! pPlayer->GetPlayerbotMgr()) + pPlayer->SetPlayerbotMgr(new PlayerbotMgr(pPlayer)); + if(pPlayer->GetPlayerbotMgr()->GetPlayerBot(guidlo) == NULL) // add (if not already in game) + { + word += "Recruit "; + word += name; + word += " as a Bot."; + pPlayer->PlayerTalkClass->GetGossipMenu().AddMenuItem((uint8)9, word, guidlo, guidlo, word, false); + } + else if(pPlayer->GetPlayerbotMgr()->GetPlayerBot(guidlo) != NULL) // remove (if in game) + { + word += "Dismiss "; + word += name; + word += " from duty."; + pPlayer->PlayerTalkClass->GetGossipMenu().AddMenuItem((uint8)0, word, guidlo, guidlo, word, false); + } + } + } + while (result->NextRow()); + delete result; +} + +bool Creature::isBotGiver() +{ + std::string scriptname = GetScriptName(); + if( scriptname == "bot_giver" ) + return true; + return false; +} \ No newline at end of file From 86e640ebfcb6dc982883e34bb12f289370571ad6 Mon Sep 17 00:00:00 2001 From: blueboy Date: Tue, 22 Dec 2009 12:10:33 +0000 Subject: [PATCH 004/187] Forgot to remove call to SetUInt32Value() in last commit --- src/game/Creature.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index d9fa79795..0ab43152e 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -1253,15 +1253,13 @@ void Creature::setDeathState(DeathState s) RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); AddMonsterMoveFlag(MONSTER_MOVE_WALK); - // Playerbot mod - //SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); + // Playerbot mod if(isBotGiver()) SetUInt32Value(UNIT_NPC_FLAGS, 1); else SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); // End Playerbot mod - SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); Unit::setDeathState(ALIVE); clearUnitState(UNIT_STAT_ALL_STATE); i_motionMaster.Clear(); From 2b30fbc2fb6f6b9e7dd70f4fa60811668c2efec7 Mon Sep 17 00:00:00 2001 From: blueboy Date: Fri, 25 Dec 2009 14:04:49 +0000 Subject: [PATCH 005/187] Removed 'botguy' code from playerbot, + Druid tank fix by yad02 --- mangos_botguy.sql | 2 -- mangos_command_bot.sql | 1 - src/game/Creature.cpp | 14 ++-------- src/game/Creature.h | 4 --- src/game/GossipDef.h | 2 -- src/game/NPCHandler.cpp | 33 +--------------------- src/game/Player.cpp | 10 ------- src/game/PlayerbotDruidAI.cpp | 14 +++++----- src/game/PlayerbotMgr.cpp | 52 ----------------------------------- 9 files changed, 10 insertions(+), 122 deletions(-) delete mode 100644 mangos_botguy.sql delete mode 100644 mangos_command_bot.sql diff --git a/mangos_botguy.sql b/mangos_botguy.sql deleted file mode 100644 index 82b894517..000000000 --- a/mangos_botguy.sql +++ /dev/null @@ -1,2 +0,0 @@ -INSERT INTO `creature_template` VALUES('99002','0','0','0','0','0','20','0','20','0','Pappy Looter','The BotRecruiter',NULL,'0','59','61','6700','24000','5598','5875','20','35','35','1','1.48','0','0','181','189','0','158','1','1400','1900','0','0','0','0','0','0','0','0','0','0','100','7','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','','1','3','1','1','0','0','0','0','0','0','0','0','1','0','0','0','bot_giver'); - diff --git a/mangos_command_bot.sql b/mangos_command_bot.sql deleted file mode 100644 index fdd594bdd..000000000 --- a/mangos_command_bot.sql +++ /dev/null @@ -1 +0,0 @@ -INSERT INTO `command`(`name`,`security`,`help`) values ('bot',0,'Syntax: .bot [$command] [$playername]\r\n\r\nadd [$playername] or remove [$playername]'); diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index 0ab43152e..e0a7c6be6 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -287,12 +287,7 @@ bool Creature::UpdateEntry(uint32 Entry, uint32 team, const CreatureData *data ) else setFaction(GetCreatureInfo()->faction_A); - // Playerbot START - if(isBotGiver()) - SetUInt32Value(UNIT_NPC_FLAGS, 1); - else - SetUInt32Value(UNIT_NPC_FLAGS,GetCreatureInfo()->npcflag); - // Playerbot END + SetUInt32Value(UNIT_NPC_FLAGS,GetCreatureInfo()->npcflag); SetAttackTime(BASE_ATTACK, GetCreatureInfo()->baseattacktime); SetAttackTime(OFF_ATTACK, GetCreatureInfo()->baseattacktime); @@ -1253,12 +1248,7 @@ void Creature::setDeathState(DeathState s) RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); AddMonsterMoveFlag(MONSTER_MOVE_WALK); - // Playerbot mod - if(isBotGiver()) - SetUInt32Value(UNIT_NPC_FLAGS, 1); - else - SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); - // End Playerbot mod + SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag); Unit::setDeathState(ALIVE); clearUnitState(UNIT_STAT_ALL_STATE); diff --git a/src/game/Creature.h b/src/game/Creature.h index fda3371bc..f7082f993 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -392,10 +392,6 @@ class MANGOS_DLL_SPEC Creature : public Unit bool isRacialLeader() const { return GetCreatureInfo()->RacialLeader; } bool isCivilian() const { return GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_CIVILIAN; } - // Playerbot mod - adds functionality to load/unload bots from NPC, also need to apply SQL scripts - bool isBotGiver(); - void LoadBotMenu(Player *pPlayer); - bool canWalk() const { return GetCreatureInfo()->InhabitType & INHABIT_GROUND; } bool canSwim() const { return GetCreatureInfo()->InhabitType & INHABIT_WATER; } bool canFly() const { return GetCreatureInfo()->InhabitType & INHABIT_AIR; } diff --git a/src/game/GossipDef.h b/src/game/GossipDef.h index 2192e21f4..36c443565 100644 --- a/src/game/GossipDef.h +++ b/src/game/GossipDef.h @@ -48,8 +48,6 @@ enum Gossip_Option GOSSIP_OPTION_ARMORER = 15, //UNIT_NPC_FLAG_ARMORER (4096) GOSSIP_OPTION_UNLEARNTALENTS = 16, //UNIT_NPC_FLAG_TRAINER (16) (bonus option for GOSSIP_OPTION_TRAINER) GOSSIP_OPTION_UNLEARNPETSKILLS = 17, //UNIT_NPC_FLAG_TRAINER (16) (bonus option for GOSSIP_OPTION_TRAINER) - // Playerbot mod - GOSSIP_OPTION_BOT = 99, //UNUSED (just for bot system) GOSSIP_OPTION_MAX }; diff --git a/src/game/NPCHandler.cpp b/src/game/NPCHandler.cpp index 5ad72f170..a489f8bb5 100644 --- a/src/game/NPCHandler.cpp +++ b/src/game/NPCHandler.cpp @@ -33,7 +33,6 @@ #include "Creature.h" #include "Pet.h" #include "Guild.h" -#include "PlayerbotMgr.h" void WorldSession::HandleTabardVendorActivateOpcode( WorldPacket & recv_data ) { @@ -269,15 +268,7 @@ void WorldSession::HandleGossipHelloOpcode(WorldPacket & recv_data) if (GetPlayer()->hasUnitState(UNIT_STAT_DIED)) GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); - // Playerbot mod - if(pCreature->isBotGiver()) - { - _player->TalkedToCreature(pCreature->GetEntry(),pCreature->GetGUID()); - _player->PrepareGossipMenu(pCreature,GOSSIP_OPTION_BOT); - _player->SendPreparedGossip(pCreature); - pCreature->StopMoving(); - } - else if (!pCreature->IsStopped()) + if (!pCreature->IsStopped()) pCreature->StopMoving(); if (pCreature->isSpiritGuide()) @@ -313,28 +304,6 @@ void WorldSession::HandleGossipSelectOptionOpcode( WorldPacket & recv_data ) if (GetPlayer()->hasUnitState(UNIT_STAT_DIED)) GetPlayer()->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); - // Playerbot mod - Creature *pCreature = GetPlayer()->GetNPCIfCanInteractWith(guid, UNIT_NPC_FLAG_NONE); - - if(pCreature->isBotGiver() && !_player->GetPlayerbotAI()) - { - if (!_player->GetPlayerbotMgr()) - _player->SetPlayerbotMgr(new PlayerbotMgr(_player)); - - WorldSession * m_session = _player->GetSession(); - uint64 guidlo = _player->PlayerTalkClass->GossipOptionSender(gossipListId); - if(_player->GetPlayerbotMgr()->GetPlayerBot(guidlo) != NULL) - { - _player->GetPlayerbotMgr()->LogoutPlayerBot(guidlo); - } - else if(_player->GetPlayerbotMgr()->GetPlayerBot(guidlo) == NULL) - { - _player->GetPlayerbotMgr()->AddPlayerBot(guidlo); - } - _player->PlayerTalkClass->CloseGossip(); - return; - } - // TODO: determine if scriptCall is needed for GO and also if scriptCall can be same as current, with modified argument WorldObject* // can vehicle have gossip? If so, need check for this also. diff --git a/src/game/Player.cpp b/src/game/Player.cpp index a8746e18a..c7bc99027 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -12257,12 +12257,6 @@ void Player::PrepareGossipMenu(WorldObject *pSource, uint32 menuId) GossipMenuItemsMapBounds pMenuItemBounds = sObjectMgr.GetGossipMenuItemsMapBounds(menuId); - // Playerbot mod - Creature *pCreature = (Creature*)pSource; - - if (pCreature->isBotGiver()) - pCreature->LoadBotMenu(this); - // if default menuId and no menu options exist for this, use options from default options if (pMenuItemBounds.first == pMenuItemBounds.second && menuId == GetDefaultGossipMenuForSource(pSource)) pMenuItemBounds = sObjectMgr.GetGossipMenuItemsMapBounds(0); @@ -12561,10 +12555,6 @@ void Player::OnGossipSelect(WorldObject* pSource, uint32 gossipListId, uint32 me GetSession()->SendBattlegGroundList(guid, bgTypeId); break; } - // Playerbot START - case GOSSIP_OPTION_BOT: - break; - // Playerbot END } } diff --git a/src/game/PlayerbotDruidAI.cpp b/src/game/PlayerbotDruidAI.cpp index 30e189422..a20a42b61 100644 --- a/src/game/PlayerbotDruidAI.cpp +++ b/src/game/PlayerbotDruidAI.cpp @@ -156,7 +156,7 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) { ai->CastSpell (BEAR_FORM); } - else if (DEMORALIZING_ROAR > 0 && m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0) && !m_bot->HasAura(MOONKIN_FORM, 0) && !pTarget->HasAura(DEMORALIZING_ROAR, 0) && ai->GetRageAmount() >= 10) + else if (DEMORALIZING_ROAR > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0)) && !m_bot->HasAura(MOONKIN_FORM, 0) && !pTarget->HasAura(DEMORALIZING_ROAR, 0) && ai->GetRageAmount() >= 10) { ai->CastSpell(DEMORALIZING_ROAR, *pTarget); } @@ -235,37 +235,37 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) DruidSpellCombat++; break; } - else if (ENRAGE > 0 && m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0) && DruidSpellCombat < 2 && !m_bot->HasAura(ENRAGE, 0)) + else if (ENRAGE > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0)) && DruidSpellCombat < 2 && !m_bot->HasAura(ENRAGE, 0)) { ai->CastSpell(ENRAGE, *m_bot); DruidSpellCombat = DruidSpellCombat +2; break; } - else if (SWIPE > 0 && m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0) && DruidSpellCombat < 4 && ai->GetRageAmount()>=20) + else if (SWIPE > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0)) && DruidSpellCombat < 4 && ai->GetRageAmount()>=20) { ai->CastSpell(SWIPE, *pTarget); DruidSpellCombat = DruidSpellCombat +2; break; } - else if (MAUL > 0 && m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0) && DruidSpellCombat < 6 && ai->GetRageAmount()>=15) + else if (MAUL > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0)) && DruidSpellCombat < 6 && ai->GetRageAmount()>=15) { ai->CastSpell(MAUL, *pTarget); DruidSpellCombat = DruidSpellCombat +2; break; } - else if (BASH > 0 && m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0) && !pTarget->HasAura(BASH, 0) && DruidSpellCombat < 8 && ai->GetRageAmount()>=10) + else if (BASH > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0)) && !pTarget->HasAura(BASH, 0) && DruidSpellCombat < 8 && ai->GetRageAmount()>=10) { ai->CastSpell(BASH, *pTarget); DruidSpellCombat = DruidSpellCombat +2; break; } - else if (CHALLENGING_ROAR > 0 && m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0) && pVictim != m_bot && DruidSpellCombat < 10 && !pTarget->HasAura(CHALLENGING_ROAR, 0) && !pTarget->HasAura(GROWL, 0) && ai->GetRageAmount()>=15) + else if (CHALLENGING_ROAR > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0)) && pVictim != m_bot && DruidSpellCombat < 10 && !pTarget->HasAura(CHALLENGING_ROAR, 0) && !pTarget->HasAura(GROWL, 0) && ai->GetRageAmount()>=15) { ai->CastSpell(CHALLENGING_ROAR, *pTarget); DruidSpellCombat = DruidSpellCombat +2; break; } - else if (GROWL > 0 && m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0) && pVictim != m_bot && DruidSpellCombat < 12 && !pTarget->HasAura(CHALLENGING_ROAR, 0) && !pTarget->HasAura(GROWL, 0)) + else if (GROWL > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0)) && pVictim != m_bot && DruidSpellCombat < 12 && !pTarget->HasAura(CHALLENGING_ROAR, 0) && !pTarget->HasAura(GROWL, 0)) { ai->CastSpell(GROWL, *pTarget); DruidSpellCombat = DruidSpellCombat +2; diff --git a/src/game/PlayerbotMgr.cpp b/src/game/PlayerbotMgr.cpp index a1d4b95fc..0abd67de0 100644 --- a/src/game/PlayerbotMgr.cpp +++ b/src/game/PlayerbotMgr.cpp @@ -580,56 +580,4 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) } return true; -} - -void Creature::LoadBotMenu(Player *pPlayer) -{ - - if (pPlayer->GetPlayerbotAI()) return; - uint64 guid = pPlayer->GetGUID(); - uint32 accountId = sObjectMgr.GetPlayerAccountIdByGUID(guid); - QueryResult *result = CharacterDatabase.PQuery("SELECT guid, name FROM characters WHERE account='%d'",accountId); - do - { - Field *fields = result->Fetch(); - uint64 guidlo = fields[0].GetUInt64(); - std::string name = fields[1].GetString(); - std::string word = ""; - - if( (guid == 0) || (guid == guidlo) ) - { - //not found or himself - } - else - { - // if(sConfig.GetBoolDefault("PlayerbotAI.DisableBots", false)) return; - // create the manager if it doesn't already exist - if (! pPlayer->GetPlayerbotMgr()) - pPlayer->SetPlayerbotMgr(new PlayerbotMgr(pPlayer)); - if(pPlayer->GetPlayerbotMgr()->GetPlayerBot(guidlo) == NULL) // add (if not already in game) - { - word += "Recruit "; - word += name; - word += " as a Bot."; - pPlayer->PlayerTalkClass->GetGossipMenu().AddMenuItem((uint8)9, word, guidlo, guidlo, word, false); - } - else if(pPlayer->GetPlayerbotMgr()->GetPlayerBot(guidlo) != NULL) // remove (if in game) - { - word += "Dismiss "; - word += name; - word += " from duty."; - pPlayer->PlayerTalkClass->GetGossipMenu().AddMenuItem((uint8)0, word, guidlo, guidlo, word, false); - } - } - } - while (result->NextRow()); - delete result; -} - -bool Creature::isBotGiver() -{ - std::string scriptname = GetScriptName(); - if( scriptname == "bot_giver" ) - return true; - return false; } \ No newline at end of file From bea772b8f9f49a2119e12c4e7124ca47f0c622f4 Mon Sep 17 00:00:00 2001 From: blueboy Date: Sun, 3 Jan 2010 10:11:08 +0000 Subject: [PATCH 006/187] Fix for non-resurrectable bots --- src/game/PlayerbotAI.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index 006dd4475..98d5ac84b 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -1938,9 +1938,11 @@ void PlayerbotAI::UpdateAI(const uint32 p_time) else if( m_botState == BOTSTATE_DEAD ) { // become ghost - if( m_bot->GetCorpse() ) + if( m_bot->GetCorpse() ){ + //sLog.outDebug( "[PlayerbotAI]: %s already has a corpse...", m_bot->GetName() ); + SetState( BOTSTATE_DEADRELEASED ); return; - + } m_bot->SetBotDeathTimer(); m_bot->BuildPlayerRepop(); // relocate ghost From f5508bdd7f06187f1234df61939db552436d2285 Mon Sep 17 00:00:00 2001 From: blueboy Date: Tue, 12 Jan 2010 22:34:43 +0000 Subject: [PATCH 007/187] Pre-stage merge --- src/game/ChatHandler.cpp | 2 +- src/game/PlayerbotAI.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/ChatHandler.cpp b/src/game/ChatHandler.cpp index d8429c141..ca66a0231 100644 --- a/src/game/ChatHandler.cpp +++ b/src/game/ChatHandler.cpp @@ -242,7 +242,7 @@ void WorldSession::HandleMessagechatOpcode( WorldPacket & recv_data ) } else // END Playerbot mod - GetPlayer()->Whisper(msg, lang,player->GetGUID()); + GetPlayer()->Whisper(msg, lang, player->GetGUID()); } break; case CHAT_MSG_PARTY: diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index 98d5ac84b..edddbedb3 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -543,7 +543,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) uint64 guid = extractGuid(p); if (guid != m_bot->GetGUID()) return; - m_bot->m_movementInfo.AddMovementFlag(MOVEMENTFLAG_FLYING2); + m_bot->m_movementInfo.AddMovementFlag(MOVEMENTFLAG_FLYING); //m_bot->SetSpeed(MOVE_RUN, GetMaster()->GetSpeed(MOVE_FLIGHT) +0.1f, true); return; } @@ -555,7 +555,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) uint64 guid = extractGuid(p); if (guid != m_bot->GetGUID()) return; - m_bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FLYING2); + m_bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FLYING); //m_bot->SetSpeed(MOVE_RUN,GetMaster()->GetSpeedRate(MOVE_RUN),true); return; } From 1b26e98894ed542191ac6b5898399439ce8c1259 Mon Sep 17 00:00:00 2001 From: blueboy Date: Mon, 18 Jan 2010 00:36:12 +0000 Subject: [PATCH 008/187] Fix for group invite issue --- src/game/GroupHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp index 3bd4f73e7..177e607e3 100644 --- a/src/game/GroupHandler.cpp +++ b/src/game/GroupHandler.cpp @@ -160,7 +160,7 @@ void WorldSession::HandleGroupInviteOpcode( WorldPacket & recv_data ) void WorldSession::HandleGroupAcceptOpcode( WorldPacket & recv_data ) { - recv_data.read_skip(); // value received in WorldSession::HandleGroupInviteOpcode and also skipeed currently? + // recv_data.read_skip(); // value received in WorldSession::HandleGroupInviteOpcode and also skipeed currently? Group *group = GetPlayer()->GetGroupInvite(); if (!group) return; From 079b4f0881c8078ce75184a65479b2185affcc54 Mon Sep 17 00:00:00 2001 From: blueboy Date: Thu, 28 Jan 2010 20:26:21 +0000 Subject: [PATCH 009/187] Add 'free' inventory bot command --- bot_readme.txt | 1 + src/game/PlayerbotAI.cpp | 113 +++++++++++++++++++++++++++++++++------ src/game/PlayerbotAI.h | 3 +- 3 files changed, 99 insertions(+), 18 deletions(-) diff --git a/bot_readme.txt b/bot_readme.txt index 6e13cf021..fbe4c2a29 100644 --- a/bot_readme.txt +++ b/bot_readme.txt @@ -27,6 +27,7 @@ Commands: /t BOTNAME equip /t BOTNAME reset (will reset states, orders and loot list) /t BOTNAME report (bot reports all items needed to finish quests) +/t BOTNAME free (bot shows free empty space in its inventory) Shortcuts: c = cast diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index edddbedb3..88ca1312c 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -2157,6 +2157,54 @@ bool PlayerbotAI::CastSpell(uint32 spellId) return true; } +Item* PlayerbotAI::FindItem(uint32 ItemId) +{ + // list out items in main backpack + //INVENTORY_SLOT_ITEM_START = 23 + //INVENTORY_SLOT_ITEM_END = 39 + + for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; slot++) + { + // sLog.outDebug("[%s's]backpack slot = %u",m_bot->GetName(),slot); // 23 to 38 = 16 + Item* const pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); // 255, 23 to 38 + if (pItem) + { + const ItemPrototype* const pItemProto = pItem->GetProto(); + if (!pItemProto ) + continue; + + if( pItemProto->ItemId == ItemId) // have required item + return pItem; + } + } + // list out items in other removable backpacks + //INVENTORY_SLOT_BAG_START = 19 + //INVENTORY_SLOT_BAG_END = 23 + + for (uint8 bag = INVENTORY_SLOT_BAG_START; bag < INVENTORY_SLOT_BAG_END; ++bag) // 20 to 23 = 4 + { + const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); // 255, 20 to 23 + if (pBag) + { + for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) + { + sLog.outDebug("[%s's]bag[%u] slot = %u",m_bot->GetName(),bag,slot); // 1 to bagsize = ? + Item* const pItem = m_bot->GetItemByPos(bag, slot); // 20 to 23, 1 to bagsize + if (pItem) + { + const ItemPrototype* const pItemProto = pItem->GetProto(); + if (!pItemProto ) + continue; + + if( pItemProto->ItemId == ItemId ) // have required item + return pItem; + } + } + } + } + return NULL; +} + // extracts all item ids in format below // I decided to roll my own extractor rather then use the one in ChatHandler // because this one works on a const string, and it handles multiple links @@ -2723,6 +2771,37 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) SendWhisper("and here's my attack spells:", fromPlayer); ch.SendSysMessage(negOut.str().c_str()); } + // Bag inventory project: 01:42 23/01/10 + else if (text == "free") + { + std::ostringstream out; + + uint32 totalused = 0; + // list out items in main backpack + for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; slot++) + { + const Item* const pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); + if (pItem) + totalused++; + } + uint32 totalfree = 16 - totalused; + // list out items in other removable backpacks + for (uint8 bag = INVENTORY_SLOT_BAG_START; bag < INVENTORY_SLOT_BAG_END; ++bag) + { + const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); + if (pBag) + { + ItemPrototype const* pBagProto = pBag->GetProto(); + if (pBagProto->Class == ITEM_CLASS_CONTAINER && pBagProto->SubClass == ITEM_SUBCLASS_CONTAINER) + totalfree = totalfree + pBag->GetFreeSlots(); + } + + } + out << totalfree << " Empty Slots (Total)"; + ChatHandler ch(&fromPlayer); + SendWhisper("I have this much space ", fromPlayer); + ch.SendSysMessage(out.str().c_str()); + } else @@ -2753,24 +2832,24 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) pQuest->GetRewChoiceItemsCount() > 1 && m_bot->CanRewardQuest(pQuest, false)) { - for (uint8 rewardIdx=0; !wasRewarded && rewardIdx < pQuest->GetRewChoiceItemsCount(); ++rewardIdx) - { - ItemPrototype const * const pRewardItem = sObjectMgr.GetItemPrototype(pQuest->RewChoiceItemId[rewardIdx]); - if (itemId == pRewardItem->ItemId) - { - m_bot->RewardQuest(pQuest, rewardIdx, pNpc, false); - - std::string questTitle = pQuest->GetTitle(); - m_bot->GetPlayerbotAI()->QuestLocalization(questTitle, questID); - std::string itemName = pRewardItem->Name1; - m_bot->GetPlayerbotAI()->ItemLocalization(itemName, pRewardItem->ItemId); + for (uint8 rewardIdx=0; !wasRewarded && rewardIdx < pQuest->GetRewChoiceItemsCount(); ++rewardIdx) + { + ItemPrototype const * const pRewardItem = sObjectMgr.GetItemPrototype(pQuest->RewChoiceItemId[rewardIdx]); + if (itemId == pRewardItem->ItemId) + { + m_bot->RewardQuest(pQuest, rewardIdx, pNpc, false); + + std::string questTitle = pQuest->GetTitle(); + m_bot->GetPlayerbotAI()->QuestLocalization(questTitle, questID); + std::string itemName = pRewardItem->Name1; + m_bot->GetPlayerbotAI()->ItemLocalization(itemName, pRewardItem->ItemId); - std::ostringstream out; - out << "|cffffffff|Hitem:" << pRewardItem->ItemId << ":0:0:0:0:0:0:0" << "|h[" << itemName << "]|h|r rewarded"; - SendWhisper(out.str(), fromPlayer); - wasRewarded = true; - } - } + std::ostringstream out; + out << "|cffffffff|Hitem:" << pRewardItem->ItemId << ":0:0:0:0:0:0:0" << "|h[" << itemName << "]|h|r rewarded"; + SendWhisper(out.str(), fromPlayer); + wasRewarded = true; + } + } } } diff --git a/src/game/PlayerbotAI.h b/src/game/PlayerbotAI.h index 989b1a2e1..2045ac2c5 100644 --- a/src/game/PlayerbotAI.h +++ b/src/game/PlayerbotAI.h @@ -162,7 +162,8 @@ class MANGOS_DLL_SPEC PlayerbotAI Item* FindBandage() const; Item* FindPoison() const; Item* FindMount(uint32 matchingRidingSkill) const; - + Item* FindItem(uint32 ItemId); + // ******* Actions **************************************** // Your handlers can call these actions to make the bot do things. void TellMaster(const std::string& text) const; From 281be308bbb06c3ccd4309217a45a08f0b838421 Mon Sep 17 00:00:00 2001 From: blueboy Date: Tue, 2 Feb 2010 17:36:38 +0000 Subject: [PATCH 010/187] Adjust for 'MOVEFLAG_FLYING' changes --- src/game/PlayerbotAI.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index 88ca1312c..24ca071ce 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -543,7 +543,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) uint64 guid = extractGuid(p); if (guid != m_bot->GetGUID()) return; - m_bot->m_movementInfo.AddMovementFlag(MOVEMENTFLAG_FLYING); + m_bot->m_movementInfo.AddMovementFlag(MOVEFLAG_FLYING); //m_bot->SetSpeed(MOVE_RUN, GetMaster()->GetSpeed(MOVE_FLIGHT) +0.1f, true); return; } @@ -555,7 +555,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) uint64 guid = extractGuid(p); if (guid != m_bot->GetGUID()) return; - m_bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FLYING); + m_bot->m_movementInfo.RemoveMovementFlag(MOVEFLAG_FLYING); //m_bot->SetSpeed(MOVE_RUN,GetMaster()->GetSpeedRate(MOVE_RUN),true); return; } From abd39fd1e5e7318b564d2deeeae6eb5c972eb055 Mon Sep 17 00:00:00 2001 From: blueboy Date: Sat, 20 Feb 2010 15:50:41 +0000 Subject: [PATCH 011/187] Adjust for 'SpellEffectIndex' changes --- src/game/PlayerbotAI.cpp | 2 +- src/game/PlayerbotDeathKnightAI.cpp | 62 +++++++-------- src/game/PlayerbotDruidAI.cpp | 118 ++++++++++++++-------------- src/game/PlayerbotHunterAI.cpp | 72 ++++++++--------- src/game/PlayerbotMageAI.cpp | 56 ++++++------- src/game/PlayerbotPaladinAI.cpp | 82 +++++++++---------- src/game/PlayerbotPriestAI.cpp | 34 ++++---- src/game/PlayerbotRogueAI.cpp | 36 ++++----- src/game/PlayerbotShamanAI.cpp | 70 ++++++++--------- src/game/PlayerbotWarlockAI.cpp | 60 +++++++------- src/game/PlayerbotWarriorAI.cpp | 98 +++++++++++------------ 11 files changed, 345 insertions(+), 345 deletions(-) diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index 24ca071ce..3ecc8703b 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -863,7 +863,7 @@ typedef std::multimap AuraMap; bool PlayerbotAI::HasAura(uint32 spellId, const Unit& player) const { - for (AuraMap::const_iterator iter = player.GetAuras().begin(); iter != player.GetAuras().end(); ++iter) + for (Unit::AuraMap::const_iterator iter = player.GetAuras().begin(); iter != player.GetAuras().end(); ++iter) { if (iter->second->GetId() == spellId) return true; diff --git a/src/game/PlayerbotDeathKnightAI.cpp b/src/game/PlayerbotDeathKnightAI.cpp index 1e45761dc..09dfc1dce 100644 --- a/src/game/PlayerbotDeathKnightAI.cpp +++ b/src/game/PlayerbotDeathKnightAI.cpp @@ -102,23 +102,23 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) { case SPELL_DK_UNHOLY: if (UNHOLY_PRESENCE > 0) - (!m_bot->HasAura(UNHOLY_PRESENCE, 0) && !m_bot->HasAura(BLOOD_PRESENCE, 0) && !m_bot->HasAura(FROST_PRESENCE, 0) && ai->CastSpell (UNHOLY_PRESENCE, *m_bot)); + (!m_bot->HasAura(UNHOLY_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(BLOOD_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(FROST_PRESENCE, EFFECT_INDEX_0) && ai->CastSpell (UNHOLY_PRESENCE, *m_bot)); // check for BONE_SHIELD in combat if (BONE_SHIELD > 0) - (!m_bot->HasAura(BONE_SHIELD, 0) && !m_bot->HasAura(ARMY_OF_THE_DEAD, 0) && ai->CastSpell (BONE_SHIELD, *m_bot)); + (!m_bot->HasAura(BONE_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0) && ai->CastSpell (BONE_SHIELD, *m_bot)); if (ARMY_OF_THE_DEAD > 0 && ai->GetAttackerCount()>=5 && LastSpellUnholyDK < 1) { ai->CastSpell(ARMY_OF_THE_DEAD); out << " summoning Army of the Dead!"; - if (ARMY_OF_THE_DEAD > 0 && m_bot->HasAura(ARMY_OF_THE_DEAD, 0)) + if (ARMY_OF_THE_DEAD > 0 && m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0)) ai->SetIgnoreUpdateTime(7); SpellSequence = SPELL_DK_FROST; LastSpellUnholyDK = LastSpellUnholyDK +1; break; } - else if (PLAGUE_STRIKE > 0 && !pTarget->HasAura(PLAGUE_STRIKE, 0) && LastSpellUnholyDK < 2) + else if (PLAGUE_STRIKE > 0 && !pTarget->HasAura(PLAGUE_STRIKE, EFFECT_INDEX_0) && LastSpellUnholyDK < 2) { ai->CastSpell(PLAGUE_STRIKE, *pTarget); out << " Plague Strike"; @@ -126,7 +126,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellUnholyDK = LastSpellUnholyDK +1; break; } - else if (DEATH_GRIP > 0 && !pTarget->HasAura(DEATH_GRIP, 0) && LastSpellUnholyDK < 3) + else if (DEATH_GRIP > 0 && !pTarget->HasAura(DEATH_GRIP, EFFECT_INDEX_0) && LastSpellUnholyDK < 3) { ai->CastSpell(DEATH_GRIP, *pTarget); out << " Death Grip"; @@ -142,7 +142,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellUnholyDK = LastSpellUnholyDK +1; break; } - else if (DEATH_STRIKE > 0 && !pTarget->HasAura(DEATH_STRIKE, 0) && LastSpellUnholyDK < 5) + else if (DEATH_STRIKE > 0 && !pTarget->HasAura(DEATH_STRIKE, EFFECT_INDEX_0) && LastSpellUnholyDK < 5) { ai->CastSpell(DEATH_STRIKE, *pTarget); out << " Death Strike"; @@ -150,7 +150,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellUnholyDK = LastSpellUnholyDK +1; break; } - else if (UNHOLY_BLIGHT > 0 && !pTarget->HasAura(UNHOLY_BLIGHT, 0) && LastSpellUnholyDK < 6) + else if (UNHOLY_BLIGHT > 0 && !pTarget->HasAura(UNHOLY_BLIGHT, EFFECT_INDEX_0) && LastSpellUnholyDK < 6) { ai->CastSpell(UNHOLY_BLIGHT); out << " Unholy Blight"; @@ -166,7 +166,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellUnholyDK = LastSpellUnholyDK +1; break; } - else if (DEATH_AND_DECAY > 0 && ai->GetAttackerCount()>=3 && dist <= ATTACK_DISTANCE && !pTarget->HasAura(DEATH_AND_DECAY, 0) && LastSpellUnholyDK < 8) + else if (DEATH_AND_DECAY > 0 && ai->GetAttackerCount()>=3 && dist <= ATTACK_DISTANCE && !pTarget->HasAura(DEATH_AND_DECAY, EFFECT_INDEX_0) && LastSpellUnholyDK < 8) { ai->CastSpell(DEATH_AND_DECAY); out << " Death and Decay"; @@ -175,7 +175,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellUnholyDK = LastSpellUnholyDK +1; break; } - else if (SUMMON_GARGOYLE > 0 && !m_bot->HasAura(ARMY_OF_THE_DEAD, 0) && !pTarget->HasAura(SUMMON_GARGOYLE, 0) && LastSpellUnholyDK < 9 && ai->GetRunicPower() >= 60) + else if (SUMMON_GARGOYLE > 0 && !m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0) && !pTarget->HasAura(SUMMON_GARGOYLE, EFFECT_INDEX_0) && LastSpellUnholyDK < 9 && ai->GetRunicPower() >= 60) { ai->CastSpell(SUMMON_GARGOYLE, *pTarget); out << " summoning Gargoyle"; @@ -192,7 +192,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellUnholyDK = LastSpellUnholyDK +1; break; } - else if (ANTI_MAGIC_SHELL > 0 && pTarget->IsNonMeleeSpellCasted(true) && !m_bot->HasAura(ANTI_MAGIC_SHELL, 0) && LastSpellUnholyDK < 11 && ai->GetRunicPower() >= 20) + else if (ANTI_MAGIC_SHELL > 0 && pTarget->IsNonMeleeSpellCasted(true) && !m_bot->HasAura(ANTI_MAGIC_SHELL, EFFECT_INDEX_0) && LastSpellUnholyDK < 11 && ai->GetRunicPower() >= 20) { ai->CastSpell(ANTI_MAGIC_SHELL, *m_bot); out << " Anti-Magic Shell"; @@ -200,7 +200,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellUnholyDK = LastSpellUnholyDK +1; break; } - else if (ANTI_MAGIC_ZONE > 0 && pTarget->IsNonMeleeSpellCasted(true) && !m_bot->HasAura(ANTI_MAGIC_SHELL, 0) && LastSpellUnholyDK < 12) + else if (ANTI_MAGIC_ZONE > 0 && pTarget->IsNonMeleeSpellCasted(true) && !m_bot->HasAura(ANTI_MAGIC_SHELL, EFFECT_INDEX_0) && LastSpellUnholyDK < 12) { ai->CastSpell(ANTI_MAGIC_ZONE, *m_bot); out << " Anti-Magic Zone"; @@ -209,7 +209,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) break; } else if(( !pet ) - && (RAISE_DEAD > 0 && !m_bot->HasAura(ARMY_OF_THE_DEAD, 0) && LastSpellUnholyDK < 13)) + && (RAISE_DEAD > 0 && !m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0) && LastSpellUnholyDK < 13)) { ai->CastSpell(RAISE_DEAD); out << " summoning Ghoul"; @@ -218,7 +218,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) break; } else if(( pet ) - && (GHOUL_FRENZY > 0 && pVictim == pet && !pet->HasAura(GHOUL_FRENZY, 0) && LastSpellUnholyDK < 14)) + && (GHOUL_FRENZY > 0 && pVictim == pet && !pet->HasAura(GHOUL_FRENZY, EFFECT_INDEX_0) && LastSpellUnholyDK < 14)) { ai->CastSpell(GHOUL_FRENZY, *pet); out << " casting Ghoul Frenzy on pet"; @@ -237,14 +237,14 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) case SPELL_DK_FROST: if (FROST_PRESENCE > 0) - (!m_bot->HasAura(FROST_PRESENCE, 0) && !m_bot->HasAura(BLOOD_PRESENCE, 0) && !m_bot->HasAura(UNHOLY_PRESENCE, 0) && ai->CastSpell (FROST_PRESENCE, *m_bot)); + (!m_bot->HasAura(FROST_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(BLOOD_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(UNHOLY_PRESENCE, EFFECT_INDEX_0) && ai->CastSpell (FROST_PRESENCE, *m_bot)); if (DEATHCHILL > 0) - (!m_bot->HasAura(DEATHCHILL, 0) && !m_bot->HasAura(KILLING_MACHINE, 0) && ai->CastSpell (DEATHCHILL, *m_bot)); + (!m_bot->HasAura(DEATHCHILL, EFFECT_INDEX_0) && !m_bot->HasAura(KILLING_MACHINE, EFFECT_INDEX_0) && ai->CastSpell (DEATHCHILL, *m_bot)); else if (KILLING_MACHINE > 0) - (!m_bot->HasAura(KILLING_MACHINE, 0) && !m_bot->HasAura(DEATHCHILL, 0) && ai->CastSpell (KILLING_MACHINE, *m_bot)); + (!m_bot->HasAura(KILLING_MACHINE, EFFECT_INDEX_0) && !m_bot->HasAura(DEATHCHILL, EFFECT_INDEX_0) && ai->CastSpell (KILLING_MACHINE, *m_bot)); - if (ICY_TOUCH > 0 && !pTarget->HasAura(ICY_TOUCH, 0) && LastSpellFrostDK < 1) + if (ICY_TOUCH > 0 && !pTarget->HasAura(ICY_TOUCH, EFFECT_INDEX_0) && LastSpellFrostDK < 1) { ai->CastSpell(ICY_TOUCH, *pTarget); out << " Icy Touch"; @@ -276,7 +276,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellFrostDK = LastSpellFrostDK +1; break; } - else if (CHAINS_OF_ICE > 0 && !pTarget->HasAura(CHAINS_OF_ICE, 0) && LastSpellFrostDK < 5) + else if (CHAINS_OF_ICE > 0 && !pTarget->HasAura(CHAINS_OF_ICE, EFFECT_INDEX_0) && LastSpellFrostDK < 5) { ai->CastSpell(CHAINS_OF_ICE, *pTarget); out << " Chains of Ice"; @@ -292,7 +292,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellFrostDK = LastSpellFrostDK +1; break; } - else if (ICY_CLUTCH > 0 && !pTarget->HasAura(ICY_CLUTCH, 0) && LastSpellFrostDK < 7) + else if (ICY_CLUTCH > 0 && !pTarget->HasAura(ICY_CLUTCH, EFFECT_INDEX_0) && LastSpellFrostDK < 7) { ai->CastSpell(ICY_CLUTCH, *pTarget); out << " Icy Clutch"; @@ -300,7 +300,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellFrostDK = LastSpellFrostDK +1; break; } - else if (ICEBOUND_FORTITUDE > 0 && ai->GetHealthPercent() < 50 && pVictim == m_bot && !m_bot->HasAura(ICEBOUND_FORTITUDE, 0) && LastSpellFrostDK < 8 && ai->GetRunicPower() >= 20) + else if (ICEBOUND_FORTITUDE > 0 && ai->GetHealthPercent() < 50 && pVictim == m_bot && !m_bot->HasAura(ICEBOUND_FORTITUDE, EFFECT_INDEX_0) && LastSpellFrostDK < 8 && ai->GetRunicPower() >= 20) { ai->CastSpell(ICEBOUND_FORTITUDE, *m_bot); out << " Icebound Fortitude"; @@ -332,7 +332,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellFrostDK = LastSpellFrostDK +1; break; } - else if (UNBREAKABLE_ARMOR > 0 && !m_bot->HasAura(UNBREAKABLE_ARMOR, 0) && ai->GetHealthPercent() < 70 && pVictim == m_bot && LastSpellFrostDK < 12) + else if (UNBREAKABLE_ARMOR > 0 && !m_bot->HasAura(UNBREAKABLE_ARMOR, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70 && pVictim == m_bot && LastSpellFrostDK < 12) { ai->CastSpell(UNBREAKABLE_ARMOR, *m_bot); out << " Unbreakable Armor"; @@ -351,9 +351,9 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) case SPELL_DK_BLOOD: if (BLOOD_PRESENCE > 0) - (!m_bot->HasAura(BLOOD_PRESENCE, 0) && !m_bot->HasAura(UNHOLY_PRESENCE, 0) && !m_bot->HasAura(FROST_PRESENCE, 0) && ai->CastSpell (BLOOD_PRESENCE, *m_bot)); + (!m_bot->HasAura(BLOOD_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(UNHOLY_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(FROST_PRESENCE, EFFECT_INDEX_0) && ai->CastSpell (BLOOD_PRESENCE, *m_bot)); - if (MARK_OF_BLOOD > 0 && !pTarget->HasAura(MARK_OF_BLOOD, 0) && LastSpellBloodDK < 1) + if (MARK_OF_BLOOD > 0 && !pTarget->HasAura(MARK_OF_BLOOD, EFFECT_INDEX_0) && LastSpellBloodDK < 1) { ai->CastSpell(MARK_OF_BLOOD, *pTarget); out << " Mark of Blood"; @@ -377,7 +377,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellBloodDK = LastSpellBloodDK +1; break; } - else if (STRANGULATE > 0 && !pTarget->HasAura(STRANGULATE, 0) && LastSpellBloodDK < 4) + else if (STRANGULATE > 0 && !pTarget->HasAura(STRANGULATE, EFFECT_INDEX_0) && LastSpellBloodDK < 4) { ai->CastSpell(STRANGULATE, *pTarget); out << " Strangulate"; @@ -401,7 +401,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellBloodDK = LastSpellBloodDK +1; break; } - else if (VAMPIRIC_BLOOD > 0 && ai->GetHealthPercent() < 70 && !m_bot->HasAura(VAMPIRIC_BLOOD, 0) && LastSpellBloodDK < 7) + else if (VAMPIRIC_BLOOD > 0 && ai->GetHealthPercent() < 70 && !m_bot->HasAura(VAMPIRIC_BLOOD, EFFECT_INDEX_0) && LastSpellBloodDK < 7) { ai->CastSpell(VAMPIRIC_BLOOD, *m_bot); out << " Vampiric Blood"; @@ -409,7 +409,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellBloodDK = LastSpellBloodDK +1; break; } - else if (RUNE_TAP > 0 && ai->GetHealthPercent() < 70 && !m_bot->HasAura(VAMPIRIC_BLOOD, 0) && LastSpellBloodDK < 8) + else if (RUNE_TAP > 0 && ai->GetHealthPercent() < 70 && !m_bot->HasAura(VAMPIRIC_BLOOD, EFFECT_INDEX_0) && LastSpellBloodDK < 8) { ai->CastSpell(RUNE_TAP, *m_bot); out << " Rune Tap"; @@ -417,7 +417,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellBloodDK = LastSpellBloodDK +1; break; } - else if (HYSTERIA > 0 && ai->GetHealthPercent() > 25 && !m_bot->HasAura(HYSTERIA, 0) && LastSpellBloodDK < 9) + else if (HYSTERIA > 0 && ai->GetHealthPercent() > 25 && !m_bot->HasAura(HYSTERIA, EFFECT_INDEX_0) && LastSpellBloodDK < 9) { ai->CastSpell(HYSTERIA, *m_bot); out << " Hysteria"; @@ -425,7 +425,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellBloodDK = LastSpellBloodDK +1; break; } - else if (DANCING_WEAPON > 0 && !m_bot->HasAura(DANCING_WEAPON, 0) && ai->GetRunicPower() >= 60 && LastSpellBloodDK < 10) + else if (DANCING_WEAPON > 0 && !m_bot->HasAura(DANCING_WEAPON, EFFECT_INDEX_0) && ai->GetRunicPower() >= 60 && LastSpellBloodDK < 10) { ai->CastSpell(DANCING_WEAPON, *pTarget); out << " summoning Dancing Rune Weapon"; @@ -433,7 +433,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellBloodDK = LastSpellBloodDK +1; break; } - else if (DARK_COMMAND > 0 && ai->GetHealthPercent() > 50 && pVictim != m_bot && !pTarget->HasAura(DARK_COMMAND, 0) && dist <= ATTACK_DISTANCE && LastSpellBloodDK < 11) + else if (DARK_COMMAND > 0 && ai->GetHealthPercent() > 50 && pVictim != m_bot && !pTarget->HasAura(DARK_COMMAND, EFFECT_INDEX_0) && dist <= ATTACK_DISTANCE && LastSpellBloodDK < 11) { ai->CastSpell(DARK_COMMAND, *pTarget); out << " Dark Command"; @@ -478,7 +478,7 @@ void PlayerbotDeathKnightAI::DoNonCombatActions() // buff master with HORN_OF_WINTER if (HORN_OF_WINTER> 0) - (!GetMaster()->HasAura(HORN_OF_WINTER,0) && ai->CastSpell (HORN_OF_WINTER, *GetMaster())); + (!GetMaster()->HasAura(HORN_OF_WINTER, EFFECT_INDEX_0) && ai->CastSpell (HORN_OF_WINTER, *GetMaster())); // hp check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) @@ -494,7 +494,7 @@ void PlayerbotDeathKnightAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(30); return; } - else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, 0) && ai->GetHealthPercent() < 70) + else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(*fItem); diff --git a/src/game/PlayerbotDruidAI.cpp b/src/game/PlayerbotDruidAI.cpp index a20a42b61..59b975b11 100644 --- a/src/game/PlayerbotDruidAI.cpp +++ b/src/game/PlayerbotDruidAI.cpp @@ -72,19 +72,19 @@ void PlayerbotDruidAI::HealTarget(Unit &target, uint8 hp) PlayerbotAI* ai = GetAI(); Player *m_bot = GetPlayerBot(); - if (hp < 70 && REJUVENATION > 0 && !target.HasAura(REJUVENATION, 0) && !target.HasAura(REGROWTH, 0) && ai->GetManaPercent() >=21) + if (hp < 70 && REJUVENATION > 0 && !target.HasAura(REJUVENATION, EFFECT_INDEX_0) && !target.HasAura(REGROWTH, EFFECT_INDEX_0) && ai->GetManaPercent() >=21) ai->CastSpell(REJUVENATION, target); - if (hp < 60 && LIFEBLOOM > 0 && !target.HasAura(LIFEBLOOM, 0) && ai->GetManaPercent() >= 28) + if (hp < 60 && LIFEBLOOM > 0 && !target.HasAura(LIFEBLOOM, EFFECT_INDEX_0) && ai->GetManaPercent() >= 28) ai->CastSpell(LIFEBLOOM, target); - if (hp < 55 && REGROWTH > 0 && !target.HasAura(REGROWTH, 0) && !target.HasAura(REJUVENATION, 0) && ai->GetManaPercent() >= 33) + if (hp < 55 && REGROWTH > 0 && !target.HasAura(REGROWTH, EFFECT_INDEX_0) && !target.HasAura(REJUVENATION, EFFECT_INDEX_0) && ai->GetManaPercent() >= 33) ai->CastSpell(REGROWTH, target); - if (hp < 50 && SWIFTMEND > 0 && target.HasAura(REJUVENATION, 0) || target.HasAura(REGROWTH, 0) && ai->GetManaPercent() >= 16) + if (hp < 50 && SWIFTMEND > 0 && target.HasAura(REJUVENATION, EFFECT_INDEX_0) || target.HasAura(REGROWTH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 16) ai->CastSpell(SWIFTMEND, target); - if (hp < 45 && WILD_GROWTH > 0 && !target.HasAura(WILD_GROWTH, 0) && ai->GetManaPercent() >= 26) + if (hp < 45 && WILD_GROWTH > 0 && !target.HasAura(WILD_GROWTH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 26) ai->CastSpell(WILD_GROWTH, target); if (hp < 30 && NOURISH > 0 && ai->GetManaPercent() >= 18) @@ -139,46 +139,46 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) if (pVictim) pVictim->Attack(pTarget, true); } - if(m_bot->HasAura(CAT_FORM, 0)) + if(m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(768); //ai->TellMaster("FormClearCat"); } - if (MOONKIN_FORM > 0 && !m_bot->HasAura(MOONKIN_FORM, 0)) + if (MOONKIN_FORM > 0 && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) { ai->CastSpell (MOONKIN_FORM); } - else if (DIRE_BEAR_FORM > 0 && !m_bot->HasAura(MOONKIN_FORM, 0) && !m_bot->HasAura(DIRE_BEAR_FORM, 0)) + else if (DIRE_BEAR_FORM > 0 && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && !m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) { ai->CastSpell (DIRE_BEAR_FORM); } - else if (BEAR_FORM > 0 && !m_bot->HasAura(MOONKIN_FORM, 0) && !m_bot->HasAura(DIRE_BEAR_FORM, 0) && !m_bot->HasAura(BEAR_FORM, 0)) + else if (BEAR_FORM > 0 && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && !m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) && !m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) { ai->CastSpell (BEAR_FORM); } - else if (DEMORALIZING_ROAR > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0)) && !m_bot->HasAura(MOONKIN_FORM, 0) && !pTarget->HasAura(DEMORALIZING_ROAR, 0) && ai->GetRageAmount() >= 10) + else if (DEMORALIZING_ROAR > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && !pTarget->HasAura(DEMORALIZING_ROAR, EFFECT_INDEX_0) && ai->GetRageAmount() >= 10) { ai->CastSpell(DEMORALIZING_ROAR, *pTarget); } - if (FAERIE_FIRE > 0 && DruidSpellCombat < 1 && !pTarget->HasAura(FAERIE_FIRE, 0)) + if (FAERIE_FIRE > 0 && DruidSpellCombat < 1 && !pTarget->HasAura(FAERIE_FIRE, EFFECT_INDEX_0)) { ai->CastSpell(FAERIE_FIRE, *pTarget); DruidSpellCombat++; break; } - else if (MOONFIRE > 0 && m_bot->HasAura(MOONKIN_FORM, 0) && DruidSpellCombat < 2 && !pTarget->HasAura(MOONFIRE, 0) && ai->GetManaPercent() >= 24) + else if (MOONFIRE > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 2 && !pTarget->HasAura(MOONFIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 24) { ai->CastSpell(MOONFIRE, *pTarget); DruidSpellCombat++; break; } - else if (ROOTS > 0 && m_bot->HasAura(MOONKIN_FORM, 0) && DruidSpellCombat < 3 && !pTarget->HasAura(ROOTS, 0) && ai->GetManaPercent() >= 8) + else if (ROOTS > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 3 && !pTarget->HasAura(ROOTS, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) { ai->CastSpell(ROOTS, *pTarget); DruidSpellCombat++; break; } - else if (HURRICANE > 0 && m_bot->HasAura(MOONKIN_FORM, 0) && ai->GetAttackerCount()>=5 && DruidSpellCombat < 4 && ai->GetManaPercent() >= 91) + else if (HURRICANE > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && ai->GetAttackerCount()>=5 && DruidSpellCombat < 4 && ai->GetManaPercent() >= 91) { //ai->TellMaster("casting hurricane!"); ai->CastSpell(HURRICANE, *pTarget); @@ -186,86 +186,86 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) DruidSpellCombat++; break; } - else if (WRATH > 0 && m_bot->HasAura(MOONKIN_FORM, 0) && DruidSpellCombat < 5 && ai->GetManaPercent() >= 13) + else if (WRATH > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 5 && ai->GetManaPercent() >= 13) { ai->CastSpell(WRATH, *pTarget); DruidSpellCombat++; break; } - else if (INSECT_SWARM > 0 && m_bot->HasAura(MOONKIN_FORM, 0) && DruidSpellCombat < 6 && !pTarget->HasAura(INSECT_SWARM, 0) && ai->GetManaPercent() >= 9) + else if (INSECT_SWARM > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 6 && !pTarget->HasAura(INSECT_SWARM, EFFECT_INDEX_0) && ai->GetManaPercent() >= 9) { ai->CastSpell(INSECT_SWARM , *pTarget); DruidSpellCombat++; break; } - else if (STARFIRE > 0 && m_bot->HasAura(MOONKIN_FORM, 0) && DruidSpellCombat < 7 && ai->GetManaPercent() >= 18) + else if (STARFIRE > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 7 && ai->GetManaPercent() >= 18) { ai->CastSpell(STARFIRE, *pTarget); DruidSpellCombat++; break; } - else if (FORCE_OF_NATURE > 0 && m_bot->HasAura(MOONKIN_FORM, 0) && DruidSpellCombat < 8 && ai->GetManaPercent() >= 12) + else if (FORCE_OF_NATURE > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 8 && ai->GetManaPercent() >= 12) { //ai->TellMaster("summoning treants."); ai->CastSpell(FORCE_OF_NATURE); DruidSpellCombat++; break; } - else if (STARFALL > 0 && m_bot->HasAura(MOONKIN_FORM, 0) && !m_bot->HasAura(STARFALL, 0) && ai->GetAttackerCount()>=3 && DruidSpellCombat < 9 && ai->GetManaPercent() >= 39) + else if (STARFALL > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && !m_bot->HasAura(STARFALL, EFFECT_INDEX_0) && ai->GetAttackerCount()>=3 && DruidSpellCombat < 9 && ai->GetManaPercent() >= 39) { ai->CastSpell(STARFALL, *pTarget); DruidSpellCombat++; break; } - else if (BARKSKIN > 0 && pVictim == m_bot && m_bot->HasAura(MOONKIN_FORM, 0) && ai->GetHealthPercent() < 75 && DruidSpellCombat < 10 && !m_bot->HasAura(BARKSKIN, 0)) + else if (BARKSKIN > 0 && pVictim == m_bot && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && ai->GetHealthPercent() < 75 && DruidSpellCombat < 10 && !m_bot->HasAura(BARKSKIN, EFFECT_INDEX_0)) { ai->CastSpell(BARKSKIN, *m_bot); DruidSpellCombat++; break; } - else if (INNERVATE > 0 && m_bot->HasAura(MOONKIN_FORM, 0) && ai->GetManaPercent() < 50 && DruidSpellCombat < 11 && !m_bot->HasAura(INNERVATE, 0)) + else if (INNERVATE > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && ai->GetManaPercent() < 50 && DruidSpellCombat < 11 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0)) { ai->CastSpell(INNERVATE, *m_bot); DruidSpellCombat++; break; } - else if (MANA_REJUVENATION > 0 && m_bot->HasAura(MOONKIN_FORM, 0) && ai->GetManaPercent() < 50 && !m_bot->HasAura(INNERVATE, 0) && DruidSpellCombat < 12 && !m_bot->HasAura(MANA_REJUVENATION, 0)) + else if (MANA_REJUVENATION > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && ai->GetManaPercent() < 50 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0) && DruidSpellCombat < 12 && !m_bot->HasAura(MANA_REJUVENATION, EFFECT_INDEX_0)) { ai->CastSpell(MANA_REJUVENATION, *m_bot); DruidSpellCombat++; break; } - else if (ENRAGE > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0)) && DruidSpellCombat < 2 && !m_bot->HasAura(ENRAGE, 0)) + else if (ENRAGE > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && DruidSpellCombat < 2 && !m_bot->HasAura(ENRAGE, EFFECT_INDEX_0)) { ai->CastSpell(ENRAGE, *m_bot); DruidSpellCombat = DruidSpellCombat +2; break; } - else if (SWIPE > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0)) && DruidSpellCombat < 4 && ai->GetRageAmount()>=20) + else if (SWIPE > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && DruidSpellCombat < 4 && ai->GetRageAmount()>=20) { ai->CastSpell(SWIPE, *pTarget); DruidSpellCombat = DruidSpellCombat +2; break; } - else if (MAUL > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0)) && DruidSpellCombat < 6 && ai->GetRageAmount()>=15) + else if (MAUL > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && DruidSpellCombat < 6 && ai->GetRageAmount()>=15) { ai->CastSpell(MAUL, *pTarget); DruidSpellCombat = DruidSpellCombat +2; break; } - else if (BASH > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0)) && !pTarget->HasAura(BASH, 0) && DruidSpellCombat < 8 && ai->GetRageAmount()>=10) + else if (BASH > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && !pTarget->HasAura(BASH, EFFECT_INDEX_0) && DruidSpellCombat < 8 && ai->GetRageAmount()>=10) { ai->CastSpell(BASH, *pTarget); DruidSpellCombat = DruidSpellCombat +2; break; } - else if (CHALLENGING_ROAR > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0)) && pVictim != m_bot && DruidSpellCombat < 10 && !pTarget->HasAura(CHALLENGING_ROAR, 0) && !pTarget->HasAura(GROWL, 0) && ai->GetRageAmount()>=15) + else if (CHALLENGING_ROAR > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && pVictim != m_bot && DruidSpellCombat < 10 && !pTarget->HasAura(CHALLENGING_ROAR, EFFECT_INDEX_0) && !pTarget->HasAura(GROWL, EFFECT_INDEX_0) && ai->GetRageAmount()>=15) { ai->CastSpell(CHALLENGING_ROAR, *pTarget); DruidSpellCombat = DruidSpellCombat +2; break; } - else if (GROWL > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, 0) || m_bot->HasAura(BEAR_FORM, 0)) && pVictim != m_bot && DruidSpellCombat < 12 && !pTarget->HasAura(CHALLENGING_ROAR, 0) && !pTarget->HasAura(GROWL, 0)) + else if (GROWL > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && pVictim != m_bot && DruidSpellCombat < 12 && !pTarget->HasAura(CHALLENGING_ROAR, EFFECT_INDEX_0) && !pTarget->HasAura(GROWL, EFFECT_INDEX_0)) { ai->CastSpell(GROWL, *pTarget); DruidSpellCombat = DruidSpellCombat +2; @@ -285,43 +285,43 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) case DruidSpell: //ai->TellMaster("DruidSpell"); - if(m_bot->HasAura(CAT_FORM, 0)) + if(m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(768); //ai->TellMaster("FormClearCat"); break; } - if(m_bot->HasAura(BEAR_FORM, 0)) + if(m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(5487); //ai->TellMaster("FormClearBear"); break; } - if(m_bot->HasAura(DIRE_BEAR_FORM, 0)) + if(m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(9634); //ai->TellMaster("FormClearDireBear"); break; } - if(m_bot->HasAura(MOONKIN_FORM, 0)) + if(m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(24858); //ai->TellMaster("FormClearMoonkin"); break; } - if (FAERIE_FIRE > 0 && DruidSpellCombat < 1 && !pTarget->HasAura(FAERIE_FIRE, 0) && ai->GetManaPercent() >= 8) + if (FAERIE_FIRE > 0 && DruidSpellCombat < 1 && !pTarget->HasAura(FAERIE_FIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) { ai->CastSpell(FAERIE_FIRE, *pTarget); DruidSpellCombat++; break; } - else if (MOONFIRE > 0 && DruidSpellCombat < 2 && !pTarget->HasAura(MOONFIRE, 0) && ai->GetManaPercent() >= 24) + else if (MOONFIRE > 0 && DruidSpellCombat < 2 && !pTarget->HasAura(MOONFIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 24) { ai->CastSpell(MOONFIRE, *pTarget); DruidSpellCombat++; break; } - else if (ROOTS > 0 && DruidSpellCombat < 3 && !pTarget->HasAura(ROOTS, 0) && ai->GetManaPercent() >= 8) + else if (ROOTS > 0 && DruidSpellCombat < 3 && !pTarget->HasAura(ROOTS, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) { ai->CastSpell(ROOTS, *pTarget); DruidSpellCombat++; @@ -341,7 +341,7 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) DruidSpellCombat++; break; } - else if (INSECT_SWARM > 0 && DruidSpellCombat < 6 && !pTarget->HasAura(INSECT_SWARM, 0) && ai->GetManaPercent() >= 9) + else if (INSECT_SWARM > 0 && DruidSpellCombat < 6 && !pTarget->HasAura(INSECT_SWARM, EFFECT_INDEX_0) && ai->GetManaPercent() >= 9) { ai->CastSpell(INSECT_SWARM , *pTarget); DruidSpellCombat++; @@ -360,25 +360,25 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) DruidSpellCombat++; break; } - else if (STARFALL > 0 && !m_bot->HasAura(STARFALL, 0) && ai->GetAttackerCount()>=3 && DruidSpellCombat < 9 && ai->GetManaPercent() >= 39) + else if (STARFALL > 0 && !m_bot->HasAura(STARFALL, EFFECT_INDEX_0) && ai->GetAttackerCount()>=3 && DruidSpellCombat < 9 && ai->GetManaPercent() >= 39) { ai->CastSpell(STARFALL, *pTarget); DruidSpellCombat++; break; } - else if (BARKSKIN > 0 && pVictim == m_bot && ai->GetHealthPercent() < 75 && DruidSpellCombat < 10 && !m_bot->HasAura(BARKSKIN, 0)) + else if (BARKSKIN > 0 && pVictim == m_bot && ai->GetHealthPercent() < 75 && DruidSpellCombat < 10 && !m_bot->HasAura(BARKSKIN, EFFECT_INDEX_0)) { ai->CastSpell(BARKSKIN, *m_bot); DruidSpellCombat++; break; } - else if (INNERVATE > 0 && ai->GetManaPercent() < 50 && DruidSpellCombat < 11 && !m_bot->HasAura(INNERVATE, 0)) + else if (INNERVATE > 0 && ai->GetManaPercent() < 50 && DruidSpellCombat < 11 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0)) { ai->CastSpell(INNERVATE, *m_bot); DruidSpellCombat++; break; } - else if (MANA_REJUVENATION > 0 && ai->GetManaPercent() < 50 && DruidSpellCombat < 12 && !m_bot->HasAura(INNERVATE, 0) && !m_bot->HasAura(MANA_REJUVENATION, 0)) + else if (MANA_REJUVENATION > 0 && ai->GetManaPercent() < 50 && DruidSpellCombat < 12 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0) && !m_bot->HasAura(MANA_REJUVENATION, EFFECT_INDEX_0)) { ai->CastSpell(MANA_REJUVENATION, *m_bot); DruidSpellCombat++; @@ -398,25 +398,25 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) case DruidHeal: //ai->TellMaster("DruidHeal"); - if(m_bot->HasAura(CAT_FORM, 0)) + if(m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(768); //ai->TellMaster("FormClearCat"); break; } - if(m_bot->HasAura(BEAR_FORM, 0)) + if(m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(5487); //ai->TellMaster("FormClearBear"); break; } - if(m_bot->HasAura(DIRE_BEAR_FORM, 0)) + if(m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(9634); //ai->TellMaster("FormClearDireBear"); break; } - if(m_bot->HasAura(MOONKIN_FORM, 0)) + if(m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(24858); //ai->TellMaster("FormClearMoonkin"); @@ -447,25 +447,25 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) if (pVictim) pVictim->Attack(pTarget, true); } - if(m_bot->HasAura(BEAR_FORM, 0)) + if(m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(5487); //ai->TellMaster("FormClearBear"); break; } - if(m_bot->HasAura(DIRE_BEAR_FORM, 0)) + if(m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(9634); //ai->TellMaster("FormClearDireBear"); break; } - if(m_bot->HasAura(MOONKIN_FORM, 0)) + if(m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(24858); //ai->TellMaster("FormClearMoonkin"); break; } - if (CAT_FORM > 0 && !m_bot->HasAura(CAT_FORM, 0)) + if (CAT_FORM > 0 && !m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) ai->CastSpell (CAT_FORM); /* if (COWER > 0 && m_bot->GetComboPoints() == 1 && ai->GetEnergyAmount() >= 20) @@ -581,32 +581,32 @@ void PlayerbotDruidAI::DoNonCombatActions() PlayerbotAI* ai = GetAI(); - if(m_bot->HasAura(CAT_FORM, 0)) + if(m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(768); //ai->TellMaster("FormClearCat"); } - if(m_bot->HasAura(BEAR_FORM, 0)) + if(m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(5487); //ai->TellMaster("FormClearBear"); } - if(m_bot->HasAura(DIRE_BEAR_FORM, 0)) + if(m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(9634); //ai->TellMaster("FormClearDireBear"); } - if(m_bot->HasAura(MOONKIN_FORM, 0)) + if(m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(24858); //ai->TellMaster("FormClearMoonkin"); } // buff myself with MARK_OF_THE_WILD - if (MARK_OF_THE_WILD > 0 && !m_bot->HasAura(MARK_OF_THE_WILD, 0)) + if (MARK_OF_THE_WILD > 0 && !m_bot->HasAura(MARK_OF_THE_WILD, EFFECT_INDEX_0)) ai->CastSpell (MARK_OF_THE_WILD, *m_bot); // Thorns generates aggro for moonkin - if (THORNS > 0 && !m_bot->HasAura(THORNS, 0)) + if (THORNS > 0 && !m_bot->HasAura(THORNS, EFFECT_INDEX_0)) ai->CastSpell (THORNS, *m_bot); // mana check @@ -623,13 +623,13 @@ void PlayerbotDruidAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(30); return; } - else if(pItem == NULL && INNERVATE>0 && !m_bot->HasAura(INNERVATE, 0) && ai->GetManaPercent() <= 70) + else if(pItem == NULL && INNERVATE>0 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0) && ai->GetManaPercent() <= 70) { ai->CastSpell(INNERVATE, *m_bot); //ai->TellMaster("casting innervate."); return; } - else if(pItem == NULL && MANA_REJUVENATION>0 && !m_bot->HasAura(INNERVATE, 0) && !m_bot->HasAura(MANA_REJUVENATION, 0) && ai->GetManaPercent() <= 70) + else if(pItem == NULL && MANA_REJUVENATION>0 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0) && !m_bot->HasAura(MANA_REJUVENATION, EFFECT_INDEX_0) && ai->GetManaPercent() <= 70) { ai->CastSpell(MANA_REJUVENATION, *m_bot); //ai->TellMaster("casting mana rejuvenation."); @@ -649,7 +649,7 @@ void PlayerbotDruidAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(30); return; } - else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, 0) && ai->GetHealthPercent() < 70) + else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(*fItem); @@ -668,8 +668,8 @@ void PlayerbotDruidAI::DoNonCombatActions() continue; // buff and heal - (!tPlayer->HasAura(MARK_OF_THE_WILD,0) && ai->CastSpell (MARK_OF_THE_WILD, *tPlayer)); - //(!tPlayer->HasAura(THORNS,0) && ai->CastSpell (THORNS, *tPlayer)); + (!tPlayer->HasAura(MARK_OF_THE_WILD, EFFECT_INDEX_0) && ai->CastSpell (MARK_OF_THE_WILD, *tPlayer)); + //(!tPlayer->HasAura(THORNS, EFFECT_INDEX_0) && ai->CastSpell (THORNS, *tPlayer)); (HealTarget(*tPlayer, tPlayer->GetHealth()*100 / tPlayer->GetMaxHealth())); } } diff --git a/src/game/PlayerbotHunterAI.cpp b/src/game/PlayerbotHunterAI.cpp index 3b902d397..10fcc9c27 100644 --- a/src/game/PlayerbotHunterAI.cpp +++ b/src/game/PlayerbotHunterAI.cpp @@ -114,25 +114,25 @@ void PlayerbotHunterAI::DoNextCombatManeuver(Unit *pTarget) Pet *pet = m_bot->GetPet(); if(( pet ) && ( ((float)pet->GetHealth()/(float)pet->GetMaxHealth()) < 0.5f ) - && ( PET_MEND>0 && !pet->getDeathState() != ALIVE && pVictim != m_bot && !pet->HasAura(PET_MEND,0) && ai->GetManaPercent()>=13 && ai->CastSpell(PET_MEND,*m_bot) )) + && ( PET_MEND>0 && !pet->getDeathState() != ALIVE && pVictim != m_bot && !pet->HasAura(PET_MEND, EFFECT_INDEX_0) && ai->GetManaPercent()>=13 && ai->CastSpell(PET_MEND,*m_bot) )) { ai->TellMaster( "healing pet." ); return; } else if(( pet ) - && ( INTIMIDATION>0 && pVictim == pet && !pet->HasAura(INTIMIDATION,0) && ai->CastSpell(INTIMIDATION,*m_bot) )) + && ( INTIMIDATION>0 && pVictim == pet && !pet->HasAura(INTIMIDATION, EFFECT_INDEX_0) && ai->CastSpell(INTIMIDATION,*m_bot) )) { //ai->TellMaster( "casting intimidation." ); // if pet has aggro :) return; } // racial traits - if( m_bot->getRace() == RACE_ORC && !m_bot->HasAura( BLOOD_FURY,0 ) ) + if( m_bot->getRace() == RACE_ORC && !m_bot->HasAura(BLOOD_FURY, EFFECT_INDEX_0)) { ai->CastSpell( BLOOD_FURY,*m_bot ); //ai->TellMaster( "Blood Fury." ); } - else if( m_bot->getRace() == RACE_TROLL && !m_bot->HasAura( BERSERKING,0 ) ) + else if( m_bot->getRace() == RACE_TROLL && !m_bot->HasAura(BERSERKING, EFFECT_INDEX_0)) { ai->CastSpell( BERSERKING,*m_bot ); //ai->TellMaster( "Berserking." ); @@ -147,24 +147,24 @@ void PlayerbotHunterAI::DoNextCombatManeuver(Unit *pTarget) if( !m_bot->GetUInt32Value(PLAYER_AMMO_ID) ) ai->TellMaster( "Out of ammo!" ); // become monkey (increases dodge chance)... - ( ASPECT_OF_THE_MONKEY>0 && !m_bot->HasAura(ASPECT_OF_THE_MONKEY, 0) && ai->CastSpell(ASPECT_OF_THE_MONKEY,*m_bot) ); + ( ASPECT_OF_THE_MONKEY>0 && !m_bot->HasAura(ASPECT_OF_THE_MONKEY, EFFECT_INDEX_0) && ai->CastSpell(ASPECT_OF_THE_MONKEY,*m_bot) ); } else if( dist>ATTACK_DISTANCE && !m_rangedCombat ) { // switch to ranged combat m_rangedCombat = true; // increase ranged attack power... - ( ASPECT_OF_THE_HAWK>0 && !m_bot->HasAura(ASPECT_OF_THE_HAWK, 0) && ai->CastSpell(ASPECT_OF_THE_HAWK,*m_bot) ); + ( ASPECT_OF_THE_HAWK>0 && !m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0) && ai->CastSpell(ASPECT_OF_THE_HAWK,*m_bot) ); } - else if( m_rangedCombat && !m_bot->HasAura(ASPECT_OF_THE_HAWK, 0) ) + else if( m_rangedCombat && !m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0)) { // check if we have hawk aspect in ranged combat ( ASPECT_OF_THE_HAWK>0 && ai->CastSpell(ASPECT_OF_THE_HAWK,*m_bot) ); } - else if( !m_rangedCombat && !m_bot->HasAura(ASPECT_OF_THE_MONKEY, 0) ) + else if( !m_rangedCombat && !m_bot->HasAura(ASPECT_OF_THE_MONKEY, EFFECT_INDEX_0)) { // check if we have monkey aspect in melee combat - ( ASPECT_OF_THE_MONKEY>0 && ai->CastSpell(ASPECT_OF_THE_MONKEY,*m_bot) ); + ( ASPECT_OF_THE_MONKEY>0 && ai->CastSpell(ASPECT_OF_THE_MONKEY,*m_bot)); } // activate auto shot @@ -184,29 +184,29 @@ void PlayerbotHunterAI::DoNextCombatManeuver(Unit *pTarget) if( m_rangedCombat ) { out << "Case Ranged"; - if( HUNTERS_MARK>0 && ai->GetManaPercent()>=3 && !pTarget->HasAura(HUNTERS_MARK,0) && ai->CastSpell(HUNTERS_MARK,*pTarget) ) + if( HUNTERS_MARK>0 && ai->GetManaPercent()>=3 && !pTarget->HasAura(HUNTERS_MARK, EFFECT_INDEX_0) && ai->CastSpell(HUNTERS_MARK,*pTarget) ) out << " > Hunter's Mark"; - else if( RAPID_FIRE>0 && ai->GetManaPercent()>=3 && !m_bot->HasAura(RAPID_FIRE,0) && ai->CastSpell(RAPID_FIRE,*m_bot) ) + else if( RAPID_FIRE>0 && ai->GetManaPercent()>=3 && !m_bot->HasAura(RAPID_FIRE, EFFECT_INDEX_0) && ai->CastSpell(RAPID_FIRE,*m_bot) ) out << " > Rapid Fire"; else if( MULTI_SHOT>0 && ai->GetManaPercent()>=13 && ai->GetAttackerCount()>=3 && ai->CastSpell(MULTI_SHOT,*pTarget) ) out << " > Multi-Shot"; else if( ARCANE_SHOT>0 && ai->GetManaPercent()>=7 && ai->CastSpell(ARCANE_SHOT,*pTarget) ) out << " > Arcane Shot"; - else if( CONCUSSIVE_SHOT>0 && ai->GetManaPercent()>=6 && !pTarget->HasAura(CONCUSSIVE_SHOT,0) && ai->CastSpell(CONCUSSIVE_SHOT,*pTarget) ) + else if( CONCUSSIVE_SHOT>0 && ai->GetManaPercent()>=6 && !pTarget->HasAura(CONCUSSIVE_SHOT, EFFECT_INDEX_0) && ai->CastSpell(CONCUSSIVE_SHOT,*pTarget) ) out << " > Concussive Shot"; - else if( EXPLOSIVE_SHOT>0 && ai->GetManaPercent()>=10 && !pTarget->HasAura(EXPLOSIVE_SHOT,0) && ai->CastSpell(EXPLOSIVE_SHOT,*pTarget) ) + else if( EXPLOSIVE_SHOT>0 && ai->GetManaPercent()>=10 && !pTarget->HasAura(EXPLOSIVE_SHOT, EFFECT_INDEX_0) && ai->CastSpell(EXPLOSIVE_SHOT,*pTarget) ) out << " > Explosive Shot"; - else if( VIPER_STING>0 && ai->GetManaPercent()>=8 && pTarget->GetPower(POWER_MANA) > 0 && ai->GetManaPercent()<70 && !pTarget->HasAura(VIPER_STING,0) && ai->CastSpell(VIPER_STING,*pTarget) ) + else if( VIPER_STING>0 && ai->GetManaPercent()>=8 && pTarget->GetPower(POWER_MANA) > 0 && ai->GetManaPercent()<70 && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && ai->CastSpell(VIPER_STING,*pTarget) ) out << " > Viper Sting"; - else if( SERPENT_STING>0 && ai->GetManaPercent()>=13 && !pTarget->HasAura(SERPENT_STING,0) && !pTarget->HasAura(SCORPID_STING,0) && !pTarget->HasAura(VIPER_STING,0) && ai->CastSpell(SERPENT_STING,*pTarget) ) + else if( SERPENT_STING>0 && ai->GetManaPercent()>=13 && !pTarget->HasAura(SERPENT_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SCORPID_STING, EFFECT_INDEX_0) && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && ai->CastSpell(SERPENT_STING,*pTarget) ) out << " > Serpent Sting"; - else if( SCORPID_STING>0 && ai->GetManaPercent()>=11 && !pTarget->HasAura(WYVERN_STING,0) && !pTarget->HasAura(SCORPID_STING,0) && !pTarget->HasAura(SERPENT_STING,0) && !pTarget->HasAura(VIPER_STING,0) && ai->CastSpell(SCORPID_STING,*pTarget) ) + else if( SCORPID_STING>0 && ai->GetManaPercent()>=11 && !pTarget->HasAura(WYVERN_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SCORPID_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SERPENT_STING, EFFECT_INDEX_0) && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && ai->CastSpell(SCORPID_STING,*pTarget) ) out << " > Scorpid Sting"; else if( CHIMERA_SHOT>0 && ai->GetManaPercent()>=12 && ai->CastSpell(CHIMERA_SHOT,*pTarget) ) out << " > Chimera Shot"; else if( VOLLEY>0 && ai->GetManaPercent()>=24 && ai->GetAttackerCount()>=3 && ai->CastSpell(VOLLEY,*pTarget) ) out << " > Volley"; - else if( BLACK_ARROW>0 && ai->GetManaPercent()>=6 && !pTarget->HasAura(BLACK_ARROW,0) && ai->CastSpell(BLACK_ARROW,*pTarget) ) + else if( BLACK_ARROW>0 && ai->GetManaPercent()>=6 && !pTarget->HasAura(BLACK_ARROW, EFFECT_INDEX_0) && ai->CastSpell(BLACK_ARROW,*pTarget) ) out << " > Black Arrow"; else if( AIMED_SHOT>0 && ai->GetManaPercent()>=12 && ai->CastSpell(AIMED_SHOT,*pTarget) ) out << " > Aimed Shot"; @@ -222,36 +222,36 @@ void PlayerbotHunterAI::DoNextCombatManeuver(Unit *pTarget) out << "Case Melee"; if( RAPTOR_STRIKE>0 && ai->GetManaPercent()>=6 && ai->CastSpell(RAPTOR_STRIKE,*pTarget) ) out << " > Raptor Strike"; - else if( EXPLOSIVE_TRAP>0 && ai->GetManaPercent()>=27 && !pTarget->HasAura(EXPLOSIVE_TRAP,0) && !pTarget->HasAura(ARCANE_TRAP,0) && !pTarget->HasAura(IMMOLATION_TRAP,0) && !pTarget->HasAura(FROST_TRAP,0) && !pTarget->HasAura(BEAR_TRAP,0) && ai->CastSpell(EXPLOSIVE_TRAP,*pTarget) ) + else if( EXPLOSIVE_TRAP>0 && ai->GetManaPercent()>=27 && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && ai->CastSpell(EXPLOSIVE_TRAP,*pTarget) ) out << " > Explosive Trap"; - else if( WING_CLIP>0 && ai->GetManaPercent()>=6 && !pTarget->HasAura(WING_CLIP,0) && ai->CastSpell(WING_CLIP,*pTarget) ) + else if( WING_CLIP>0 && ai->GetManaPercent()>=6 && !pTarget->HasAura(WING_CLIP, EFFECT_INDEX_0) && ai->CastSpell(WING_CLIP,*pTarget) ) out << " > Wing Clip"; - else if( IMMOLATION_TRAP>0 && ai->GetManaPercent()>=13 && !pTarget->HasAura(IMMOLATION_TRAP,0) && !pTarget->HasAura(ARCANE_TRAP,0) && !pTarget->HasAura(EXPLOSIVE_TRAP,0) && !pTarget->HasAura(FROST_TRAP,0) && !pTarget->HasAura(BEAR_TRAP,0) && ai->CastSpell(IMMOLATION_TRAP,*pTarget) ) + else if( IMMOLATION_TRAP>0 && ai->GetManaPercent()>=13 && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && ai->CastSpell(IMMOLATION_TRAP,*pTarget) ) out << " > Immolation Trap"; else if( MONGOOSE_BITE>0 && ai->GetManaPercent()>=4 && ai->CastSpell(MONGOOSE_BITE,*pTarget) ) out << " > Mongoose Bite"; - else if( FROST_TRAP>0 && ai->GetManaPercent()>=2 && !pTarget->HasAura(FROST_TRAP,0) && !pTarget->HasAura(ARCANE_TRAP,0) && !pTarget->HasAura(IMMOLATION_TRAP,0) && !pTarget->HasAura(EXPLOSIVE_TRAP,0) && !pTarget->HasAura(BEAR_TRAP,0) && ai->CastSpell(FROST_TRAP,*pTarget) ) + else if( FROST_TRAP>0 && ai->GetManaPercent()>=2 && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && ai->CastSpell(FROST_TRAP,*pTarget)) out << " > Frost Trap"; - else if( ARCANE_TRAP>0 && !pTarget->HasAura(ARCANE_TRAP,0) && !pTarget->HasAura(BEAR_TRAP,0) && !pTarget->HasAura(EXPLOSIVE_TRAP,0) && !pTarget->HasAura(IMMOLATION_TRAP,0) && !pTarget->HasAura(FROST_TRAP,0) && ai->CastSpell(ARCANE_TRAP,*pTarget) ) + else if( ARCANE_TRAP>0 && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && ai->CastSpell(ARCANE_TRAP,*pTarget) ) out << " > Arcane Trap"; - else if( DETERRENCE>0 && pVictim == m_bot && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.5 && !m_bot->HasAura(DETERRENCE,0) && ai->CastSpell(DETERRENCE,*m_bot) ) + else if( DETERRENCE>0 && pVictim == m_bot && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.5 && !m_bot->HasAura(DETERRENCE, EFFECT_INDEX_0) && ai->CastSpell(DETERRENCE,*m_bot) ) out << " > Deterrence"; - else if( m_bot->getRace() == RACE_TAUREN && !pTarget->HasAura( WAR_STOMP,0 ) && ai->CastSpell(WAR_STOMP,*pTarget) ) + else if( m_bot->getRace() == RACE_TAUREN && !pTarget->HasAura( WAR_STOMP, EFFECT_INDEX_0) && ai->CastSpell(WAR_STOMP,*pTarget) ) out << " > War Stomp"; - else if( m_bot->getRace() == RACE_BLOODELF && !pTarget->HasAura( ARCANE_TORRENT,0 ) && ai->CastSpell( ARCANE_TORRENT,*pTarget ) ) + else if( m_bot->getRace() == RACE_BLOODELF && !pTarget->HasAura( ARCANE_TORRENT, EFFECT_INDEX_0) && ai->CastSpell( ARCANE_TORRENT,*pTarget ) ) out << " > Arcane Torrent"; else if( m_bot->getRace() == RACE_DWARF && m_bot->HasAuraState( AURA_STATE_DEADLY_POISON ) && ai->CastSpell( STONEFORM,*m_bot ) ) out << " > Stoneform"; - else if( m_bot->getRace() == RACE_NIGHTELF && pVictim == m_bot && ai->GetHealthPercent() < 25 && !m_bot->HasAura( SHADOWMELD,0 ) && ai->CastSpell( SHADOWMELD,*m_bot ) ) + else if( m_bot->getRace() == RACE_NIGHTELF && pVictim == m_bot && ai->GetHealthPercent() < 25 && !m_bot->HasAura( SHADOWMELD, EFFECT_INDEX_0) && ai->CastSpell( SHADOWMELD,*m_bot ) ) out << " > Shadowmeld"; - else if( m_bot->getRace() == RACE_DRAENEI && ai->GetHealthPercent() < 25 && !m_bot->HasAura(GIFT_OF_THE_NAARU,0) && ai->CastSpell(GIFT_OF_THE_NAARU,*m_bot) ) + else if( m_bot->getRace() == RACE_DRAENEI && ai->GetHealthPercent() < 25 && !m_bot->HasAura(GIFT_OF_THE_NAARU, EFFECT_INDEX_0) && ai->CastSpell(GIFT_OF_THE_NAARU,*m_bot) ) out << " > Gift of the Naaru"; else if(( pet && !pet->getDeathState() != ALIVE) - && ( MISDIRECTION>0 && pVictim == m_bot && !m_bot->HasAura(MISDIRECTION,0) && ai->GetManaPercent()>=9 && ai->CastSpell(MISDIRECTION,*pet)) ) + && ( MISDIRECTION>0 && pVictim == m_bot && !m_bot->HasAura(MISDIRECTION, EFFECT_INDEX_0) && ai->GetManaPercent()>=9 && ai->CastSpell(MISDIRECTION,*pet)) ) out << " > Misdirection"; // give threat to pet - /*else if( FREEZING_TRAP>0 && ai->GetManaPercent()>=5 && !pTarget->HasAura(FREEZING_TRAP,0) && !pTarget->HasAura(ARCANE_TRAP,0) && !pTarget->HasAura(EXPLOSIVE_TRAP,0) && !pTarget->HasAura(BEAR_TRAP,0) && !pTarget->HasAura(IMMOLATION_TRAP,0) && !pTarget->HasAura(FROST_TRAP,0) && ai->CastSpell(FREEZING_TRAP,*pTarget) ) + /*else if( FREEZING_TRAP>0 && ai->GetManaPercent()>=5 && !pTarget->HasAura(FREEZING_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && ai->CastSpell(FREEZING_TRAP,*pTarget) ) out << " > Freezing Trap"; // this can trap your bots too - else if( BEAR_TRAP>0 && !pTarget->HasAura(BEAR_TRAP,0) && !pTarget->HasAura(ARCANE_TRAP,0) && !pTarget->HasAura(EXPLOSIVE_TRAP,0) && !pTarget->HasAura(IMMOLATION_TRAP,0) && !pTarget->HasAura(FROST_TRAP,0) && ai->CastSpell(BEAR_TRAP,*pTarget) ) + else if( BEAR_TRAP>0 && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && ai->CastSpell(BEAR_TRAP,*pTarget) ) out << " > Bear Trap"; // this was just too annoying :) else if( DISENGAGE>0 && pVictim && ai->GetManaPercent()>=5 && ai->CastSpell(DISENGAGE,*pTarget) ) out << " > Disengage!"; // attempt to return to ranged combat*/ @@ -278,11 +278,11 @@ void PlayerbotHunterAI::DoNonCombatActions() // buff group if (TRUESHOT_AURA > 0) - (!m_bot->HasAura(TRUESHOT_AURA, 0) && ai->CastSpell (TRUESHOT_AURA, *m_bot)); + (!m_bot->HasAura(TRUESHOT_AURA, EFFECT_INDEX_0) && ai->CastSpell (TRUESHOT_AURA, *m_bot)); // buff myself if (ASPECT_OF_THE_HAWK > 0) - (!m_bot->HasAura(ASPECT_OF_THE_HAWK, 0) && ai->CastSpell (ASPECT_OF_THE_HAWK, *m_bot)); + (!m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0) && ai->CastSpell (ASPECT_OF_THE_HAWK, *m_bot)); // mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) @@ -312,14 +312,14 @@ void PlayerbotHunterAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(30); return; } - else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, 0) && ai->GetHealthPercent() < 70) + else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(*fItem); ai->SetIgnoreUpdateTime(8); return; } - else if (pItem == NULL && fItem == NULL && m_bot->getRace() == RACE_DRAENEI && !m_bot->HasAura(GIFT_OF_THE_NAARU, 0) && ai->GetHealthPercent() < 70) + else if (pItem == NULL && fItem == NULL && m_bot->getRace() == RACE_DRAENEI && !m_bot->HasAura(GIFT_OF_THE_NAARU, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I'm casting gift of the naaru."); ai->CastSpell(GIFT_OF_THE_NAARU, *m_bot); @@ -351,7 +351,7 @@ void PlayerbotHunterAI::DoNonCombatActions() else if( ((float)pet->GetHealth()/(float)pet->GetMaxHealth()) < 0.5f ) { // heal pet when health lower 50% - if( PET_MEND>0 && !pet->getDeathState() != ALIVE && !pet->HasAura(PET_MEND,0) && ai->GetManaPercent()>=13 && ai->CastSpell(PET_MEND,*m_bot) ) + if( PET_MEND>0 && !pet->getDeathState() != ALIVE && !pet->HasAura(PET_MEND, EFFECT_INDEX_0) && ai->GetManaPercent()>=13 && ai->CastSpell(PET_MEND,*m_bot) ) ai->TellMaster( "healing pet." ); } else if(pet->GetHappinessState() != HAPPY) // if pet is hungry @@ -409,7 +409,7 @@ void PlayerbotHunterAI::DoNonCombatActions() } } } - if( pet->HasAura(PET_MEND,0) && !pet->HasAura(PET_FEED,0) ) + if( pet->HasAura(PET_MEND, EFFECT_INDEX_0) && !pet->HasAura(PET_FEED, EFFECT_INDEX_0)) ai->TellMaster( "..no pet food!" ); ai->SetIgnoreUpdateTime(7); } diff --git a/src/game/PlayerbotMageAI.cpp b/src/game/PlayerbotMageAI.cpp index 2354ae828..cd0857f02 100644 --- a/src/game/PlayerbotMageAI.cpp +++ b/src/game/PlayerbotMageAI.cpp @@ -90,28 +90,28 @@ void PlayerbotMageAI::DoNextCombatManeuver(Unit *pTarget) switch (SpellSequence) { case SPELL_FROST: - if (ICY_VEINS > 0 && !m_bot->HasAura(ICY_VEINS, 0) && LastSpellFrost < 1 && ai->GetManaPercent() >= 3) + if (ICY_VEINS > 0 && !m_bot->HasAura(ICY_VEINS, EFFECT_INDEX_0) && LastSpellFrost < 1 && ai->GetManaPercent() >= 3) { ai->CastSpell(ICY_VEINS, *m_bot); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost +1; break; } - else if (FROSTBOLT > 0 && LastSpellFrost < 2 && !pTarget->HasAura(FROSTBOLT, 0) && ai->GetManaPercent() >= 16) + else if (FROSTBOLT > 0 && LastSpellFrost < 2 && !pTarget->HasAura(FROSTBOLT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 16) { ai->CastSpell(FROSTBOLT, *pTarget); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost +1; break; } - else if (FROST_WARD > 0 && LastSpellFrost < 3 && !m_bot->HasAura(FROST_WARD, 0) && ai->GetManaPercent() >= 19) + else if (FROST_WARD > 0 && LastSpellFrost < 3 && !m_bot->HasAura(FROST_WARD, EFFECT_INDEX_0) && ai->GetManaPercent() >= 19) { ai->CastSpell(FROST_WARD, *m_bot); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost +1; break; } - else if (FROST_NOVA > 0 && LastSpellFrost < 4 && dist <= ATTACK_DISTANCE && !pTarget->HasAura(FROST_NOVA, 0) && ai->GetManaPercent() >= 10) + else if (FROST_NOVA > 0 && LastSpellFrost < 4 && dist <= ATTACK_DISTANCE && !pTarget->HasAura(FROST_NOVA, EFFECT_INDEX_0) && ai->GetManaPercent() >= 10) { ai->CastSpell(FROST_NOVA, *pTarget); SpellSequence = SPELL_FIRE; @@ -133,21 +133,21 @@ void PlayerbotMageAI::DoNextCombatManeuver(Unit *pTarget) LastSpellFrost = LastSpellFrost +1; break; } - else if (CONE_OF_COLD > 0 && LastSpellFrost < 7 && dist <= ATTACK_DISTANCE && !pTarget->HasAura(CONE_OF_COLD, 0) && ai->GetManaPercent() >= 35) + else if (CONE_OF_COLD > 0 && LastSpellFrost < 7 && dist <= ATTACK_DISTANCE && !pTarget->HasAura(CONE_OF_COLD, EFFECT_INDEX_0) && ai->GetManaPercent() >= 35) { ai->CastSpell(CONE_OF_COLD, *pTarget); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost +1; break; } - else if (DEEP_FREEZE > 0 && LastSpellFrost < 8 && pTarget->HasAura(AURA_STATE_FROZEN, 0) && !pTarget->HasAura(DEEP_FREEZE, 0) && ai->GetManaPercent() >= 9) + else if (DEEP_FREEZE > 0 && LastSpellFrost < 8 && pTarget->HasAura(AURA_STATE_FROZEN, EFFECT_INDEX_0) && !pTarget->HasAura(DEEP_FREEZE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 9) { ai->CastSpell(DEEP_FREEZE, *pTarget); SpellSequence = SPELL_FIRE; LastSpellFrost = LastSpellFrost +1; break; } - else if (ICE_BARRIER > 0 && LastSpellFrost < 9 && pVictim == m_bot && !m_bot->HasAura(ICE_BARRIER, 0) && ai->GetHealthPercent() < 50 && ai->GetManaPercent() >= 30) + else if (ICE_BARRIER > 0 && LastSpellFrost < 9 && pVictim == m_bot && !m_bot->HasAura(ICE_BARRIER, EFFECT_INDEX_0) && ai->GetHealthPercent() < 50 && ai->GetManaPercent() >= 30) { ai->CastSpell(ICE_BARRIER, *m_bot); SpellSequence = SPELL_FIRE; @@ -161,7 +161,7 @@ void PlayerbotMageAI::DoNextCombatManeuver(Unit *pTarget) LastSpellFrost = LastSpellFrost +1; break; } - else if (ICE_BLOCK > 0 && LastSpellFrost < 11 && pVictim == m_bot && !m_bot->HasAura(ICE_BLOCK, 0) && ai->GetHealthPercent() < 30) + else if (ICE_BLOCK > 0 && LastSpellFrost < 11 && pVictim == m_bot && !m_bot->HasAura(ICE_BLOCK, EFFECT_INDEX_0) && ai->GetHealthPercent() < 30) { ai->CastSpell(ICE_BLOCK, *m_bot); SpellSequence = SPELL_FIRE; @@ -180,14 +180,14 @@ void PlayerbotMageAI::DoNextCombatManeuver(Unit *pTarget) //break; case SPELL_FIRE: - if (FIRE_WARD > 0 && !m_bot->HasAura(FIRE_WARD, 0) && LastSpellFire < 1 && ai->GetManaPercent() >= 3) + if (FIRE_WARD > 0 && !m_bot->HasAura(FIRE_WARD, EFFECT_INDEX_0) && LastSpellFire < 1 && ai->GetManaPercent() >= 3) { ai->CastSpell(FIRE_WARD, *m_bot); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire +1; break; } - else if (COMBUSTION > 0 && !m_bot->HasAura(COMBUSTION, 0) && LastSpellFire < 2) + else if (COMBUSTION > 0 && !m_bot->HasAura(COMBUSTION, EFFECT_INDEX_0) && LastSpellFire < 2) { ai->CastSpell(COMBUSTION, *m_bot); SpellSequence = SPELL_ARCANE; @@ -222,7 +222,7 @@ void PlayerbotMageAI::DoNextCombatManeuver(Unit *pTarget) LastSpellFire = LastSpellFire +1; break; } - else if (PYROBLAST > 0 && LastSpellFire < 7 && !pTarget->HasAura(PYROBLAST, 0) && ai->GetManaPercent() >= 27) + else if (PYROBLAST > 0 && LastSpellFire < 7 && !pTarget->HasAura(PYROBLAST, EFFECT_INDEX_0) && ai->GetManaPercent() >= 27) { ai->CastSpell(PYROBLAST, *pTarget); SpellSequence = SPELL_ARCANE; @@ -243,14 +243,14 @@ void PlayerbotMageAI::DoNextCombatManeuver(Unit *pTarget) LastSpellFire = LastSpellFire +1; break; } - else if (LIVING_BOMB > 0 && LastSpellFire < 10 && !pTarget->HasAura(LIVING_BOMB, 0) && ai->GetManaPercent() >= 27) + else if (LIVING_BOMB > 0 && LastSpellFire < 10 && !pTarget->HasAura(LIVING_BOMB, EFFECT_INDEX_0) && ai->GetManaPercent() >= 27) { ai->CastSpell(LIVING_BOMB, *pTarget); SpellSequence = SPELL_ARCANE; LastSpellFire = LastSpellFire +1; break; } - else if (FROSTFIRE_BOLT > 0 && LastSpellFire < 11 && !pTarget->HasAura(FROSTFIRE_BOLT, 0) && ai->GetManaPercent() >= 14) + else if (FROSTFIRE_BOLT > 0 && LastSpellFire < 11 && !pTarget->HasAura(FROSTFIRE_BOLT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 14) { ai->CastSpell(FROSTFIRE_BOLT, *pTarget); SpellSequence = SPELL_ARCANE; @@ -291,7 +291,7 @@ void PlayerbotMageAI::DoNextCombatManeuver(Unit *pTarget) LastSpellArcane = LastSpellArcane +1; break; } - else if (SLOW > 0 && LastSpellArcane < 5 && !pTarget->HasAura(SLOW, 0) && ai->GetManaPercent() >= 12) + else if (SLOW > 0 && LastSpellArcane < 5 && !pTarget->HasAura(SLOW, EFFECT_INDEX_0) && ai->GetManaPercent() >= 12) { ai->CastSpell(SLOW, *pTarget); SpellSequence = SPELL_FROST; @@ -319,7 +319,7 @@ void PlayerbotMageAI::DoNextCombatManeuver(Unit *pTarget) LastSpellArcane = LastSpellArcane +1; break; } - else if (MANA_SHIELD > 0 && LastSpellArcane < 9 && ai->GetHealthPercent() < 70 && pVictim == m_bot && !m_bot->HasAura(MANA_SHIELD, 0) && ai->GetManaPercent() >= 8) + else if (MANA_SHIELD > 0 && LastSpellArcane < 9 && ai->GetHealthPercent() < 70 && pVictim == m_bot && !m_bot->HasAura(MANA_SHIELD, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) { ai->CastSpell(MANA_SHIELD, *m_bot); SpellSequence = SPELL_FROST; @@ -345,24 +345,24 @@ void PlayerbotMageAI::DoNonCombatActions() // buff master if (DALARAN_BRILLIANCE > 0) - (!GetMaster()->HasAura(DALARAN_BRILLIANCE, 0) && ai->GetManaPercent() >= 81 && ai->CastSpell (DALARAN_BRILLIANCE, *GetMaster())); + (!GetMaster()->HasAura(DALARAN_BRILLIANCE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 81 && ai->CastSpell (DALARAN_BRILLIANCE, *GetMaster())); else if (ARCANE_BRILLIANCE > 0) - (!GetMaster()->HasAura(ARCANE_BRILLIANCE, 0) && !GetMaster()->HasAura(DALARAN_BRILLIANCE, 0) && ai->GetManaPercent() >= 97 && ai->CastSpell (ARCANE_BRILLIANCE, *GetMaster())); + (!GetMaster()->HasAura(ARCANE_BRILLIANCE, EFFECT_INDEX_0) && !GetMaster()->HasAura(DALARAN_BRILLIANCE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 97 && ai->CastSpell (ARCANE_BRILLIANCE, *GetMaster())); // buff myself if (DALARAN_INTELLECT > 0) - (!m_bot->HasAura(DALARAN_INTELLECT, 0) && !m_bot->HasAura(DALARAN_BRILLIANCE, 0) && !m_bot->HasAura(ARCANE_BRILLIANCE, 0) && ai->GetManaPercent() >= 31 && ai->CastSpell (DALARAN_INTELLECT, *m_bot)); + (!m_bot->HasAura(DALARAN_INTELLECT, EFFECT_INDEX_0) && !m_bot->HasAura(DALARAN_BRILLIANCE, EFFECT_INDEX_0) && !m_bot->HasAura(ARCANE_BRILLIANCE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 31 && ai->CastSpell (DALARAN_INTELLECT, *m_bot)); else if (ARCANE_INTELLECT > 0) - (!m_bot->HasAura(ARCANE_INTELLECT, 0) && !m_bot->HasAura(DALARAN_BRILLIANCE, 0) && !m_bot->HasAura(ARCANE_BRILLIANCE, 0) && !m_bot->HasAura(DALARAN_INTELLECT, 0) && ai->GetManaPercent() >= 37 && ai->CastSpell (ARCANE_INTELLECT, *m_bot)); + (!m_bot->HasAura(ARCANE_INTELLECT, EFFECT_INDEX_0) && !m_bot->HasAura(DALARAN_BRILLIANCE, EFFECT_INDEX_0) && !m_bot->HasAura(ARCANE_BRILLIANCE, EFFECT_INDEX_0) && !m_bot->HasAura(DALARAN_INTELLECT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 37 && ai->CastSpell (ARCANE_INTELLECT, *m_bot)); if (MOLTEN_ARMOR > 0) - (!m_bot->HasAura(MOLTEN_ARMOR, 0) && !m_bot->HasAura(MAGE_ARMOR, 0) && ai->GetManaPercent() >= 31 && ai->CastSpell (MOLTEN_ARMOR, *m_bot)); + (!m_bot->HasAura(MOLTEN_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(MAGE_ARMOR, EFFECT_INDEX_0) && ai->GetManaPercent() >= 31 && ai->CastSpell (MOLTEN_ARMOR, *m_bot)); else if (MAGE_ARMOR > 0) - (!m_bot->HasAura(MAGE_ARMOR, 0) && !m_bot->HasAura(MOLTEN_ARMOR, 0) && ai->GetManaPercent() >= 31 && ai->CastSpell (MAGE_ARMOR, *m_bot)); + (!m_bot->HasAura(MAGE_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(MOLTEN_ARMOR, EFFECT_INDEX_0) && ai->GetManaPercent() >= 31 && ai->CastSpell (MAGE_ARMOR, *m_bot)); else if (ICE_ARMOR > 0) - (!m_bot->HasAura(ICE_ARMOR, 0) && !m_bot->HasAura(MOLTEN_ARMOR, 0) && !m_bot->HasAura(MAGE_ARMOR, 0) && ai->GetManaPercent() >= 34 && ai->CastSpell (ICE_ARMOR, *m_bot)); + (!m_bot->HasAura(ICE_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(MOLTEN_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(MAGE_ARMOR, EFFECT_INDEX_0) && ai->GetManaPercent() >= 34 && ai->CastSpell (ICE_ARMOR, *m_bot)); else if (FROST_ARMOR > 0) - (!m_bot->HasAura(FROST_ARMOR, 0) && !m_bot->HasAura(MOLTEN_ARMOR, 0) && !m_bot->HasAura(MAGE_ARMOR, 0) && !m_bot->HasAura(ICE_ARMOR, 0) && ai->GetManaPercent() >= 34 && ai->CastSpell (FROST_ARMOR, *m_bot)); + (!m_bot->HasAura(FROST_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(MOLTEN_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(MAGE_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(ICE_ARMOR, EFFECT_INDEX_0) && ai->GetManaPercent() >= 34 && ai->CastSpell (FROST_ARMOR, *m_bot)); // buff master's group if (GetMaster()->GetGroup()) @@ -374,10 +374,10 @@ void PlayerbotMageAI::DoNonCombatActions() if( !tPlayer || !tPlayer->isAlive() ) continue; // buff - (!tPlayer->HasAura(ARCANE_INTELLECT,0) && !tPlayer->HasAura(DALARAN_BRILLIANCE, 0) && !tPlayer->HasAura(ARCANE_BRILLIANCE, 0) && !tPlayer->HasAura(DALARAN_INTELLECT,0) && ai->GetManaPercent() >= 37 && ai->CastSpell (ARCANE_INTELLECT, *tPlayer)); - (!tPlayer->HasAura(DALARAN_INTELLECT,0) && !tPlayer->HasAura(DALARAN_BRILLIANCE, 0) && !tPlayer->HasAura(ARCANE_BRILLIANCE, 0) && ai->GetManaPercent() >= 31 && ai->CastSpell (DALARAN_INTELLECT, *tPlayer)); - (!tPlayer->HasAura(DAMPEN_MAGIC,0) && !tPlayer->HasAura(AMPLIFY_MAGIC,0) && ai->GetManaPercent() >= 32 && ai->CastSpell (DAMPEN_MAGIC, *tPlayer)); - (!tPlayer->HasAura(AMPLIFY_MAGIC,0) && !tPlayer->HasAura(DAMPEN_MAGIC,0) && ai->GetManaPercent() >= 32 && ai->CastSpell (AMPLIFY_MAGIC, *tPlayer)); + (!tPlayer->HasAura(ARCANE_INTELLECT, EFFECT_INDEX_0) && !tPlayer->HasAura(DALARAN_BRILLIANCE, EFFECT_INDEX_0) && !tPlayer->HasAura(ARCANE_BRILLIANCE, EFFECT_INDEX_0) && !tPlayer->HasAura(DALARAN_INTELLECT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 37 && ai->CastSpell (ARCANE_INTELLECT, *tPlayer)); + (!tPlayer->HasAura(DALARAN_INTELLECT, EFFECT_INDEX_0) && !tPlayer->HasAura(DALARAN_BRILLIANCE, EFFECT_INDEX_0) && !tPlayer->HasAura(ARCANE_BRILLIANCE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 31 && ai->CastSpell (DALARAN_INTELLECT, *tPlayer)); + (!tPlayer->HasAura(DAMPEN_MAGIC, EFFECT_INDEX_0) && !tPlayer->HasAura(AMPLIFY_MAGIC, EFFECT_INDEX_0) && ai->GetManaPercent() >= 32 && ai->CastSpell (DAMPEN_MAGIC, *tPlayer)); + (!tPlayer->HasAura(AMPLIFY_MAGIC, EFFECT_INDEX_0) && !tPlayer->HasAura(DAMPEN_MAGIC, EFFECT_INDEX_0) && ai->GetManaPercent() >= 32 && ai->CastSpell (AMPLIFY_MAGIC, *tPlayer)); } } @@ -425,7 +425,7 @@ void PlayerbotMageAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(30); return; } - else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, 0) && ai->GetHealthPercent() < 70) + else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(*fItem); diff --git a/src/game/PlayerbotPaladinAI.cpp b/src/game/PlayerbotPaladinAI.cpp index 71227edf4..1104a90bb 100644 --- a/src/game/PlayerbotPaladinAI.cpp +++ b/src/game/PlayerbotPaladinAI.cpp @@ -118,7 +118,7 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) uint32 masterHP = GetMaster()->GetHealth()*100 / GetMaster()->GetMaxHealth(); if (GetMaster()->isAlive()) - if (masterHP < 25 && HAND_OF_PROTECTION > 0 && !GetMaster()->HasAura(FORBEARANCE, 0) && !GetMaster()->HasAura(HAND_OF_PROTECTION, 0) && !GetMaster()->HasAura(DIVINE_PROTECTION, 0) && !GetMaster()->HasAura(DIVINE_SHIELD, 0)) + if (masterHP < 25 && HAND_OF_PROTECTION > 0 && !GetMaster()->HasAura(FORBEARANCE, EFFECT_INDEX_0) && !GetMaster()->HasAura(HAND_OF_PROTECTION, EFFECT_INDEX_0) && !GetMaster()->HasAura(DIVINE_PROTECTION, EFFECT_INDEX_0) && !GetMaster()->HasAura(DIVINE_SHIELD, EFFECT_INDEX_0)) ai->CastSpell(HAND_OF_PROTECTION, *GetMaster()); // heal group inside combat, but do not heal if tank @@ -137,28 +137,28 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) } } - if (RIGHTEOUS_FURY > 0 && !m_bot->HasAura(RIGHTEOUS_FURY, 0)) + if (RIGHTEOUS_FURY > 0 && !m_bot->HasAura(RIGHTEOUS_FURY, EFFECT_INDEX_0)) ai->CastSpell (RIGHTEOUS_FURY, *m_bot); - if (SHADOW_RESISTANCE_AURA > 0 && !m_bot->HasAura(SHADOW_RESISTANCE_AURA, 0) && pTarget->getClass() == CLASS_WARLOCK) + if (SHADOW_RESISTANCE_AURA > 0 && !m_bot->HasAura(SHADOW_RESISTANCE_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_WARLOCK) ai->CastSpell (SHADOW_RESISTANCE_AURA, *m_bot); - if (DEVOTION_AURA > 0 && !m_bot->HasAura(DEVOTION_AURA, 0) && pTarget->getClass() == CLASS_WARRIOR) + if (DEVOTION_AURA > 0 && !m_bot->HasAura(DEVOTION_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_WARRIOR) ai->CastSpell (DEVOTION_AURA, *m_bot); - if (FIRE_RESISTANCE_AURA > 0 && !m_bot->HasAura(FIRE_RESISTANCE_AURA, 0) && pTarget->getClass() == CLASS_MAGE) + if (FIRE_RESISTANCE_AURA > 0 && !m_bot->HasAura(FIRE_RESISTANCE_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_MAGE) ai->CastSpell (FIRE_RESISTANCE_AURA, *m_bot); - if (RETRIBUTION_AURA > 0 && !m_bot->HasAura(RETRIBUTION_AURA, 0) && pTarget->getClass() == CLASS_PRIEST) + if (RETRIBUTION_AURA > 0 && !m_bot->HasAura(RETRIBUTION_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_PRIEST) ai->CastSpell (RETRIBUTION_AURA, *m_bot); - if (DEVOTION_AURA > 0 && !m_bot->HasAura(DEVOTION_AURA, 0) && pTarget->getClass() == CLASS_SHAMAN) + if (DEVOTION_AURA > 0 && !m_bot->HasAura(DEVOTION_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_SHAMAN) ai->CastSpell (DEVOTION_AURA, *m_bot); - if (DEVOTION_AURA > 0 && !m_bot->HasAura(DEVOTION_AURA, 0) && pTarget->getClass() == CLASS_ROGUE) + if (DEVOTION_AURA > 0 && !m_bot->HasAura(DEVOTION_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_ROGUE) ai->CastSpell (DEVOTION_AURA, *m_bot); - if (DEVOTION_AURA > 0 && !m_bot->HasAura(DEVOTION_AURA, 0) && pTarget->getClass() == CLASS_PALADIN) + if (DEVOTION_AURA > 0 && !m_bot->HasAura(DEVOTION_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_PALADIN) ai->CastSpell (DEVOTION_AURA, *m_bot); if (ai->GetHealthPercent() <= 40 || GetMaster()->GetHealth() <= GetMaster()->GetMaxHealth()*0.4) @@ -169,21 +169,21 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) switch (SpellSequence) { case Combat: - if (JUDGEMENT_OF_LIGHT > 0 && !pTarget->HasAura(JUDGEMENT_OF_LIGHT, 0) && CombatCounter < 1 && ai->GetManaPercent() >=5) + if (JUDGEMENT_OF_LIGHT > 0 && !pTarget->HasAura(JUDGEMENT_OF_LIGHT, EFFECT_INDEX_0) && CombatCounter < 1 && ai->GetManaPercent() >=5) { ai->CastSpell (JUDGEMENT_OF_LIGHT, *pTarget); out << " Judgement of Light"; CombatCounter++; break; } - else if (SEAL_OF_COMMAND > 0 && !m_bot->HasAura(SEAL_OF_COMMAND, 0) && CombatCounter < 2 && ai->GetManaPercent() >= 14) + else if (SEAL_OF_COMMAND > 0 && !m_bot->HasAura(SEAL_OF_COMMAND, EFFECT_INDEX_0) && CombatCounter < 2 && ai->GetManaPercent() >= 14) { ai->CastSpell (SEAL_OF_COMMAND, *m_bot); out << " Seal of Command"; CombatCounter++; break; } - else if (HAMMER_OF_JUSTICE > 0 && !pTarget->HasAura(HAMMER_OF_JUSTICE, 0) && CombatCounter < 3 && ai->GetManaPercent() >=3) + else if (HAMMER_OF_JUSTICE > 0 && !pTarget->HasAura(HAMMER_OF_JUSTICE, EFFECT_INDEX_0) && CombatCounter < 3 && ai->GetManaPercent() >=3) { ai->CastSpell (HAMMER_OF_JUSTICE, *pTarget); out << " Hammer of Justice"; @@ -197,14 +197,14 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) CombatCounter++; break; } - else if (AVENGING_WRATH > 0 && CombatCounter < 5 && !m_bot->HasAura(AVENGING_WRATH, 0) && ai->GetManaPercent() >=8) + else if (AVENGING_WRATH > 0 && CombatCounter < 5 && !m_bot->HasAura(AVENGING_WRATH, EFFECT_INDEX_0) && ai->GetManaPercent() >=8) { ai->CastSpell (AVENGING_WRATH, *m_bot); out << " Avenging Wrath"; CombatCounter++; break; } - else if (SACRED_SHIELD > 0 && CombatCounter < 6 && pVictim == m_bot && ai->GetHealthPercent() < 70 && !m_bot->HasAura(SACRED_SHIELD, 0) && ai->GetManaPercent() >=12) + else if (SACRED_SHIELD > 0 && CombatCounter < 6 && pVictim == m_bot && ai->GetHealthPercent() < 70 && !m_bot->HasAura(SACRED_SHIELD, EFFECT_INDEX_0) && ai->GetManaPercent() >=12) { ai->CastSpell (SACRED_SHIELD, *m_bot); out << " Sacred Shield"; @@ -232,14 +232,14 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) CombatCounter++; break; } - else if (HAND_OF_SACRIFICE > 0 && pVictim == GetMaster() && !GetMaster()->HasAura(HAND_OF_SACRIFICE, 0) && CombatCounter < 10 && ai->GetManaPercent() >=6) + else if (HAND_OF_SACRIFICE > 0 && pVictim == GetMaster() && !GetMaster()->HasAura(HAND_OF_SACRIFICE, EFFECT_INDEX_0) && CombatCounter < 10 && ai->GetManaPercent() >=6) { ai->CastSpell (HAND_OF_SACRIFICE, *GetMaster()); out << " Hand of Sacrifice"; CombatCounter++; break; } - else if (DIVINE_PROTECTION > 0 && pVictim == m_bot && !m_bot->HasAura(FORBEARANCE, 0) && ai->GetHealthPercent() < 30 && CombatCounter < 11 && ai->GetManaPercent() >=3) + else if (DIVINE_PROTECTION > 0 && pVictim == m_bot && !m_bot->HasAura(FORBEARANCE, EFFECT_INDEX_0) && ai->GetHealthPercent() < 30 && CombatCounter < 11 && ai->GetManaPercent() >=3) { ai->CastSpell (DIVINE_PROTECTION, *m_bot); out << " Divine Protection"; @@ -253,14 +253,14 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) CombatCounter++; break; } - else if (DIVINE_PLEA > 0 && !m_bot->HasAura(DIVINE_PLEA, 0) && ai->GetManaPercent() < 50 && CombatCounter < 13) + else if (DIVINE_PLEA > 0 && !m_bot->HasAura(DIVINE_PLEA, EFFECT_INDEX_0) && ai->GetManaPercent() < 50 && CombatCounter < 13) { ai->CastSpell (DIVINE_PLEA, *m_bot); out << " Divine Plea"; CombatCounter++; break; } - else if (DIVINE_FAVOR > 0 && !m_bot->HasAura(DIVINE_FAVOR, 0) && CombatCounter < 14) + else if (DIVINE_FAVOR > 0 && !m_bot->HasAura(DIVINE_FAVOR, EFFECT_INDEX_0) && CombatCounter < 14) { ai->CastSpell (DIVINE_FAVOR, *m_bot); out << " Divine Favor"; @@ -303,13 +303,13 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( out.str().c_str() ); - if (AVENGING_WRATH > 0 && !m_bot->HasAura(AVENGING_WRATH, 0) && ai->GetManaPercent() >= 8) + if (AVENGING_WRATH > 0 && !m_bot->HasAura(AVENGING_WRATH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) ai->CastSpell(AVENGING_WRATH, *m_bot); - if (DIVINE_SHIELD > 0 && ai->GetHealthPercent() < 30 && pVictim == m_bot && !m_bot->HasAura(FORBEARANCE, 0) && !m_bot->HasAura(DIVINE_SHIELD, 0) && ai->GetManaPercent() >= 3) + if (DIVINE_SHIELD > 0 && ai->GetHealthPercent() < 30 && pVictim == m_bot && !m_bot->HasAura(FORBEARANCE, EFFECT_INDEX_0) && !m_bot->HasAura(DIVINE_SHIELD, EFFECT_INDEX_0) && ai->GetManaPercent() >= 3) ai->CastSpell(DIVINE_SHIELD, *m_bot); - if (DIVINE_SACRIFICE > 0 && ai->GetHealthPercent() > 50 && pVictim != m_bot && !m_bot->HasAura(DIVINE_SACRIFICE, 0)) + if (DIVINE_SACRIFICE > 0 && ai->GetHealthPercent() > 50 && pVictim != m_bot && !m_bot->HasAura(DIVINE_SACRIFICE, EFFECT_INDEX_0)) ai->CastSpell(DIVINE_SACRIFICE, *m_bot); } @@ -321,12 +321,12 @@ void PlayerbotPaladinAI::DoNonCombatActions() return; // buff myself - if (GREATER_BLESSING_OF_MIGHT > 0 && !m_bot->HasAura(GREATER_BLESSING_OF_MIGHT, 0)) + if (GREATER_BLESSING_OF_MIGHT > 0 && !m_bot->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0)) ai->CastSpell (GREATER_BLESSING_OF_MIGHT, *m_bot); - else if (BLESSING_OF_MIGHT > 0 && !m_bot->HasAura(GREATER_BLESSING_OF_MIGHT, 0) && !m_bot->HasAura(BLESSING_OF_MIGHT, 0)) + else if (BLESSING_OF_MIGHT > 0 && !m_bot->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0) && !m_bot->HasAura(BLESSING_OF_MIGHT, EFFECT_INDEX_0)) ai->CastSpell (BLESSING_OF_MIGHT, *m_bot); - if (DIVINE_FAVOR > 0 && !m_bot->HasAura(DIVINE_FAVOR, 0) && ai->GetManaPercent() >= 3) + if (DIVINE_FAVOR > 0 && !m_bot->HasAura(DIVINE_FAVOR, EFFECT_INDEX_0) && ai->GetManaPercent() >= 3) ai->CastSpell(DIVINE_FAVOR , *m_bot); /* if (SEAL_OF_COMMAND > 0) @@ -335,58 +335,58 @@ void PlayerbotPaladinAI::DoNonCombatActions() //Select Class buff seq. ///Process Who is my master --> get the player class --> aura already present if not then proced --> cast the spell //Priest - if (BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_PRIEST && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, 0) && !GetMaster()->HasAura(BLESSING_OF_WISDOM, 0)) + if (BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_PRIEST && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0) && !GetMaster()->HasAura(BLESSING_OF_WISDOM, EFFECT_INDEX_0)) ai->CastSpell (BLESSING_OF_WISDOM, *(GetMaster())); - if (GREATER_BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_PRIEST && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, 0)) + if (GREATER_BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_PRIEST && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0)) ai->CastSpell (GREATER_BLESSING_OF_WISDOM, *(GetMaster())); //Mage - if (BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_MAGE && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, 0) && !GetMaster()->HasAura(BLESSING_OF_WISDOM, 0)) + if (BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_MAGE && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0) && !GetMaster()->HasAura(BLESSING_OF_WISDOM, EFFECT_INDEX_0)) ai->CastSpell (BLESSING_OF_WISDOM, *(GetMaster())); - if (GREATER_BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_MAGE && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, 0)) + if (GREATER_BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_MAGE && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0)) ai->CastSpell (GREATER_BLESSING_OF_WISDOM, *(GetMaster())); //Paladin - if (BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_PALADIN && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, 0) && !GetMaster()->HasAura(BLESSING_OF_WISDOM, 0)) + if (BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_PALADIN && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0) && !GetMaster()->HasAura(BLESSING_OF_WISDOM, EFFECT_INDEX_0)) ai->CastSpell (BLESSING_OF_WISDOM, *(GetMaster())); - if (GREATER_BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_PALADIN && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, 0)) + if (GREATER_BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_PALADIN && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0)) ai->CastSpell (GREATER_BLESSING_OF_WISDOM, *(GetMaster())); //Warlock - if (BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_WARLOCK && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, 0) && !GetMaster()->HasAura(BLESSING_OF_WISDOM, 0)) + if (BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_WARLOCK && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0) && !GetMaster()->HasAura(BLESSING_OF_WISDOM, EFFECT_INDEX_0)) ai->CastSpell (BLESSING_OF_WISDOM, *(GetMaster())); - if (GREATER_BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_WARLOCK && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, 0)) + if (GREATER_BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_WARLOCK && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0)) ai->CastSpell (GREATER_BLESSING_OF_WISDOM, *(GetMaster())); //Warrior - if (BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_WARRIOR && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, 0) && !GetMaster()->HasAura(BLESSING_OF_MIGHT, 0) && !GetMaster()->HasAura(DEFENSIVE_STANCE, 0)) + if (BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_WARRIOR && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0) && !GetMaster()->HasAura(BLESSING_OF_MIGHT, EFFECT_INDEX_0) && !GetMaster()->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0)) ai->CastSpell (BLESSING_OF_MIGHT, *(GetMaster())); - if (GREATER_BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_WARRIOR && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, 0) && !GetMaster()->HasAura(DEFENSIVE_STANCE, 0)) + if (GREATER_BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_WARRIOR && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0) && !GetMaster()->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0)) ai->CastSpell (GREATER_BLESSING_OF_MIGHT, *(GetMaster())); - if (BLESSING_OF_KINGS > 0 && GetMaster()->getClass() == CLASS_WARRIOR && !GetMaster()->HasAura(GREATER_BLESSING_OF_KINGS, 0) && !GetMaster()->HasAura(BLESSING_OF_KINGS, 0) && !GetMaster()->HasAura(BERSERKER_STANCE, 0) && !GetMaster()->HasAura(BATTLE_STANCE, 0)) + if (BLESSING_OF_KINGS > 0 && GetMaster()->getClass() == CLASS_WARRIOR && !GetMaster()->HasAura(GREATER_BLESSING_OF_KINGS, EFFECT_INDEX_0) && !GetMaster()->HasAura(BLESSING_OF_KINGS, EFFECT_INDEX_0) && !GetMaster()->HasAura(BERSERKER_STANCE, EFFECT_INDEX_0) && !GetMaster()->HasAura(BATTLE_STANCE, EFFECT_INDEX_0)) ai->CastSpell (BLESSING_OF_KINGS, *(GetMaster())); - if (GREATER_BLESSING_OF_KINGS > 0 && GetMaster()->getClass() == CLASS_WARRIOR && !GetMaster()->HasAura(GREATER_BLESSING_OF_KINGS, 0) && !GetMaster()->HasAura(BERSERKER_STANCE, 0) && !GetMaster()->HasAura(BATTLE_STANCE, 0)) + if (GREATER_BLESSING_OF_KINGS > 0 && GetMaster()->getClass() == CLASS_WARRIOR && !GetMaster()->HasAura(GREATER_BLESSING_OF_KINGS, EFFECT_INDEX_0) && !GetMaster()->HasAura(BERSERKER_STANCE, EFFECT_INDEX_0) && !GetMaster()->HasAura(BATTLE_STANCE, EFFECT_INDEX_0)) ai->CastSpell (GREATER_BLESSING_OF_KINGS, *(GetMaster())); //Rogue - if (BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_ROGUE && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, 0) && !GetMaster()->HasAura(BLESSING_OF_MIGHT, 0)) + if (BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_ROGUE && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0) && !GetMaster()->HasAura(BLESSING_OF_MIGHT, EFFECT_INDEX_0)) ai->CastSpell (BLESSING_OF_MIGHT, *(GetMaster())); - if (GREATER_BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_ROGUE && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, 0)) + if (GREATER_BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_ROGUE && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0)) ai->CastSpell (GREATER_BLESSING_OF_MIGHT, *(GetMaster())); //Shaman - if (BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_SHAMAN && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, 0) && !GetMaster()->HasAura(BLESSING_OF_MIGHT, 0)) + if (BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_SHAMAN && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0) && !GetMaster()->HasAura(BLESSING_OF_MIGHT, EFFECT_INDEX_0)) ai->CastSpell (BLESSING_OF_MIGHT, *(GetMaster())); - if (GREATER_BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_SHAMAN && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, 0)) + if (GREATER_BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_SHAMAN && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0)) ai->CastSpell (GREATER_BLESSING_OF_MIGHT, *(GetMaster())); // mana check @@ -417,7 +417,7 @@ void PlayerbotPaladinAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(30); return; } - else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, 0) && ai->GetHealthPercent() < 70) + else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(*fItem); diff --git a/src/game/PlayerbotPriestAI.cpp b/src/game/PlayerbotPriestAI.cpp index b57c8a878..be96fa3b5 100644 --- a/src/game/PlayerbotPriestAI.cpp +++ b/src/game/PlayerbotPriestAI.cpp @@ -75,7 +75,7 @@ void PlayerbotPriestAI::HealTarget(Unit &target, uint8 hp) { PlayerbotAI* ai = GetAI(); -// return ((hp < 80 && !target.HasAura(RENEW,0) && ai->CastSpell(RENEW, target)) || +// return ((hp < 80 && !target.HasAura(RENEW, EFFECT_INDEX_0) && ai->CastSpell(RENEW, target)) || // (hp < 60 && ai->CastSpell(HEAL, target)) || // (hp < 30 && ai->CastSpell(FLASH_HEAL, target)) ) ; @@ -145,12 +145,12 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) Group *m_group = m_bot->GetGroup(); // Heal myself - if (ai->GetHealthPercent() < 15 && FADE > 0 && !m_bot->HasAura(FADE, 0)) + if (ai->GetHealthPercent() < 15 && FADE > 0 && !m_bot->HasAura(FADE, EFFECT_INDEX_0)) { ai->TellMaster("I'm casting fade."); ai->CastSpell(FADE, *m_bot); } - else if (ai->GetHealthPercent() < 25 && PWS > 0 && !m_bot->HasAura(PWS, 0)) + else if (ai->GetHealthPercent() < 25 && PWS > 0 && !m_bot->HasAura(PWS, EFFECT_INDEX_0)) { ai->TellMaster("I'm casting pws on myself."); ai->CastSpell(PWS); @@ -167,7 +167,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) uint32 masterHP = GetMaster()->GetHealth()*100 / GetMaster()->GetMaxHealth(); if (GetMaster()->isAlive()) { - if (masterHP < 25 && PWS > 0 && !GetMaster()->HasAura(PWS, 0)) + if (masterHP < 25 && PWS > 0 && !GetMaster()->HasAura(PWS, EFFECT_INDEX_0)) ai->CastSpell(PWS, *(GetMaster())); else if (masterHP < 80) HealTarget (*GetMaster(), masterHP); @@ -196,7 +196,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) switch (SpellSequence) { case SPELL_HOLY: - if (SMITE > 0 && LastSpellHoly <1 && !pTarget->HasAura(SMITE, 0) && ai->GetManaPercent() >= 17) + if (SMITE > 0 && LastSpellHoly <1 && !pTarget->HasAura(SMITE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 17) { ai->CastSpell(SMITE, *pTarget); SpellSequence = SPELL_SHADOWMAGIC; @@ -220,7 +220,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) LastSpellHoly = LastSpellHoly +1; break; } - else if (HOLY_FIRE > 0 && LastSpellHoly <4 && !pTarget->HasAura(HOLY_FIRE, 0) && ai->GetManaPercent() >= 13) + else if (HOLY_FIRE > 0 && LastSpellHoly <4 && !pTarget->HasAura(HOLY_FIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 13) { //ai->TellMaster("I'm casting holy fire."); ai->CastSpell(HOLY_FIRE, *pTarget); @@ -228,7 +228,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) LastSpellHoly = LastSpellHoly +1; break; } - else if (PRAYER_OF_MENDING > 0 && LastSpellHoly <5 && pVictim == GetMaster() && GetMaster()->GetHealth() <= GetMaster()->GetMaxHealth()*0.7 && !GetMaster()->HasAura(PRAYER_OF_MENDING, 0) && ai->GetManaPercent() >= 15) + else if (PRAYER_OF_MENDING > 0 && LastSpellHoly <5 && pVictim == GetMaster() && GetMaster()->GetHealth() <= GetMaster()->GetMaxHealth()*0.7 && !GetMaster()->HasAura(PRAYER_OF_MENDING, EFFECT_INDEX_0) && ai->GetManaPercent() >= 15) { //ai->TellMaster("I'm casting prayer of mending on master."); ai->CastSpell(PRAYER_OF_MENDING, *GetMaster()); @@ -247,7 +247,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) //break; case SPELL_SHADOWMAGIC: - if (PAIN > 0 && LastSpellShadowMagic <1 && !pTarget->HasAura(PAIN, 0) && ai->GetManaPercent() >= 25) + if (PAIN > 0 && LastSpellShadowMagic <1 && !pTarget->HasAura(PAIN, EFFECT_INDEX_0) && ai->GetManaPercent() >= 25) { //ai->TellMaster("I'm casting pain."); ai->CastSpell(PAIN, *pTarget); @@ -272,7 +272,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) break; } - else if (MIND_FLAY > 0 && LastSpellShadowMagic <4 && !pTarget->HasAura(MIND_FLAY, 0) && ai->GetManaPercent() >= 10) + else if (MIND_FLAY > 0 && LastSpellShadowMagic <4 && !pTarget->HasAura(MIND_FLAY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 10) { //ai->TellMaster("I'm casting mind flay."); ai->CastSpell(MIND_FLAY, *pTarget); @@ -281,7 +281,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) LastSpellShadowMagic = LastSpellShadowMagic +1; break; } - else if (DEVOURING_PLAGUE > 0 && LastSpellShadowMagic <5 && !pTarget->HasAura(DEVOURING_PLAGUE, 0) && ai->GetManaPercent() >= 28) + else if (DEVOURING_PLAGUE > 0 && LastSpellShadowMagic <5 && !pTarget->HasAura(DEVOURING_PLAGUE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 28) { ai->CastSpell(DEVOURING_PLAGUE, *pTarget); SpellSequence = SPELL_DISCIPLINE; @@ -295,7 +295,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) LastSpellShadowMagic = LastSpellShadowMagic +1; break; } - else if (VAMPIRIC_TOUCH > 0 && LastSpellShadowMagic <7 && !pTarget->HasAura(VAMPIRIC_TOUCH, 0) && ai->GetManaPercent() >= 18) + else if (VAMPIRIC_TOUCH > 0 && LastSpellShadowMagic <7 && !pTarget->HasAura(VAMPIRIC_TOUCH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 18) { ai->CastSpell(VAMPIRIC_TOUCH, *pTarget); SpellSequence = SPELL_DISCIPLINE; @@ -352,7 +352,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) LastSpellDiscipline = LastSpellDiscipline + 1; break; } - else if (INNER_FOCUS > 0 && !m_bot->HasAura(INNER_FOCUS, 0) && LastSpellDiscipline <4) + else if (INNER_FOCUS > 0 && !m_bot->HasAura(INNER_FOCUS, EFFECT_INDEX_0) && LastSpellDiscipline <4) { //ai->TellMaster("I'm casting inner focus"); ai->CastSpell(INNER_FOCUS, *m_bot); @@ -393,14 +393,14 @@ void PlayerbotPriestAI::DoNonCombatActions() // buff myself if (FORTITUDE > 0) - (!m_bot->HasAura(FORTITUDE, 0) && ai->CastSpell (FORTITUDE, *m_bot)); + (!m_bot->HasAura(FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell (FORTITUDE, *m_bot)); if (INNER_FIRE > 0) - (!m_bot->HasAura(INNER_FIRE, 0) && ai->CastSpell (INNER_FIRE, *m_bot)); + (!m_bot->HasAura(INNER_FIRE, EFFECT_INDEX_0) && ai->CastSpell (INNER_FIRE, *m_bot)); // buff master if (FORTITUDE > 0) - (!GetMaster()->HasAura(FORTITUDE, 0) && ai->CastSpell(FORTITUDE,*(GetMaster())) ); + (!GetMaster()->HasAura(FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell(FORTITUDE,*(GetMaster())) ); // mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) @@ -430,7 +430,7 @@ void PlayerbotPriestAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(30); return; } - else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, 0) && ai->GetHealthPercent() < 70) + else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(*fItem); @@ -461,7 +461,7 @@ void PlayerbotPriestAI::DoNonCombatActions() else if( tPlayer->isAlive() ) { // buff and heal - (!tPlayer->HasAura(FORTITUDE,0) && ai->CastSpell (FORTITUDE, *tPlayer)); + (!tPlayer->HasAura(FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell (FORTITUDE, *tPlayer)); (HealTarget(*tPlayer, tPlayer->GetHealth()*100 / tPlayer->GetMaxHealth())); } } diff --git a/src/game/PlayerbotRogueAI.cpp b/src/game/PlayerbotRogueAI.cpp index 440ccd5bf..ff71f942e 100644 --- a/src/game/PlayerbotRogueAI.cpp +++ b/src/game/PlayerbotRogueAI.cpp @@ -125,7 +125,7 @@ void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) }*/ // decide what to do: - if( pVictim==m_bot && CLOAK_OF_SHADOWS>0 && pVictim->HasAura(SPELL_AURA_PERIODIC_DAMAGE) && !m_bot->HasAura(CLOAK_OF_SHADOWS,0) && ai->CastSpell(CLOAK_OF_SHADOWS) ) + if( pVictim==m_bot && CLOAK_OF_SHADOWS>0 && pVictim->HasAura(SPELL_AURA_PERIODIC_DAMAGE) && !m_bot->HasAura(CLOAK_OF_SHADOWS, EFFECT_INDEX_0) && ai->CastSpell(CLOAK_OF_SHADOWS)) { if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "CoS!" ); @@ -153,7 +153,7 @@ void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) out << " > Premeditation"; else if( AMBUSH>0 && ai->GetEnergyAmount()>=60 && ai->CastSpell(AMBUSH,*pTarget) ) out << " > Ambush"; - else if( CHEAP_SHOT>0 && !pTarget->HasAura(CHEAP_SHOT,0) && ai->GetEnergyAmount()>=60 && ai->CastSpell(CHEAP_SHOT,*pTarget) ) + else if( CHEAP_SHOT>0 && !pTarget->HasAura(CHEAP_SHOT, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=60 && ai->CastSpell(CHEAP_SHOT,*pTarget) ) out << " > Cheap Shot"; else if( GARROTE>0 && ai->GetEnergyAmount()>=50 && ai->CastSpell(GARROTE,*pTarget) ) out << " > Garrote"; @@ -162,19 +162,19 @@ void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) break; case RogueThreat: out << "Case Threat"; - if( GOUGE>0 && ai->GetEnergyAmount()>=45 && !pTarget->HasAura(GOUGE,0) && ai->CastSpell(GOUGE,*pTarget) ) + if( GOUGE>0 && ai->GetEnergyAmount()>=45 && !pTarget->HasAura(GOUGE, EFFECT_INDEX_0) && ai->CastSpell(GOUGE,*pTarget) ) out << " > Gouge"; - else if( EVASION>0 && ai->GetHealthPercent()<=35 && !m_bot->HasAura(EVASION,0) && ai->CastSpell(EVASION) ) + else if( EVASION>0 && ai->GetHealthPercent()<=35 && !m_bot->HasAura(EVASION, EFFECT_INDEX_0) && ai->CastSpell(EVASION) ) out << " > Evasion"; - else if( BLIND>0 && ai->GetHealthPercent()<=30 && !pTarget->HasAura(BLIND,0) && ai->GetEnergyAmount()>=30 && ai->CastSpell(BLIND,*pTarget) ) + else if( BLIND>0 && ai->GetHealthPercent()<=30 && !pTarget->HasAura(BLIND, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=30 && ai->CastSpell(BLIND,*pTarget) ) out << " > Blind"; else if( FEINT>0 && ai->GetHealthPercent()<=25 && ai->GetEnergyAmount()>=20 && ai->CastSpell(FEINT) ) out << " > Feint"; - else if( VANISH>0 && ai->GetHealthPercent()<=20 && !m_bot->HasAura(FEINT,0) && ai->CastSpell(VANISH) ) + else if( VANISH>0 && ai->GetHealthPercent()<=20 && !m_bot->HasAura(FEINT, EFFECT_INDEX_0) && ai->CastSpell(VANISH) ) out << " > Vanish"; else if( PREPARATION>0 && ai->CastSpell(PREPARATION) ) out << " > Preparation"; - else if( m_bot->getRace() == RACE_NIGHTELF && ai->GetHealthPercent()<=15 && !m_bot->HasAura( SHADOWMELD, 0 ) && ai->CastSpell( SHADOWMELD, *m_bot ) ) + else if( m_bot->getRace() == RACE_NIGHTELF && ai->GetHealthPercent()<=15 && !m_bot->HasAura( SHADOWMELD, EFFECT_INDEX_0) && ai->CastSpell( SHADOWMELD, *m_bot ) ) out << " > Shadowmeld"; else out << " NONE!"; @@ -193,13 +193,13 @@ void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) out << "Case Combat"; if( m_bot->GetComboPoints()<=4 ) { - if( SHADOW_DANCE>0 && !m_bot->HasAura(SHADOW_DANCE,0) && ai->CastSpell(SHADOW_DANCE,*m_bot) ) + if( SHADOW_DANCE>0 && !m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && ai->CastSpell(SHADOW_DANCE,*m_bot) ) out << " > Shadow Dance"; - else if( CHEAP_SHOT>0 && m_bot->HasAura(SHADOW_DANCE,0) && !pTarget->HasAura(CHEAP_SHOT,0) && ai->GetEnergyAmount()>=60 && ai->CastSpell(CHEAP_SHOT,*pTarget) ) + else if( CHEAP_SHOT>0 && m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && !pTarget->HasAura(CHEAP_SHOT, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=60 && ai->CastSpell(CHEAP_SHOT,*pTarget) ) out << " > Cheap Shot"; - else if( AMBUSH>0 && m_bot->HasAura(SHADOW_DANCE,0) && ai->GetEnergyAmount()>=60 && ai->CastSpell(AMBUSH,*pTarget) ) + else if( AMBUSH>0 && m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=60 && ai->CastSpell(AMBUSH,*pTarget) ) out << " > Ambush"; - else if( GARROTE>0 && m_bot->HasAura(SHADOW_DANCE,0) && ai->GetEnergyAmount()>=50 && ai->CastSpell(GARROTE,*pTarget) ) + else if( GARROTE>0 && m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=50 && ai->CastSpell(GARROTE,*pTarget) ) out << " > Garrote"; else if( BACKSTAB>0 && pTarget->isInBackInMap(m_bot,1) && ai->GetEnergyAmount()>=60 && ai->CastSpell(BACKSTAB,*pTarget) ) out << " > Backstab"; @@ -215,7 +215,7 @@ void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) out << " > Dismantle"; else if( SHADOWSTEP>0 && ai->GetEnergyAmount()>=10 && ai->CastSpell(SHADOWSTEP,*pTarget) ) out << " > Shadowstep"; - else if( m_bot->getRace() == RACE_BLOODELF && !pTarget->HasAura( ARCANE_TORRENT,0 ) && ai->CastSpell( ARCANE_TORRENT,*pTarget ) ) + else if( m_bot->getRace() == RACE_BLOODELF && !pTarget->HasAura( ARCANE_TORRENT, EFFECT_INDEX_0) && ai->CastSpell( ARCANE_TORRENT,*pTarget ) ) out << " > Arcane Torrent"; else if( m_bot->getRace() == RACE_HUMAN && m_bot->hasUnitState( UNIT_STAT_STUNNED ) || m_bot->HasAuraType( SPELL_AURA_MOD_FEAR ) || m_bot->HasAuraType( SPELL_AURA_MOD_DECREASE_SPEED ) || m_bot->HasAuraType( SPELL_AURA_MOD_CHARM ) && ai->CastSpell( EVERY_MAN_FOR_HIMSELF, *m_bot ) ) out << " > Every Man for Himself"; @@ -225,9 +225,9 @@ void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) out << " > Stoneform"; else if( m_bot->getRace() == RACE_GNOME && m_bot->hasUnitState( UNIT_STAT_STUNNED ) || m_bot->HasAuraType( SPELL_AURA_MOD_DECREASE_SPEED ) && ai->CastSpell( ESCAPE_ARTIST, *m_bot ) ) out << " > Escape Artist"; - else if( m_bot->getRace() == RACE_ORC && !m_bot->HasAura( BLOOD_FURY, 0 ) && ai->CastSpell( BLOOD_FURY, *m_bot ) ) + else if( m_bot->getRace() == RACE_ORC && !m_bot->HasAura( BLOOD_FURY, EFFECT_INDEX_0) && ai->CastSpell( BLOOD_FURY, *m_bot ) ) out << " > Blood Fury"; - else if( m_bot->getRace() == RACE_TROLL && !m_bot->HasAura( BERSERKING, 0 ) && ai->CastSpell( BERSERKING, *m_bot ) ) + else if( m_bot->getRace() == RACE_TROLL && !m_bot->HasAura( BERSERKING, EFFECT_INDEX_0) && ai->CastSpell( BERSERKING, *m_bot ) ) out << " > Berserking"; else out << " NONE!"; @@ -244,11 +244,11 @@ void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) out << " > Warlock Slice & Dice"; else if (SLICE_DICE>0 && pTarget->getClass()==CLASS_HUNTER && ai->GetEnergyAmount()>=25 && ai->CastSpell(SLICE_DICE, *pTarget) ) out << " > Hunter Slice & Dice"; - else if (EXPOSE_ARMOR>0 && pTarget->getClass()==CLASS_WARRIOR && !pTarget->HasAura(EXPOSE_ARMOR, 0) && ai->GetEnergyAmount()>=25 && ai->CastSpell(EXPOSE_ARMOR, *pTarget) ) + else if (EXPOSE_ARMOR>0 && pTarget->getClass()==CLASS_WARRIOR && !pTarget->HasAura(EXPOSE_ARMOR, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=25 && ai->CastSpell(EXPOSE_ARMOR, *pTarget) ) out << " > Warrior Expose Armor"; - else if (EXPOSE_ARMOR>0 && pTarget->getClass()==CLASS_PALADIN && !pTarget->HasAura(EXPOSE_ARMOR, 0) && ai->GetEnergyAmount()>=25 && ai->CastSpell(EXPOSE_ARMOR, *pTarget) ) + else if (EXPOSE_ARMOR>0 && pTarget->getClass()==CLASS_PALADIN && !pTarget->HasAura(EXPOSE_ARMOR, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=25 && ai->CastSpell(EXPOSE_ARMOR, *pTarget) ) out << " > Paladin Expose Armor"; - else if (EXPOSE_ARMOR>0 && pTarget->getClass()==CLASS_DEATH_KNIGHT && !pTarget->HasAura(EXPOSE_ARMOR, 0) && ai->GetEnergyAmount()>=25 && ai->CastSpell(EXPOSE_ARMOR, *pTarget) ) + else if (EXPOSE_ARMOR>0 && pTarget->getClass()==CLASS_DEATH_KNIGHT && !pTarget->HasAura(EXPOSE_ARMOR, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=25 && ai->CastSpell(EXPOSE_ARMOR, *pTarget) ) out << " > DK Expose Armor"; else if (RUPTURE>0 && pTarget->getClass()==CLASS_MAGE && ai->GetEnergyAmount()>=25 && ai->CastSpell(RUPTURE, *pTarget) ) out << " > Mage Rupture"; @@ -291,7 +291,7 @@ void PlayerbotRogueAI::DoNonCombatActions() GetAI()->SetIgnoreUpdateTime(30); return; } - else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, 0) && GetAI()->GetHealthPercent() < 70) + else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && GetAI()->GetHealthPercent() < 70) { GetAI()->TellMaster("I could use first aid."); GetAI()->UseItem(*fItem); diff --git a/src/game/PlayerbotShamanAI.cpp b/src/game/PlayerbotShamanAI.cpp index 4a6dd27dd..31956b21b 100644 --- a/src/game/PlayerbotShamanAI.cpp +++ b/src/game/PlayerbotShamanAI.cpp @@ -79,7 +79,7 @@ void PlayerbotShamanAI::HealTarget(Unit &target, uint8 hp) ai->CastSpell(HEALING_WAVE, target); else if (hp < 45 && LESSER_HEALING_WAVE > 0 && ai->GetManaPercent() >= 19) ai->CastSpell(LESSER_HEALING_WAVE, target); - else if (hp < 55 && RIPTIDE > 0 && !target.HasAura(RIPTIDE, 0) && ai->GetManaPercent() >= 21) + else if (hp < 55 && RIPTIDE > 0 && !target.HasAura(RIPTIDE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 21) ai->CastSpell(RIPTIDE, target); else if (hp < 70 && CHAIN_HEAL > 0 && ai->GetManaPercent() >= 24) ai->CastSpell(CHAIN_HEAL, target); @@ -150,14 +150,14 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) switch (SpellSequence) { case SPELL_ENHANCEMENT: - if (STRENGTH_OF_EARTH_TOTEM > 0 && LastSpellEnhancement == 1 && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, 0)) && ai->GetManaPercent() >= 13) + if (STRENGTH_OF_EARTH_TOTEM > 0 && LastSpellEnhancement == 1 && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 13) { ai->CastSpell(STRENGTH_OF_EARTH_TOTEM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement +1; break; } - else if (STONESKIN_TOTEM > 0 && LastSpellEnhancement == 5 && (!m_bot->HasAura(STONESKIN_TOTEM, 0)) && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, 0)) && ai->GetManaPercent() >= 13) + else if (STONESKIN_TOTEM > 0 && LastSpellEnhancement == 5 && (!m_bot->HasAura(STONESKIN_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 13) { ai->CastSpell(STONESKIN_TOTEM); SpellSequence = SPELL_RESTORATION; @@ -171,49 +171,49 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) LastSpellEnhancement = LastSpellEnhancement +1; break; } - else if (FROST_RESISTANCE_TOTEM > 0 && LastSpellEnhancement == 10 && (!m_bot->HasAura(FROST_RESISTANCE_TOTEM, 0)) && (!m_bot->HasAura(TOTEM_OF_WRATH, 0)) && (!m_bot->HasAura(FLAMETONGUE_TOTEM, 0)) && ai->GetManaPercent() >= 10) + else if (FROST_RESISTANCE_TOTEM > 0 && LastSpellEnhancement == 10 && (!m_bot->HasAura(FROST_RESISTANCE_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(TOTEM_OF_WRATH, EFFECT_INDEX_0)) && (!m_bot->HasAura(FLAMETONGUE_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 10) { ai->CastSpell(FROST_RESISTANCE_TOTEM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement +1; break; } - else if (FLAMETONGUE_TOTEM > 0 && LastSpellEnhancement == 15 && (!m_bot->HasAura(FLAMETONGUE_TOTEM, 0)) && (!m_bot->HasAura(TOTEM_OF_WRATH, 0)) && (!m_bot->HasAura(FROST_RESISTANCE_TOTEM, 0)) && ai->GetManaPercent() >= 14) + else if (FLAMETONGUE_TOTEM > 0 && LastSpellEnhancement == 15 && (!m_bot->HasAura(FLAMETONGUE_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(TOTEM_OF_WRATH, EFFECT_INDEX_0)) && (!m_bot->HasAura(FROST_RESISTANCE_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 14) { ai->CastSpell(FLAMETONGUE_TOTEM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement +1; break; } - else if (FIRE_RESISTANCE_TOTEM > 0 && LastSpellEnhancement == 20 && (!m_bot->HasAura(FIRE_RESISTANCE_TOTEM, 0)) && (!m_bot->HasAura(HEALING_STREAM_TOTEM, 0)) && (!m_bot->HasAura(MANA_SPRING_TOTEM, 0)) && ai->GetManaPercent() >= 10) + else if (FIRE_RESISTANCE_TOTEM > 0 && LastSpellEnhancement == 20 && (!m_bot->HasAura(FIRE_RESISTANCE_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(HEALING_STREAM_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(MANA_SPRING_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 10) { ai->CastSpell(FIRE_RESISTANCE_TOTEM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement +1; break; } - else if (GROUNDING_TOTEM > 0 && LastSpellEnhancement == 25 && (!m_bot->HasAura(GROUNDING_TOTEM, 0)) && (!m_bot->HasAura(WRATH_OF_AIR_TOTEM, 0)) && (!m_bot->HasAura(WIND_FURY_TOTEM, 0)) && ai->GetManaPercent() >= 5) + else if (GROUNDING_TOTEM > 0 && LastSpellEnhancement == 25 && (!m_bot->HasAura(GROUNDING_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(WRATH_OF_AIR_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(WIND_FURY_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 5) { ai->CastSpell(GROUNDING_TOTEM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement +1; break; } - else if (NATURE_RESISTANCE_TOTEM > 0 && LastSpellEnhancement == 30 && (!m_bot->HasAura(NATURE_RESISTANCE_TOTEM, 0)) && (!m_bot->HasAura(WRATH_OF_AIR_TOTEM, 0)) && (!m_bot->HasAura(GROUNDING_TOTEM, 0)) && (!m_bot->HasAura(WIND_FURY_TOTEM, 0)) && ai->GetManaPercent() >= 10) + else if (NATURE_RESISTANCE_TOTEM > 0 && LastSpellEnhancement == 30 && (!m_bot->HasAura(NATURE_RESISTANCE_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(WRATH_OF_AIR_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(GROUNDING_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(WIND_FURY_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 10) { ai->CastSpell(NATURE_RESISTANCE_TOTEM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement +1; break; } - else if (WIND_FURY_TOTEM > 0 && LastSpellEnhancement == 35 && (!m_bot->HasAura(WIND_FURY_TOTEM, 0)) && (!m_bot->HasAura(WRATH_OF_AIR_TOTEM, 0)) && (!m_bot->HasAura(GROUNDING_TOTEM, 0)) && ai->GetManaPercent() >= 11) + else if (WIND_FURY_TOTEM > 0 && LastSpellEnhancement == 35 && (!m_bot->HasAura(WIND_FURY_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(WRATH_OF_AIR_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(GROUNDING_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 11) { ai->CastSpell(WIND_FURY_TOTEM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement +1; break; } - else if (STORMSTRIKE > 0 && LastSpellEnhancement == 4 && (!pTarget->HasAura(STORMSTRIKE, 0)) && ai->GetManaPercent() >= 8) + else if (STORMSTRIKE > 0 && LastSpellEnhancement == 4 && (!pTarget->HasAura(STORMSTRIKE, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 8) { ai->CastSpell(STORMSTRIKE, *pTarget); SpellSequence = SPELL_RESTORATION; @@ -234,7 +234,7 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) LastSpellEnhancement = LastSpellEnhancement +1; break; } - else if (WRATH_OF_AIR_TOTEM > 0 && (!m_bot->HasAura(WRATH_OF_AIR_TOTEM, 0)) && (!m_bot->HasAura(GROUNDING_TOTEM, 0)) && LastSpellEnhancement == 40) + else if (WRATH_OF_AIR_TOTEM > 0 && (!m_bot->HasAura(WRATH_OF_AIR_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(GROUNDING_TOTEM, EFFECT_INDEX_0)) && LastSpellEnhancement == 40) { ai->CastSpell(WRATH_OF_AIR_TOTEM); SpellSequence = SPELL_RESTORATION; @@ -248,21 +248,21 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) LastSpellEnhancement = LastSpellEnhancement +1; break; } - else if (BLOODLUST > 0 && LastSpellEnhancement == 8 && (!GetMaster()->HasAura(BLOODLUST, 0)) && ai->GetManaPercent() >= 26) + else if (BLOODLUST > 0 && LastSpellEnhancement == 8 && (!GetMaster()->HasAura(BLOODLUST, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 26) { ai->CastSpell(BLOODLUST); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement +1; break; } - else if (HEROISM > 0 && LastSpellEnhancement == 10 && (!GetMaster()->HasAura(HEROISM, 0)) && ai->GetManaPercent() >= 26) + else if (HEROISM > 0 && LastSpellEnhancement == 10 && (!GetMaster()->HasAura(HEROISM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 26) { ai->CastSpell(HEROISM); SpellSequence = SPELL_RESTORATION; LastSpellEnhancement = LastSpellEnhancement +1; break; } - else if (SHAMANISTIC_RAGE > 0 && (!m_bot->HasAura(SHAMANISTIC_RAGE, 0)) && LastSpellEnhancement == 11) + else if (SHAMANISTIC_RAGE > 0 && (!m_bot->HasAura(SHAMANISTIC_RAGE, EFFECT_INDEX_0)) && LastSpellEnhancement == 11) { ai->CastSpell(SHAMANISTIC_RAGE, *m_bot); SpellSequence = SPELL_RESTORATION; @@ -280,14 +280,14 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) //break; case SPELL_RESTORATION: - if (HEALING_STREAM_TOTEM > 0 && LastSpellRestoration < 3 && ai->GetHealthPercent() < 50 && (!m_bot->HasAura(HEALING_STREAM_TOTEM, 0)) && (!m_bot->HasAura(MANA_SPRING_TOTEM, 0)) && ai->GetManaPercent() >= 4) + if (HEALING_STREAM_TOTEM > 0 && LastSpellRestoration < 3 && ai->GetHealthPercent() < 50 && (!m_bot->HasAura(HEALING_STREAM_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(MANA_SPRING_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 4) { ai->CastSpell(HEALING_STREAM_TOTEM); SpellSequence = SPELL_ELEMENTAL; LastSpellRestoration = LastSpellRestoration +1; break; } - else if (MANA_SPRING_TOTEM > 0 && LastSpellRestoration < 4 && (!m_bot->HasAura(MANA_SPRING_TOTEM, 0)) && (!m_bot->HasAura(HEALING_STREAM_TOTEM, 0)) && ai->GetManaPercent() >= 5) + else if (MANA_SPRING_TOTEM > 0 && LastSpellRestoration < 4 && (!m_bot->HasAura(MANA_SPRING_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(HEALING_STREAM_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 5) { ai->CastSpell(MANA_SPRING_TOTEM); SpellSequence = SPELL_ELEMENTAL; @@ -301,7 +301,7 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) LastSpellRestoration = LastSpellRestoration +1; break; } - /*else if (TREMOR_TOTEM > 0 && LastSpellRestoration < 6 && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, 0)) && ai->GetManaPercent() >= 2) + /*else if (TREMOR_TOTEM > 0 && LastSpellRestoration < 6 && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 2) { ai->CastSpell(TREMOR_TOTEM); SpellSequence = SPELL_ELEMENTAL; @@ -326,42 +326,42 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) LastSpellElemental = LastSpellElemental + 1; break; } - else if (SEARING_TOTEM > 0 && LastSpellElemental == 2 && (!pTarget->HasAura(SEARING_TOTEM, 0)) && (!m_bot->HasAura(TOTEM_OF_WRATH, 0)) && ai->GetManaPercent() >= 9) + else if (SEARING_TOTEM > 0 && LastSpellElemental == 2 && (!pTarget->HasAura(SEARING_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(TOTEM_OF_WRATH, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 9) { ai->CastSpell(SEARING_TOTEM); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } - else if (STONECLAW_TOTEM > 0 && ai->GetHealthPercent() < 51 && LastSpellElemental == 3 && (!pTarget->HasAura(STONECLAW_TOTEM, 0)) && (!pTarget->HasAura(EARTHBIND_TOTEM, 0)) && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, 0)) && ai->GetManaPercent() >= 8) + else if (STONECLAW_TOTEM > 0 && ai->GetHealthPercent() < 51 && LastSpellElemental == 3 && (!pTarget->HasAura(STONECLAW_TOTEM, EFFECT_INDEX_0)) && (!pTarget->HasAura(EARTHBIND_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 8) { ai->CastSpell(STONECLAW_TOTEM); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } - else if (FLAME_SHOCK > 0 && LastSpellElemental == 4 && (!pTarget->HasAura(FLAME_SHOCK, 0)) && ai->GetManaPercent() >= 22) + else if (FLAME_SHOCK > 0 && LastSpellElemental == 4 && (!pTarget->HasAura(FLAME_SHOCK, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 22) { ai->CastSpell(FLAME_SHOCK, *pTarget); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } - else if (LAVA_BURST > 0 && LastSpellElemental == 5 && (pTarget->HasAura(FLAME_SHOCK, 0)) && ai->GetManaPercent() >= 10) + else if (LAVA_BURST > 0 && LastSpellElemental == 5 && (pTarget->HasAura(FLAME_SHOCK, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 10) { ai->CastSpell(LAVA_BURST, *pTarget); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } - else if (MAGMA_TOTEM > 0 && LastSpellElemental == 6 && (!m_bot->HasAura(TOTEM_OF_WRATH, 0)) && ai->GetManaPercent() >= 35) + else if (MAGMA_TOTEM > 0 && LastSpellElemental == 6 && (!m_bot->HasAura(TOTEM_OF_WRATH, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 35) { ai->CastSpell(MAGMA_TOTEM); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } - else if (EARTHBIND_TOTEM > 0 && LastSpellElemental == 7 && (!pTarget->HasAura(EARTHBIND_TOTEM, 0)) && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, 0)) && ai->GetManaPercent() >= 5) + else if (EARTHBIND_TOTEM > 0 && LastSpellElemental == 7 && (!pTarget->HasAura(EARTHBIND_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 5) { ai->CastSpell(EARTHBIND_TOTEM); SpellSequence = SPELL_ENHANCEMENT; @@ -396,7 +396,7 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) LastSpellElemental = LastSpellElemental + 1; break; } - else if (FROST_SHOCK > 0 && LastSpellElemental == 12 && (!pTarget->HasAura(FROST_SHOCK, 0)) && ai->GetManaPercent() >= 23) + else if (FROST_SHOCK > 0 && LastSpellElemental == 12 && (!pTarget->HasAura(FROST_SHOCK, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 23) { ai->CastSpell(FROST_SHOCK, *pTarget); SpellSequence = SPELL_ENHANCEMENT; @@ -410,7 +410,7 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) LastSpellElemental = LastSpellElemental + 1; break; } - else if (TOTEM_OF_WRATH > 0 && LastSpellElemental == 14 && (!m_bot->HasAura(TOTEM_OF_WRATH, 0)) && ai->GetManaPercent() >= 5) + else if (TOTEM_OF_WRATH > 0 && LastSpellElemental == 14 && (!m_bot->HasAura(TOTEM_OF_WRATH, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 5) { ai->CastSpell(TOTEM_OF_WRATH); SpellSequence = SPELL_ENHANCEMENT; @@ -424,7 +424,7 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) LastSpellElemental = LastSpellElemental + 1; break; } - /*else if (HEX > 0 && LastSpellElemental == 16 && (!pTarget->HasAura(HEX, 0)) && ai->GetManaPercent() >= 3) + /*else if (HEX > 0 && LastSpellElemental == 16 && (!pTarget->HasAura(HEX, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 3) { ai->CastSpell(HEX); SpellSequence = SPELL_ENHANCEMENT; @@ -456,25 +456,25 @@ void PlayerbotShamanAI::DoNonCombatActions() // buff master with EARTH_SHIELD if (EARTH_SHIELD > 0) - (!GetMaster()->HasAura(EARTH_SHIELD, 0) && ai->CastSpell(EARTH_SHIELD,*(GetMaster())) ); + (!GetMaster()->HasAura(EARTH_SHIELD, EFFECT_INDEX_0) && ai->CastSpell(EARTH_SHIELD,*(GetMaster())) ); // buff myself with WATER_SHIELD, LIGHTNING_SHIELD if (WATER_SHIELD > 0) - (!m_bot->HasAura(WATER_SHIELD, 0) && !m_bot->HasAura(LIGHTNING_SHIELD, 0) && ai->CastSpell(WATER_SHIELD,*m_bot) ); + (!m_bot->HasAura(WATER_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(LIGHTNING_SHIELD, EFFECT_INDEX_0) && ai->CastSpell(WATER_SHIELD,*m_bot) ); else if (LIGHTNING_SHIELD > 0) - (!m_bot->HasAura(LIGHTNING_SHIELD, 0) && !m_bot->HasAura(WATER_SHIELD, 0) && ai->CastSpell(LIGHTNING_SHIELD,*m_bot) ); + (!m_bot->HasAura(LIGHTNING_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(WATER_SHIELD, EFFECT_INDEX_0) && ai->CastSpell(LIGHTNING_SHIELD,*m_bot) ); /* // buff myself weapon if (ROCKBITER_WEAPON > 0) - (!m_bot->HasAura(ROCKBITER_WEAPON, 0) && !m_bot->HasAura(EARTHLIVING_WEAPON, 0) && !m_bot->HasAura(WINDFURY_WEAPON, 0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, 0) && !m_bot->HasAura(FROSTBRAND_WEAPON, 0) && ai->CastSpell(ROCKBITER_WEAPON,*m_bot) ); + (!m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && ai->CastSpell(ROCKBITER_WEAPON,*m_bot) ); else if (EARTHLIVING_WEAPON > 0) - (!m_bot->HasAura(EARTHLIVING_WEAPON, 0) && !m_bot->HasAura(EARTHLIVING_WEAPON, 0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, 0) && !m_bot->HasAura(FROSTBRAND_WEAPON, 0) && !m_bot->HasAura(ROCKBITER_WEAPON, 0) && ai->CastSpell(WINDFURY_WEAPON,*m_bot) ); + (!m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && ai->CastSpell(WINDFURY_WEAPON,*m_bot) ); else if (WINDFURY_WEAPON > 0) - (!m_bot->HasAura(WINDFURY_WEAPON, 0) && !m_bot->HasAura(EARTHLIVING_WEAPON, 0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, 0) && !m_bot->HasAura(FROSTBRAND_WEAPON, 0) && !m_bot->HasAura(ROCKBITER_WEAPON, 0) && ai->CastSpell(WINDFURY_WEAPON,*m_bot) ); + (!m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && ai->CastSpell(WINDFURY_WEAPON,*m_bot) ); else if (FLAMETONGUE_WEAPON > 0) - (!m_bot->HasAura(FLAMETONGUE_WEAPON, 0) && !m_bot->HasAura(EARTHLIVING_WEAPON, 0) && !m_bot->HasAura(WINDFURY_WEAPON, 0) && !m_bot->HasAura(FROSTBRAND_WEAPON, 0) && !m_bot->HasAura(ROCKBITER_WEAPON, 0) && ai->CastSpell(FLAMETONGUE_WEAPON,*m_bot) ); + (!m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && ai->CastSpell(FLAMETONGUE_WEAPON,*m_bot) ); else if (FROSTBRAND_WEAPON > 0) - (!m_bot->HasAura(FROSTBRAND_WEAPON, 0) && !m_bot->HasAura(EARTHLIVING_WEAPON, 0) && !m_bot->HasAura(WINDFURY_WEAPON, 0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, 0) && !m_bot->HasAura(ROCKBITER_WEAPON, 0) && ai->CastSpell(FROSTBRAND_WEAPON,*m_bot) ); + (!m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && ai->CastSpell(FROSTBRAND_WEAPON,*m_bot) ); */ // mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) @@ -504,7 +504,7 @@ void PlayerbotShamanAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(30); return; } - else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, 0) && ai->GetHealthPercent() < 70) + else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(*fItem); diff --git a/src/game/PlayerbotWarlockAI.cpp b/src/game/PlayerbotWarlockAI.cpp index d12ed5a9d..79cc25aab 100644 --- a/src/game/PlayerbotWarlockAI.cpp +++ b/src/game/PlayerbotWarlockAI.cpp @@ -100,35 +100,35 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) switch (SpellSequence) { case SPELL_CURSES: - if (CURSE_OF_AGONY > 0 && !pTarget->HasAura(CURSE_OF_AGONY, 0) && !pTarget->HasAura(SHADOWFLAME, 0) && LastSpellCurse < 1 && ai->GetManaPercent() >= 14) + if (CURSE_OF_AGONY > 0 && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && LastSpellCurse < 1 && ai->GetManaPercent() >= 14) { ai->CastSpell(CURSE_OF_AGONY, *pTarget); SpellSequence = SPELL_AFFLICTION; LastSpellCurse = LastSpellCurse +1; break; } - else if (CURSE_OF_THE_ELEMENTS > 0 && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, 0) && !pTarget->HasAura(SHADOWFLAME, 0) && !pTarget->HasAura(CURSE_OF_AGONY, 0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, 0) && LastSpellCurse < 2 && ai->GetManaPercent() >= 10) + else if (CURSE_OF_THE_ELEMENTS > 0 && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && LastSpellCurse < 2 && ai->GetManaPercent() >= 10) { ai->CastSpell(CURSE_OF_THE_ELEMENTS, *pTarget); SpellSequence = SPELL_AFFLICTION; LastSpellCurse = LastSpellCurse +1; break; } - else if (CURSE_OF_EXHAUSTION > 0 && !pTarget->HasAura(CURSE_OF_EXHAUSTION, 0) && !pTarget->HasAura(SHADOWFLAME, 0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, 0) && !pTarget->HasAura(CURSE_OF_AGONY, 0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, 0) && LastSpellCurse < 3 && ai->GetManaPercent() >= 6) + else if (CURSE_OF_EXHAUSTION > 0 && !pTarget->HasAura(CURSE_OF_EXHAUSTION, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && LastSpellCurse < 3 && ai->GetManaPercent() >= 6) { ai->CastSpell(CURSE_OF_EXHAUSTION, *pTarget); SpellSequence = SPELL_AFFLICTION; LastSpellCurse = LastSpellCurse +1; break; } - else if (CURSE_OF_WEAKNESS > 0 && !pTarget->HasAura(CURSE_OF_WEAKNESS, 0) && !pTarget->HasAura(SHADOWFLAME, 0) && !pTarget->HasAura(CURSE_OF_EXHAUSTION, 0) && !pTarget->HasAura(CURSE_OF_AGONY, 0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, 0) && LastSpellCurse < 4 && ai->GetManaPercent() >= 14) + else if (CURSE_OF_WEAKNESS > 0 && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_EXHAUSTION, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && LastSpellCurse < 4 && ai->GetManaPercent() >= 14) { ai->CastSpell(CURSE_OF_WEAKNESS, *pTarget); SpellSequence = SPELL_AFFLICTION; LastSpellCurse = LastSpellCurse +1; break; } - else if (CURSE_OF_TONGUES > 0 && !pTarget->HasAura(CURSE_OF_TONGUES, 0) && !pTarget->HasAura(SHADOWFLAME, 0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, 0) && !pTarget->HasAura(CURSE_OF_EXHAUSTION, 0) && !pTarget->HasAura(CURSE_OF_AGONY, 0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, 0) && LastSpellCurse < 5 && ai->GetManaPercent() >= 4) + else if (CURSE_OF_TONGUES > 0 && !pTarget->HasAura(CURSE_OF_TONGUES, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_EXHAUSTION, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && LastSpellCurse < 5 && ai->GetManaPercent() >= 4) { ai->CastSpell(CURSE_OF_TONGUES, *pTarget); SpellSequence = SPELL_AFFLICTION; @@ -147,14 +147,14 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) LastSpellAffliction = LastSpellAffliction +1; break; } - else if (CORRUPTION > 0 && !pTarget->HasAura(CORRUPTION, 0) && !pTarget->HasAura(SHADOWFLAME, 0) && !pTarget->HasAura(SEED_OF_CORRUPTION, 0) && LastSpellAffliction < 2 && ai->GetManaPercent() >= 19) + else if (CORRUPTION > 0 && !pTarget->HasAura(CORRUPTION, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && LastSpellAffliction < 2 && ai->GetManaPercent() >= 19) { ai->CastSpell(CORRUPTION, *pTarget); SpellSequence = SPELL_DESTRUCTION; LastSpellAffliction = LastSpellAffliction +1; break; } - else if (DRAIN_SOUL > 0 && pTarget->GetHealth() < pTarget->GetMaxHealth()*0.40 && !pTarget->HasAura(DRAIN_SOUL, 0) && LastSpellAffliction < 3 && ai->GetManaPercent() >= 19) + else if (DRAIN_SOUL > 0 && pTarget->GetHealth() < pTarget->GetMaxHealth()*0.40 && !pTarget->HasAura(DRAIN_SOUL, EFFECT_INDEX_0) && LastSpellAffliction < 3 && ai->GetManaPercent() >= 19) { ai->CastSpell(DRAIN_SOUL, *pTarget); ai->SetIgnoreUpdateTime(15); @@ -162,7 +162,7 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) LastSpellAffliction = LastSpellAffliction +1; break; } - else if (DRAIN_LIFE > 0 && LastSpellAffliction < 4 && !pTarget->HasAura(DRAIN_SOUL, 0) && !pTarget->HasAura(SEED_OF_CORRUPTION, 0) && !pTarget->HasAura(DRAIN_LIFE, 0) && !pTarget->HasAura(DRAIN_MANA, 0) && ai->GetHealthPercent() <= 70 && ai->GetManaPercent() >= 23) + else if (DRAIN_LIFE > 0 && LastSpellAffliction < 4 && !pTarget->HasAura(DRAIN_SOUL, EFFECT_INDEX_0) && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_LIFE, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_MANA, EFFECT_INDEX_0) && ai->GetHealthPercent() <= 70 && ai->GetManaPercent() >= 23) { ai->CastSpell(DRAIN_LIFE, *pTarget); ai->SetIgnoreUpdateTime(5); @@ -170,7 +170,7 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) LastSpellAffliction = LastSpellAffliction +1; break; } - else if (DRAIN_MANA > 0 && pTarget->GetPower(POWER_MANA) > 0 && !pTarget->HasAura(DRAIN_SOUL, 0) && !pTarget->HasAura(DRAIN_MANA, 0) && !pTarget->HasAura(SEED_OF_CORRUPTION, 0) && !pTarget->HasAura(DRAIN_LIFE, 0) && LastSpellAffliction < 5 && ai->GetManaPercent() < 70 && ai->GetManaPercent() >= 17) + else if (DRAIN_MANA > 0 && pTarget->GetPower(POWER_MANA) > 0 && !pTarget->HasAura(DRAIN_SOUL, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_MANA, EFFECT_INDEX_0) && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_LIFE, EFFECT_INDEX_0) && LastSpellAffliction < 5 && ai->GetManaPercent() < 70 && ai->GetManaPercent() >= 17) { ai->CastSpell(DRAIN_MANA, *pTarget); ai->SetIgnoreUpdateTime(5); @@ -178,35 +178,35 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) LastSpellAffliction = LastSpellAffliction +1; break; } - else if (UNSTABLE_AFFLICTION > 0 && LastSpellAffliction < 6 && !pTarget->HasAura(UNSTABLE_AFFLICTION, 0) && !pTarget->HasAura(SHADOWFLAME, 0) && ai->GetManaPercent() >= 20) + else if (UNSTABLE_AFFLICTION > 0 && LastSpellAffliction < 6 && !pTarget->HasAura(UNSTABLE_AFFLICTION, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && ai->GetManaPercent() >= 20) { ai->CastSpell(UNSTABLE_AFFLICTION, *pTarget); SpellSequence = SPELL_DESTRUCTION; LastSpellAffliction = LastSpellAffliction +1; break; } - else if (HAUNT > 0 && LastSpellAffliction < 7 && !pTarget->HasAura(HAUNT, 0) && ai->GetManaPercent() >= 12) + else if (HAUNT > 0 && LastSpellAffliction < 7 && !pTarget->HasAura(HAUNT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 12) { ai->CastSpell(HAUNT, *pTarget); SpellSequence = SPELL_DESTRUCTION; LastSpellAffliction = LastSpellAffliction +1; break; } - else if (ATROCITY > 0 && !pTarget->HasAura(ATROCITY, 0) && LastSpellAffliction < 8 && ai->GetManaPercent() >= 21) + else if (ATROCITY > 0 && !pTarget->HasAura(ATROCITY, EFFECT_INDEX_0) && LastSpellAffliction < 8 && ai->GetManaPercent() >= 21) { ai->CastSpell(ATROCITY, *pTarget); SpellSequence = SPELL_DESTRUCTION; LastSpellAffliction = LastSpellAffliction +1; break; } - else if (SEED_OF_CORRUPTION > 0 && !pTarget->HasAura(SEED_OF_CORRUPTION, 0) && LastSpellAffliction < 9 && ai->GetManaPercent() >= 34) + else if (SEED_OF_CORRUPTION > 0 && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && LastSpellAffliction < 9 && ai->GetManaPercent() >= 34) { ai->CastSpell(SEED_OF_CORRUPTION, *pTarget); SpellSequence = SPELL_DESTRUCTION; LastSpellAffliction = LastSpellAffliction +1; break; } - else if (HOWL_OF_TERROR > 0 && !pTarget->HasAura(HOWL_OF_TERROR, 0) && ai->GetAttackerCount()>3 && LastSpellAffliction < 10 && ai->GetManaPercent() >= 11) + else if (HOWL_OF_TERROR > 0 && !pTarget->HasAura(HOWL_OF_TERROR, EFFECT_INDEX_0) && ai->GetAttackerCount()>3 && LastSpellAffliction < 10 && ai->GetManaPercent() >= 11) { ai->CastSpell(HOWL_OF_TERROR, *pTarget); ai->TellMaster("casting howl of terror!"); @@ -214,7 +214,7 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) LastSpellAffliction = LastSpellAffliction +1; break; } - else if (FEAR > 0 && !pTarget->HasAura(FEAR, 0) && pVictim==m_bot && ai->GetAttackerCount()>=2 && LastSpellAffliction < 11 && ai->GetManaPercent() >= 12) + else if (FEAR > 0 && !pTarget->HasAura(FEAR, EFFECT_INDEX_0) && pVictim==m_bot && ai->GetAttackerCount()>=2 && LastSpellAffliction < 11 && ai->GetManaPercent() >= 12) { ai->CastSpell(FEAR, *pTarget); //ai->TellMaster("casting fear!"); @@ -236,7 +236,7 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) //break; case SPELL_DESTRUCTION: - if (SHADOWFURY > 0 && LastSpellDestruction < 1 && !pTarget->HasAura(SHADOWFURY, 0) && ai->GetManaPercent() >= 37) + if (SHADOWFURY > 0 && LastSpellDestruction < 1 && !pTarget->HasAura(SHADOWFURY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 37) { ai->CastSpell(SHADOWFURY, *pTarget); SpellSequence = SPELL_CURSES; @@ -259,14 +259,14 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) LastSpellDestruction = LastSpellDestruction + 1; break; } - else if (SHADOWFLAME > 0 && !pTarget->HasAura(SHADOWFLAME, 0) && LastSpellDestruction < 4 && ai->GetManaPercent() >= 25) + else if (SHADOWFLAME > 0 && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && LastSpellDestruction < 4 && ai->GetManaPercent() >= 25) { ai->CastSpell(SHADOWFLAME, *pTarget); SpellSequence = SPELL_CURSES; LastSpellDestruction = LastSpellDestruction + 1; break; } - else if (IMMOLATE > 0 && !pTarget->HasAura(IMMOLATE, 0) && !pTarget->HasAura(SHADOWFLAME, 0) && LastSpellDestruction < 5 && ai->GetManaPercent() >= 23) + else if (IMMOLATE > 0 && !pTarget->HasAura(IMMOLATE, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && LastSpellDestruction < 5 && ai->GetManaPercent() >= 23) { ai->CastSpell(IMMOLATE, *pTarget); SpellSequence = SPELL_CURSES; @@ -309,14 +309,14 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) LastSpellDestruction = LastSpellDestruction + 1; break; } - else if (SHADOWBURN > 0 && LastSpellDestruction < 11 && pTarget->GetHealth() < pTarget->GetMaxHealth()*0.20 && !pTarget->HasAura(SHADOWBURN, 0) && ai->GetManaPercent() >= 27) + else if (SHADOWBURN > 0 && LastSpellDestruction < 11 && pTarget->GetHealth() < pTarget->GetMaxHealth()*0.20 && !pTarget->HasAura(SHADOWBURN, EFFECT_INDEX_0) && ai->GetManaPercent() >= 27) { ai->CastSpell(SHADOWBURN, *pTarget); SpellSequence = SPELL_CURSES; LastSpellDestruction = LastSpellDestruction + 1; break; } - else if (HELLFIRE > 0 && LastSpellDestruction < 12 && !m_bot->HasAura(HELLFIRE, 0) && ai->GetAttackerCount()>=5 && ai->GetHealthPercent() >= 10 && ai->GetManaPercent() >= 87) + else if (HELLFIRE > 0 && LastSpellDestruction < 12 && !m_bot->HasAura(HELLFIRE, EFFECT_INDEX_0) && ai->GetAttackerCount()>=5 && ai->GetHealthPercent() >= 10 && ai->GetManaPercent() >= 87) { ai->CastSpell(HELLFIRE); ai->TellMaster("casting hellfire!"); @@ -349,17 +349,17 @@ void PlayerbotWarlockAI::DoNonCombatActions() // buff myself DEMON_SKIN, DEMON_ARMOR, FEL_ARMOR if (FEL_ARMOR > 0) - (!m_bot->HasAura(FEL_ARMOR, 0) && ai->CastSpell(FEL_ARMOR, *m_bot)); + (!m_bot->HasAura(FEL_ARMOR, EFFECT_INDEX_0) && ai->CastSpell(FEL_ARMOR, *m_bot)); else if (DEMON_ARMOR > 0) - (!m_bot->HasAura(DEMON_ARMOR, 0) && !m_bot->HasAura(FEL_ARMOR, 0) && ai->CastSpell(DEMON_ARMOR, *m_bot)); + (!m_bot->HasAura(DEMON_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(FEL_ARMOR, EFFECT_INDEX_0) && ai->CastSpell(DEMON_ARMOR, *m_bot)); else if (DEMON_SKIN > 0) - (!m_bot->HasAura(DEMON_SKIN, 0) && !m_bot->HasAura(FEL_ARMOR, 0) && !m_bot->HasAura(DEMON_ARMOR, 0) && ai->CastSpell(DEMON_SKIN, *m_bot)); + (!m_bot->HasAura(DEMON_SKIN, EFFECT_INDEX_0) && !m_bot->HasAura(FEL_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(DEMON_ARMOR, EFFECT_INDEX_0) && ai->CastSpell(DEMON_SKIN, *m_bot)); // buff myself & master DETECT_INVISIBILITY if (DETECT_INVISIBILITY > 0) - (!m_bot->HasAura(DETECT_INVISIBILITY, 0) && ai->GetManaPercent() >= 2 && ai->CastSpell(DETECT_INVISIBILITY, *m_bot)); + (!m_bot->HasAura(DETECT_INVISIBILITY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 2 && ai->CastSpell(DETECT_INVISIBILITY, *m_bot)); if (DETECT_INVISIBILITY > 0) - (!GetMaster()->HasAura(DETECT_INVISIBILITY, 0) && ai->GetManaPercent() >= 2 && ai->CastSpell(DETECT_INVISIBILITY, *GetMaster())); + (!GetMaster()->HasAura(DETECT_INVISIBILITY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 2 && ai->CastSpell(DETECT_INVISIBILITY, *GetMaster())); // mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) @@ -403,7 +403,7 @@ void PlayerbotWarlockAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(30); return; } - else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, 0) && ai->GetHealthPercent() < 70) + else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(*fItem); @@ -411,7 +411,7 @@ void PlayerbotWarlockAI::DoNonCombatActions() return; } else if(( pet ) - && (pItem == NULL && fItem == NULL && CONSUME_SHADOWS>0 && !m_bot->HasAura(CONSUME_SHADOWS, 0) && ai->GetHealthPercent() < 75) ) + && (pItem == NULL && fItem == NULL && CONSUME_SHADOWS>0 && !m_bot->HasAura(CONSUME_SHADOWS, EFFECT_INDEX_0) && ai->GetHealthPercent() < 75) ) { ai->CastSpell(CONSUME_SHADOWS, *m_bot); //ai->TellMaster("casting consume shadows."); @@ -444,19 +444,19 @@ void PlayerbotWarlockAI::DoNonCombatActions() // check for buffs with demon if(( pet ) - && ( SOUL_LINK>0 && !m_bot->HasAura(SOUL_LINK,0) && ai->GetManaPercent() >= 16 && ai->CastSpell(SOUL_LINK,*m_bot) )) + && ( SOUL_LINK>0 && !m_bot->HasAura(SOUL_LINK, EFFECT_INDEX_0) && ai->GetManaPercent() >= 16 && ai->CastSpell(SOUL_LINK,*m_bot) )) { //ai->TellMaster( "casting soul link." ); return; } else if(( pet ) - && ( BLOOD_PACT>0 && !m_bot->HasAura(BLOOD_PACT,0) && ai->CastSpell(BLOOD_PACT,*m_bot) )) + && ( BLOOD_PACT>0 && !m_bot->HasAura(BLOOD_PACT, EFFECT_INDEX_0) && ai->CastSpell(BLOOD_PACT,*m_bot) )) { //ai->TellMaster( "casting blood pact." ); return; } else if(( pet ) - && ( FEL_INTELLIGENCE>0 && !m_bot->HasAura(FEL_INTELLIGENCE, 0) && ai->CastSpell(FEL_INTELLIGENCE,*m_bot) )) + && ( FEL_INTELLIGENCE>0 && !m_bot->HasAura(FEL_INTELLIGENCE, EFFECT_INDEX_0) && ai->CastSpell(FEL_INTELLIGENCE,*m_bot) )) { //ai->TellMaster( "casting fel intelligence." ); return; diff --git a/src/game/PlayerbotWarriorAI.cpp b/src/game/PlayerbotWarriorAI.cpp index d1186c6fd..9e536051d 100644 --- a/src/game/PlayerbotWarriorAI.cpp +++ b/src/game/PlayerbotWarriorAI.cpp @@ -84,25 +84,25 @@ bool PlayerbotWarriorAI::DoFirstCombatManeuver(Unit *pTarget) PlayerbotAI::CombatOrderType co = ai->GetCombatOrder(); float fTargetDist = m_bot->GetDistance( pTarget ); - if( (co&PlayerbotAI::ORDERS_TANK) && DEFENSIVE_STANCE>0 && !m_bot->HasAura(DEFENSIVE_STANCE, 0) && ai->CastSpell(DEFENSIVE_STANCE) ) + if( (co&PlayerbotAI::ORDERS_TANK) && DEFENSIVE_STANCE>0 && !m_bot->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0) && ai->CastSpell(DEFENSIVE_STANCE) ) { if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "First > Defensive Stance (%d)", DEFENSIVE_STANCE ); return true; } - else if( (co&PlayerbotAI::ORDERS_TANK) && TAUNT>0 && m_bot->HasAura(DEFENSIVE_STANCE, 0) && ai->CastSpell(TAUNT,*pTarget) ) + else if( (co&PlayerbotAI::ORDERS_TANK) && TAUNT>0 && m_bot->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0) && ai->CastSpell(TAUNT,*pTarget) ) { if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "First > Taunt (%d)", TAUNT ); return false; } - else if( BATTLE_STANCE>0 && !m_bot->HasAura(BATTLE_STANCE, 0) && ai->CastSpell(BATTLE_STANCE) ) + else if( BATTLE_STANCE>0 && !m_bot->HasAura(BATTLE_STANCE, EFFECT_INDEX_0) && ai->CastSpell(BATTLE_STANCE) ) { if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "First > Battle Stance (%d)", BATTLE_STANCE ); return true; } - else if( BATTLE_STANCE>0 && CHARGE>0 && m_bot->HasAura(BATTLE_STANCE, 0) ) + else if( BATTLE_STANCE>0 && CHARGE>0 && m_bot->HasAura(BATTLE_STANCE, EFFECT_INDEX_0) ) { if( fTargetDist<8.0f ) return false; @@ -149,31 +149,31 @@ void PlayerbotWarriorAI::DoNextCombatManeuver(Unit *pTarget) PlayerbotAI::CombatOrderType co = ai->GetCombatOrder(); // decide what stance to use - if( (co&PlayerbotAI::ORDERS_TANK) && !m_bot->HasAura(DEFENSIVE_STANCE,0) && ai->CastSpell(DEFENSIVE_STANCE) ) + if( (co&PlayerbotAI::ORDERS_TANK) && !m_bot->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0) && ai->CastSpell(DEFENSIVE_STANCE) ) if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "Stance > Defensive" ); - else if( !(co&PlayerbotAI::ORDERS_TANK) && !m_bot->HasAura(BATTLE_STANCE,0) && ai->CastSpell(BATTLE_STANCE) ) + else if( !(co&PlayerbotAI::ORDERS_TANK) && !m_bot->HasAura(BATTLE_STANCE, EFFECT_INDEX_0) && ai->CastSpell(BATTLE_STANCE) ) if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "Stance > Battle" ); // get spell sequence if( pTarget->IsNonMeleeSpellCasted(true) ) SpellSequence = WarriorSpellPreventing; - else if( m_bot->HasAura( BATTLE_STANCE, 0 ) ) + else if( m_bot->HasAura( BATTLE_STANCE, EFFECT_INDEX_0) ) SpellSequence = WarriorBattle; - else if( m_bot->HasAura( DEFENSIVE_STANCE, 0 ) ) + else if( m_bot->HasAura( DEFENSIVE_STANCE, EFFECT_INDEX_0) ) SpellSequence = WarriorDefensive; - else if( m_bot->HasAura( BERSERKER_STANCE, 0 ) ) + else if( m_bot->HasAura( BERSERKER_STANCE, EFFECT_INDEX_0) ) SpellSequence = WarriorBerserker; // do shouts, berserker rage, etc... - if( BERSERKER_RAGE>0 && !m_bot->HasAura( BERSERKER_RAGE, 0 ) && ai->CastSpell( BERSERKER_RAGE ) ) + if( BERSERKER_RAGE>0 && !m_bot->HasAura( BERSERKER_RAGE, EFFECT_INDEX_0) && ai->CastSpell( BERSERKER_RAGE ) ) if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "Pre > Berseker Rage" ); - else if( DEMORALIZING_SHOUT>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( DEMORALIZING_SHOUT, 0 ) && ai->CastSpell( DEMORALIZING_SHOUT ) ) + else if( DEMORALIZING_SHOUT>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( DEMORALIZING_SHOUT, EFFECT_INDEX_0) && ai->CastSpell( DEMORALIZING_SHOUT ) ) if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "Pre > Demoralizing Shout" ); - else if( BATTLE_SHOUT>0 && ai->GetRageAmount()>=10 && !m_bot->HasAura( BATTLE_SHOUT, 0 ) && ai->CastSpell( BATTLE_SHOUT ) ) + else if( BATTLE_SHOUT>0 && ai->GetRageAmount()>=10 && !m_bot->HasAura( BATTLE_SHOUT, EFFECT_INDEX_0) && ai->CastSpell( BATTLE_SHOUT ) ) if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "Pre > Battle Shout" ); @@ -186,7 +186,7 @@ void PlayerbotWarriorAI::DoNextCombatManeuver(Unit *pTarget) out << " > Shield Bash"; else if( PUMMEL>0 && ai->GetRageAmount()>=10 && ai->CastSpell( PUMMEL, *pTarget ) ) out << " > Pummel"; - else if( SPELL_REFLECTION>0 && ai->GetRageAmount()>=15 && !m_bot->HasAura( SPELL_REFLECTION, 0 ) && ai->CastSpell( SPELL_REFLECTION, *m_bot ) ) + else if( SPELL_REFLECTION>0 && ai->GetRageAmount()>=15 && !m_bot->HasAura( SPELL_REFLECTION, EFFECT_INDEX_0) && ai->CastSpell( SPELL_REFLECTION, *m_bot ) ) out << " > Spell Reflection"; else out << " > NONE"; @@ -196,59 +196,59 @@ void PlayerbotWarriorAI::DoNextCombatManeuver(Unit *pTarget) out << "Case Battle"; if( EXECUTE>0 && ai->GetRageAmount()>=15 && pTarget->GetHealth() < pTarget->GetMaxHealth()*0.2 && ai->CastSpell( EXECUTE, *pTarget ) ) out << " > Execute!"; - else if( LAST_STAND>0 && !m_bot->HasAura( LAST_STAND, 0 ) && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.5 && ai->CastSpell( LAST_STAND, *m_bot ) ) + else if( LAST_STAND>0 && !m_bot->HasAura( LAST_STAND, EFFECT_INDEX_0) && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.5 && ai->CastSpell( LAST_STAND, *m_bot ) ) out << " > Last Stand!"; - else if( BLOODRAGE>0 && ai->GetRageAmount()<50 && !m_bot->HasAura( BLOODRAGE, 0 ) && ai->CastSpell( BLOODRAGE, *m_bot ) ) + else if( BLOODRAGE>0 && ai->GetRageAmount()<50 && !m_bot->HasAura( BLOODRAGE, EFFECT_INDEX_0) && ai->CastSpell( BLOODRAGE, *m_bot ) ) out << " > Bloodrage"; - else if( DEATH_WISH>0 && ai->GetRageAmount()>=10 && !m_bot->HasAura( DEATH_WISH, 0 ) && ai->CastSpell( DEATH_WISH, *m_bot ) ) + else if( DEATH_WISH>0 && ai->GetRageAmount()>=10 && !m_bot->HasAura( DEATH_WISH, EFFECT_INDEX_0) && ai->CastSpell( DEATH_WISH, *m_bot ) ) out << " > Death Wish"; - else if( RETALIATION>0 && pVictim == m_bot && ai->GetAttackerCount()>=2 && !m_bot->HasAura( RETALIATION, 0 ) && ai->CastSpell( RETALIATION, *m_bot ) ) + else if( RETALIATION>0 && pVictim == m_bot && ai->GetAttackerCount()>=2 && !m_bot->HasAura( RETALIATION, EFFECT_INDEX_0) && ai->CastSpell( RETALIATION, *m_bot ) ) out << " > Retaliation"; - else if( DEMORALIZING_SHOUT>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( DEMORALIZING_SHOUT, 0 ) && ai->CastSpell( DEMORALIZING_SHOUT, *pTarget ) ) + else if( DEMORALIZING_SHOUT>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( DEMORALIZING_SHOUT, EFFECT_INDEX_0) && ai->CastSpell( DEMORALIZING_SHOUT, *pTarget ) ) out << " > Demoralizing Shout"; - else if( SWEEPING_STRIKES>0 && ai->GetRageAmount()>=30 && ai->GetAttackerCount()>=2 && !m_bot->HasAura( SWEEPING_STRIKES, 0 ) && ai->CastSpell( SWEEPING_STRIKES, *m_bot ) ) + else if( SWEEPING_STRIKES>0 && ai->GetRageAmount()>=30 && ai->GetAttackerCount()>=2 && !m_bot->HasAura( SWEEPING_STRIKES, EFFECT_INDEX_0) && ai->CastSpell( SWEEPING_STRIKES, *m_bot ) ) out << " > Sweeping Strikes!"; - else if( BLADESTORM>0 && ai->GetRageAmount()>=25 && pVictim == m_bot && !m_bot->HasAura( BLADESTORM, 0 ) && ai->GetAttackerCount()>=3 && ai->CastSpell( BLADESTORM, *pTarget ) ) + else if( BLADESTORM>0 && ai->GetRageAmount()>=25 && pVictim == m_bot && !m_bot->HasAura( BLADESTORM, EFFECT_INDEX_0) && ai->GetAttackerCount()>=3 && ai->CastSpell( BLADESTORM, *pTarget ) ) out << " > Bladestorm!"; - else if( MORTAL_STRIKE>0 && ai->GetRageAmount()>=30 && !pTarget->HasAura( MORTAL_STRIKE, 0 ) && ai->CastSpell( MORTAL_STRIKE, *pTarget ) ) + else if( MORTAL_STRIKE>0 && ai->GetRageAmount()>=30 && !pTarget->HasAura( MORTAL_STRIKE, EFFECT_INDEX_0) && ai->CastSpell( MORTAL_STRIKE, *pTarget ) ) out << " > Mortal Strike"; else if( INTIMIDATING_SHOUT>0 && ai->GetRageAmount()>=25 && ai->GetAttackerCount()>5 && ai->CastSpell( INTIMIDATING_SHOUT, *pTarget ) ) out << " > Intimidating Shout"; - else if( THUNDER_CLAP>0 && ai->GetRageAmount()>=20 && pVictim == m_bot && !pTarget->HasAura( THUNDER_CLAP, 0 ) && ai->CastSpell( THUNDER_CLAP, *pTarget ) ) + else if( THUNDER_CLAP>0 && ai->GetRageAmount()>=20 && pVictim == m_bot && !pTarget->HasAura( THUNDER_CLAP, EFFECT_INDEX_0) && ai->CastSpell( THUNDER_CLAP, *pTarget ) ) out << " > Thunder Clap"; - else if( ENRAGED_REGENERATION>0 && ai->GetRageAmount()>=15 && !m_bot->HasAura( BERSERKER_RAGE, 0 ) && !m_bot->HasAura( ENRAGED_REGENERATION, 0 ) && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.5 && ai->CastSpell( ENRAGED_REGENERATION, *m_bot ) ) + else if( ENRAGED_REGENERATION>0 && ai->GetRageAmount()>=15 && !m_bot->HasAura( BERSERKER_RAGE, EFFECT_INDEX_0) && !m_bot->HasAura( ENRAGED_REGENERATION, EFFECT_INDEX_0) && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.5 && ai->CastSpell( ENRAGED_REGENERATION, *m_bot ) ) out << " > Enraged Regeneration"; - else if( SHOCKWAVE>0 && ai->GetRageAmount()>=15 && pVictim == m_bot && !pTarget->HasAura( WAR_STOMP, 0 ) && !pTarget->HasAura( PIERCING_HOWL, 0 ) && !pTarget->HasAura( SHOCKWAVE, 0 ) && !pTarget->HasAura( CONCUSSION_BLOW, 0 ) && ai->CastSpell( SHOCKWAVE, *pTarget ) ) + else if( SHOCKWAVE>0 && ai->GetRageAmount()>=15 && pVictim == m_bot && !pTarget->HasAura( WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura( PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura( SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura( CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell( SHOCKWAVE, *pTarget ) ) out << " > Shockwave"; - else if( REND>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( REND, 0 ) && ai->CastSpell( REND, *pTarget ) ) + else if( REND>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( REND, EFFECT_INDEX_0) && ai->CastSpell( REND, *pTarget ) ) out << " > Rend"; - else if( HAMSTRING>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( HAMSTRING, 0 ) && ai->CastSpell( HAMSTRING, *pTarget ) ) + else if( HAMSTRING>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( HAMSTRING, EFFECT_INDEX_0) && ai->CastSpell( HAMSTRING, *pTarget ) ) out << " > Hamstring"; - else if( CHALLENGING_SHOUT>0 && ai->GetRageAmount()>=5 && pVictim != m_bot && ai->GetHealthPercent() > 25 && !pTarget->HasAura( MOCKING_BLOW, 0 ) && !pTarget->HasAura( CHALLENGING_SHOUT, 0 ) && ai->CastSpell( CHALLENGING_SHOUT, *pTarget ) ) + else if( CHALLENGING_SHOUT>0 && ai->GetRageAmount()>=5 && pVictim != m_bot && ai->GetHealthPercent() > 25 && !pTarget->HasAura( MOCKING_BLOW, EFFECT_INDEX_0) && !pTarget->HasAura( CHALLENGING_SHOUT, EFFECT_INDEX_0) && ai->CastSpell( CHALLENGING_SHOUT, *pTarget ) ) out << " > Challenging Shout"; - else if( BLOODTHIRST>0 && ai->GetRageAmount()>=20 && !m_bot->HasAura( BLOODTHIRST, 0 ) && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.7 && ai->CastSpell( BLOODTHIRST, *pTarget ) ) + else if( BLOODTHIRST>0 && ai->GetRageAmount()>=20 && !m_bot->HasAura( BLOODTHIRST, EFFECT_INDEX_0) && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.7 && ai->CastSpell( BLOODTHIRST, *pTarget ) ) out << " > Bloodthrist"; else if( CLEAVE>0 && ai->GetRageAmount()>=20 && ai->CastSpell( CLEAVE, *pTarget ) ) out << " > Cleave"; else if( HEROIC_STRIKE>0 && ai->GetRageAmount()>=15 && ai->CastSpell( HEROIC_STRIKE, *pTarget ) ) out << " > Heroic Strike"; - else if( CONCUSSION_BLOW>0 && ai->GetRageAmount()>=15 && !pTarget->HasAura( WAR_STOMP, 0 ) && !pTarget->HasAura( PIERCING_HOWL, 0 ) && !pTarget->HasAura( SHOCKWAVE, 0 ) && !pTarget->HasAura( CONCUSSION_BLOW, 0 ) && ai->CastSpell( CONCUSSION_BLOW, *pTarget ) ) + else if( CONCUSSION_BLOW>0 && ai->GetRageAmount()>=15 && !pTarget->HasAura( WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura( PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura( SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura( CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell( CONCUSSION_BLOW, *pTarget ) ) out << " > Concussion Blow"; else if( SLAM>0 && ai->GetRageAmount()>=15 && ai->CastSpell( SLAM, *pTarget ) ) out << " > Slam"; - else if( PIERCING_HOWL>0 && ai->GetRageAmount()>=10 && ai->GetAttackerCount()>=3 && !pTarget->HasAura( WAR_STOMP, 0 ) && !pTarget->HasAura( PIERCING_HOWL, 0 ) && !pTarget->HasAura( SHOCKWAVE, 0 ) && !pTarget->HasAura( CONCUSSION_BLOW, 0 ) && ai->CastSpell( PIERCING_HOWL, *pTarget ) ) + else if( PIERCING_HOWL>0 && ai->GetRageAmount()>=10 && ai->GetAttackerCount()>=3 && !pTarget->HasAura( WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura( PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura( SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura( CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell( PIERCING_HOWL, *pTarget ) ) out << " > Piercing Howl"; - else if( MOCKING_BLOW>0 && ai->GetRageAmount()>=10 && pVictim != m_bot && ai->GetHealthPercent() > 25 && !pTarget->HasAura( MOCKING_BLOW, 0 ) && !pTarget->HasAura( CHALLENGING_SHOUT, 0 ) && ai->CastSpell( MOCKING_BLOW, *pTarget ) ) + else if( MOCKING_BLOW>0 && ai->GetRageAmount()>=10 && pVictim != m_bot && ai->GetHealthPercent() > 25 && !pTarget->HasAura( MOCKING_BLOW, EFFECT_INDEX_0) && !pTarget->HasAura( CHALLENGING_SHOUT, EFFECT_INDEX_0) && ai->CastSpell( MOCKING_BLOW, *pTarget ) ) out << " > Mocking Blow"; else if( OVERPOWER>0 && ai->GetRageAmount()>=5 && ai->CastSpell( OVERPOWER, *pTarget ) ) out << " > Overpower"; else if( SUNDER_ARMOR>0 && ai->CastSpell( SUNDER_ARMOR, *pTarget ) ) out << " > Sunder Armor"; - else if( SHATTERING_THROW>0 && !pTarget->HasAura( SHATTERING_THROW, 0 ) && ai->CastSpell( SHATTERING_THROW, *pTarget ) ) + else if( SHATTERING_THROW>0 && !pTarget->HasAura( SHATTERING_THROW, EFFECT_INDEX_0) && ai->CastSpell( SHATTERING_THROW, *pTarget ) ) out << " > Shattering Throw"; else if( HEROIC_THROW>0 && ai->CastSpell( HEROIC_THROW, *pTarget ) ) out << " > Heroic Throw"; - else if( m_bot->getRace() == RACE_TAUREN && !pTarget->HasAura( WAR_STOMP, 0 ) && !pTarget->HasAura( PIERCING_HOWL, 0 ) && !pTarget->HasAura( SHOCKWAVE, 0 ) && !pTarget->HasAura( CONCUSSION_BLOW, 0 ) && ai->CastSpell( WAR_STOMP, *pTarget ) ) + else if( m_bot->getRace() == RACE_TAUREN && !pTarget->HasAura( WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura( PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura( SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura( CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell( WAR_STOMP, *pTarget ) ) out << " > War Stomp"; else if( m_bot->getRace() == RACE_HUMAN && m_bot->hasUnitState( UNIT_STAT_STUNNED ) || m_bot->HasAuraType( SPELL_AURA_MOD_FEAR ) || m_bot->HasAuraType( SPELL_AURA_MOD_DECREASE_SPEED ) || m_bot->HasAuraType( SPELL_AURA_MOD_CHARM ) && ai->CastSpell( EVERY_MAN_FOR_HIMSELF, *m_bot ) ) out << " > Every Man for Himself"; @@ -258,13 +258,13 @@ void PlayerbotWarriorAI::DoNextCombatManeuver(Unit *pTarget) out << " > Stoneform"; else if( m_bot->getRace() == RACE_GNOME && m_bot->hasUnitState( UNIT_STAT_STUNNED ) || m_bot->HasAuraType( SPELL_AURA_MOD_DECREASE_SPEED ) && ai->CastSpell( ESCAPE_ARTIST, *m_bot ) ) out << " > Escape Artist"; - else if( m_bot->getRace() == RACE_NIGHTELF && pVictim == m_bot && ai->GetHealthPercent() < 25 && !m_bot->HasAura( SHADOWMELD, 0 ) && ai->CastSpell( SHADOWMELD, *m_bot ) ) + else if( m_bot->getRace() == RACE_NIGHTELF && pVictim == m_bot && ai->GetHealthPercent() < 25 && !m_bot->HasAura( SHADOWMELD, EFFECT_INDEX_0) && ai->CastSpell( SHADOWMELD, *m_bot ) ) out << " > Shadowmeld"; - else if( m_bot->getRace() == RACE_ORC && !m_bot->HasAura( BLOOD_FURY, 0 ) && ai->CastSpell( BLOOD_FURY, *m_bot ) ) + else if( m_bot->getRace() == RACE_ORC && !m_bot->HasAura( BLOOD_FURY, EFFECT_INDEX_0) && ai->CastSpell( BLOOD_FURY, *m_bot ) ) out << " > Blood Fury"; - else if( m_bot->getRace() == RACE_TROLL && !m_bot->HasAura( BERSERKING, 0 ) && ai->CastSpell( BERSERKING, *m_bot ) ) + else if( m_bot->getRace() == RACE_TROLL && !m_bot->HasAura( BERSERKING, EFFECT_INDEX_0) && ai->CastSpell( BERSERKING, *m_bot ) ) out << " > Berserking"; - else if( m_bot->getRace() == RACE_DRAENEI && ai->GetHealthPercent() < 25 && !m_bot->HasAura(GIFT_OF_THE_NAARU, 0) && ai->CastSpell(GIFT_OF_THE_NAARU, *m_bot) ) + else if( m_bot->getRace() == RACE_DRAENEI && ai->GetHealthPercent() < 25 && !m_bot->HasAura(GIFT_OF_THE_NAARU, EFFECT_INDEX_0) && ai->CastSpell(GIFT_OF_THE_NAARU, *m_bot) ) out << " > Gift of the Naaru"; else out << " > NONE"; @@ -272,15 +272,15 @@ void PlayerbotWarriorAI::DoNextCombatManeuver(Unit *pTarget) case WarriorDefensive: out << "Case Defensive"; - if( DISARM>0 && ai->GetRageAmount()>=15 && !pTarget->HasAura( DISARM, 0 ) && ai->CastSpell( DISARM, *pTarget ) ) + if( DISARM>0 && ai->GetRageAmount()>=15 && !pTarget->HasAura( DISARM, EFFECT_INDEX_0) && ai->CastSpell( DISARM, *pTarget ) ) out << " > Disarm"; else if( SUNDER_ARMOR>0 && ai->GetRageAmount()>=15 && ai->CastSpell( SUNDER_ARMOR, *pTarget ) ) out << " > Sunder Armor"; else if( REVENGE>0 && ai->GetRageAmount()>=5 && ai->CastSpell( REVENGE, *pTarget ) ) out << " > Revenge"; - else if( SHIELD_BLOCK>0 && !m_bot->HasAura( SHIELD_BLOCK, 0 ) && ai->CastSpell( SHIELD_BLOCK, *m_bot ) ) + else if( SHIELD_BLOCK>0 && !m_bot->HasAura( SHIELD_BLOCK, EFFECT_INDEX_0) && ai->CastSpell( SHIELD_BLOCK, *m_bot ) ) out << " > Shield Block"; - else if( SHIELD_WALL>0 && !m_bot->HasAura( SHIELD_WALL, 0 ) && ai->CastSpell( SHIELD_WALL, *m_bot ) ) + else if( SHIELD_WALL>0 && !m_bot->HasAura( SHIELD_WALL, EFFECT_INDEX_0) && ai->CastSpell( SHIELD_WALL, *m_bot ) ) out << " > Shield Wall"; else out << " > NONE"; @@ -308,21 +308,21 @@ void PlayerbotWarriorAI::DoNonCombatActions() // otherwise cast other useful shout // If the bot is protect talented, she/he needs stamina not attack power. // With stance change can the shout change to. - // Inserted line to battle shout m_bot->HasAura( COMMANDING_SHOUT, 0 ) + // Inserted line to battle shout m_bot->HasAura( COMMANDING_SHOUT, EFFECT_INDEX_0) // Natsukawa - if( ( (COMMANDING_SHOUT>0 && !m_bot->HasAura( COMMANDING_SHOUT, 0 )) || - (BATTLE_SHOUT>0 && !m_bot->HasAura( BATTLE_SHOUT, 0 )) ) && - ai->GetRageAmount()<10 && BLOODRAGE>0 && !m_bot->HasAura( BLOODRAGE, 0 ) ) + if( ( (COMMANDING_SHOUT>0 && !m_bot->HasAura( COMMANDING_SHOUT, EFFECT_INDEX_0)) || + (BATTLE_SHOUT>0 && !m_bot->HasAura( BATTLE_SHOUT, EFFECT_INDEX_0)) ) && + ai->GetRageAmount()<10 && BLOODRAGE>0 && !m_bot->HasAura( BLOODRAGE, EFFECT_INDEX_0) ) { // we do have a useful shout, no rage coming but can cast bloodrage... do it ai->CastSpell( BLOODRAGE, *m_bot ); } - else if( COMMANDING_SHOUT>0 && !m_bot->HasAura( COMMANDING_SHOUT, 0 ) ) + else if( COMMANDING_SHOUT>0 && !m_bot->HasAura( COMMANDING_SHOUT, EFFECT_INDEX_0) ) { // use commanding shout now ai->CastSpell( COMMANDING_SHOUT, *m_bot ); } - else if( BATTLE_SHOUT>0 && !m_bot->HasAura( BATTLE_SHOUT, 0 ) && !m_bot->HasAura( COMMANDING_SHOUT, 0 ) ) + else if( BATTLE_SHOUT>0 && !m_bot->HasAura( BATTLE_SHOUT, EFFECT_INDEX_0) && !m_bot->HasAura( COMMANDING_SHOUT, EFFECT_INDEX_0) ) { // use battle shout ai->CastSpell( BATTLE_SHOUT, *m_bot ); @@ -330,7 +330,7 @@ void PlayerbotWarriorAI::DoNonCombatActions() // buff master with VIGILANCE if (VIGILANCE > 0) - (!GetMaster()->HasAura( VIGILANCE, 0 ) && ai->CastSpell( VIGILANCE, *GetMaster() ) ); + (!GetMaster()->HasAura( VIGILANCE, EFFECT_INDEX_0) && ai->CastSpell( VIGILANCE, *GetMaster() ) ); // hp check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) @@ -346,14 +346,14 @@ void PlayerbotWarriorAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(30); return; } - else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, 0) && ai->GetHealthPercent() < 70) + else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(*fItem); ai->SetIgnoreUpdateTime(8); return; } - else if (pItem == NULL && fItem == NULL && m_bot->getRace() == RACE_DRAENEI && !m_bot->HasAura(GIFT_OF_THE_NAARU, 0) && ai->GetHealthPercent() < 70) + else if (pItem == NULL && fItem == NULL && m_bot->getRace() == RACE_DRAENEI && !m_bot->HasAura(GIFT_OF_THE_NAARU, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I'm casting gift of the naaru."); ai->CastSpell(GIFT_OF_THE_NAARU, *m_bot); From 34197485b2704077cfa5ccce946e56d44515fa7c Mon Sep 17 00:00:00 2001 From: blueboy Date: Sat, 27 Feb 2010 21:16:50 +0000 Subject: [PATCH 012/187] Adjust for 'PlayerSpell' changes --- src/game/PlayerbotAI.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index 3ecc8703b..507d1830e 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -185,7 +185,7 @@ uint32 PlayerbotAI::getSpellId(const char* args, bool master) const { uint32 spellId = itr->first; - if (itr->second->state == PLAYERSPELL_REMOVED || itr->second->disabled || IsPassiveSpell(spellId)) + if (itr->second.state == PLAYERSPELL_REMOVED || itr->second.disabled || IsPassiveSpell(spellId)) continue; const SpellEntry* pSpellInfo = sSpellStore.LookupEntry(spellId); @@ -487,7 +487,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) for(PlayerSpellMap::iterator itr = m_bot->GetSpellMap().begin(); itr != m_bot->GetSpellMap().end(); ++itr) { uint32 spellId = itr->first; - if(itr->second->state == PLAYERSPELL_REMOVED || itr->second->disabled || IsPassiveSpell(spellId)) + if(itr->second.state == PLAYERSPELL_REMOVED || itr->second.disabled || IsPassiveSpell(spellId)) continue; const SpellEntry* pSpellInfo = sSpellStore.LookupEntry(spellId); if (!pSpellInfo) @@ -2738,7 +2738,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) for (PlayerSpellMap::iterator itr = m_bot->GetSpellMap().begin(); itr != m_bot->GetSpellMap().end(); ++itr) { const uint32 spellId = itr->first; - if (itr->second->state == PLAYERSPELL_REMOVED || itr->second->disabled || IsPassiveSpell(spellId)) + if (itr->second.state == PLAYERSPELL_REMOVED || itr->second.disabled || IsPassiveSpell(spellId)) continue; const SpellEntry* const pSpellInfo = sSpellStore.LookupEntry(spellId); From c77991287da5fce9dcacd4ab4ff8a825b8b7b53d Mon Sep 17 00:00:00 2001 From: blueboy Date: Wed, 3 Mar 2010 11:34:51 +0000 Subject: [PATCH 013/187] Utilize both map & vmap height calculations for bots --- src/game/Object.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/game/Object.cpp b/src/game/Object.cpp index d53364deb..8ebb12e9b 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -1428,9 +1428,16 @@ void WorldObject::GetRandomPoint( float x, float y, float z, float distance, flo void WorldObject::UpdateGroundPositionZ(float x, float y, float &z) const { - float new_z = GetBaseMap()->GetHeight(x,y,z,true); - if(new_z > INVALID_HEIGHT) - z = new_z+ 0.05f; // just to be sure that we are not a few pixel under the surface + float map_z = GetBaseMap()->GetHeight(x,y,z,false); + float vmap_z = GetBaseMap()->GetHeight(x,y,z,true); + + if(vmap_z > INVALID_HEIGHT) + z = vmap_z - 0.03f; // adjust offset to suit + + if((map_z > vmap_z) && (map_z > z)) + z = map_z; + + MaNGOS::NormalizeMapCoord(z); } bool WorldObject::IsPositionValid() const From 7ad3aeecc84b474dd52ed90e65414bfeecefea76 Mon Sep 17 00:00:00 2001 From: blueboy Date: Wed, 3 Mar 2010 11:55:19 +0000 Subject: [PATCH 014/187] Tidy code & add new config options: PlayerbotAI.MaxNumBots PlayerbotAI.DisableBotsInRealm PlayerbotAI.RestrictBotLevel --- src/game/PlayerbotMgr.cpp | 156 +++++++++++++++++++++---------- src/game/PlayerbotMgr.h | 5 +- src/mangosd/mangosd.conf.dist.in | 19 +++- 3 files changed, 129 insertions(+), 51 deletions(-) diff --git a/src/game/PlayerbotMgr.cpp b/src/game/PlayerbotMgr.cpp index 0abd67de0..16e6f2b7e 100644 --- a/src/game/PlayerbotMgr.cpp +++ b/src/game/PlayerbotMgr.cpp @@ -17,7 +17,10 @@ class CharacterHandler; PlayerbotMgr::PlayerbotMgr(Player* const master) : m_master(master) { // load config variables - m_confDisableBots = sConfig.GetBoolDefault( "PlayerbotAI.DisableBots", false ); + m_confMaxNumBots = sConfig.GetIntDefault( "PlayerbotAI.MaxNumBots", 9 ); + m_confDisableBotsInRealm = sConfig.GetIntDefault( "PlayerbotAI.DisableBotsInRealm", 0 ); + m_confRestrictBotLevel = sConfig.GetIntDefault( "PlayerbotAI.RestrictBotLevel", 80 ); + m_confDisableBots = sConfig.GetBoolDefault( "PlayerbotAI.DisableBots", false ); m_confDebugWhisper = sConfig.GetBoolDefault( "PlayerbotAI.DebugWhisper", false ); m_confFollowDistance[0] = sConfig.GetFloatDefault( "PlayerbotAI.FollowDistanceMin", 0.5f ); m_confFollowDistance[1] = sConfig.GetFloatDefault( "PlayerbotAI.FollowDistanceMin", 1.0f ); @@ -463,23 +466,23 @@ void PlayerbotMgr::RemoveAllBotsFromGroup() bool ChatHandler::HandlePlayerbotCommand(const char* args) { - if(sConfig.GetBoolDefault("PlayerbotAI.DisableBots", false)) - { - PSendSysMessage("|cffff0000Playerbot system is currently disabled!"); + if(sConfig.GetBoolDefault("PlayerbotAI.DisableBots", false)) + { + PSendSysMessage("|cffff0000Playerbot system is currently disabled!"); SetSentErrorMessage(true); return false; - } + } if (! m_session) { - PSendSysMessage("You may only add bots from an active session"); + PSendSysMessage("|cffff0000You may only add bots from an active session"); SetSentErrorMessage(true); return false; } if (!*args) { - PSendSysMessage("usage: add PLAYERNAME or remove PLAYERNAME"); + PSendSysMessage("|cffff0000usage: add PLAYERNAME or remove PLAYERNAME"); SetSentErrorMessage(true); return false; } @@ -488,7 +491,7 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) char *charname = strtok (NULL, " "); if (!cmd || !charname) { - PSendSysMessage("usage: add PLAYERNAME or remove PLAYERNAME"); + PSendSysMessage("|cffff0000usage: add PLAYERNAME or remove PLAYERNAME"); SetSentErrorMessage(true); return false; } @@ -508,8 +511,9 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) } uint32 accountId = sObjectMgr.GetPlayerAccountIdByGUID(guid); - if (accountId != m_session->GetAccountId()) { - PSendSysMessage("You may only add bots from the same account."); + if (accountId != m_session->GetAccountId()) + { + PSendSysMessage("|cffff0000You may only add bots from the same account."); SetSentErrorMessage(true); return false; } @@ -522,62 +526,116 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) m_session->GetPlayer()->SetPlayerbotMgr(mgr); } + QueryResult *resultrealm = loginDatabase.PQuery("SELECT active_realm_id FROM account WHERE id = '%u'", m_session->GetAccountId()); + if(resultrealm) + { + Field *fields=resultrealm->Fetch(); + uint32 acctrealmid = fields[0].GetUInt32(); + if(acctrealmid == sConfig.GetIntDefault("PlayerbotAI.DisableBotsInRealm", 0)) + { + PSendSysMessage("|cffff0000bots are disabled for this realm."); + SetSentErrorMessage(true); + delete resultrealm; + return false; + } + } + delete resultrealm; + + QueryResult *resultchar = CharacterDatabase.PQuery("SELECT Count(*) FROM characters WHERE online = 1 AND account = '%u'", m_session->GetAccountId()); + if(resultchar) + { + Field *fields=resultchar->Fetch(); + uint32 acctcharcount = fields[0].GetUInt32(); + if((acctcharcount > sConfig.GetIntDefault("PlayerbotAI.MaxNumBots", 9)) && (cmdStr == "add" || cmdStr == "login")) + { + PSendSysMessage("|cffff0000You cannot summon anymore bots, for this account."); + SetSentErrorMessage(true); + delete resultchar; + return false; + } + } + delete resultchar; + + QueryResult *resultlvl = CharacterDatabase.PQuery("SELECT level,name FROM characters WHERE guid = '%u'", guid); + if(resultlvl) + { + Field *fields=resultlvl->Fetch(); + uint32 charlvl = fields[0].GetUInt32(); + if(charlvl > sConfig.GetIntDefault("PlayerbotAI.RestrictBotLevel", 80)) + { + PSendSysMessage("|cffff0000You cannot summon |cffffffff[%s]|cffff0000, it's level is too high.",fields[1].GetString()); + SetSentErrorMessage(true); + delete resultlvl; + return false; + } + } + delete resultlvl; + if (cmdStr == "add" || cmdStr == "login") { - if (mgr->GetPlayerBot(guid)) { + if (mgr->GetPlayerBot(guid)) + { PSendSysMessage("Bot already exists in world."); SetSentErrorMessage(true); return false; } - mgr->AddPlayerBot(guid); + CharacterDatabase.DirectPExecute("UPDATE characters SET online = 1 WHERE guid = '%u'", guid); + mgr->AddPlayerBot(guid); PSendSysMessage("Bot added successfully."); } else if (cmdStr == "remove" || cmdStr == "logout") { - if (! mgr->GetPlayerBot(guid)) { - PSendSysMessage("Bot can not be removed because bot does not exist in world."); + if (! mgr->GetPlayerBot(guid)) + { + PSendSysMessage("|cffff0000Bot can not be removed because bot does not exist in world."); SetSentErrorMessage(true); return false; } + CharacterDatabase.DirectPExecute("UPDATE characters SET online = 0 WHERE guid = '%u'", guid); mgr->LogoutPlayerBot(guid); PSendSysMessage("Bot removed successfully."); } - else if (cmdStr == "co" || cmdStr == "combatorder") - { - Unit *target = 0; - char *orderChar = strtok( NULL, " " ); - if( !orderChar ) { - PSendSysMessage("Syntax error: .bot co [targetPlayer]"); + else if (cmdStr == "co" || cmdStr == "combatorder") + { + Unit *target = 0; + char *orderChar = strtok( NULL, " " ); + if(!orderChar) + { + PSendSysMessage("|cffff0000Syntax error:|cffffffff .bot co [targetPlayer]"); SetSentErrorMessage(true); return false; - } - std::string orderStr = orderChar; - if( orderStr == "protect" || orderStr == "assist" ) { - char *targetChar = strtok( NULL, " " ); - uint64 targetGUID = m_session->GetPlayer()->GetSelection(); - if( !targetChar && !targetGUID ) { - PSendSysMessage("Combat orders protect and assist expect a target either by selection or by giving target player in command string!"); - SetSentErrorMessage(true); - return false; - } - std::string targetStr = targetChar; - if( targetChar ) { - targetGUID = sObjectMgr.GetPlayerGUIDByName( targetStr.c_str() ); - } - target = ObjectAccessor::GetUnit( *m_session->GetPlayer(), targetGUID ); - if( !target ) { - PSendSysMessage("Invalid target for combat order protect or assist!"); - SetSentErrorMessage(true); - return false; - } - } - if (mgr->GetPlayerBot(guid) == NULL) { - PSendSysMessage("Bot can not receive combat order because bot does not exist in world."); - SetSentErrorMessage(true); - return false; } - mgr->GetPlayerBot( guid )->GetPlayerbotAI()->SetCombatOrderByStr( orderStr, target ); - } - + std::string orderStr = orderChar; + if(orderStr == "protect" || orderStr == "assist") + { + char *targetChar = strtok( NULL, " " ); + uint64 targetGUID = m_session->GetPlayer()->GetSelection(); + if(!targetChar && !targetGUID) + { + PSendSysMessage("|cffff0000Combat orders protect and assist expect a target either by selection or by giving target player in command string!"); + SetSentErrorMessage(true); + return false; + } + std::string targetStr = targetChar; + if(targetChar) + { + targetGUID = sObjectMgr.GetPlayerGUIDByName( targetStr.c_str() ); + } + target = ObjectAccessor::GetUnit( *m_session->GetPlayer(), targetGUID ); + if(!target) + { + PSendSysMessage("|cffff0000Invalid target for combat order protect or assist!"); + SetSentErrorMessage(true); + return false; + } + } + if (mgr->GetPlayerBot(guid) == NULL) + { + PSendSysMessage("|cffff0000Bot can not receive combat order because bot does not exist in world."); + SetSentErrorMessage(true); + return false; + } + mgr->GetPlayerBot( guid )->GetPlayerbotAI()->SetCombatOrderByStr( orderStr, target ); + } return true; -} \ No newline at end of file +} diff --git a/src/game/PlayerbotMgr.h b/src/game/PlayerbotMgr.h index 3381a5a2e..288f9bd95 100644 --- a/src/game/PlayerbotMgr.h +++ b/src/game/PlayerbotMgr.h @@ -43,7 +43,10 @@ class MANGOS_DLL_SPEC PlayerbotMgr public: // config variables - bool m_confDisableBots; + uint32 m_confRestrictBotLevel; + uint32 m_confDisableBotsInRealm; + uint32 m_confMaxNumBots; + bool m_confDisableBots; bool m_confDebugWhisper; float m_confFollowDistance[2]; diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in index a36f2fa63..0511f7e04 100644 --- a/src/mangosd/mangosd.conf.dist.in +++ b/src/mangosd/mangosd.conf.dist.in @@ -1424,9 +1424,26 @@ SOAP.Port = 7878 # PlayerbotAI.FollowDistanceMax # Min. and Max. follow distance for bots # Default: 0.5 / 1.0 +# +# PlayerbotAI.MaxNumBots +# Limits the number of bots per account (Max 9) +# Default: 9 +# +# PlayerbotAI.DisableBotsInRealm +# Disable the bot command and bot menu for this realm +# Default: 0 - off +# Realm id: - on +# +# PlayerbotAI.RestrictBotLevel +# Restrict the allowed bot level (Current Max 80) +# Default: 80 +# ################################################################################################################### PlayerbotAI.DisableBots = 0 PlayerbotAI.DebugWhisper = 0 PlayerbotAI.FollowDistanceMin = 0.5 -PlayerbotAI.FollowDistanceMax = 1.0 \ No newline at end of file +PlayerbotAI.FollowDistanceMax = 1.0 +PlayerbotAI.MaxNumBots = 9 +PlayerbotAI.DisableBotsInRealm = 0 +PlayerbotAI.RestrictBotLevel = 80 From 8fdcc010cf3eb9b61c464d01d5bb09dbb506a82e Mon Sep 17 00:00:00 2001 From: blueboy Date: Sat, 6 Mar 2010 01:20:27 +0000 Subject: [PATCH 015/187] Add 'pet feed' visual to PlayerbotHunterAI --- src/game/PlayerbotHunterAI.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/game/PlayerbotHunterAI.cpp b/src/game/PlayerbotHunterAI.cpp index 10fcc9c27..a7658e242 100644 --- a/src/game/PlayerbotHunterAI.cpp +++ b/src/game/PlayerbotHunterAI.cpp @@ -356,6 +356,7 @@ void PlayerbotHunterAI::DoNonCombatActions() } else if(pet->GetHappinessState() != HAPPY) // if pet is hungry { + Unit *caster = (Unit*)m_bot; // list out items in main backpack for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; slot++) { @@ -369,6 +370,7 @@ void PlayerbotHunterAI::DoNonCombatActions() if(pet->HaveInDiet(pItemProto)) // is pItem in pets diet { //sLog.outDebug("Food for pet: %s",pItemProto->Name1); + caster->CastSpell(caster,51284,true); // pet feed visual uint32 count = 1; // number of items used int32 benefit = pet->GetCurrentFoodBenefitLevel(pItemProto->ItemLevel); // nutritional value of food m_bot->DestroyItemCount(pItem,count,true); // remove item from inventory @@ -397,7 +399,8 @@ void PlayerbotHunterAI::DoNonCombatActions() if(pet->HaveInDiet(pItemProto)) // is pItem in pets diet { //sLog.outDebug("Food for pet: %s",pItemProto->Name1); - uint32 count = 1; // number of items used + caster->CastSpell(caster,51284,true); // pet feed visual + uint32 count = 1; // number of items used int32 benefit = pet->GetCurrentFoodBenefitLevel(pItemProto->ItemLevel); // nutritional value of food m_bot->DestroyItemCount(pItem,count,true); // remove item from inventory m_bot->CastCustomSpell(m_bot,PET_FEED,&benefit,NULL,NULL,true); // feed pet From 3e5bdd5493e2729a523b2f9e84ca2a2859708a7b Mon Sep 17 00:00:00 2001 From: blueboy Date: Thu, 11 Mar 2010 23:21:18 +0000 Subject: [PATCH 016/187] Remove redundant PlayerbotAI.DisableBotsInRealm option, Fix for HasAura issue & Remove trailing whitespaces --- bot_readme.txt | 2 +- bot_todo.txt | 2 +- src/game/CharacterHandler.cpp | 2 +- src/game/Chat.cpp | 2 +- src/game/Chat.h | 2 +- src/game/ChatHandler.cpp | 2 +- src/game/Creature.h | 3 +- src/game/Group.cpp | 2 +- src/game/GroupHandler.cpp | 2 +- src/game/Makefile.am | 2 +- src/game/Object.cpp | 2 +- src/game/Player.cpp | 2 +- src/game/Player.h | 2 +- src/game/PlayerbotAI.cpp | 4 +- src/game/PlayerbotAI.h | 2 +- src/game/PlayerbotClassAI.cpp | 2 +- src/game/PlayerbotDeathKnightAI.cpp | 26 +++++------ src/game/PlayerbotDeathKnightAI.h | 8 ++-- src/game/PlayerbotDruidAI.cpp | 42 ++++++++--------- src/game/PlayerbotDruidAI.h | 28 +++++------ src/game/PlayerbotHunterAI.cpp | 58 +++++++++++------------ src/game/PlayerbotHunterAI.h | 8 ++-- src/game/PlayerbotMageAI.cpp | 36 +++++++-------- src/game/PlayerbotMgr.cpp | 16 ------- src/game/PlayerbotMgr.h | 2 +- src/game/PlayerbotPaladinAI.cpp | 72 ++++++++++++++--------------- src/game/PlayerbotPaladinAI.h | 12 ++--- src/game/PlayerbotPriestAI.cpp | 2 +- src/game/PlayerbotPriestAI.h | 8 ++-- src/game/PlayerbotRogueAI.cpp | 2 +- src/game/PlayerbotRogueAI.h | 8 ++-- src/game/PlayerbotShamanAI.cpp | 38 +++++++-------- src/game/PlayerbotShamanAI.h | 8 ++-- src/game/PlayerbotWarlockAI.cpp | 42 ++++++++--------- src/game/PlayerbotWarlockAI.h | 16 +++---- src/game/PlayerbotWarriorAI.cpp | 26 +++++------ src/game/PlayerbotWarriorAI.h | 8 ++-- src/game/QueryHandler.cpp | 2 +- src/game/WorldSession.cpp | 2 +- src/mangosd/mangosd.conf.dist.in | 6 --- 40 files changed, 244 insertions(+), 267 deletions(-) diff --git a/bot_readme.txt b/bot_readme.txt index fbe4c2a29..c02455928 100644 --- a/bot_readme.txt +++ b/bot_readme.txt @@ -27,7 +27,7 @@ Commands: /t BOTNAME equip /t BOTNAME reset (will reset states, orders and loot list) /t BOTNAME report (bot reports all items needed to finish quests) -/t BOTNAME free (bot shows free empty space in its inventory) +/t BOTNAME free (bot shows free empty space in its inventory) Shortcuts: c = cast diff --git a/bot_todo.txt b/bot_todo.txt index e6bad0c1c..bc3fe15f6 100644 --- a/bot_todo.txt +++ b/bot_todo.txt @@ -26,4 +26,4 @@ Needs some fix. Rogue : some abilitys require Rogue to be stealthed and behind target. ///---Implement locale independet way of getting spellIDs---/// -Hardcode lowest rank spellID, use function to get highest rank \ No newline at end of file +Hardcode lowest rank spellID, use function to get highest rank diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp index 5d0a0b324..d3d2ee4cd 100644 --- a/src/game/CharacterHandler.cpp +++ b/src/game/CharacterHandler.cpp @@ -1378,6 +1378,6 @@ void WorldSession::HandleEquipmentSetUse(WorldPacket &recv_data) } WorldPacket data(SMSG_EQUIPMENT_SET_USE_RESULT, 1); - data << uint8(0); // 4 - equipment swap failed - inventory is full + data << uint8(0); // 4 - equipment swap failed - inventory is full SendPacket(&data); } diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index 99098bdbc..f0c3f163f 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -906,7 +906,7 @@ bool ChatHandler::ExecuteCommandInTable(ChatCommand *table, const char* text, co fullcmd.c_str(),p->GetName(),GetAccountId(),p->GetPositionX(),p->GetPositionY(),p->GetPositionZ(),p->GetMapId(), sel_guid.GetString().c_str()); } - else // 0 account -> console + else // 0 account -> console { sLog.outCommand(GetAccountId(),"Command: %s [Account: %u from %s]", fullcmd.c_str(),GetAccountId(),GetAccountId() ? "RA-connection" : "Console"); diff --git a/src/game/Chat.h b/src/game/Chat.h index 0450c5dc4..ee4dd9eaf 100644 --- a/src/game/Chat.h +++ b/src/game/Chat.h @@ -32,7 +32,7 @@ class ChatCommand { public: const char * Name; - uint32 SecurityLevel; // function pointer required correct align (use uint32) + uint32 SecurityLevel; // function pointer required correct align (use uint32) bool AllowConsole; bool (ChatHandler::*Handler)(const char* args); std::string Help; diff --git a/src/game/ChatHandler.cpp b/src/game/ChatHandler.cpp index ea93eeeed..27fe92155 100644 --- a/src/game/ChatHandler.cpp +++ b/src/game/ChatHandler.cpp @@ -622,7 +622,7 @@ void WorldSession::HandleChatIgnoredOpcode(WorldPacket& recv_data ) //sLog.outDebug("WORLD: Received CMSG_CHAT_IGNORED"); recv_data >> iguid; - recv_data >> unk; // probably related to spam reporting + recv_data >> unk; // probably related to spam reporting Player *player = sObjectMgr.GetPlayer(iguid); if(!player || !player->GetSession()) diff --git a/src/game/Creature.h b/src/game/Creature.h index ade26099b..50fd2fabd 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -185,7 +185,7 @@ struct EquipmentInfo // from `creature` table struct CreatureData { - uint32 id; // entry in creature_template + uint32 id; // entry in creature_template uint16 mapid; uint16 phaseMask; uint32 displayid; @@ -404,7 +404,6 @@ class MANGOS_DLL_SPEC Creature : public Unit void SetCorpseDelay(uint32 delay) { m_corpseDelay = delay; } bool isRacialLeader() const { return GetCreatureInfo()->RacialLeader; } bool isCivilian() const { return GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_CIVILIAN; } - bool canWalk() const { return GetCreatureInfo()->InhabitType & INHABIT_GROUND; } bool canSwim() const { return GetCreatureInfo()->InhabitType & INHABIT_WATER; } bool canFly() const { return GetCreatureInfo()->InhabitType & INHABIT_AIR; } diff --git a/src/game/Group.cpp b/src/game/Group.cpp index 11cfbd5b3..3a0346f93 100644 --- a/src/game/Group.cpp +++ b/src/game/Group.cpp @@ -314,7 +314,7 @@ uint32 Group::RemoveMember(const uint64 &guid, const uint8 &method) //END Playerbot mod // remove member and change leader (if need) only if strong more 2 members _before_ member remove - if(GetMembersCount() > uint32(isBGGroup() ? 1 : 2)) // in BG group case allow 1 members group + if(GetMembersCount() > uint32(isBGGroup() ? 1 : 2)) // in BG group case allow 1 members group { bool leaderChanged = _removeMember(guid); diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp index 7086c6e64..f8c976367 100644 --- a/src/game/GroupHandler.cpp +++ b/src/game/GroupHandler.cpp @@ -54,7 +54,7 @@ void WorldSession::HandleGroupInviteOpcode( WorldPacket & recv_data ) { std::string membername; recv_data >> membername; - recv_data.read_skip(); // 0 for all known invite ways + recv_data.read_skip(); // 0 for all known invite ways // attempt add selected player diff --git a/src/game/Makefile.am b/src/game/Makefile.am index 509f135dc..ef0a7b2d9 100644 --- a/src/game/Makefile.am +++ b/src/game/Makefile.am @@ -7,7 +7,7 @@ # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License diff --git a/src/game/Object.cpp b/src/game/Object.cpp index daaaff94e..7586c23d9 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -1979,4 +1979,4 @@ bool WorldObject::IsControlledByPlayer() const default: return false; } -} \ No newline at end of file +} diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 60fd48297..48d3020fc 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -460,7 +460,7 @@ Player::Player (WorldSession *session): Unit(), m_achievementMgr(this), m_reputa m_stableSlots = 0; - /////////////////// Instance System ///////////////////// + /////////////////// Instance System //////////////////// m_HomebindTimer = 0; m_InstanceValid = true; diff --git a/src/game/Player.h b/src/game/Player.h index 2673f9516..4475d2277 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -32,7 +32,7 @@ #include "WorldSession.h" #include "Pet.h" #include "MapReference.h" -#include "Util.h" // for Tokens typedef +#include "Util.h" // for Tokens typedef #include "AchievementMgr.h" #include "ReputationMgr.h" #include "BattleGround.h" diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index 507d1830e..ea62d7e1f 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -858,8 +858,8 @@ uint8 PlayerbotAI::GetRunicPower() const return GetRunicPower(*m_bot); } -typedef std::pair spellEffectPair; -typedef std::multimap AuraMap; +//typedef std::pair spellEffectPair; +//typedef std::multimap AuraMap; bool PlayerbotAI::HasAura(uint32 spellId, const Unit& player) const { diff --git a/src/game/PlayerbotAI.h b/src/game/PlayerbotAI.h index 2045ac2c5..c1de0e07f 100644 --- a/src/game/PlayerbotAI.h +++ b/src/game/PlayerbotAI.h @@ -78,7 +78,7 @@ class MANGOS_DLL_SPEC PlayerbotAI AIT_LOWESTTHREAT = 0x01, AIT_HIGHESTTHREAT = 0x02, AIT_VICTIMSELF = 0x04, - AIT_VICTIMNOTSELF = 0x08 // !!! must use victim param in FindAttackers + AIT_VICTIMNOTSELF = 0x08 // !!! must use victim param in FindAttackers }; struct AttackerInfo { diff --git a/src/game/PlayerbotClassAI.cpp b/src/game/PlayerbotClassAI.cpp index 96e19b7ab..b7e853c3d 100644 --- a/src/game/PlayerbotClassAI.cpp +++ b/src/game/PlayerbotClassAI.cpp @@ -4,7 +4,7 @@ PlayerbotClassAI::PlayerbotClassAI(Player* const master, Player* const bot, PlayerbotAI* const ai): m_master(master), m_bot(bot), m_ai(ai) {} PlayerbotClassAI::~PlayerbotClassAI() {} -bool PlayerbotClassAI::DoFirstCombatManeuver(Unit *) +bool PlayerbotClassAI::DoFirstCombatManeuver(Unit *) { // return false, if done with opening moves/spells return false; diff --git a/src/game/PlayerbotDeathKnightAI.cpp b/src/game/PlayerbotDeathKnightAI.cpp index 09dfc1dce..175b1a2fa 100644 --- a/src/game/PlayerbotDeathKnightAI.cpp +++ b/src/game/PlayerbotDeathKnightAI.cpp @@ -14,7 +14,7 @@ PlayerbotDeathKnightAI::PlayerbotDeathKnightAI(Player* const master, Player* con UNHOLY_BLIGHT = ai->getSpellId("unholy blight"); SCOURGE_STRIKE = ai->getSpellId("scourge strike"); DEATH_AND_DECAY = ai->getSpellId("death and decay"); - CORPSE_EXPLOSION = ai->getSpellId("corpse explosion"); + CORPSE_EXPLOSION = ai->getSpellId("corpse explosion"); BONE_SHIELD = ai->getSpellId("shield"); // buffs ANTI_MAGIC_SHELL = ai->getSpellId("anti-magic shell"); ANTI_MAGIC_ZONE = ai->getSpellId("anti-magic"); @@ -36,14 +36,14 @@ PlayerbotDeathKnightAI::PlayerbotDeathKnightAI(Player* const master, Player* con HORN_OF_WINTER = ai->getSpellId("horn of winter"); ICEBOUND_FORTITUDE= ai->getSpellId("icebound fortitude"); EMPOWER_WEAPON = ai->getSpellId("empower rune weapon"); - UNBREAKABLE_ARMOR = ai->getSpellId("unbreakable armor"); + UNBREAKABLE_ARMOR = ai->getSpellId("unbreakable armor"); BLOOD_STRIKE = ai->getSpellId("blood strike"); // Blood PESTILENCE = ai->getSpellId("pestilence"); STRANGULATE = ai->getSpellId("strangulate"); BLOOD_BOIL = ai->getSpellId("blood boil"); HEART_STRIKE = ai->getSpellId("heart strike"); DANCING_WEAPON = ai->getSpellId("dancing rune weapon"); - DARK_COMMAND = ai->getSpellId("dark command"); + DARK_COMMAND = ai->getSpellId("dark command"); MARK_OF_BLOOD = ai->getSpellId("mark of blood"); // buffs RUNE_TAP = ai->getSpellId("rune tap"); VAMPIRIC_BLOOD = ai->getSpellId("vampiric blood"); @@ -57,16 +57,16 @@ PlayerbotDeathKnightAI::PlayerbotDeathKnightAI(Player* const master, Player* con RECENTLY_BANDAGED = 11196; // first aid check // racial - ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf - GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei - STONEFORM = ai->getSpellId("stoneform"); // dwarf - ESCAPE_ARTIST = ai->getSpellId("escape artist"); // gnome - EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human - SHADOWMELD = ai->getSpellId("shadowmeld"); // night elf - BLOOD_FURY = ai->getSpellId("blood fury"); // orc - WAR_STOMP = ai->getSpellId("war stomp"); // tauren - BERSERKING = ai->getSpellId("berserking"); // troll - WILL_OF_THE_FORSAKEN = ai->getSpellId("will of the forsaken"); // undead + ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf + GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei + STONEFORM = ai->getSpellId("stoneform"); // dwarf + ESCAPE_ARTIST = ai->getSpellId("escape artist"); // gnome + EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human + SHADOWMELD = ai->getSpellId("shadowmeld"); // night elf + BLOOD_FURY = ai->getSpellId("blood fury"); // orc + WAR_STOMP = ai->getSpellId("war stomp"); // tauren + BERSERKING = ai->getSpellId("berserking"); // troll + WILL_OF_THE_FORSAKEN = ai->getSpellId("will of the forsaken"); // undead } PlayerbotDeathKnightAI::~PlayerbotDeathKnightAI() {} diff --git a/src/game/PlayerbotDeathKnightAI.h b/src/game/PlayerbotDeathKnightAI.h index 81ecd99ca..b6611dd6d 100644 --- a/src/game/PlayerbotDeathKnightAI.h +++ b/src/game/PlayerbotDeathKnightAI.h @@ -38,11 +38,11 @@ class MANGOS_DLL_SPEC PlayerbotDeathKnightAI : PlayerbotClassAI // Blood uint32 BLOOD_STRIKE, PESTILENCE, STRANGULATE, BLOOD_BOIL, HEART_STRIKE, MARK_OF_BLOOD, BLOOD_PRESENCE, RUNE_TAP, VAMPIRIC_BLOOD, DEATH_PACT, DEATH_RUNE_MASTERY, HYSTERIA, DANCING_WEAPON, DARK_COMMAND; - // first aid - uint32 RECENTLY_BANDAGED; + // first aid + uint32 RECENTLY_BANDAGED; - // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + // racial + uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; uint32 SpellSequence, LastSpellUnholyDK, LastSpellFrostDK, LastSpellBloodDK; }; diff --git a/src/game/PlayerbotDruidAI.cpp b/src/game/PlayerbotDruidAI.cpp index 59b975b11..89d36bdaf 100644 --- a/src/game/PlayerbotDruidAI.cpp +++ b/src/game/PlayerbotDruidAI.cpp @@ -16,27 +16,27 @@ PlayerbotDruidAI::PlayerbotDruidAI(Player* const master, Player* const bot, Play STARFALL = ai->getSpellId("starfall"); WRATH = ai->getSpellId("wrath"); ROOTS = ai->getSpellId("roots"); - INSECT_SWARM = ai->getSpellId("insect swarm"); - FORCE_OF_NATURE = ai->getSpellId("force of nature"); - HURRICANE = ai->getSpellId("hurricane"); + INSECT_SWARM = ai->getSpellId("insect swarm"); + FORCE_OF_NATURE = ai->getSpellId("force of nature"); + HURRICANE = ai->getSpellId("hurricane"); MARK_OF_THE_WILD = ai->getSpellId("mark of the wild"); // buffs THORNS = ai->getSpellId("thorns"); - BARKSKIN = ai->getSpellId("barkskin"); - INNERVATE = ai->getSpellId("innervate"); - MANA_REJUVENATION = ai->getSpellId("mana rejuvenation"); + BARKSKIN = ai->getSpellId("barkskin"); + INNERVATE = ai->getSpellId("innervate"); + MANA_REJUVENATION = ai->getSpellId("mana rejuvenation"); FAERIE_FIRE = ai->getSpellId("faerie fire"); // debuffs REJUVENATION = ai->getSpellId("rejuvenation"); // heals REGROWTH = ai->getSpellId("regrowth"); - WILD_GROWTH = ai->getSpellId("wild growth"); + WILD_GROWTH = ai->getSpellId("wild growth"); LIFEBLOOM = ai->getSpellId("lifebloom"); NOURISH = ai->getSpellId("nourish"); HEALING_TOUCH = ai->getSpellId("healing touch"); - SWIFTMEND = ai->getSpellId("swiftmend"); - TRANQUILITY = ai->getSpellId("tranquility"); + SWIFTMEND = ai->getSpellId("swiftmend"); + TRANQUILITY = ai->getSpellId("tranquility"); //Druid Forms - MOONKIN_FORM = ai->getSpellId("moonkin form"); + MOONKIN_FORM = ai->getSpellId("moonkin form"); DIRE_BEAR_FORM = ai->getSpellId("dire bear form"); - BEAR_FORM = ai->getSpellId("bear form"); + BEAR_FORM = ai->getSpellId("bear form"); CAT_FORM = ai->getSpellId("cat form"); TREE_OF_LIFE = 33891; //Cat Attack type's @@ -50,19 +50,19 @@ PlayerbotDruidAI::PlayerbotDruidAI(Player* const master, Player* const bot, Play FEROCIOUS_BITE = ai->getSpellId("ferocious bite"); //35 MAIM = ai->getSpellId("maim"); //35 //Bear/Dire Bear Attacks & Buffs - BASH = ai->getSpellId("bash"); //10 rage - MAUL = ai->getSpellId("maul"); //15 - SWIPE = ai->getSpellId("swipe"); //20 - DEMORALIZING_ROAR = ai->getSpellId("roar"); //10 - CHALLENGING_ROAR = ai->getSpellId("challenging roar");//15 - ENRAGE = ai->getSpellId("enrage"); - GROWL = ai->getSpellId("growl"); + BASH = ai->getSpellId("bash"); //10 rage + MAUL = ai->getSpellId("maul"); //15 + SWIPE = ai->getSpellId("swipe"); //20 + DEMORALIZING_ROAR = ai->getSpellId("roar"); //10 + CHALLENGING_ROAR = ai->getSpellId("challenging roar");//15 + ENRAGE = ai->getSpellId("enrage"); + GROWL = ai->getSpellId("growl"); - RECENTLY_BANDAGED = 11196; // first aid check + RECENTLY_BANDAGED = 11196; // first aid check // racial - SHADOWMELD = ai->getSpellId("shadowmeld"); // night elf - WAR_STOMP = ai->getSpellId("war stomp"); // tauren + SHADOWMELD = ai->getSpellId("shadowmeld"); // night elf + WAR_STOMP = ai->getSpellId("war stomp"); // tauren } PlayerbotDruidAI::~PlayerbotDruidAI() {} diff --git a/src/game/PlayerbotDruidAI.h b/src/game/PlayerbotDruidAI.h index 231f4e0b6..927b74f56 100644 --- a/src/game/PlayerbotDruidAI.h +++ b/src/game/PlayerbotDruidAI.h @@ -32,29 +32,29 @@ class MANGOS_DLL_SPEC PlayerbotDruidAI : PlayerbotClassAI // Heals the target based off its hps void HealTarget (Unit& target, uint8 hp); - // druid cat/bear/dire bear/moonkin/tree of life forms - uint32 CAT_FORM, BEAR_FORM, DIRE_BEAR_FORM, MOONKIN_FORM, TREE_OF_LIFE; + // druid cat/bear/dire bear/moonkin/tree of life forms + uint32 CAT_FORM, BEAR_FORM, DIRE_BEAR_FORM, MOONKIN_FORM, TREE_OF_LIFE; // druid cat attacks uint32 CLAW, COWER, TIGERS_FURY, RAKE, RIP, FEROCIOUS_BITE, MAIM, MANGLE; - // druid bear/dire bear attacks & buffs - uint32 BASH, MAUL, SWIPE, DEMORALIZING_ROAR, CHALLENGING_ROAR, GROWL, ENRAGE; + // druid bear/dire bear attacks & buffs + uint32 BASH, MAUL, SWIPE, DEMORALIZING_ROAR, CHALLENGING_ROAR, GROWL, ENRAGE; - // druid attacks & debuffs - uint32 MOONFIRE, ROOTS, WRATH, STARFALL, STARFIRE, INSECT_SWARM, FAERIE_FIRE, FORCE_OF_NATURE, HURRICANE; + // druid attacks & debuffs + uint32 MOONFIRE, ROOTS, WRATH, STARFALL, STARFIRE, INSECT_SWARM, FAERIE_FIRE, FORCE_OF_NATURE, HURRICANE; - // druid buffs - uint32 MARK_OF_THE_WILD, THORNS, MANA_REJUVENATION, INNERVATE, BARKSKIN; + // druid buffs + uint32 MARK_OF_THE_WILD, THORNS, MANA_REJUVENATION, INNERVATE, BARKSKIN; - // druid heals - uint32 LIFEBLOOM, REJUVENATION, REGROWTH, NOURISH, HEALING_TOUCH, WILD_GROWTH, SWIFTMEND, TRANQUILITY; + // druid heals + uint32 LIFEBLOOM, REJUVENATION, REGROWTH, NOURISH, HEALING_TOUCH, WILD_GROWTH, SWIFTMEND, TRANQUILITY; - // first aid - uint32 RECENTLY_BANDAGED; + // first aid + uint32 RECENTLY_BANDAGED; - // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + // racial + uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; uint32 SpellSequence, DruidSpellCombat; }; diff --git a/src/game/PlayerbotHunterAI.cpp b/src/game/PlayerbotHunterAI.cpp index a7658e242..d29b51bb8 100644 --- a/src/game/PlayerbotHunterAI.cpp +++ b/src/game/PlayerbotHunterAI.cpp @@ -15,11 +15,11 @@ PlayerbotHunterAI::PlayerbotHunterAI(Player* const master, Player* const bot, Pl PET_FEED = 1539; // PET SKILLS - INTIMIDATION = ai->getSpellId("intimidation"); // (generic) - SONIC_BLAST = ai->getSpellId("sonic blast"); // bat - DEMORALIZING_SCREECH = ai->getSpellId("demoralizing screech"); // carrion bird + INTIMIDATION = ai->getSpellId("intimidation"); // (generic) + SONIC_BLAST = ai->getSpellId("sonic blast"); // bat + DEMORALIZING_SCREECH = ai->getSpellId("demoralizing screech"); // carrion bird BAD_ATTITUDE = ai->getSpellId("bad attitude"); // crocolisk - NETHER_SHOCK = ai->getSpellId("nether shock"); // nether ray + NETHER_SHOCK = ai->getSpellId("nether shock"); // nether ray // RANGED COMBAT AUTO_SHOT = ai->getSpellId("auto shot"); // basic ranged hunter fighting @@ -28,51 +28,51 @@ PlayerbotHunterAI::PlayerbotHunterAI(Player* const master, Player* const bot, Pl CONCUSSIVE_SHOT = ai->getSpellId("concussive shot"); DISTRACTING_SHOT = ai->getSpellId("distracting shot"); MULTI_SHOT = ai->getSpellId("multi-shot"); - EXPLOSIVE_SHOT = ai->getSpellId("explosive shot"); + EXPLOSIVE_SHOT = ai->getSpellId("explosive shot"); SERPENT_STING = ai->getSpellId("serpent sting"); SCORPID_STING = ai->getSpellId("scorpid sting"); - WYVERN_STING = ai->getSpellId("wyvern sting"); - VIPER_STING = ai->getSpellId("viper sting"); - AIMED_SHOT = ai->getSpellId("aimed shot"); - STEADY_SHOT = ai->getSpellId("steady shot"); - CHIMERA_SHOT = ai->getSpellId("chimera shot"); - VOLLEY = ai->getSpellId("volley"); - BLACK_ARROW = ai->getSpellId("black arrow"); - KILL_SHOT = ai->getSpellId("kill shot"); + WYVERN_STING = ai->getSpellId("wyvern sting"); + VIPER_STING = ai->getSpellId("viper sting"); + AIMED_SHOT = ai->getSpellId("aimed shot"); + STEADY_SHOT = ai->getSpellId("steady shot"); + CHIMERA_SHOT = ai->getSpellId("chimera shot"); + VOLLEY = ai->getSpellId("volley"); + BLACK_ARROW = ai->getSpellId("black arrow"); + KILL_SHOT = ai->getSpellId("kill shot"); // MELEE RAPTOR_STRIKE = ai->getSpellId("raptor strike"); WING_CLIP = ai->getSpellId("wing clip"); MONGOOSE_BITE = ai->getSpellId("mongoose bite"); - DISENGAGE = ai->getSpellId("disengage"); - MISDIRECTION = ai->getSpellId("misdirection"); - DETERRENCE = ai->getSpellId("deterrence"); + DISENGAGE = ai->getSpellId("disengage"); + MISDIRECTION = ai->getSpellId("misdirection"); + DETERRENCE = ai->getSpellId("deterrence"); // TRAPS BEAR_TRAP = ai->getSpellId("bear trap"); FREEZING_TRAP = ai->getSpellId("freezing trap"); IMMOLATION_TRAP = ai->getSpellId("immolation trap"); - FROST_TRAP = ai->getSpellId("frost trap"); - EXPLOSIVE_TRAP = ai->getSpellId("explosive trap"); - ARCANE_TRAP = ai->getSpellId("arcane trap"); - SNAKE_TRAP = ai->getSpellId("snake trap"); + FROST_TRAP = ai->getSpellId("frost trap"); + EXPLOSIVE_TRAP = ai->getSpellId("explosive trap"); + ARCANE_TRAP = ai->getSpellId("arcane trap"); + SNAKE_TRAP = ai->getSpellId("snake trap"); // BUFFS ASPECT_OF_THE_HAWK = ai->getSpellId("aspect of the hawk"); ASPECT_OF_THE_MONKEY = ai->getSpellId("aspect of the monkey"); RAPID_FIRE = ai->getSpellId("rapid fire"); - TRUESHOT_AURA = 19506; + TRUESHOT_AURA = 19506; - RECENTLY_BANDAGED = 11196; // first aid check + RECENTLY_BANDAGED = 11196; // first aid check // racial - ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf - GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei - STONEFORM = ai->getSpellId("stoneform"); // dwarf - SHADOWMELD = ai->getSpellId("shadowmeld"); // night elf - BLOOD_FURY = ai->getSpellId("blood fury"); // orc - WAR_STOMP = ai->getSpellId("war stomp"); // tauren - BERSERKING = ai->getSpellId("berserking"); // troll + ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf + GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei + STONEFORM = ai->getSpellId("stoneform"); // dwarf + SHADOWMELD = ai->getSpellId("shadowmeld"); // night elf + BLOOD_FURY = ai->getSpellId("blood fury"); // orc + WAR_STOMP = ai->getSpellId("war stomp"); // tauren + BERSERKING = ai->getSpellId("berserking"); // troll m_petSummonFailed = false; m_rangedCombat = true; diff --git a/src/game/PlayerbotHunterAI.h b/src/game/PlayerbotHunterAI.h index 1ae7cfd05..680b2eab9 100644 --- a/src/game/PlayerbotHunterAI.h +++ b/src/game/PlayerbotHunterAI.h @@ -38,11 +38,11 @@ class MANGOS_DLL_SPEC PlayerbotHunterAI : PlayerbotClassAI uint32 BEAR_TRAP, FREEZING_TRAP, IMMOLATION_TRAP, FROST_TRAP, EXPLOSIVE_TRAP, ARCANE_TRAP, SNAKE_TRAP; uint32 ASPECT_OF_THE_HAWK, ASPECT_OF_THE_MONKEY, RAPID_FIRE, TRUESHOT_AURA, MISDIRECTION; - // first aid - uint32 RECENTLY_BANDAGED; + // first aid + uint32 RECENTLY_BANDAGED; - // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + // racial + uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; }; #endif diff --git a/src/game/PlayerbotMageAI.cpp b/src/game/PlayerbotMageAI.cpp index cd0857f02..0eb1dfd5a 100644 --- a/src/game/PlayerbotMageAI.cpp +++ b/src/game/PlayerbotMageAI.cpp @@ -11,12 +11,12 @@ PlayerbotMageAI::PlayerbotMageAI(Player* const master, Player* const bot, Player SLOW = ai->getSpellId("slow"); ARCANE_BARRAGE = ai->getSpellId("arcane barrage"); ARCANE_BLAST = ai->getSpellId("arcane blast"); - ARCANE_POWER = ai->getSpellId("arcane power"); + ARCANE_POWER = ai->getSpellId("arcane power"); DAMPEN_MAGIC = ai->getSpellId("dampen magic"); - AMPLIFY_MAGIC = ai->getSpellId("amplify magic"); - MAGE_ARMOR = ai->getSpellId("mage armor"); - MIRROR_IMAGE = ai->getSpellId("mirror image"); - ARCANE_INTELLECT = ai->getSpellId("arcane intellect"); + AMPLIFY_MAGIC = ai->getSpellId("amplify magic"); + MAGE_ARMOR = ai->getSpellId("mage armor"); + MIRROR_IMAGE = ai->getSpellId("mirror image"); + ARCANE_INTELLECT = ai->getSpellId("arcane intellect"); ARCANE_BRILLIANCE = ai->getSpellId("arcane brilliance"); DALARAN_INTELLECT = ai->getSpellId("dalaran intellect"); DALARAN_BRILLIANCE = ai->getSpellId("dalaran brilliance"); @@ -33,8 +33,8 @@ PlayerbotMageAI::PlayerbotMageAI(Player* const master, Player* const bot, Player DRAGONS_BREATH = ai->getSpellId("dragon's breath"); LIVING_BOMB = ai->getSpellId("living bomb"); FROSTFIRE_BOLT = ai->getSpellId("frostfire bolt"); - FIRE_WARD = ai->getSpellId("fire ward"); - MOLTEN_ARMOR = ai->getSpellId("molten armor"); + FIRE_WARD = ai->getSpellId("fire ward"); + MOLTEN_ARMOR = ai->getSpellId("molten armor"); ICY_VEINS = ai->getSpellId("icy veins"); //FROST DEEP_FREEZE = ai->getSpellId("deep freeze"); FROSTBOLT = ai->getSpellId("frostbolt"); @@ -43,22 +43,22 @@ PlayerbotMageAI::PlayerbotMageAI(Player* const master, Player* const bot, Player CONE_OF_COLD = ai->getSpellId("cone of cold"); ICE_BARRIER = ai->getSpellId("ice barrier"); SUMMON_WATER_ELEMENTAL = ai->getSpellId("summon water elemental"); - FROST_WARD = ai->getSpellId("frost ward"); + FROST_WARD = ai->getSpellId("frost ward"); ICE_LANCE = ai->getSpellId("ice lance"); FROST_ARMOR = ai->getSpellId("frost armor"); ICE_ARMOR = ai->getSpellId("ice armor"); - ICE_BLOCK = ai->getSpellId("ice block"); - COLD_SNAP = ai->getSpellId("cold snap"); + ICE_BLOCK = ai->getSpellId("ice block"); + COLD_SNAP = ai->getSpellId("cold snap"); - RECENTLY_BANDAGED = 11196; // first aid check + RECENTLY_BANDAGED = 11196; // first aid check - // racial - ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf - GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei - ESCAPE_ARTIST = ai->getSpellId("escape artist"); // gnome - EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human - BERSERKING = ai->getSpellId("berserking"); // troll - WILL_OF_THE_FORSAKEN = ai->getSpellId("will of the forsaken"); // undead + // racial + ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf + GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei + ESCAPE_ARTIST = ai->getSpellId("escape artist"); // gnome + EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human + BERSERKING = ai->getSpellId("berserking"); // troll + WILL_OF_THE_FORSAKEN = ai->getSpellId("will of the forsaken"); // undead } PlayerbotMageAI::~PlayerbotMageAI() {} diff --git a/src/game/PlayerbotMgr.cpp b/src/game/PlayerbotMgr.cpp index 16e6f2b7e..1aca344d0 100644 --- a/src/game/PlayerbotMgr.cpp +++ b/src/game/PlayerbotMgr.cpp @@ -18,7 +18,6 @@ PlayerbotMgr::PlayerbotMgr(Player* const master) : m_master(master) { // load config variables m_confMaxNumBots = sConfig.GetIntDefault( "PlayerbotAI.MaxNumBots", 9 ); - m_confDisableBotsInRealm = sConfig.GetIntDefault( "PlayerbotAI.DisableBotsInRealm", 0 ); m_confRestrictBotLevel = sConfig.GetIntDefault( "PlayerbotAI.RestrictBotLevel", 80 ); m_confDisableBots = sConfig.GetBoolDefault( "PlayerbotAI.DisableBots", false ); m_confDebugWhisper = sConfig.GetBoolDefault( "PlayerbotAI.DebugWhisper", false ); @@ -526,21 +525,6 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) m_session->GetPlayer()->SetPlayerbotMgr(mgr); } - QueryResult *resultrealm = loginDatabase.PQuery("SELECT active_realm_id FROM account WHERE id = '%u'", m_session->GetAccountId()); - if(resultrealm) - { - Field *fields=resultrealm->Fetch(); - uint32 acctrealmid = fields[0].GetUInt32(); - if(acctrealmid == sConfig.GetIntDefault("PlayerbotAI.DisableBotsInRealm", 0)) - { - PSendSysMessage("|cffff0000bots are disabled for this realm."); - SetSentErrorMessage(true); - delete resultrealm; - return false; - } - } - delete resultrealm; - QueryResult *resultchar = CharacterDatabase.PQuery("SELECT Count(*) FROM characters WHERE online = 1 AND account = '%u'", m_session->GetAccountId()); if(resultchar) { diff --git a/src/game/PlayerbotMgr.h b/src/game/PlayerbotMgr.h index 288f9bd95..b1690239b 100644 --- a/src/game/PlayerbotMgr.h +++ b/src/game/PlayerbotMgr.h @@ -52,7 +52,7 @@ class MANGOS_DLL_SPEC PlayerbotMgr private: Player* const m_master; - PlayerBotMap m_playerBots; + PlayerBotMap m_playerBots; }; #endif diff --git a/src/game/PlayerbotPaladinAI.cpp b/src/game/PlayerbotPaladinAI.cpp index 1104a90bb..fd9047a35 100644 --- a/src/game/PlayerbotPaladinAI.cpp +++ b/src/game/PlayerbotPaladinAI.cpp @@ -19,57 +19,57 @@ PlayerbotPaladinAI::PlayerbotPaladinAI(Player* const master, Player* const bot, SEAL_OF_COMMAND = ai->getSpellId("command"); JUDGEMENT_OF_LIGHT = ai->getSpellId("judgement of light"); JUDGEMENT_OF_WISDOM = ai->getSpellId("judgement of wisdom"); - JUDGEMENT_OF_JUSTICE = ai->getSpellId("judgement of justice"); - DIVINE_STORM = ai->getSpellId("divine storm"); - BLESSING_OF_MIGHT = ai->getSpellId("blessing of might"); - GREATER_BLESSING_OF_MIGHT = ai->getSpellId("greater blessing of might"); - HAMMER_OF_WRATH = ai->getSpellId("hammer of wrath"); + JUDGEMENT_OF_JUSTICE = ai->getSpellId("judgement of justice"); + DIVINE_STORM = ai->getSpellId("divine storm"); + BLESSING_OF_MIGHT = ai->getSpellId("blessing of might"); + GREATER_BLESSING_OF_MIGHT = ai->getSpellId("greater blessing of might"); + HAMMER_OF_WRATH = ai->getSpellId("hammer of wrath"); FLASH_OF_LIGHT = ai->getSpellId("flash of light"); // Holy HOLY_LIGHT = ai->getSpellId("holy light"); - HOLY_SHOCK = ai->getSpellId("shock"); - HOLY_WRATH = ai->getSpellId("wrath"); - DIVINE_FAVOR = ai->getSpellId("divine favor"); - CONCENTRATION_AURA = ai->getSpellId("concentration aura"); + HOLY_SHOCK = ai->getSpellId("shock"); + HOLY_WRATH = ai->getSpellId("wrath"); + DIVINE_FAVOR = ai->getSpellId("divine favor"); + CONCENTRATION_AURA = ai->getSpellId("concentration aura"); BLESSING_OF_WISDOM = ai->getSpellId("blessing of wisdom"); GREATER_BLESSING_OF_WISDOM = ai->getSpellId("greater blessing of wisdom"); - CONSECRATION = ai->getSpellId("consecration"); - AVENGING_WRATH = ai->getSpellId("avenging wrath"); - LAY_ON_HANDS = ai->getSpellId("lay on hands"); - EXORCISM = ai->getSpellId("exorcism"); - SACRED_SHIELD = ai->getSpellId("sacred shield"); - DIVINE_PLEA = ai->getSpellId("divine plea"); + CONSECRATION = ai->getSpellId("consecration"); + AVENGING_WRATH = ai->getSpellId("avenging wrath"); + LAY_ON_HANDS = ai->getSpellId("lay on hands"); + EXORCISM = ai->getSpellId("exorcism"); + SACRED_SHIELD = ai->getSpellId("sacred shield"); + DIVINE_PLEA = ai->getSpellId("divine plea"); BLESSING_OF_KINGS = ai->getSpellId("blessing of kings"); // Protection GREATER_BLESSING_OF_KINGS = ai->getSpellId("greater blessing of kings"); - GREATER_BLESSING_OF_SANCTUARY= ai->getSpellId("greater blessing of sanctuary"); + GREATER_BLESSING_OF_SANCTUARY= ai->getSpellId("greater blessing of sanctuary"); HAMMER_OF_JUSTICE = ai->getSpellId("hammer of justice"); RIGHTEOUS_FURY = ai->getSpellId("righteous fury"); - RIGHTEOUS_DEFENSE = ai->getSpellId("righteous defense"); - SHADOW_RESISTANCE_AURA = ai->getSpellId("shadow resistance aura"); - DEVOTION_AURA = ai->getSpellId("devotion aura"); - FIRE_RESISTANCE_AURA = ai->getSpellId("fire resistance aura"); - FROST_RESISTANCE_AURA = ai->getSpellId("frost resistance aura"); - HAND_OF_PROTECTION = ai->getSpellId("hand of protection"); - DIVINE_PROTECTION = ai->getSpellId("divine protection"); - DIVINE_INTERVENTION = ai->getSpellId("divine intervention"); - DIVINE_SACRIFICE = ai->getSpellId("divine"); - DIVINE_SHIELD = ai->getSpellId("divine shield"); - HOLY_SHIELD = ai->getSpellId("holy shield"); - AVENGERS_SHIELD = ai->getSpellId("avenger's shield"); - HAND_OF_SACRIFICE = ai->getSpellId("hand of sacrifice"); - SHIELD_OF_RIGHTEOUSNESS = ai->getSpellId("shield of righteousness"); + RIGHTEOUS_DEFENSE = ai->getSpellId("righteous defense"); + SHADOW_RESISTANCE_AURA = ai->getSpellId("shadow resistance aura"); + DEVOTION_AURA = ai->getSpellId("devotion aura"); + FIRE_RESISTANCE_AURA = ai->getSpellId("fire resistance aura"); + FROST_RESISTANCE_AURA = ai->getSpellId("frost resistance aura"); + HAND_OF_PROTECTION = ai->getSpellId("hand of protection"); + DIVINE_PROTECTION = ai->getSpellId("divine protection"); + DIVINE_INTERVENTION = ai->getSpellId("divine intervention"); + DIVINE_SACRIFICE = ai->getSpellId("divine"); + DIVINE_SHIELD = ai->getSpellId("divine shield"); + HOLY_SHIELD = ai->getSpellId("holy shield"); + AVENGERS_SHIELD = ai->getSpellId("avenger's shield"); + HAND_OF_SACRIFICE = ai->getSpellId("hand of sacrifice"); + SHIELD_OF_RIGHTEOUSNESS = ai->getSpellId("shield of righteousness"); DEFENSIVE_STANCE = 71; //Def Stance BERSERKER_STANCE = 2458; //Ber Stance BATTLE_STANCE = 2457; //Bat Stance - FORBEARANCE = 25771; // cannot be protected + FORBEARANCE = 25771; // cannot be protected - RECENTLY_BANDAGED = 11196; // first aid check + RECENTLY_BANDAGED = 11196; // first aid check // racial - ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf - GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei - STONEFORM = ai->getSpellId("stoneform"); // dwarf - EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human + ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf + GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei + STONEFORM = ai->getSpellId("stoneform"); // dwarf + EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human } PlayerbotPaladinAI::~PlayerbotPaladinAI() {} diff --git a/src/game/PlayerbotPaladinAI.h b/src/game/PlayerbotPaladinAI.h index a3f5685cd..f89aa9625 100644 --- a/src/game/PlayerbotPaladinAI.h +++ b/src/game/PlayerbotPaladinAI.h @@ -39,14 +39,14 @@ class MANGOS_DLL_SPEC PlayerbotPaladinAI : PlayerbotClassAI // Protection uint32 GREATER_BLESSING_OF_KINGS, BLESSING_OF_KINGS, HAND_OF_PROTECTION, SHADOW_RESISTANCE_AURA, DEVOTION_AURA, FIRE_RESISTANCE_AURA, FROST_RESISTANCE_AURA, DEFENSIVE_STANCE, BERSERKER_STANCE, BATTLE_STANCE, DIVINE_SACRIFICE, DIVINE_PROTECTION, DIVINE_INTERVENTION, HOLY_SHIELD, AVENGERS_SHIELD, RIGHTEOUS_DEFENSE, GREATER_BLESSING_OF_SANCTUARY, HAND_OF_SACRIFICE, SHIELD_OF_RIGHTEOUSNESS; - // cannot be protected - uint32 FORBEARANCE; + // cannot be protected + uint32 FORBEARANCE; - // first aid - uint32 RECENTLY_BANDAGED; + // first aid + uint32 RECENTLY_BANDAGED; - // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + // racial + uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; uint32 SpellSequence, CombatCounter, HealCounter; }; diff --git a/src/game/PlayerbotPriestAI.cpp b/src/game/PlayerbotPriestAI.cpp index be96fa3b5..6ed1a9383 100644 --- a/src/game/PlayerbotPriestAI.cpp +++ b/src/game/PlayerbotPriestAI.cpp @@ -13,7 +13,7 @@ PlayerbotPriestAI::PlayerbotPriestAI(Player* const master, Player* const bot, Pl else if((HEAL = ai->getSpellId ("greater heal"))==0 && (HEAL = ai->getSpellId ("heal"))==0) HEAL = ai->getSpellId("lesser heal"); - GREAT_HEAL = ai->getSpellId("great heal"); + GREAT_HEAL = ai->getSpellId("great heal"); FLASH_HEAL = ai->getSpellId("flash heal"); REZZ = ai->getSpellId("resurrection"); SMITE = ai->getSpellId("smite"); diff --git a/src/game/PlayerbotPriestAI.h b/src/game/PlayerbotPriestAI.h index ca04b698b..c49ba769a 100644 --- a/src/game/PlayerbotPriestAI.h +++ b/src/game/PlayerbotPriestAI.h @@ -40,11 +40,11 @@ class MANGOS_DLL_SPEC PlayerbotPriestAI : PlayerbotClassAI // discipline uint32 PWS, INNER_FIRE, FORTITUDE, TOUCH_OF_WEAKNESS, FEAR_WARD, DSPIRIT, POWER_INFUSION, MASS_DISPEL, PENANCE, DIVINE_SPIRIT, INNER_FOCUS; - // first aid - uint32 RECENTLY_BANDAGED; + // first aid + uint32 RECENTLY_BANDAGED; - // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + // racial + uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; uint32 SpellSequence, LastSpellHoly, LastSpellShadowMagic, LastSpellDiscipline; }; diff --git a/src/game/PlayerbotRogueAI.cpp b/src/game/PlayerbotRogueAI.cpp index ff71f942e..3a1ce22ad 100644 --- a/src/game/PlayerbotRogueAI.cpp +++ b/src/game/PlayerbotRogueAI.cpp @@ -22,7 +22,7 @@ PlayerbotRogueAI::PlayerbotRogueAI(Player* const master, Player* const bot, Play CRIPPLING_POISON = 3408; //SpellID MIND_NUMBING_POISON = 5761; //SpellID GOUGE = ai->getSpellId("gouge"); - SPRINT = ai->getSpellId("sprint"); + SPRINT = ai->getSpellId("sprint"); SHADOWSTEP = ai->getSpellId("shadowstep"); //SUBTLETY STEALTH = ai->getSpellId("stealth"); diff --git a/src/game/PlayerbotRogueAI.h b/src/game/PlayerbotRogueAI.h index 1f840c211..862453e99 100644 --- a/src/game/PlayerbotRogueAI.h +++ b/src/game/PlayerbotRogueAI.h @@ -40,11 +40,11 @@ class MANGOS_DLL_SPEC PlayerbotRogueAI : PlayerbotClassAI // ASSASSINATION uint32 EVISCERATE, SLICE_DICE, GARROTE, EXPOSE_ARMOR, AMBUSH, RUPTURE, DISMANTLE, CHEAP_SHOT, KIDNEY_SHOT, MUTILATE, ENVENOM, DEADLY_THROW; - // first aid - uint32 RECENTLY_BANDAGED; + // first aid + uint32 RECENTLY_BANDAGED; - // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + // racial + uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; uint32 SpellSequence, LastSpellCombat, LastSpellSubtlety, LastSpellAssassination, Aura; }; diff --git a/src/game/PlayerbotShamanAI.cpp b/src/game/PlayerbotShamanAI.cpp index 31956b21b..ee86fa506 100644 --- a/src/game/PlayerbotShamanAI.cpp +++ b/src/game/PlayerbotShamanAI.cpp @@ -8,11 +8,11 @@ PlayerbotShamanAI::PlayerbotShamanAI(Player* const master, Player* const bot, Pl CHAIN_HEAL = ai->getSpellId("chain heal"); HEALING_WAVE = ai->getSpellId("healing wave"); LESSER_HEALING_WAVE = ai->getSpellId("lesser healing wave"); - RIPTIDE = ai->getSpellId("riptide"); + RIPTIDE = ai->getSpellId("riptide"); ANCESTRAL_SPIRIT = ai->getSpellId("ancestral spirit"); - EARTH_SHIELD = ai->getSpellId("earth shield"); + EARTH_SHIELD = ai->getSpellId("earth shield"); WATER_SHIELD = ai->getSpellId("water shield"); - EARTHLIVING_WEAPON = ai->getSpellId("earthliving weapon"); + EARTHLIVING_WEAPON = ai->getSpellId("earthliving weapon"); TREMOR_TOTEM = ai->getSpellId("tremor totem"); // totems HEALING_STREAM_TOTEM = ai->getSpellId("healing stream totem"); MANA_SPRING_TOTEM = ai->getSpellId("mana spring totem"); @@ -22,17 +22,17 @@ PlayerbotShamanAI::PlayerbotShamanAI(Player* const master, Player* const bot, Pl STORMSTRIKE = ai->getSpellId("stormstrike"); LAVA_LASH = ai->getSpellId("lava lash"); SHAMANISTIC_RAGE = ai->getSpellId("shamanistic rage"); - BLOODLUST = ai->getSpellId("bloodlust"); + BLOODLUST = ai->getSpellId("bloodlust"); HEROISM = ai->getSpellId("heroism"); - FERAL_SPIRIT = ai->getSpellId("feral spirit"); - LIGHTNING_SHIELD = ai->getSpellId("lightning"); - ROCKBITER_WEAPON = ai->getSpellId("rockbiter"); - FLAMETONGUE_WEAPON = ai->getSpellId("flametongue weapon"); - FROSTBRAND_WEAPON = ai->getSpellId("frostbrand weapon"); - WINDFURY_WEAPON = ai->getSpellId("windfury weapon"); - STONESKIN_TOTEM = ai->getSpellId("stoneskin totem"); // totems + FERAL_SPIRIT = ai->getSpellId("feral spirit"); + LIGHTNING_SHIELD = ai->getSpellId("lightning"); + ROCKBITER_WEAPON = ai->getSpellId("rockbiter"); + FLAMETONGUE_WEAPON = ai->getSpellId("flametongue weapon"); + FROSTBRAND_WEAPON = ai->getSpellId("frostbrand weapon"); + WINDFURY_WEAPON = ai->getSpellId("windfury weapon"); + STONESKIN_TOTEM = ai->getSpellId("stoneskin totem"); // totems STRENGTH_OF_EARTH_TOTEM = ai->getSpellId("strength of earth totem"); - FROST_RESISTANCE_TOTEM = ai->getSpellId("frost resistance totem"); + FROST_RESISTANCE_TOTEM = ai->getSpellId("frost resistance totem"); FLAMETONGUE_TOTEM = ai->getSpellId("flametongue totem"); FIRE_RESISTANCE_TOTEM = ai->getSpellId("fire resistance totem"); GROUNDING_TOTEM = ai->getSpellId("grounding totem"); @@ -50,13 +50,13 @@ PlayerbotShamanAI::PlayerbotShamanAI(Player* const master, Player* const bot, Pl FROST_SHOCK = ai->getSpellId("frost shock"); CHAIN_LIGHTNING = ai->getSpellId("chain lightning"); LAVA_BURST = ai->getSpellId("lava burst"); - HEX = ai->getSpellId("hex"); - STONECLAW_TOTEM = ai->getSpellId("stoneclaw totem"); // totems - SEARING_TOTEM = ai->getSpellId("searing totem"); - FIRE_NOVA_TOTEM = ai->getSpellId("fire nova totem"); - MAGMA_TOTEM = ai->getSpellId("magma totem"); - EARTHBIND_TOTEM = ai->getSpellId("earthbind totem"); - TOTEM_OF_WRATH = ai->getSpellId("totem of wrath"); + HEX = ai->getSpellId("hex"); + STONECLAW_TOTEM = ai->getSpellId("stoneclaw totem"); // totems + SEARING_TOTEM = ai->getSpellId("searing totem"); + FIRE_NOVA_TOTEM = ai->getSpellId("fire nova totem"); + MAGMA_TOTEM = ai->getSpellId("magma totem"); + EARTHBIND_TOTEM = ai->getSpellId("earthbind totem"); + TOTEM_OF_WRATH = ai->getSpellId("totem of wrath"); FIRE_ELEMENTAL_TOTEM = ai->getSpellId("fire elemental totem"); RECENTLY_BANDAGED = 11196; // first aid check diff --git a/src/game/PlayerbotShamanAI.h b/src/game/PlayerbotShamanAI.h index 792641aaa..d13383812 100644 --- a/src/game/PlayerbotShamanAI.h +++ b/src/game/PlayerbotShamanAI.h @@ -40,11 +40,11 @@ class MANGOS_DLL_SPEC PlayerbotShamanAI : PlayerbotClassAI // ELEMENTAL uint32 LIGHTNING_BOLT, EARTH_SHOCK, STONECLAW_TOTEM, FLAME_SHOCK, SEARING_TOTEM, PURGE, FIRE_NOVA_TOTEM, WIND_SHOCK, FROST_SHOCK, MAGMA_TOTEM, CHAIN_LIGHTNING, TOTEM_OF_WRATH, FIRE_ELEMENTAL_TOTEM, LAVA_BURST, EARTHBIND_TOTEM, HEX; - // first aid - uint32 RECENTLY_BANDAGED; + // first aid + uint32 RECENTLY_BANDAGED; - // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + // racial + uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; uint32 SpellSequence, LastSpellEnhancement, LastSpellRestoration, LastSpellElemental; }; diff --git a/src/game/PlayerbotWarlockAI.cpp b/src/game/PlayerbotWarlockAI.cpp index 79cc25aab..d3901acfa 100644 --- a/src/game/PlayerbotWarlockAI.cpp +++ b/src/game/PlayerbotWarlockAI.cpp @@ -11,41 +11,41 @@ PlayerbotWarlockAI::PlayerbotWarlockAI(Player* const master, Player* const bot, SEARING_PAIN = ai->getSpellId("searing pain"); CONFLAGRATE = ai->getSpellId("conflagrate"); SHADOWFURY = ai->getSpellId("shadowfury"); - CHAOS_BOLT = ai->getSpellId("chaos bolt"); - SHADOWFLAME = ai->getSpellId("shadowflame"); - HELLFIRE = ai->getSpellId("hellfire"); - RAIN_OF_FIRE = ai->getSpellId("rain of fire"); - SOUL_FIRE = ai->getSpellId("soul fire"); // soul shard spells - SHADOWBURN = ai->getSpellId("shadowburn"); + CHAOS_BOLT = ai->getSpellId("chaos bolt"); + SHADOWFLAME = ai->getSpellId("shadowflame"); + HELLFIRE = ai->getSpellId("hellfire"); + RAIN_OF_FIRE = ai->getSpellId("rain of fire"); + SOUL_FIRE = ai->getSpellId("soul fire"); // soul shard spells + SHADOWBURN = ai->getSpellId("shadowburn"); // CURSE CURSE_OF_WEAKNESS = ai->getSpellId("curse of weakness"); CURSE_OF_THE_ELEMENTS = ai->getSpellId("curse of the elements"); CURSE_OF_AGONY = ai->getSpellId("curse of agony"); CURSE_OF_EXHAUSTION = ai->getSpellId("curse of exhaustion"); CURSE_OF_TONGUES = ai->getSpellId("curse of tongues"); - CURSE_OF_DOOM = ai->getSpellId("curse of doom"); + CURSE_OF_DOOM = ai->getSpellId("curse of doom"); // AFFLICTION - CORRUPTION = ai->getSpellId("corruption"); - DRAIN_SOUL = ai->getSpellId("drain soul"); - DRAIN_LIFE = ai->getSpellId("drain life"); - DRAIN_MANA = ai->getSpellId("drain mana"); + CORRUPTION = ai->getSpellId("corruption"); + DRAIN_SOUL = ai->getSpellId("drain soul"); + DRAIN_LIFE = ai->getSpellId("drain life"); + DRAIN_MANA = ai->getSpellId("drain mana"); LIFE_TAP = ai->getSpellId("life tap"); UNSTABLE_AFFLICTION = ai->getSpellId("unstable affliction"); HAUNT = ai->getSpellId("haunt"); ATROCITY = ai->getSpellId("atrocity"); SEED_OF_CORRUPTION = ai->getSpellId("seed of corruption"); - DARK_PACT = ai->getSpellId("dark pact"); - HOWL_OF_TERROR = ai->getSpellId("howl of terror"); - FEAR = ai->getSpellId("fear"); + DARK_PACT = ai->getSpellId("dark pact"); + HOWL_OF_TERROR = ai->getSpellId("howl of terror"); + FEAR = ai->getSpellId("fear"); // DEMONOLOGY - DEMON_SKIN = ai->getSpellId("demon skin"); + DEMON_SKIN = ai->getSpellId("demon skin"); DEMON_ARMOR = ai->getSpellId("demon armor"); FEL_ARMOR = ai->getSpellId("fel armor"); SHADOW_WARD = ai->getSpellId("shadow ward"); SOULSHATTER = ai->getSpellId("soulshatter"); - SOUL_LINK = ai->getSpellId("soul link"); - HEALTH_FUNNEL = ai->getSpellId("health funnel"); - DETECT_INVISIBILITY = ai->getSpellId("detect invisibility"); + SOUL_LINK = ai->getSpellId("soul link"); + HEALTH_FUNNEL = ai->getSpellId("health funnel"); + DETECT_INVISIBILITY = ai->getSpellId("detect invisibility"); // demon summon SUMMON_IMP = ai->getSpellId("summon imp"); SUMMON_VOIDWALKER = ai->getSpellId("summon voidwalker"); @@ -53,9 +53,9 @@ PlayerbotWarlockAI::PlayerbotWarlockAI(Player* const master, Player* const bot, SUMMON_FELHUNTER = ai->getSpellId("summon felhunter"); SUMMON_FELGUARD = ai->getSpellId("summon felguard"); // demon skills - BLOOD_PACT = ai->getSpellId("blood pact"); // imp skill - CONSUME_SHADOWS = ai->getSpellId("consume shadows"); // voidwalker skill - FEL_INTELLIGENCE = ai->getSpellId("fel intelligence"); // felhunter skill + BLOOD_PACT = ai->getSpellId("blood pact"); // imp skill + CONSUME_SHADOWS = ai->getSpellId("consume shadows"); // voidwalker skill + FEL_INTELLIGENCE = ai->getSpellId("fel intelligence"); // felhunter skill RECENTLY_BANDAGED = 11196; // first aid check diff --git a/src/game/PlayerbotWarlockAI.h b/src/game/PlayerbotWarlockAI.h index c608e0e7f..4fe61e32f 100644 --- a/src/game/PlayerbotWarlockAI.h +++ b/src/game/PlayerbotWarlockAI.h @@ -43,17 +43,17 @@ class MANGOS_DLL_SPEC PlayerbotWarlockAI : PlayerbotClassAI // DEMONOLOGY uint32 DEMON_SKIN, DEMON_ARMOR, SHADOW_WARD, FEL_ARMOR, SOULSHATTER, SOUL_LINK, HEALTH_FUNNEL, DETECT_INVISIBILITY; - // DEMON SUMMON - uint32 SUMMON_IMP, SUMMON_VOIDWALKER, SUMMON_SUCCUBUS, SUMMON_FELHUNTER, SUMMON_FELGUARD; + // DEMON SUMMON + uint32 SUMMON_IMP, SUMMON_VOIDWALKER, SUMMON_SUCCUBUS, SUMMON_FELHUNTER, SUMMON_FELGUARD; - // DEMON SKILLS - uint32 BLOOD_PACT, CONSUME_SHADOWS, FEL_INTELLIGENCE; + // DEMON SKILLS + uint32 BLOOD_PACT, CONSUME_SHADOWS, FEL_INTELLIGENCE; - // first aid - uint32 RECENTLY_BANDAGED; + // first aid + uint32 RECENTLY_BANDAGED; - // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + // racial + uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; uint32 SpellSequence, LastSpellCurse, LastSpellAffliction, LastSpellDestruction; }; diff --git a/src/game/PlayerbotWarriorAI.cpp b/src/game/PlayerbotWarriorAI.cpp index 9e536051d..7d03c1da4 100644 --- a/src/game/PlayerbotWarriorAI.cpp +++ b/src/game/PlayerbotWarriorAI.cpp @@ -23,7 +23,7 @@ PlayerbotWarriorAI::PlayerbotWarriorAI(Player* const master, Player* const bot, MORTAL_STRIKE = ai->getSpellId("mortal strike"); //ARMS BLADESTORM = ai->getSpellId("bladestorm"); //ARMS HEROIC_THROW = ai->getSpellId("heroic throw"); //ARMS - SHATTERING_THROW = ai->getSpellId("shattering throw"); //ARMS + SHATTERING_THROW = ai->getSpellId("shattering throw"); //ARMS BLOODRAGE = ai->getSpellId("bloodrage"); //PROTECTION DEFENSIVE_STANCE = ai->getSpellId("defensive stance"); //PROTECTION DEVASTATE = ai->getSpellId("devastate"); //PROTECTION @@ -40,7 +40,7 @@ PlayerbotWarriorAI::PlayerbotWarriorAI(Player* const master, Player* const bot, SHOCKWAVE = ai->getSpellId("shockwave"); //PROTECTION CONCUSSION_BLOW = ai->getSpellId("blow"); //PROTECTION SPELL_REFLECTION = ai->getSpellId("spell reflection"); //PROTECTION - LAST_STAND = ai->getSpellId("last stand"); //PROTECTION + LAST_STAND = ai->getSpellId("last stand"); //PROTECTION BATTLE_SHOUT = ai->getSpellId("battle shout"); //FURY DEMORALIZING_SHOUT = ai->getSpellId("demoralizing shout"); //FURY CLEAVE = ai->getSpellId("cleave"); //FURY @@ -60,20 +60,20 @@ PlayerbotWarriorAI::PlayerbotWarriorAI(Player* const master, Player* const bot, HEROIC_FURY = ai->getSpellId("heroic fury"); //FURY COMMANDING_SHOUT = ai->getSpellId("commanding shout"); //FURY ENRAGED_REGENERATION = ai->getSpellId("enraged regeneration"); //FURY - PIERCING_HOWL = ai->getSpellId("piercing howl"); //FURY + PIERCING_HOWL = ai->getSpellId("piercing howl"); //FURY - RECENTLY_BANDAGED = 11196; // first aid check + RECENTLY_BANDAGED = 11196; // first aid check // racial - GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei - STONEFORM = ai->getSpellId("stoneform"); // dwarf - ESCAPE_ARTIST = ai->getSpellId("escape artist"); // gnome - EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human - SHADOWMELD = ai->getSpellId("shadowmeld"); // night elf - BLOOD_FURY = ai->getSpellId("blood fury"); // orc - WAR_STOMP = ai->getSpellId("war stomp"); // tauren - BERSERKING = ai->getSpellId("berserking"); // troll - WILL_OF_THE_FORSAKEN = ai->getSpellId("will of the forsaken"); // undead + GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei + STONEFORM = ai->getSpellId("stoneform"); // dwarf + ESCAPE_ARTIST = ai->getSpellId("escape artist"); // gnome + EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human + SHADOWMELD = ai->getSpellId("shadowmeld"); // night elf + BLOOD_FURY = ai->getSpellId("blood fury"); // orc + WAR_STOMP = ai->getSpellId("war stomp"); // tauren + BERSERKING = ai->getSpellId("berserking"); // troll + WILL_OF_THE_FORSAKEN = ai->getSpellId("will of the forsaken"); // undead } PlayerbotWarriorAI::~PlayerbotWarriorAI() {} diff --git a/src/game/PlayerbotWarriorAI.h b/src/game/PlayerbotWarriorAI.h index 3cf1852d1..5fbe5fc8f 100644 --- a/src/game/PlayerbotWarriorAI.h +++ b/src/game/PlayerbotWarriorAI.h @@ -40,11 +40,11 @@ class MANGOS_DLL_SPEC PlayerbotWarriorAI : PlayerbotClassAI // FURY uint32 BERSERKER_STANCE, BATTLE_SHOUT, DEMORALIZING_SHOUT, OVERPOWER, CLEAVE, INTIMIDATING_SHOUT, EXECUTE, CHALLENGING_SHOUT, SLAM, INTERCEPT, DEATH_WISH, BERSERKER_RAGE, WHIRLWIND, PUMMEL, BLOODTHIRST, RECKLESSNESS, RAMPAGE, HEROIC_FURY, COMMANDING_SHOUT, ENRAGED_REGENERATION, PIERCING_HOWL; - // first aid - uint32 RECENTLY_BANDAGED; + // first aid + uint32 RECENTLY_BANDAGED; - // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + // racial + uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; uint32 SpellSequence; }; diff --git a/src/game/QueryHandler.cpp b/src/game/QueryHandler.cpp index 5e3f8c850..29c779404 100644 --- a/src/game/QueryHandler.cpp +++ b/src/game/QueryHandler.cpp @@ -331,7 +331,7 @@ void WorldSession::HandleNpcTextQueryOpcode( WorldPacket & recv_data ) GossipText const* pGossip = sObjectMgr.GetGossipText(textID); - WorldPacket data( SMSG_NPC_TEXT_UPDATE, 100 ); // guess size + WorldPacket data( SMSG_NPC_TEXT_UPDATE, 100 ); // guess size data << textID; if (!pGossip) diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index f23afd72d..1fca26b5b 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -20,7 +20,7 @@ \ingroup u2w */ -#include "WorldSocket.h" // must be first to make ACE happy with ACE includes in it +#include "WorldSocket.h" // must be first to make ACE happy with ACE includes in it #include "Common.h" #include "Database/DatabaseEnv.h" #include "Log.h" diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in index 2f350569c..93cfd98e3 100644 --- a/src/mangosd/mangosd.conf.dist.in +++ b/src/mangosd/mangosd.conf.dist.in @@ -1445,11 +1445,6 @@ SOAP.Port = 7878 # Limits the number of bots per account (Max 9) # Default: 9 # -# PlayerbotAI.DisableBotsInRealm -# Disable the bot command and bot menu for this realm -# Default: 0 - off -# Realm id: - on -# # PlayerbotAI.RestrictBotLevel # Restrict the allowed bot level (Current Max 80) # Default: 80 @@ -1461,5 +1456,4 @@ PlayerbotAI.DebugWhisper = 0 PlayerbotAI.FollowDistanceMin = 0.5 PlayerbotAI.FollowDistanceMax = 1.0 PlayerbotAI.MaxNumBots = 9 -PlayerbotAI.DisableBotsInRealm = 0 PlayerbotAI.RestrictBotLevel = 80 From b3f988374093fffc2d3a0b246578fde25f259267 Mon Sep 17 00:00:00 2001 From: blueboy Date: Fri, 12 Mar 2010 04:16:22 +0000 Subject: [PATCH 017/187] Further removal of trailing whitespaces --- bot_readme.txt | 4 +- src/game/Chat.h | 2 +- src/game/Object.cpp | 2 +- src/game/Player.h | 2 +- src/game/PlayerbotAI.cpp | 310 ++++++------ src/game/PlayerbotAI.h | 50 +- src/game/PlayerbotDeathKnightAI.cpp | 706 ++++++++++++++-------------- src/game/PlayerbotDeathKnightAI.h | 2 +- src/game/PlayerbotDruidAI.cpp | 4 +- src/game/PlayerbotHunterAI.cpp | 6 +- src/game/PlayerbotMgr.cpp | 204 ++++---- src/game/PlayerbotPaladinAI.cpp | 20 +- src/game/PlayerbotPaladinAI.h | 2 +- src/game/PlayerbotPriestAI.cpp | 56 +-- src/game/PlayerbotRogueAI.cpp | 100 ++-- src/game/PlayerbotShamanAI.cpp | 68 +-- src/game/PlayerbotWarlockAI.cpp | 400 ++++++++-------- src/game/PlayerbotWarlockAI.h | 2 +- src/game/PlayerbotWarriorAI.cpp | 108 ++--- src/game/PlayerbotWarriorAI.h | 2 +- src/game/WorldSession.cpp | 2 +- src/mangosd/mangosd.conf.dist.in | 2 +- win/VC90/game.vcproj | 4 +- 23 files changed, 1029 insertions(+), 1029 deletions(-) diff --git a/bot_readme.txt b/bot_readme.txt index c02455928..9a06ec301 100644 --- a/bot_readme.txt +++ b/bot_readme.txt @@ -62,8 +62,8 @@ To trade items/money with your bot simply initiate a trade and the bot will tell /w BOTNAME 6g500s25c <-- request 6 gold, 500 silver, and 25 cooper A bot is also able to show an item in its 'Will not be traded' slot. The item can be either -in its bags or be equipped and even be soulbound. By this you can cast spells/enchantments -on soulbound items ('nt' stands for 'not trading'). +in its bags or be equipped and even be soulbound. By this you can cast spells/enchantments +on soulbound items ('nt' stands for 'not trading'). /w BOTNAME nt [Powerful Soulbound Item] More Information: diff --git a/src/game/Chat.h b/src/game/Chat.h index ee4dd9eaf..83444c223 100644 --- a/src/game/Chat.h +++ b/src/game/Chat.h @@ -507,7 +507,7 @@ class ChatHandler bool HandleWaterwalkCommand(const char* args); bool HandlePlayerbotCommand(const char* args); bool HandleQuitCommand(const char* args); - + //! Development Commands bool HandleSaveAllCommand(const char* args); diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 7586c23d9..b983b8e6c 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -1427,7 +1427,7 @@ void WorldObject::UpdateGroundPositionZ(float x, float y, float &z) const { float map_z = GetBaseMap()->GetHeight(x,y,z,false); float vmap_z = GetBaseMap()->GetHeight(x,y,z,true); - + if(vmap_z > INVALID_HEIGHT) z = vmap_z - 0.03f; // adjust offset to suit diff --git a/src/game/Player.h b/src/game/Player.h index 4475d2277..c4e9dd436 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -2551,7 +2551,7 @@ class MANGOS_DLL_SPEC Player : public Unit // Playerbot mod: PlayerbotAI* m_playerbotAI; PlayerbotMgr* m_playerbotMgr; - + // Homebind coordinates uint32 m_homebindMapId; uint16 m_homebindAreaId; diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index ea62d7e1f..12533fb1f 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -39,7 +39,7 @@ float rand_float(float low, float high) * the guid and what weight they hold. I call it the mask. For example) if mask is 01001001, * there will be only 3 words. The first word is shifted to the left 0 times, * the second is shifted 3 times, and the third is shifted 6. - * + * * Possibly use ByteBuffer::readPackGUID? */ uint64 extractGuid(WorldPacket& packet) @@ -82,7 +82,7 @@ PlayerbotAI::PlayerbotAI(PlayerbotMgr* const mgr, Player* const bot) : m_mgr(mgr), m_bot(bot), m_ignoreAIUpdatesUntilTime(0), m_combatOrder(ORDERS_NONE), m_ScenarioType(SCENARIO_PVEEASY), m_TimeDoneEating(0), m_TimeDoneDrinking(0), - m_CurrentlyCastingSpellId(0), m_spellIdCommand(0), + m_CurrentlyCastingSpellId(0), m_spellIdCommand(0), m_targetGuidCommand(0), m_classAI(0) { // set bot state and needed item list @@ -348,7 +348,7 @@ void PlayerbotAI::SendQuestItemList( Player& player ) void PlayerbotAI::SendOrders( Player& player ) { std::ostringstream out; - + if( !m_combatOrder ) out << "Got no combat orders!"; else if( m_combatOrder&ORDERS_TANK ) @@ -362,7 +362,7 @@ void PlayerbotAI::SendOrders( Player& player ) if( m_combatOrder&ORDERS_PROTECT ) out << "I PROTECT " << (m_targetProtect?m_targetProtect->GetName():"unknown"); out << "."; - + if( m_mgr->m_confDebugWhisper ) { out << " " << (IsInCombat()?"I'm in COMBAT! ":"Not in combat. "); @@ -516,7 +516,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) else if((pSpellInfo->EffectApplyAuraName[2] == SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED) && (pSpellInfo->EffectApplyAuraName[1] == SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED)) { - if((pSpellInfo->EffectBasePoints[2] == master_speed2) + if((pSpellInfo->EffectBasePoints[2] == master_speed2) && (pSpellInfo->EffectBasePoints[1] == master_speed1)) { spellMount = spellId; @@ -762,7 +762,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) return; } - /* uncomment this and your bots will tell you all their outgoing packet opcode names + /* uncomment this and your bots will tell you all their outgoing packet opcode names case SMSG_MONSTER_MOVE: case SMSG_UPDATE_WORLD_STATE: case SMSG_COMPRESSED_UPDATE_OBJECT: @@ -1324,12 +1324,12 @@ void PlayerbotAI::DoCombatMovement() { float targetDist = m_bot->GetDistance( m_targetCombat ); - if( m_combatStyle==COMBAT_MELEE && !m_bot->hasUnitState( UNIT_STAT_CHASE ) && ( (m_movementOrder==MOVEMENT_STAY && targetDist<=ATTACK_DISTANCE) || (m_movementOrder!=MOVEMENT_STAY) ) ) + if( m_combatStyle==COMBAT_MELEE && !m_bot->hasUnitState( UNIT_STAT_CHASE ) && ( (m_movementOrder==MOVEMENT_STAY && targetDist<=ATTACK_DISTANCE) || (m_movementOrder!=MOVEMENT_STAY) ) ) { // melee combat - chase target if in range or if we are not forced to stay m_bot->GetMotionMaster()->MoveChase( m_targetCombat ); - } - else if( m_combatStyle==COMBAT_RANGED && m_movementOrder!=MOVEMENT_STAY ) + } + else if( m_combatStyle==COMBAT_RANGED && m_movementOrder!=MOVEMENT_STAY ) { // ranged combat - just move within spell range // TODO: just follow in spell range! how to determine bots spell range? @@ -1540,20 +1540,20 @@ void PlayerbotAI::TurnInQuests( WorldObject *questgiver ) QuestMenu& questMenu = m_bot->PlayerTalkClass->GetQuestMenu(); for (uint32 iI = 0; iI < questMenu.MenuItemCount(); ++iI) { - QuestMenuItem const& qItem = questMenu.GetItem(iI); - uint32 questID = qItem.m_qId; - Quest const* pQuest = sObjectMgr.GetQuestTemplate(questID); + QuestMenuItem const& qItem = questMenu.GetItem(iI); + uint32 questID = qItem.m_qId; + Quest const* pQuest = sObjectMgr.GetQuestTemplate(questID); + + std::ostringstream out; + std::string questTitle = pQuest->GetTitle(); + QuestLocalization(questTitle, questID); - std::ostringstream out; - std::string questTitle = pQuest->GetTitle(); - QuestLocalization(questTitle, questID); - QuestStatus status = m_bot->GetQuestStatus(questID); - - // if quest is complete, turn it in - if (status == QUEST_STATUS_COMPLETE) - { - // if bot hasn't already turned quest in + + // if quest is complete, turn it in + if (status == QUEST_STATUS_COMPLETE) + { + // if bot hasn't already turned quest in if (! m_bot->GetQuestRewardStatus(questID)) { // auto reward quest if no choice in reward @@ -1569,7 +1569,7 @@ void PlayerbotAI::TurnInQuests( WorldObject *questgiver ) out << "|cffff0000Unable to turn quest in:|r |cff808080|Hquest:" << questID << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r"; } } - + // auto reward quest if one item as reward else if (pQuest->GetRewChoiceItemsCount() == 1) { @@ -1580,28 +1580,28 @@ void PlayerbotAI::TurnInQuests( WorldObject *questgiver ) if (m_bot->CanRewardQuest(pQuest, rewardIdx, false)) { m_bot->RewardQuest(pQuest, rewardIdx, questgiver, true); - + std::string itemName = pRewardItem->Name1; ItemLocalization(itemName, pRewardItem->ItemId); - + out << "Quest complete: " - << " |cff808080|Hquest:" << questID << ':' << pQuest->GetQuestLevel() - << "|h[" << questTitle << "]|h|r reward: |cffffffff|Hitem:" + << " |cff808080|Hquest:" << questID << ':' << pQuest->GetQuestLevel() + << "|h[" << questTitle << "]|h|r reward: |cffffffff|Hitem:" << pRewardItem->ItemId << ":0:0:0:0:0:0:0" << "|h[" << itemName << "]|h|r"; } else { out << "|cffff0000Unable to turn quest in:|r " - << "|cff808080|Hquest:" << questID << ':' + << "|cff808080|Hquest:" << questID << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r" - << " reward: |cffffffff|Hitem:" + << " reward: |cffffffff|Hitem:" << pRewardItem->ItemId << ":0:0:0:0:0:0:0" << "|h[" << itemName << "]|h|r"; } } - + // else multiple rewards - let master pick else { - out << "What reward should I take for |cff808080|Hquest:" << questID << ':' << pQuest->GetQuestLevel() + out << "What reward should I take for |cff808080|Hquest:" << questID << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r? "; for (uint8 i=0; i < pQuest->GetRewChoiceItemsCount(); ++i) { @@ -1615,12 +1615,12 @@ void PlayerbotAI::TurnInQuests( WorldObject *questgiver ) } else if (status == QUEST_STATUS_INCOMPLETE) { - out << "|cffff0000Quest incomplete:|r " + out << "|cffff0000Quest incomplete:|r " << " |cff808080|Hquest:" << questID << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r"; } else if (status == QUEST_STATUS_AVAILABLE){ - out << "|cff00ff00Quest available:|r " + out << "|cff00ff00Quest available:|r " << " |cff808080|Hquest:" << questID << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r"; } @@ -1734,13 +1734,13 @@ void PlayerbotAI::UpdateAttackerInfo() // DEBUG: output attacker info //sLog.outBasic( "[PlayerbotAI]: %s m_attackerInfo = {", m_bot->GetName() ); //for( AttackerInfoList::iterator i=m_attackerInfo.begin(); i!=m_attackerInfo.end(); ++i ) - // sLog.outBasic( "[PlayerbotAI]: [%016I64X] { %08X, %08X, %.2f, %.2f, %d, %d }", - // i->first, - // (i->second.attacker?i->second.attacker->GetGUIDLow():0), - // (i->second.victim?i->second.victim->GetGUIDLow():0), - // i->second.threat, - // i->second.threat2, - // i->second.count, + // sLog.outBasic( "[PlayerbotAI]: [%016I64X] { %08X, %08X, %.2f, %.2f, %d, %d }", + // i->first, + // (i->second.attacker?i->second.attacker->GetGUIDLow():0), + // (i->second.victim?i->second.victim->GetGUIDLow():0), + // i->second.threat, + // i->second.threat2, + // i->second.count, // i->second.source ); //sLog.outBasic( "[PlayerbotAI]: };" ); } @@ -1810,9 +1810,9 @@ void PlayerbotAI::SetCombatOrder( CombatOrderType co, Unit *target ) { m_targetProtect = 0; return; } - if( co == ORDERS_PROTECT ) + if( co == ORDERS_PROTECT ) m_targetProtect = target; - else if( co == ORDERS_ASSIST ) + else if( co == ORDERS_ASSIST ) m_targetAssist = target; if( (co&ORDERS_PRIMARY) ) m_combatOrder = (CombatOrderType)(((uint32)m_combatOrder&(uint32)ORDERS_SECONDARY)|(uint32)co); @@ -1830,7 +1830,7 @@ void PlayerbotAI::MovementReset() { // stop moving... MovementClear(); - if( m_movementOrder == MOVEMENT_FOLLOW ) + if( m_movementOrder == MOVEMENT_FOLLOW ) { if( !m_followTarget ) return; @@ -1860,7 +1860,7 @@ void PlayerbotAI::MovementReset() { } } -void PlayerbotAI::MovementUpdate() +void PlayerbotAI::MovementUpdate() { // send heartbeats to world WorldPacket data; @@ -1871,7 +1871,7 @@ void PlayerbotAI::MovementUpdate() m_bot->SetPosition( m_bot->GetPositionX(), m_bot->GetPositionY(), m_bot->GetPositionZ(), m_bot->GetOrientation(), false ); } -void PlayerbotAI::MovementClear() +void PlayerbotAI::MovementClear() { // stop... m_bot->GetMotionMaster()->Clear( true ); @@ -1883,7 +1883,7 @@ void PlayerbotAI::MovementClear() m_bot->SetStandState(UNIT_STAND_STATE_STAND); } -bool PlayerbotAI::IsMoving() +bool PlayerbotAI::IsMoving() { return (m_bot->GetMotionMaster()->GetCurrentMovementGeneratorType() == IDLE_MOTION_TYPE ? false : true); } @@ -2119,7 +2119,7 @@ bool PlayerbotAI::CastSpell(uint32 spellId) if (!m_bot->isInFrontInMap(pTarget, 10)) { m_bot->SetInFront(pTarget); - MovementUpdate(); + MovementUpdate(); } } @@ -2162,7 +2162,7 @@ Item* PlayerbotAI::FindItem(uint32 ItemId) // list out items in main backpack //INVENTORY_SLOT_ITEM_START = 23 //INVENTORY_SLOT_ITEM_END = 39 - + for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; slot++) { // sLog.outDebug("[%s's]backpack slot = %u",m_bot->GetName(),slot); // 23 to 38 = 16 @@ -2180,7 +2180,7 @@ Item* PlayerbotAI::FindItem(uint32 ItemId) // list out items in other removable backpacks //INVENTORY_SLOT_BAG_START = 19 //INVENTORY_SLOT_BAG_END = 23 - + for (uint8 bag = INVENTORY_SLOT_BAG_START; bag < INVENTORY_SLOT_BAG_END; ++bag) // 20 to 23 = 4 { const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); // 255, 20 to 23 @@ -2196,7 +2196,7 @@ Item* PlayerbotAI::FindItem(uint32 ItemId) if (!pItemProto ) continue; - if( pItemProto->ItemId == ItemId ) // have required item + if( pItemProto->ItemId == ItemId ) // have required item return pItem; } } @@ -2378,13 +2378,13 @@ void PlayerbotAI::EquipItem(Item& item) } // submits packet to trade an item (trade window must already be open) -// default slot is -1 which means trade slots 0 to 5. if slot is set +// default slot is -1 which means trade slots 0 to 5. if slot is set // to TRADE_SLOT_NONTRADED (which is slot 6) item will be shown in the // 'Will not be traded' slot. bool PlayerbotAI::TradeItem(const Item& item, int8 slot) { - sLog.outDebug( "[PlayerbotAI::TradeItem]: slot=%d, hasTrader=%d, itemInTrade=%d, itemTradeable=%d", - slot, + sLog.outDebug( "[PlayerbotAI::TradeItem]: slot=%d, hasTrader=%d, itemInTrade=%d, itemTradeable=%d", + slot, (m_bot->GetTrader()?1:0), (item.IsInTrade()?1:0), (item.CanBeTraded()?1:0) @@ -2474,7 +2474,7 @@ bool PlayerbotAI::TradeCopper(uint32 copper) bool PlayerbotAI::FollowCheckTeleport( WorldObject &obj ) { // if bot has strayed too far from the master, teleport bot - + if (!m_bot->IsWithinDistInMap( &obj, 50, true )) { m_ignoreAIUpdatesUntilTime = time(0) + 6; @@ -2571,7 +2571,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) extractItemIds(text, itemIds); if (itemIds.size() == 0) SendWhisper("Show me what item you want by shift clicking the item in the chat window.", fromPlayer); - else if( !strncmp( text.c_str(), "nt ", 3 ) ) + else if( !strncmp( text.c_str(), "nt ", 3 ) ) { if( itemIds.size() > 1 ) SendWhisper( "There is only one 'Will not be traded' slot. Shift-click just one item, please!", fromPlayer ); @@ -2675,55 +2675,55 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) for (std::list::iterator it = itemList.begin(); it != itemList.end(); ++it) EquipItem(**it); } - + else if (text == "quests") { - bool hasIncompleteQuests = false; - std::ostringstream incomout; - incomout << "my incomplete quests are:"; - bool hasCompleteQuests = false; - std::ostringstream comout; - comout << "my complete quests are:"; - for (uint16 slot = 0; slot < MAX_QUEST_LOG_SIZE; ++slot) - { - if(uint32 questId = m_bot->GetQuestSlotQuestId(slot)) - { - Quest const* pQuest = sObjectMgr.GetQuestTemplate(questId); - if (m_bot->GetQuestStatus(questId) == QUEST_STATUS_COMPLETE) { - hasCompleteQuests = true; - comout << " |cFFFFFF00|Hquest:" << questId << ':' << pQuest->GetQuestLevel() << "|h[" << pQuest->GetTitle() << "]|h|r"; - } - else { - hasIncompleteQuests = true; - incomout << " |cFFFFFF00|Hquest:" << questId << ':' << pQuest->GetQuestLevel() << "|h[" << pQuest->GetTitle() << "]|h|r"; - } - } - } - if (hasCompleteQuests) - SendWhisper(comout.str(), fromPlayer); - if (hasIncompleteQuests) - SendWhisper(incomout.str(), fromPlayer); - if (! hasCompleteQuests && ! hasIncompleteQuests) - SendWhisper("I have no quests!", fromPlayer); - } - + bool hasIncompleteQuests = false; + std::ostringstream incomout; + incomout << "my incomplete quests are:"; + bool hasCompleteQuests = false; + std::ostringstream comout; + comout << "my complete quests are:"; + for (uint16 slot = 0; slot < MAX_QUEST_LOG_SIZE; ++slot) + { + if(uint32 questId = m_bot->GetQuestSlotQuestId(slot)) + { + Quest const* pQuest = sObjectMgr.GetQuestTemplate(questId); + if (m_bot->GetQuestStatus(questId) == QUEST_STATUS_COMPLETE) { + hasCompleteQuests = true; + comout << " |cFFFFFF00|Hquest:" << questId << ':' << pQuest->GetQuestLevel() << "|h[" << pQuest->GetTitle() << "]|h|r"; + } + else { + hasIncompleteQuests = true; + incomout << " |cFFFFFF00|Hquest:" << questId << ':' << pQuest->GetQuestLevel() << "|h[" << pQuest->GetTitle() << "]|h|r"; + } + } + } + if (hasCompleteQuests) + SendWhisper(comout.str(), fromPlayer); + if (hasIncompleteQuests) + SendWhisper(incomout.str(), fromPlayer); + if (! hasCompleteQuests && ! hasIncompleteQuests) + SendWhisper("I have no quests!", fromPlayer); + } + // drop a quest - else if (text.size() > 5 && text.substr(0, 5) == "drop ") - { - uint64 oldSelectionGUID = 0; - if (fromPlayer.GetSelection() != m_bot->GetGUID()) { - oldSelectionGUID = m_bot->GetGUID(); - fromPlayer.SetSelection(m_bot->GetGUID()); - } - PlayerbotChatHandler ch(GetMaster()); - if (! ch.dropQuest(text.substr(5).c_str())) - ch.sysmessage("ERROR: could not drop quest"); - if (oldSelectionGUID) - fromPlayer.SetSelection(oldSelectionGUID); - } + else if (text.size() > 5 && text.substr(0, 5) == "drop ") + { + uint64 oldSelectionGUID = 0; + if (fromPlayer.GetSelection() != m_bot->GetGUID()) { + oldSelectionGUID = m_bot->GetGUID(); + fromPlayer.SetSelection(m_bot->GetGUID()); + } + PlayerbotChatHandler ch(GetMaster()); + if (! ch.dropQuest(text.substr(5).c_str())) + ch.sysmessage("ERROR: could not drop quest"); + if (oldSelectionGUID) + fromPlayer.SetSelection(oldSelectionGUID); + } + - else if (text == "spells") { @@ -2780,80 +2780,80 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) // list out items in main backpack for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; slot++) { - const Item* const pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); + const Item* const pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); if (pItem) totalused++; - } - uint32 totalfree = 16 - totalused; + } + uint32 totalfree = 16 - totalused; // list out items in other removable backpacks for (uint8 bag = INVENTORY_SLOT_BAG_START; bag < INVENTORY_SLOT_BAG_END; ++bag) { - const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); + const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); if (pBag) - { - ItemPrototype const* pBagProto = pBag->GetProto(); + { + ItemPrototype const* pBagProto = pBag->GetProto(); if (pBagProto->Class == ITEM_CLASS_CONTAINER && pBagProto->SubClass == ITEM_SUBCLASS_CONTAINER) - totalfree = totalfree + pBag->GetFreeSlots(); + totalfree = totalfree + pBag->GetFreeSlots(); } - } - out << totalfree << " Empty Slots (Total)"; - ChatHandler ch(&fromPlayer); + } + out << totalfree << " Empty Slots (Total)"; + ChatHandler ch(&fromPlayer); SendWhisper("I have this much space ", fromPlayer); ch.SendSysMessage(out.str().c_str()); } - - + + else { - // if this looks like an item link, reward item it completed quest and talking to NPC + // if this looks like an item link, reward item it completed quest and talking to NPC std::list itemIds; extractItemIds(text, itemIds); if (!itemIds.empty()) { - uint32 itemId = itemIds.front(); - bool wasRewarded = false; - uint64 questRewarderGUID = m_bot->GetSelection(); - Object* const pNpc = ObjectAccessor::GetObjectByTypeMask(*m_bot, questRewarderGUID, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); - if (!pNpc) - return; - - QuestMenu& questMenu = m_bot->PlayerTalkClass->GetQuestMenu(); - for (uint32 iI = 0; !wasRewarded && iI < questMenu.MenuItemCount(); ++iI) - { - QuestMenuItem const& qItem = questMenu.GetItem(iI); - - uint32 questID = qItem.m_qId; - Quest const* pQuest = sObjectMgr.GetQuestTemplate(questID); - QuestStatus status = m_bot->GetQuestStatus(questID); - - // if quest is complete, turn it in - if (status == QUEST_STATUS_COMPLETE && - ! m_bot->GetQuestRewardStatus(questID) && - pQuest->GetRewChoiceItemsCount() > 1 && - m_bot->CanRewardQuest(pQuest, false)) - { - for (uint8 rewardIdx=0; !wasRewarded && rewardIdx < pQuest->GetRewChoiceItemsCount(); ++rewardIdx) - { - ItemPrototype const * const pRewardItem = sObjectMgr.GetItemPrototype(pQuest->RewChoiceItemId[rewardIdx]); - if (itemId == pRewardItem->ItemId) - { - m_bot->RewardQuest(pQuest, rewardIdx, pNpc, false); - - std::string questTitle = pQuest->GetTitle(); - m_bot->GetPlayerbotAI()->QuestLocalization(questTitle, questID); - std::string itemName = pRewardItem->Name1; - m_bot->GetPlayerbotAI()->ItemLocalization(itemName, pRewardItem->ItemId); - - std::ostringstream out; - out << "|cffffffff|Hitem:" << pRewardItem->ItemId << ":0:0:0:0:0:0:0" << "|h[" << itemName << "]|h|r rewarded"; - SendWhisper(out.str(), fromPlayer); - wasRewarded = true; - } - } - } - } - - } + uint32 itemId = itemIds.front(); + bool wasRewarded = false; + uint64 questRewarderGUID = m_bot->GetSelection(); + Object* const pNpc = ObjectAccessor::GetObjectByTypeMask(*m_bot, questRewarderGUID, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); + if (!pNpc) + return; + + QuestMenu& questMenu = m_bot->PlayerTalkClass->GetQuestMenu(); + for (uint32 iI = 0; !wasRewarded && iI < questMenu.MenuItemCount(); ++iI) + { + QuestMenuItem const& qItem = questMenu.GetItem(iI); + + uint32 questID = qItem.m_qId; + Quest const* pQuest = sObjectMgr.GetQuestTemplate(questID); + QuestStatus status = m_bot->GetQuestStatus(questID); + + // if quest is complete, turn it in + if (status == QUEST_STATUS_COMPLETE && + ! m_bot->GetQuestRewardStatus(questID) && + pQuest->GetRewChoiceItemsCount() > 1 && + m_bot->CanRewardQuest(pQuest, false)) + { + for (uint8 rewardIdx=0; !wasRewarded && rewardIdx < pQuest->GetRewChoiceItemsCount(); ++rewardIdx) + { + ItemPrototype const * const pRewardItem = sObjectMgr.GetItemPrototype(pQuest->RewChoiceItemId[rewardIdx]); + if (itemId == pRewardItem->ItemId) + { + m_bot->RewardQuest(pQuest, rewardIdx, pNpc, false); + + std::string questTitle = pQuest->GetTitle(); + m_bot->GetPlayerbotAI()->QuestLocalization(questTitle, questID); + std::string itemName = pRewardItem->Name1; + m_bot->GetPlayerbotAI()->ItemLocalization(itemName, pRewardItem->ItemId); + + std::ostringstream out; + out << "|cffffffff|Hitem:" << pRewardItem->ItemId << ":0:0:0:0:0:0:0" << "|h[" << itemName << "]|h|r rewarded"; + SendWhisper(out.str(), fromPlayer); + wasRewarded = true; + } + } + } + } + + } else { std::string msg = "What? follow, stay, (c)ast , spells, (e)quip , (u)se , drop , report, quests"; SendWhisper(msg, fromPlayer); diff --git a/src/game/PlayerbotAI.h b/src/game/PlayerbotAI.h index c1de0e07f..377dfaabe 100644 --- a/src/game/PlayerbotAI.h +++ b/src/game/PlayerbotAI.h @@ -49,7 +49,7 @@ class MANGOS_DLL_SPEC PlayerbotAI enum CombatTargetType { TARGET_NORMAL = 0x00, - TARGET_THREATEN = 0x01 + TARGET_THREATEN = 0x01 }; enum BotState @@ -61,12 +61,12 @@ class MANGOS_DLL_SPEC PlayerbotAI BOTSTATE_LOOTING // looting mode, used just after combat }; - enum MovementOrderType - { - MOVEMENT_NONE = 0x00, - MOVEMENT_FOLLOW = 0x01, - MOVEMENT_STAY = 0x02 - }; + enum MovementOrderType + { + MOVEMENT_NONE = 0x00, + MOVEMENT_FOLLOW = 0x01, + MOVEMENT_STAY = 0x02 + }; typedef std::map BotNeedItem; typedef std::list BotLootCreature; @@ -163,7 +163,7 @@ class MANGOS_DLL_SPEC PlayerbotAI Item* FindPoison() const; Item* FindMount(uint32 matchingRidingSkill) const; Item* FindItem(uint32 ItemId); - + // ******* Actions **************************************** // Your handlers can call these actions to make the bot do things. void TellMaster(const std::string& text) const; @@ -182,7 +182,7 @@ class MANGOS_DLL_SPEC PlayerbotAI void GetCombatTarget( Unit* forcedTarged = 0 ); Unit *GetCurrentTarget() { return m_targetCombat; }; void DoNextCombatManeuver(); - void DoCombatMovement(); + void DoCombatMovement(); void SetIgnoreUpdateTime(uint8 t) {m_ignoreAIUpdatesUntilTime=time(0) + t; }; Player *GetPlayerBot() const {return m_bot;} @@ -193,7 +193,7 @@ class MANGOS_DLL_SPEC PlayerbotAI void SetState( BotState state ); void SetQuestNeedItems(); void SendQuestItemList( Player& player ); - void SendOrders( Player& player ); + void SendOrders( Player& player ); bool FollowCheckTeleport( WorldObject &obj ); void DoLoot(); @@ -204,15 +204,15 @@ class MANGOS_DLL_SPEC PlayerbotAI void UpdateAttackerInfo(); Unit* FindAttacker( ATTACKERINFOTYPE ait=AIT_NONE, Unit *victim=0 ); uint32 GetAttackerCount() { return m_attackerInfo.size(); }; - void SetCombatOrderByStr( std::string str, Unit *target=0 ); - void SetCombatOrder( CombatOrderType co, Unit *target=0 ); - CombatOrderType GetCombatOrder() { return this->m_combatOrder; } - void SetMovementOrder( MovementOrderType mo, Unit *followTarget=0 ); - MovementOrderType GetMovementOrder() { return this->m_movementOrder; } - void MovementReset(); - void MovementUpdate(); - void MovementClear(); - bool IsMoving(); + void SetCombatOrderByStr( std::string str, Unit *target=0 ); + void SetCombatOrder( CombatOrderType co, Unit *target=0 ); + CombatOrderType GetCombatOrder() { return this->m_combatOrder; } + void SetMovementOrder( MovementOrderType mo, Unit *followTarget=0 ); + MovementOrderType GetMovementOrder() { return this->m_movementOrder; } + void MovementReset(); + void MovementUpdate(); + void MovementClear(); + bool IsMoving(); void SetInFront( const Unit* obj ); @@ -237,9 +237,9 @@ class MANGOS_DLL_SPEC PlayerbotAI // no need to waste CPU cycles during casting etc time_t m_ignoreAIUpdatesUntilTime; - CombatStyle m_combatStyle; + CombatStyle m_combatStyle; CombatOrderType m_combatOrder; - MovementOrderType m_movementOrder; + MovementOrderType m_movementOrder; ScenarioType m_ScenarioType; @@ -268,11 +268,11 @@ class MANGOS_DLL_SPEC PlayerbotAI bool m_targetChanged; CombatTargetType m_targetType; - Unit *m_targetCombat; // current combat target - Unit *m_targetAssist; // get new target by checking attacker list of assisted player - Unit *m_targetProtect; // check + Unit *m_targetCombat; // current combat target + Unit *m_targetAssist; // get new target by checking attacker list of assisted player + Unit *m_targetProtect; // check - Unit *m_followTarget; // whom to follow in non combat situation? + Unit *m_followTarget; // whom to follow in non combat situation? }; #endif diff --git a/src/game/PlayerbotDeathKnightAI.cpp b/src/game/PlayerbotDeathKnightAI.cpp index 175b1a2fa..e1bb31d1d 100644 --- a/src/game/PlayerbotDeathKnightAI.cpp +++ b/src/game/PlayerbotDeathKnightAI.cpp @@ -86,7 +86,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) // ------- Non Duel combat ---------- - //ai->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, GetMaster() ); // dont want to melee mob + //ai->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, GetMaster() ); // dont want to melee mob // DK Attacks: Unholy, Frost & Blood @@ -101,376 +101,376 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) switch (SpellSequence) { case SPELL_DK_UNHOLY: - if (UNHOLY_PRESENCE > 0) - (!m_bot->HasAura(UNHOLY_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(BLOOD_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(FROST_PRESENCE, EFFECT_INDEX_0) && ai->CastSpell (UNHOLY_PRESENCE, *m_bot)); + if (UNHOLY_PRESENCE > 0) + (!m_bot->HasAura(UNHOLY_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(BLOOD_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(FROST_PRESENCE, EFFECT_INDEX_0) && ai->CastSpell (UNHOLY_PRESENCE, *m_bot)); - // check for BONE_SHIELD in combat - if (BONE_SHIELD > 0) - (!m_bot->HasAura(BONE_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0) && ai->CastSpell (BONE_SHIELD, *m_bot)); + // check for BONE_SHIELD in combat + if (BONE_SHIELD > 0) + (!m_bot->HasAura(BONE_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0) && ai->CastSpell (BONE_SHIELD, *m_bot)); - if (ARMY_OF_THE_DEAD > 0 && ai->GetAttackerCount()>=5 && LastSpellUnholyDK < 1) - { - ai->CastSpell(ARMY_OF_THE_DEAD); - out << " summoning Army of the Dead!"; - if (ARMY_OF_THE_DEAD > 0 && m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0)) - ai->SetIgnoreUpdateTime(7); - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (PLAGUE_STRIKE > 0 && !pTarget->HasAura(PLAGUE_STRIKE, EFFECT_INDEX_0) && LastSpellUnholyDK < 2) - { - ai->CastSpell(PLAGUE_STRIKE, *pTarget); - out << " Plague Strike"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (DEATH_GRIP > 0 && !pTarget->HasAura(DEATH_GRIP, EFFECT_INDEX_0) && LastSpellUnholyDK < 3) - { - ai->CastSpell(DEATH_GRIP, *pTarget); - out << " Death Grip"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (DEATH_COIL > 0 && LastSpellUnholyDK < 4 && ai->GetRunicPower() >= 40) - { - ai->CastSpell(DEATH_COIL, *pTarget); - out << " Death Coil"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (DEATH_STRIKE > 0 && !pTarget->HasAura(DEATH_STRIKE, EFFECT_INDEX_0) && LastSpellUnholyDK < 5) - { - ai->CastSpell(DEATH_STRIKE, *pTarget); - out << " Death Strike"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (UNHOLY_BLIGHT > 0 && !pTarget->HasAura(UNHOLY_BLIGHT, EFFECT_INDEX_0) && LastSpellUnholyDK < 6) - { - ai->CastSpell(UNHOLY_BLIGHT); - out << " Unholy Blight"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (SCOURGE_STRIKE > 0 && LastSpellUnholyDK < 7) - { - ai->CastSpell(SCOURGE_STRIKE, *pTarget); - out << " Scourge Strike"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (DEATH_AND_DECAY > 0 && ai->GetAttackerCount()>=3 && dist <= ATTACK_DISTANCE && !pTarget->HasAura(DEATH_AND_DECAY, EFFECT_INDEX_0) && LastSpellUnholyDK < 8) - { - ai->CastSpell(DEATH_AND_DECAY); - out << " Death and Decay"; - ai->SetIgnoreUpdateTime(1); - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (SUMMON_GARGOYLE > 0 && !m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0) && !pTarget->HasAura(SUMMON_GARGOYLE, EFFECT_INDEX_0) && LastSpellUnholyDK < 9 && ai->GetRunicPower() >= 60) - { - ai->CastSpell(SUMMON_GARGOYLE, *pTarget); - out << " summoning Gargoyle"; - ai->SetIgnoreUpdateTime(2); - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (CORPSE_EXPLOSION > 0 && dist <= ATTACK_DISTANCE && LastSpellUnholyDK < 10) - { - ai->CastSpell(CORPSE_EXPLOSION, *pTarget); - out << " Corpse Explosion"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (ANTI_MAGIC_SHELL > 0 && pTarget->IsNonMeleeSpellCasted(true) && !m_bot->HasAura(ANTI_MAGIC_SHELL, EFFECT_INDEX_0) && LastSpellUnholyDK < 11 && ai->GetRunicPower() >= 20) - { - ai->CastSpell(ANTI_MAGIC_SHELL, *m_bot); - out << " Anti-Magic Shell"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (ANTI_MAGIC_ZONE > 0 && pTarget->IsNonMeleeSpellCasted(true) && !m_bot->HasAura(ANTI_MAGIC_SHELL, EFFECT_INDEX_0) && LastSpellUnholyDK < 12) - { - ai->CastSpell(ANTI_MAGIC_ZONE, *m_bot); - out << " Anti-Magic Zone"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if(( !pet ) - && (RAISE_DEAD > 0 && !m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0) && LastSpellUnholyDK < 13)) - { - ai->CastSpell(RAISE_DEAD); - out << " summoning Ghoul"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if(( pet ) - && (GHOUL_FRENZY > 0 && pVictim == pet && !pet->HasAura(GHOUL_FRENZY, EFFECT_INDEX_0) && LastSpellUnholyDK < 14)) - { - ai->CastSpell(GHOUL_FRENZY, *pet); - out << " casting Ghoul Frenzy on pet"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (LastSpellUnholyDK > 15) - { - LastSpellUnholyDK = 0; - SpellSequence = SPELL_DK_FROST; - break; - } + if (ARMY_OF_THE_DEAD > 0 && ai->GetAttackerCount()>=5 && LastSpellUnholyDK < 1) + { + ai->CastSpell(ARMY_OF_THE_DEAD); + out << " summoning Army of the Dead!"; + if (ARMY_OF_THE_DEAD > 0 && m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0)) + ai->SetIgnoreUpdateTime(7); + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK +1; + break; + } + else if (PLAGUE_STRIKE > 0 && !pTarget->HasAura(PLAGUE_STRIKE, EFFECT_INDEX_0) && LastSpellUnholyDK < 2) + { + ai->CastSpell(PLAGUE_STRIKE, *pTarget); + out << " Plague Strike"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK +1; + break; + } + else if (DEATH_GRIP > 0 && !pTarget->HasAura(DEATH_GRIP, EFFECT_INDEX_0) && LastSpellUnholyDK < 3) + { + ai->CastSpell(DEATH_GRIP, *pTarget); + out << " Death Grip"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK +1; + break; + } + else if (DEATH_COIL > 0 && LastSpellUnholyDK < 4 && ai->GetRunicPower() >= 40) + { + ai->CastSpell(DEATH_COIL, *pTarget); + out << " Death Coil"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK +1; + break; + } + else if (DEATH_STRIKE > 0 && !pTarget->HasAura(DEATH_STRIKE, EFFECT_INDEX_0) && LastSpellUnholyDK < 5) + { + ai->CastSpell(DEATH_STRIKE, *pTarget); + out << " Death Strike"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK +1; + break; + } + else if (UNHOLY_BLIGHT > 0 && !pTarget->HasAura(UNHOLY_BLIGHT, EFFECT_INDEX_0) && LastSpellUnholyDK < 6) + { + ai->CastSpell(UNHOLY_BLIGHT); + out << " Unholy Blight"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK +1; + break; + } + else if (SCOURGE_STRIKE > 0 && LastSpellUnholyDK < 7) + { + ai->CastSpell(SCOURGE_STRIKE, *pTarget); + out << " Scourge Strike"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK +1; + break; + } + else if (DEATH_AND_DECAY > 0 && ai->GetAttackerCount()>=3 && dist <= ATTACK_DISTANCE && !pTarget->HasAura(DEATH_AND_DECAY, EFFECT_INDEX_0) && LastSpellUnholyDK < 8) + { + ai->CastSpell(DEATH_AND_DECAY); + out << " Death and Decay"; + ai->SetIgnoreUpdateTime(1); + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK +1; + break; + } + else if (SUMMON_GARGOYLE > 0 && !m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0) && !pTarget->HasAura(SUMMON_GARGOYLE, EFFECT_INDEX_0) && LastSpellUnholyDK < 9 && ai->GetRunicPower() >= 60) + { + ai->CastSpell(SUMMON_GARGOYLE, *pTarget); + out << " summoning Gargoyle"; + ai->SetIgnoreUpdateTime(2); + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK +1; + break; + } + else if (CORPSE_EXPLOSION > 0 && dist <= ATTACK_DISTANCE && LastSpellUnholyDK < 10) + { + ai->CastSpell(CORPSE_EXPLOSION, *pTarget); + out << " Corpse Explosion"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK +1; + break; + } + else if (ANTI_MAGIC_SHELL > 0 && pTarget->IsNonMeleeSpellCasted(true) && !m_bot->HasAura(ANTI_MAGIC_SHELL, EFFECT_INDEX_0) && LastSpellUnholyDK < 11 && ai->GetRunicPower() >= 20) + { + ai->CastSpell(ANTI_MAGIC_SHELL, *m_bot); + out << " Anti-Magic Shell"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK +1; + break; + } + else if (ANTI_MAGIC_ZONE > 0 && pTarget->IsNonMeleeSpellCasted(true) && !m_bot->HasAura(ANTI_MAGIC_SHELL, EFFECT_INDEX_0) && LastSpellUnholyDK < 12) + { + ai->CastSpell(ANTI_MAGIC_ZONE, *m_bot); + out << " Anti-Magic Zone"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK +1; + break; + } + else if(( !pet ) + && (RAISE_DEAD > 0 && !m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0) && LastSpellUnholyDK < 13)) + { + ai->CastSpell(RAISE_DEAD); + out << " summoning Ghoul"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK +1; + break; + } + else if(( pet ) + && (GHOUL_FRENZY > 0 && pVictim == pet && !pet->HasAura(GHOUL_FRENZY, EFFECT_INDEX_0) && LastSpellUnholyDK < 14)) + { + ai->CastSpell(GHOUL_FRENZY, *pet); + out << " casting Ghoul Frenzy on pet"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK +1; + break; + } + else if (LastSpellUnholyDK > 15) + { + LastSpellUnholyDK = 0; + SpellSequence = SPELL_DK_FROST; + break; + } - LastSpellUnholyDK = 0; + LastSpellUnholyDK = 0; case SPELL_DK_FROST: - if (FROST_PRESENCE > 0) - (!m_bot->HasAura(FROST_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(BLOOD_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(UNHOLY_PRESENCE, EFFECT_INDEX_0) && ai->CastSpell (FROST_PRESENCE, *m_bot)); + if (FROST_PRESENCE > 0) + (!m_bot->HasAura(FROST_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(BLOOD_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(UNHOLY_PRESENCE, EFFECT_INDEX_0) && ai->CastSpell (FROST_PRESENCE, *m_bot)); - if (DEATHCHILL > 0) - (!m_bot->HasAura(DEATHCHILL, EFFECT_INDEX_0) && !m_bot->HasAura(KILLING_MACHINE, EFFECT_INDEX_0) && ai->CastSpell (DEATHCHILL, *m_bot)); - else if (KILLING_MACHINE > 0) - (!m_bot->HasAura(KILLING_MACHINE, EFFECT_INDEX_0) && !m_bot->HasAura(DEATHCHILL, EFFECT_INDEX_0) && ai->CastSpell (KILLING_MACHINE, *m_bot)); + if (DEATHCHILL > 0) + (!m_bot->HasAura(DEATHCHILL, EFFECT_INDEX_0) && !m_bot->HasAura(KILLING_MACHINE, EFFECT_INDEX_0) && ai->CastSpell (DEATHCHILL, *m_bot)); + else if (KILLING_MACHINE > 0) + (!m_bot->HasAura(KILLING_MACHINE, EFFECT_INDEX_0) && !m_bot->HasAura(DEATHCHILL, EFFECT_INDEX_0) && ai->CastSpell (KILLING_MACHINE, *m_bot)); - if (ICY_TOUCH > 0 && !pTarget->HasAura(ICY_TOUCH, EFFECT_INDEX_0) && LastSpellFrostDK < 1) - { - ai->CastSpell(ICY_TOUCH, *pTarget); - out << " Icy Touch"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (OBLITERATE > 0 && LastSpellFrostDK < 2) - { - ai->CastSpell(OBLITERATE, *pTarget); - out << " Obliterate"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (FROST_STRIKE > 0 && LastSpellFrostDK < 3 && ai->GetRunicPower() >= 40) - { - ai->CastSpell(FROST_STRIKE, *pTarget); - out << " Frost Strike"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (HOWLING_BLAST > 0 && ai->GetAttackerCount()>=3 && LastSpellFrostDK < 4) - { - ai->CastSpell(HOWLING_BLAST, *pTarget); - out << " Howling Blast"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (CHAINS_OF_ICE > 0 && !pTarget->HasAura(CHAINS_OF_ICE, EFFECT_INDEX_0) && LastSpellFrostDK < 5) - { - ai->CastSpell(CHAINS_OF_ICE, *pTarget); - out << " Chains of Ice"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (RUNE_STRIKE > 0 && LastSpellFrostDK < 6 && ai->GetRunicPower() >= 20) - { - ai->CastSpell(RUNE_STRIKE, *pTarget); - out << " Rune Strike"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (ICY_CLUTCH > 0 && !pTarget->HasAura(ICY_CLUTCH, EFFECT_INDEX_0) && LastSpellFrostDK < 7) - { - ai->CastSpell(ICY_CLUTCH, *pTarget); - out << " Icy Clutch"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (ICEBOUND_FORTITUDE > 0 && ai->GetHealthPercent() < 50 && pVictim == m_bot && !m_bot->HasAura(ICEBOUND_FORTITUDE, EFFECT_INDEX_0) && LastSpellFrostDK < 8 && ai->GetRunicPower() >= 20) - { - ai->CastSpell(ICEBOUND_FORTITUDE, *m_bot); - out << " Icebound Fortitude"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (MIND_FREEZE > 0 && pTarget->IsNonMeleeSpellCasted(true) && dist <= ATTACK_DISTANCE && LastSpellFrostDK < 9 && ai->GetRunicPower() >= 20) - { - ai->CastSpell(MIND_FREEZE, *pTarget); - out << " Mind Freeze"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (HUNGERING_COLD > 0 && ai->GetAttackerCount()>=3 && dist <= ATTACK_DISTANCE && LastSpellFrostDK < 10 && ai->GetRunicPower() >= 40) - { - ai->CastSpell(HUNGERING_COLD, *pTarget); - out << " Hungering Cold"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (EMPOWER_WEAPON > 0 && ai->GetRunicPower() < 20 && LastSpellFrostDK < 11) - { - ai->CastSpell(EMPOWER_WEAPON, *m_bot); - out << " Empower Rune Weapon"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (UNBREAKABLE_ARMOR > 0 && !m_bot->HasAura(UNBREAKABLE_ARMOR, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70 && pVictim == m_bot && LastSpellFrostDK < 12) - { - ai->CastSpell(UNBREAKABLE_ARMOR, *m_bot); - out << " Unbreakable Armor"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (LastSpellFrostDK > 13) - { - LastSpellFrostDK = 0; - SpellSequence = SPELL_DK_BLOOD; - break; - } + if (ICY_TOUCH > 0 && !pTarget->HasAura(ICY_TOUCH, EFFECT_INDEX_0) && LastSpellFrostDK < 1) + { + ai->CastSpell(ICY_TOUCH, *pTarget); + out << " Icy Touch"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK +1; + break; + } + else if (OBLITERATE > 0 && LastSpellFrostDK < 2) + { + ai->CastSpell(OBLITERATE, *pTarget); + out << " Obliterate"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK +1; + break; + } + else if (FROST_STRIKE > 0 && LastSpellFrostDK < 3 && ai->GetRunicPower() >= 40) + { + ai->CastSpell(FROST_STRIKE, *pTarget); + out << " Frost Strike"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK +1; + break; + } + else if (HOWLING_BLAST > 0 && ai->GetAttackerCount()>=3 && LastSpellFrostDK < 4) + { + ai->CastSpell(HOWLING_BLAST, *pTarget); + out << " Howling Blast"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK +1; + break; + } + else if (CHAINS_OF_ICE > 0 && !pTarget->HasAura(CHAINS_OF_ICE, EFFECT_INDEX_0) && LastSpellFrostDK < 5) + { + ai->CastSpell(CHAINS_OF_ICE, *pTarget); + out << " Chains of Ice"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK +1; + break; + } + else if (RUNE_STRIKE > 0 && LastSpellFrostDK < 6 && ai->GetRunicPower() >= 20) + { + ai->CastSpell(RUNE_STRIKE, *pTarget); + out << " Rune Strike"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK +1; + break; + } + else if (ICY_CLUTCH > 0 && !pTarget->HasAura(ICY_CLUTCH, EFFECT_INDEX_0) && LastSpellFrostDK < 7) + { + ai->CastSpell(ICY_CLUTCH, *pTarget); + out << " Icy Clutch"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK +1; + break; + } + else if (ICEBOUND_FORTITUDE > 0 && ai->GetHealthPercent() < 50 && pVictim == m_bot && !m_bot->HasAura(ICEBOUND_FORTITUDE, EFFECT_INDEX_0) && LastSpellFrostDK < 8 && ai->GetRunicPower() >= 20) + { + ai->CastSpell(ICEBOUND_FORTITUDE, *m_bot); + out << " Icebound Fortitude"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK +1; + break; + } + else if (MIND_FREEZE > 0 && pTarget->IsNonMeleeSpellCasted(true) && dist <= ATTACK_DISTANCE && LastSpellFrostDK < 9 && ai->GetRunicPower() >= 20) + { + ai->CastSpell(MIND_FREEZE, *pTarget); + out << " Mind Freeze"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK +1; + break; + } + else if (HUNGERING_COLD > 0 && ai->GetAttackerCount()>=3 && dist <= ATTACK_DISTANCE && LastSpellFrostDK < 10 && ai->GetRunicPower() >= 40) + { + ai->CastSpell(HUNGERING_COLD, *pTarget); + out << " Hungering Cold"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK +1; + break; + } + else if (EMPOWER_WEAPON > 0 && ai->GetRunicPower() < 20 && LastSpellFrostDK < 11) + { + ai->CastSpell(EMPOWER_WEAPON, *m_bot); + out << " Empower Rune Weapon"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK +1; + break; + } + else if (UNBREAKABLE_ARMOR > 0 && !m_bot->HasAura(UNBREAKABLE_ARMOR, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70 && pVictim == m_bot && LastSpellFrostDK < 12) + { + ai->CastSpell(UNBREAKABLE_ARMOR, *m_bot); + out << " Unbreakable Armor"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK +1; + break; + } + else if (LastSpellFrostDK > 13) + { + LastSpellFrostDK = 0; + SpellSequence = SPELL_DK_BLOOD; + break; + } - LastSpellFrostDK = 0; + LastSpellFrostDK = 0; case SPELL_DK_BLOOD: - if (BLOOD_PRESENCE > 0) - (!m_bot->HasAura(BLOOD_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(UNHOLY_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(FROST_PRESENCE, EFFECT_INDEX_0) && ai->CastSpell (BLOOD_PRESENCE, *m_bot)); + if (BLOOD_PRESENCE > 0) + (!m_bot->HasAura(BLOOD_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(UNHOLY_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(FROST_PRESENCE, EFFECT_INDEX_0) && ai->CastSpell (BLOOD_PRESENCE, *m_bot)); - if (MARK_OF_BLOOD > 0 && !pTarget->HasAura(MARK_OF_BLOOD, EFFECT_INDEX_0) && LastSpellBloodDK < 1) - { - ai->CastSpell(MARK_OF_BLOOD, *pTarget); - out << " Mark of Blood"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (BLOOD_STRIKE > 0 && LastSpellBloodDK < 2) - { - ai->CastSpell(BLOOD_STRIKE, *pTarget); - out << " Blood Strike"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (PESTILENCE > 0 && dist <= ATTACK_DISTANCE && ai->GetAttackerCount()>=3 && LastSpellBloodDK < 3) - { - ai->CastSpell(PESTILENCE, *pTarget); - out << " Pestilence"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (STRANGULATE > 0 && !pTarget->HasAura(STRANGULATE, EFFECT_INDEX_0) && LastSpellBloodDK < 4) - { - ai->CastSpell(STRANGULATE, *pTarget); - out << " Strangulate"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (BLOOD_BOIL > 0 && ai->GetAttackerCount()>=5 && dist <= ATTACK_DISTANCE && LastSpellBloodDK < 5) - { - ai->CastSpell(BLOOD_BOIL, *pTarget); - out << " Blood Boil"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (HEART_STRIKE > 0 && LastSpellBloodDK < 6) - { - ai->CastSpell(HEART_STRIKE, *pTarget); - out << " Heart Strike"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (VAMPIRIC_BLOOD > 0 && ai->GetHealthPercent() < 70 && !m_bot->HasAura(VAMPIRIC_BLOOD, EFFECT_INDEX_0) && LastSpellBloodDK < 7) - { - ai->CastSpell(VAMPIRIC_BLOOD, *m_bot); - out << " Vampiric Blood"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (RUNE_TAP > 0 && ai->GetHealthPercent() < 70 && !m_bot->HasAura(VAMPIRIC_BLOOD, EFFECT_INDEX_0) && LastSpellBloodDK < 8) - { - ai->CastSpell(RUNE_TAP, *m_bot); - out << " Rune Tap"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (HYSTERIA > 0 && ai->GetHealthPercent() > 25 && !m_bot->HasAura(HYSTERIA, EFFECT_INDEX_0) && LastSpellBloodDK < 9) - { - ai->CastSpell(HYSTERIA, *m_bot); - out << " Hysteria"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (DANCING_WEAPON > 0 && !m_bot->HasAura(DANCING_WEAPON, EFFECT_INDEX_0) && ai->GetRunicPower() >= 60 && LastSpellBloodDK < 10) - { - ai->CastSpell(DANCING_WEAPON, *pTarget); - out << " summoning Dancing Rune Weapon"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (DARK_COMMAND > 0 && ai->GetHealthPercent() > 50 && pVictim != m_bot && !pTarget->HasAura(DARK_COMMAND, EFFECT_INDEX_0) && dist <= ATTACK_DISTANCE && LastSpellBloodDK < 11) - { - ai->CastSpell(DARK_COMMAND, *pTarget); - out << " Dark Command"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if(( pet ) - && (DEATH_PACT > 0 && ai->GetHealthPercent() < 50 && LastSpellBloodDK < 12 && ai->GetRunicPower() >= 40)) - { - ai->CastSpell(DEATH_PACT, *pet); - out << " Death Pact (sacrifice pet)"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (LastSpellBloodDK > 13) - { - LastSpellBloodDK = 0; - SpellSequence = SPELL_DK_UNHOLY; - break; - } - else - { - LastSpellBloodDK = 0; - SpellSequence = SPELL_DK_UNHOLY; - } + if (MARK_OF_BLOOD > 0 && !pTarget->HasAura(MARK_OF_BLOOD, EFFECT_INDEX_0) && LastSpellBloodDK < 1) + { + ai->CastSpell(MARK_OF_BLOOD, *pTarget); + out << " Mark of Blood"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK +1; + break; + } + else if (BLOOD_STRIKE > 0 && LastSpellBloodDK < 2) + { + ai->CastSpell(BLOOD_STRIKE, *pTarget); + out << " Blood Strike"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK +1; + break; + } + else if (PESTILENCE > 0 && dist <= ATTACK_DISTANCE && ai->GetAttackerCount()>=3 && LastSpellBloodDK < 3) + { + ai->CastSpell(PESTILENCE, *pTarget); + out << " Pestilence"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK +1; + break; + } + else if (STRANGULATE > 0 && !pTarget->HasAura(STRANGULATE, EFFECT_INDEX_0) && LastSpellBloodDK < 4) + { + ai->CastSpell(STRANGULATE, *pTarget); + out << " Strangulate"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK +1; + break; + } + else if (BLOOD_BOIL > 0 && ai->GetAttackerCount()>=5 && dist <= ATTACK_DISTANCE && LastSpellBloodDK < 5) + { + ai->CastSpell(BLOOD_BOIL, *pTarget); + out << " Blood Boil"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK +1; + break; + } + else if (HEART_STRIKE > 0 && LastSpellBloodDK < 6) + { + ai->CastSpell(HEART_STRIKE, *pTarget); + out << " Heart Strike"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK +1; + break; + } + else if (VAMPIRIC_BLOOD > 0 && ai->GetHealthPercent() < 70 && !m_bot->HasAura(VAMPIRIC_BLOOD, EFFECT_INDEX_0) && LastSpellBloodDK < 7) + { + ai->CastSpell(VAMPIRIC_BLOOD, *m_bot); + out << " Vampiric Blood"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK +1; + break; + } + else if (RUNE_TAP > 0 && ai->GetHealthPercent() < 70 && !m_bot->HasAura(VAMPIRIC_BLOOD, EFFECT_INDEX_0) && LastSpellBloodDK < 8) + { + ai->CastSpell(RUNE_TAP, *m_bot); + out << " Rune Tap"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK +1; + break; + } + else if (HYSTERIA > 0 && ai->GetHealthPercent() > 25 && !m_bot->HasAura(HYSTERIA, EFFECT_INDEX_0) && LastSpellBloodDK < 9) + { + ai->CastSpell(HYSTERIA, *m_bot); + out << " Hysteria"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK +1; + break; + } + else if (DANCING_WEAPON > 0 && !m_bot->HasAura(DANCING_WEAPON, EFFECT_INDEX_0) && ai->GetRunicPower() >= 60 && LastSpellBloodDK < 10) + { + ai->CastSpell(DANCING_WEAPON, *pTarget); + out << " summoning Dancing Rune Weapon"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK +1; + break; + } + else if (DARK_COMMAND > 0 && ai->GetHealthPercent() > 50 && pVictim != m_bot && !pTarget->HasAura(DARK_COMMAND, EFFECT_INDEX_0) && dist <= ATTACK_DISTANCE && LastSpellBloodDK < 11) + { + ai->CastSpell(DARK_COMMAND, *pTarget); + out << " Dark Command"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK +1; + break; + } + else if(( pet ) + && (DEATH_PACT > 0 && ai->GetHealthPercent() < 50 && LastSpellBloodDK < 12 && ai->GetRunicPower() >= 40)) + { + ai->CastSpell(DEATH_PACT, *pet); + out << " Death Pact (sacrifice pet)"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK +1; + break; + } + else if (LastSpellBloodDK > 13) + { + LastSpellBloodDK = 0; + SpellSequence = SPELL_DK_UNHOLY; + break; + } + else + { + LastSpellBloodDK = 0; + SpellSequence = SPELL_DK_UNHOLY; + } } - if( ai->GetManager()->m_confDebugWhisper ) + if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( out.str().c_str() ); } // end DoNextCombatManeuver void PlayerbotDeathKnightAI::DoNonCombatActions() { - PlayerbotAI* ai = GetAI(); - Player *m_bot = GetPlayerBot(); + PlayerbotAI* ai = GetAI(); + Player *m_bot = GetPlayerBot(); if (!m_bot) return; diff --git a/src/game/PlayerbotDeathKnightAI.h b/src/game/PlayerbotDeathKnightAI.h index b6611dd6d..14a9d952b 100644 --- a/src/game/PlayerbotDeathKnightAI.h +++ b/src/game/PlayerbotDeathKnightAI.h @@ -28,7 +28,7 @@ class MANGOS_DLL_SPEC PlayerbotDeathKnightAI : PlayerbotClassAI //void BuffPlayer(Player *target); private: - + // Unholy uint32 BONE_SHIELD, PLAGUE_STRIKE, DEATH_GRIP, DEATH_COIL, DEATH_STRIKE, UNHOLY_BLIGHT, SCOURGE_STRIKE, DEATH_AND_DECAY, UNHOLY_PRESENCE, RAISE_DEAD, ARMY_OF_THE_DEAD, SUMMON_GARGOYLE, ANTI_MAGIC_SHELL, ANTI_MAGIC_ZONE, GHOUL_FRENZY, CORPSE_EXPLOSION; diff --git a/src/game/PlayerbotDruidAI.cpp b/src/game/PlayerbotDruidAI.cpp index 89d36bdaf..780e8fbdf 100644 --- a/src/game/PlayerbotDruidAI.cpp +++ b/src/game/PlayerbotDruidAI.cpp @@ -10,7 +10,7 @@ class PlayerbotAI; PlayerbotDruidAI::PlayerbotDruidAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) { - + MOONFIRE = ai->getSpellId("moonfire"); // attacks STARFIRE = ai->getSpellId("starfire"); STARFALL = ai->getSpellId("starfall"); @@ -656,7 +656,7 @@ void PlayerbotDruidAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(8); return; } - + // buff and heal master's group if (GetMaster()->GetGroup()) { diff --git a/src/game/PlayerbotHunterAI.cpp b/src/game/PlayerbotHunterAI.cpp index d29b51bb8..b2ba9a1d6 100644 --- a/src/game/PlayerbotHunterAI.cpp +++ b/src/game/PlayerbotHunterAI.cpp @@ -47,7 +47,7 @@ PlayerbotHunterAI::PlayerbotHunterAI(Player* const master, Player* const bot, Pl DISENGAGE = ai->getSpellId("disengage"); MISDIRECTION = ai->getSpellId("misdirection"); DETERRENCE = ai->getSpellId("deterrence"); - + // TRAPS BEAR_TRAP = ai->getSpellId("bear trap"); FREEZING_TRAP = ai->getSpellId("freezing trap"); @@ -356,7 +356,7 @@ void PlayerbotHunterAI::DoNonCombatActions() } else if(pet->GetHappinessState() != HAPPY) // if pet is hungry { - Unit *caster = (Unit*)m_bot; + Unit *caster = (Unit*)m_bot; // list out items in main backpack for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; slot++) { @@ -371,7 +371,7 @@ void PlayerbotHunterAI::DoNonCombatActions() { //sLog.outDebug("Food for pet: %s",pItemProto->Name1); caster->CastSpell(caster,51284,true); // pet feed visual - uint32 count = 1; // number of items used + uint32 count = 1; // number of items used int32 benefit = pet->GetCurrentFoodBenefitLevel(pItemProto->ItemLevel); // nutritional value of food m_bot->DestroyItemCount(pItem,count,true); // remove item from inventory m_bot->CastCustomSpell(m_bot,PET_FEED,&benefit,NULL,NULL,true); // feed pet diff --git a/src/game/PlayerbotMgr.cpp b/src/game/PlayerbotMgr.cpp index 1aca344d0..63c37d327 100644 --- a/src/game/PlayerbotMgr.cpp +++ b/src/game/PlayerbotMgr.cpp @@ -14,7 +14,7 @@ class LoginQueryHolder; class CharacterHandler; -PlayerbotMgr::PlayerbotMgr(Player* const master) : m_master(master) +PlayerbotMgr::PlayerbotMgr(Player* const master) : m_master(master) { // load config variables m_confMaxNumBots = sConfig.GetIntDefault( "PlayerbotAI.MaxNumBots", 9 ); @@ -25,7 +25,7 @@ PlayerbotMgr::PlayerbotMgr(Player* const master) : m_master(master) m_confFollowDistance[1] = sConfig.GetFloatDefault( "PlayerbotAI.FollowDistanceMin", 1.0f ); } -PlayerbotMgr::~PlayerbotMgr() +PlayerbotMgr::~PlayerbotMgr() { LogoutAllBots(); } @@ -199,17 +199,17 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) case CMSG_GAMEOBJ_USE: { WorldPacket p(packet); - p.rpos(0); // reset reader - uint64 objGUID; - p >> objGUID; + p.rpos(0); // reset reader + uint64 objGUID; + p >> objGUID; GameObject *obj = m_master->GetMap()->GetGameObject( objGUID ); if( !obj ) return; - for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) - { - Player* const bot = it->second; + for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) + { + Player* const bot = it->second; if( obj->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER ) { @@ -225,103 +225,103 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) case CMSG_GOSSIP_HELLO: case CMSG_QUESTGIVER_HELLO: { - WorldPacket p(packet); - p.rpos(0); // reset reader - uint64 npcGUID; - p >> npcGUID; - - WorldObject* pNpc = m_master->GetMap()->GetWorldObject( npcGUID ); - if (!pNpc) - return; - - // for all master's bots - for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) - { - Player* const bot = it->second; - bot->GetPlayerbotAI()->TurnInQuests( pNpc ); - } - - return; + WorldPacket p(packet); + p.rpos(0); // reset reader + uint64 npcGUID; + p >> npcGUID; + + WorldObject* pNpc = m_master->GetMap()->GetWorldObject( npcGUID ); + if (!pNpc) + return; + + // for all master's bots + for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) + { + Player* const bot = it->second; + bot->GetPlayerbotAI()->TurnInQuests( pNpc ); + } + + return; } // if master accepts a quest, bots should also try to accept quest case CMSG_QUESTGIVER_ACCEPT_QUEST: { - WorldPacket p(packet); - p.rpos(0); // reset reader - uint64 guid; - uint32 quest; - p >> guid >> quest; - Quest const* qInfo = sObjectMgr.GetQuestTemplate(quest); - if (qInfo) - { - for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) - { - Player* const bot = it->second; - - if (bot->GetQuestStatus(quest) == QUEST_STATUS_COMPLETE) - bot->GetPlayerbotAI()->TellMaster("I already completed that quest."); - else if (! bot->CanTakeQuest(qInfo, false)) - { - if (! bot->SatisfyQuestStatus(qInfo, false)) - bot->GetPlayerbotAI()->TellMaster("I already have that quest."); - else - bot->GetPlayerbotAI()->TellMaster("I can't take that quest."); - } - else if (! bot->SatisfyQuestLog(false)) - bot->GetPlayerbotAI()->TellMaster("My quest log is full."); - else if (! bot->CanAddQuest(qInfo, false)) - bot->GetPlayerbotAI()->TellMaster("I can't take that quest because it requires that I take items, but my bags are full!"); - - else + WorldPacket p(packet); + p.rpos(0); // reset reader + uint64 guid; + uint32 quest; + p >> guid >> quest; + Quest const* qInfo = sObjectMgr.GetQuestTemplate(quest); + if (qInfo) + { + for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) { - p.rpos(0); // reset reader - bot->GetSession()->HandleQuestgiverAcceptQuestOpcode(p); - bot->GetPlayerbotAI()->TellMaster("Got the quest."); + Player* const bot = it->second; + + if (bot->GetQuestStatus(quest) == QUEST_STATUS_COMPLETE) + bot->GetPlayerbotAI()->TellMaster("I already completed that quest."); + else if (! bot->CanTakeQuest(qInfo, false)) + { + if (! bot->SatisfyQuestStatus(qInfo, false)) + bot->GetPlayerbotAI()->TellMaster("I already have that quest."); + else + bot->GetPlayerbotAI()->TellMaster("I can't take that quest."); + } + else if (! bot->SatisfyQuestLog(false)) + bot->GetPlayerbotAI()->TellMaster("My quest log is full."); + else if (! bot->CanAddQuest(qInfo, false)) + bot->GetPlayerbotAI()->TellMaster("I can't take that quest because it requires that I take items, but my bags are full!"); + + else + { + p.rpos(0); // reset reader + bot->GetSession()->HandleQuestgiverAcceptQuestOpcode(p); + bot->GetPlayerbotAI()->TellMaster("Got the quest."); + } } - } - } - return; + } + return; } case CMSG_LOOT_ROLL: { - WorldPacket p(packet); //WorldPacket packet for CMSG_LOOT_ROLL, (8+4+1) - uint64 Guid; - uint32 NumberOfPlayers; - uint8 rollType; - p.rpos(0); //reset packet pointer - p >> Guid; //guid of the item rolled - p >> NumberOfPlayers; //number of players invited to roll - p >> rollType; //need,greed or pass on roll + WorldPacket p(packet); //WorldPacket packet for CMSG_LOOT_ROLL, (8+4+1) + uint64 Guid; + uint32 NumberOfPlayers; + uint8 rollType; + p.rpos(0); //reset packet pointer + p >> Guid; //guid of the item rolled + p >> NumberOfPlayers; //number of players invited to roll + p >> rollType; //need,greed or pass on roll - for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) - { + for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) + { - uint32 choice = urand(0,2); //returns 0,1,or 2 + uint32 choice = urand(0,2); //returns 0,1,or 2 - Player* const bot = it->second; - if(!bot) - return; + Player* const bot = it->second; + if(!bot) + return; - Group* group = bot->GetGroup(); - if(!group) - return; + Group* group = bot->GetGroup(); + if(!group) + return; - group->CountRollVote(bot->GetGUID(), Guid, NumberOfPlayers, choice); + group->CountRollVote(bot->GetGUID(), Guid, NumberOfPlayers, choice); - switch (choice) - { - case ROLL_NEED: - bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED, 1); - break; - case ROLL_GREED: - bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED, 1); - break; - } - } - return; + switch (choice) + { + case ROLL_NEED: + bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED, 1); + break; + case ROLL_GREED: + bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED, 1); + break; + } + } + return; } @@ -358,11 +358,11 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) } void PlayerbotMgr::HandleMasterOutgoingPacket(const WorldPacket& packet) { - /** + /* switch (packet.GetOpcode()) { // maybe our bots should only start looting after the master loots? - //case SMSG_LOOT_RELEASE_RESPONSE: {} + //case SMSG_LOOT_RELEASE_RESPONSE: {} case SMSG_NAME_QUERY_RESPONSE: case SMSG_MONSTER_MOVE: case SMSG_COMPRESSED_UPDATE_OBJECT: @@ -384,7 +384,7 @@ void PlayerbotMgr::HandleMasterOutgoingPacket(const WorldPacket& packet) sLog.outError(out.str().c_str()); } } - */ + */ } void PlayerbotMgr::LogoutAllBots() @@ -448,7 +448,7 @@ void PlayerbotMgr::OnBotLogin(Player * const bot) // sometimes master can lose leadership, pass leadership to master check const uint64 masterGuid = m_master->GetGUID(); - if (m_master->GetGroup() && + if (m_master->GetGroup() && ! m_master->GetGroup()->IsLeader(masterGuid)) m_master->GetGroup()->ChangeLeader(masterGuid); } @@ -510,7 +510,7 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) } uint32 accountId = sObjectMgr.GetPlayerAccountIdByGUID(guid); - if (accountId != m_session->GetAccountId()) + if (accountId != m_session->GetAccountId()) { PSendSysMessage("|cffff0000You may only add bots from the same account."); SetSentErrorMessage(true); @@ -548,28 +548,28 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) if(charlvl > sConfig.GetIntDefault("PlayerbotAI.RestrictBotLevel", 80)) { PSendSysMessage("|cffff0000You cannot summon |cffffffff[%s]|cffff0000, it's level is too high.",fields[1].GetString()); - SetSentErrorMessage(true); + SetSentErrorMessage(true); delete resultlvl; - return false; + return false; } } delete resultlvl; if (cmdStr == "add" || cmdStr == "login") { - if (mgr->GetPlayerBot(guid)) + if (mgr->GetPlayerBot(guid)) { PSendSysMessage("Bot already exists in world."); SetSentErrorMessage(true); return false; } CharacterDatabase.DirectPExecute("UPDATE characters SET online = 1 WHERE guid = '%u'", guid); - mgr->AddPlayerBot(guid); + mgr->AddPlayerBot(guid); PSendSysMessage("Bot added successfully."); } else if (cmdStr == "remove" || cmdStr == "logout") { - if (! mgr->GetPlayerBot(guid)) + if (! mgr->GetPlayerBot(guid)) { PSendSysMessage("|cffff0000Bot can not be removed because bot does not exist in world."); SetSentErrorMessage(true); @@ -583,25 +583,25 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) { Unit *target = 0; char *orderChar = strtok( NULL, " " ); - if(!orderChar) + if(!orderChar) { PSendSysMessage("|cffff0000Syntax error:|cffffffff .bot co [targetPlayer]"); SetSentErrorMessage(true); return false; } std::string orderStr = orderChar; - if(orderStr == "protect" || orderStr == "assist") + if(orderStr == "protect" || orderStr == "assist") { char *targetChar = strtok( NULL, " " ); uint64 targetGUID = m_session->GetPlayer()->GetSelection(); - if(!targetChar && !targetGUID) + if(!targetChar && !targetGUID) { PSendSysMessage("|cffff0000Combat orders protect and assist expect a target either by selection or by giving target player in command string!"); SetSentErrorMessage(true); return false; } std::string targetStr = targetChar; - if(targetChar) + if(targetChar) { targetGUID = sObjectMgr.GetPlayerGUIDByName( targetStr.c_str() ); } @@ -613,7 +613,7 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) return false; } } - if (mgr->GetPlayerBot(guid) == NULL) + if (mgr->GetPlayerBot(guid) == NULL) { PSendSysMessage("|cffff0000Bot can not receive combat order because bot does not exist in world."); SetSentErrorMessage(true); diff --git a/src/game/PlayerbotPaladinAI.cpp b/src/game/PlayerbotPaladinAI.cpp index fd9047a35..399ecce3d 100644 --- a/src/game/PlayerbotPaladinAI.cpp +++ b/src/game/PlayerbotPaladinAI.cpp @@ -110,16 +110,16 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) // damage spells ai->SetInFront( pTarget ); Player *m_bot = GetPlayerBot(); - Group *m_group = m_bot->GetGroup(); - float dist = m_bot->GetDistance( pTarget ); - std::ostringstream out; + Group *m_group = m_bot->GetGroup(); + float dist = m_bot->GetDistance( pTarget ); + std::ostringstream out; //Shield master if low hp. uint32 masterHP = GetMaster()->GetHealth()*100 / GetMaster()->GetMaxHealth(); if (GetMaster()->isAlive()) if (masterHP < 25 && HAND_OF_PROTECTION > 0 && !GetMaster()->HasAura(FORBEARANCE, EFFECT_INDEX_0) && !GetMaster()->HasAura(HAND_OF_PROTECTION, EFFECT_INDEX_0) && !GetMaster()->HasAura(DIVINE_PROTECTION, EFFECT_INDEX_0) && !GetMaster()->HasAura(DIVINE_SHIELD, EFFECT_INDEX_0)) - ai->CastSpell(HAND_OF_PROTECTION, *GetMaster()); + ai->CastSpell(HAND_OF_PROTECTION, *GetMaster()); // heal group inside combat, but do not heal if tank if( m_group && pVictim != m_bot ) // possible tank @@ -284,13 +284,13 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) if (ai->GetHealthPercent() <= 40) { HealTarget (*m_bot, ai->GetHealthPercent()); - out << " ...healing bot"; + out << " ...healing bot"; break; } if (masterHP <= 40) { HealTarget (*GetMaster(), masterHP); - out << " ...healing master"; + out << " ...healing master"; break; } else @@ -300,7 +300,7 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) break; } } - if( ai->GetManager()->m_confDebugWhisper ) + if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( out.str().c_str() ); if (AVENGING_WRATH > 0 && !m_bot->HasAura(AVENGING_WRATH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) @@ -309,13 +309,13 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) if (DIVINE_SHIELD > 0 && ai->GetHealthPercent() < 30 && pVictim == m_bot && !m_bot->HasAura(FORBEARANCE, EFFECT_INDEX_0) && !m_bot->HasAura(DIVINE_SHIELD, EFFECT_INDEX_0) && ai->GetManaPercent() >= 3) ai->CastSpell(DIVINE_SHIELD, *m_bot); - if (DIVINE_SACRIFICE > 0 && ai->GetHealthPercent() > 50 && pVictim != m_bot && !m_bot->HasAura(DIVINE_SACRIFICE, EFFECT_INDEX_0)) + if (DIVINE_SACRIFICE > 0 && ai->GetHealthPercent() > 50 && pVictim != m_bot && !m_bot->HasAura(DIVINE_SACRIFICE, EFFECT_INDEX_0)) ai->CastSpell(DIVINE_SACRIFICE, *m_bot); } void PlayerbotPaladinAI::DoNonCombatActions() { - PlayerbotAI* ai = GetAI(); + PlayerbotAI* ai = GetAI(); Player * m_bot = GetPlayerBot(); if (!m_bot) return; @@ -326,7 +326,7 @@ void PlayerbotPaladinAI::DoNonCombatActions() else if (BLESSING_OF_MIGHT > 0 && !m_bot->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0) && !m_bot->HasAura(BLESSING_OF_MIGHT, EFFECT_INDEX_0)) ai->CastSpell (BLESSING_OF_MIGHT, *m_bot); - if (DIVINE_FAVOR > 0 && !m_bot->HasAura(DIVINE_FAVOR, EFFECT_INDEX_0) && ai->GetManaPercent() >= 3) + if (DIVINE_FAVOR > 0 && !m_bot->HasAura(DIVINE_FAVOR, EFFECT_INDEX_0) && ai->GetManaPercent() >= 3) ai->CastSpell(DIVINE_FAVOR , *m_bot); /* if (SEAL_OF_COMMAND > 0) diff --git a/src/game/PlayerbotPaladinAI.h b/src/game/PlayerbotPaladinAI.h index f89aa9625..74a3a88a5 100644 --- a/src/game/PlayerbotPaladinAI.h +++ b/src/game/PlayerbotPaladinAI.h @@ -27,7 +27,7 @@ class MANGOS_DLL_SPEC PlayerbotPaladinAI : PlayerbotClassAI void BuffPlayer(Player *target); private: - // Heals the target based off its hps + // Heals the target based off its hps void HealTarget (Unit& target, uint8 hp); // Retribution diff --git a/src/game/PlayerbotPriestAI.cpp b/src/game/PlayerbotPriestAI.cpp index 6ed1a9383..f66732cd5 100644 --- a/src/game/PlayerbotPriestAI.cpp +++ b/src/game/PlayerbotPriestAI.cpp @@ -13,7 +13,7 @@ PlayerbotPriestAI::PlayerbotPriestAI(Player* const master, Player* const bot, Pl else if((HEAL = ai->getSpellId ("greater heal"))==0 && (HEAL = ai->getSpellId ("heal"))==0) HEAL = ai->getSpellId("lesser heal"); - GREAT_HEAL = ai->getSpellId("great heal"); + GREAT_HEAL = ai->getSpellId("great heal"); FLASH_HEAL = ai->getSpellId("flash heal"); REZZ = ai->getSpellId("resurrection"); SMITE = ai->getSpellId("smite"); @@ -38,7 +38,7 @@ PlayerbotPriestAI::PlayerbotPriestAI(Player* const master, Player* const bot, Pl SHADOWFIEND = ai->getSpellId("shadowfiend"); MIND_SEAR = ai->getSpellId("mind sear"); //DISCIPLINE - PENANCE = ai->getSpellId("penance"); + PENANCE = ai->getSpellId("penance"); INNER_FIRE = ai->getSpellId("inner fire"); PWS = ai->getSpellId("power word: shield"); if((FORTITUDE = ai->getSpellId ("prayer of fortitude"))==1) @@ -54,19 +54,19 @@ PlayerbotPriestAI::PlayerbotPriestAI(Player* const master, Player* const bot, Pl MASS_DISPEL = ai->getSpellId("mass dispel"); POWER_INFUSION = ai->getSpellId("power infusion"); - DIVINE_SPIRIT = ai->getSpellId("divine spirit"); - INNER_FOCUS = ai->getSpellId("inner focus"); - - RECENTLY_BANDAGED = 11196; // first aid check - - // racial - ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf - GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei - STONEFORM = ai->getSpellId("stoneform"); // dwarf - EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human - SHADOWMELD = ai->getSpellId("shadowmeld"); // night elf - BERSERKING = ai->getSpellId("berserking"); // troll - WILL_OF_THE_FORSAKEN = ai->getSpellId("will of the forsaken"); // undead + DIVINE_SPIRIT = ai->getSpellId("divine spirit"); + INNER_FOCUS = ai->getSpellId("inner focus"); + + RECENTLY_BANDAGED = 11196; // first aid check + + // racial + ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf + GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei + STONEFORM = ai->getSpellId("stoneform"); // dwarf + EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human + SHADOWMELD = ai->getSpellId("shadowmeld"); // night elf + BERSERKING = ai->getSpellId("berserking"); // troll + WILL_OF_THE_FORSAKEN = ai->getSpellId("will of the forsaken"); // undead } PlayerbotPriestAI::~PlayerbotPriestAI() {} @@ -77,7 +77,7 @@ void PlayerbotPriestAI::HealTarget(Unit &target, uint8 hp) // return ((hp < 80 && !target.HasAura(RENEW, EFFECT_INDEX_0) && ai->CastSpell(RENEW, target)) || // (hp < 60 && ai->CastSpell(HEAL, target)) || -// (hp < 30 && ai->CastSpell(FLASH_HEAL, target)) ) ; +// (hp < 30 && ai->CastSpell(FLASH_HEAL, target)) ); if (hp < 25 && FLASH_HEAL > 0 && ai->GetManaPercent() >= 20) { @@ -119,7 +119,7 @@ void PlayerbotPriestAI::HealTarget(Unit &target, uint8 hp) void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) { - Unit* pVictim = pTarget->getVictim(); + Unit* pVictim = pTarget->getVictim(); PlayerbotAI* ai = GetAI(); if (!ai) return; @@ -139,7 +139,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) // ------- Non Duel combat ---------- - ai->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, GetMaster() ); // dont want to melee mob + ai->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, GetMaster() ); // dont want to melee mob Player *m_bot = GetPlayerBot(); Group *m_group = m_bot->GetGroup(); @@ -207,7 +207,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) { //ai->TellMaster("I'm casting mana burn."); ai->CastSpell(MANA_BURN, *pTarget); - ai->SetIgnoreUpdateTime(3); + ai->SetIgnoreUpdateTime(3); SpellSequence = SPELL_SHADOWMAGIC; LastSpellHoly = LastSpellHoly +1; break; @@ -276,7 +276,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) { //ai->TellMaster("I'm casting mind flay."); ai->CastSpell(MIND_FLAY, *pTarget); - ai->SetIgnoreUpdateTime(3); + ai->SetIgnoreUpdateTime(3); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; @@ -288,7 +288,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) LastSpellShadowMagic = LastSpellShadowMagic +1; break; } - else if (SHADOW_PROTECTION > 0 && LastSpellShadowMagic <6 && ai->GetManaPercent() >= 60) + else if (SHADOW_PROTECTION > 0 && LastSpellShadowMagic <6 && ai->GetManaPercent() >= 60) { ai->CastSpell(SHADOW_PROTECTION, *pTarget); SpellSequence = SPELL_DISCIPLINE; @@ -312,7 +312,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) else if (MIND_SEAR > 0 && LastSpellShadowMagic <9 && ai->GetAttackerCount()>=3 && ai->GetManaPercent() >= 28) { ai->CastSpell(MIND_SEAR, *pTarget); - ai->SetIgnoreUpdateTime(5); + ai->SetIgnoreUpdateTime(5); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; @@ -352,7 +352,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) LastSpellDiscipline = LastSpellDiscipline + 1; break; } - else if (INNER_FOCUS > 0 && !m_bot->HasAura(INNER_FOCUS, EFFECT_INDEX_0) && LastSpellDiscipline <4) + else if (INNER_FOCUS > 0 && !m_bot->HasAura(INNER_FOCUS, EFFECT_INDEX_0) && LastSpellDiscipline <4) { //ai->TellMaster("I'm casting inner focus"); ai->CastSpell(INNER_FOCUS, *m_bot); @@ -384,7 +384,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) void PlayerbotPriestAI::DoNonCombatActions() { - PlayerbotAI* ai = GetAI(); + PlayerbotAI* ai = GetAI(); Player * m_bot = GetPlayerBot(); if (!m_bot) return; @@ -398,16 +398,16 @@ void PlayerbotPriestAI::DoNonCombatActions() if (INNER_FIRE > 0) (!m_bot->HasAura(INNER_FIRE, EFFECT_INDEX_0) && ai->CastSpell (INNER_FIRE, *m_bot)); - // buff master - if (FORTITUDE > 0) - (!GetMaster()->HasAura(FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell(FORTITUDE,*(GetMaster())) ); + // buff master + if (FORTITUDE > 0) + (!GetMaster()->HasAura(FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell(FORTITUDE,*(GetMaster())) ); // mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); Item* pItem = ai->FindDrink(); - Item* fItem = ai->FindBandage(); + Item* fItem = ai->FindBandage(); if (pItem != NULL && ai->GetManaPercent() < 30) { diff --git a/src/game/PlayerbotRogueAI.cpp b/src/game/PlayerbotRogueAI.cpp index 3a1ce22ad..4d7618066 100644 --- a/src/game/PlayerbotRogueAI.cpp +++ b/src/game/PlayerbotRogueAI.cpp @@ -1,4 +1,4 @@ - /* + /* Name : PlayerbotRogueAI.cpp Complete: maybe around 28% Author : Natsukawa @@ -29,13 +29,13 @@ PlayerbotRogueAI::PlayerbotRogueAI(Player* const master, Player* const bot, Play VANISH = ai->getSpellId("vanish"); EVASION = ai->getSpellId("evasion"); CLOAK_OF_SHADOWS = ai->getSpellId("cloak of shadows"); - HEMORRHAGE = ai->getSpellId("hemorrhage"); - GHOSTLY_STRIKE = ai->getSpellId("ghostly strike"); - SHADOW_DANCE = ai->getSpellId("shadow dance"); - BLIND = ai->getSpellId("blind"); - DISTRACT = ai->getSpellId("distract"); - PREPARATION = ai->getSpellId("preparation"); - PREMEDITATION = ai->getSpellId("premeditation"); + HEMORRHAGE = ai->getSpellId("hemorrhage"); + GHOSTLY_STRIKE = ai->getSpellId("ghostly strike"); + SHADOW_DANCE = ai->getSpellId("shadow dance"); + BLIND = ai->getSpellId("blind"); + DISTRACT = ai->getSpellId("distract"); + PREPARATION = ai->getSpellId("preparation"); + PREMEDITATION = ai->getSpellId("premeditation"); EVISCERATE = ai->getSpellId("eviscerate"); //ASSASSINATION KIDNEY_SHOT = ai->getSpellId("kidney shot"); @@ -46,18 +46,18 @@ PlayerbotRogueAI::PlayerbotRogueAI(Player* const master, Player* const bot, Play DISMANTLE = ai->getSpellId("dismantle"); CHEAP_SHOT = ai->getSpellId("cheap shot"); AMBUSH = ai->getSpellId("ambush"); - MUTILATE = ai->getSpellId("mutilate"); + MUTILATE = ai->getSpellId("mutilate"); - RECENTLY_BANDAGED = 11196; // first aid check - // racial - ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf - STONEFORM = ai->getSpellId("stoneform"); // dwarf - ESCAPE_ARTIST = ai->getSpellId("escape artist"); // gnome - EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human - SHADOWMELD = ai->getSpellId("shadowmeld"); // night elf - BLOOD_FURY = ai->getSpellId("blood fury"); // orc - BERSERKING = ai->getSpellId("berserking"); // troll - WILL_OF_THE_FORSAKEN = ai->getSpellId("will of the forsaken"); // undead + RECENTLY_BANDAGED = 11196; // first aid check + // racial + ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf + STONEFORM = ai->getSpellId("stoneform"); // dwarf + ESCAPE_ARTIST = ai->getSpellId("escape artist"); // gnome + EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human + SHADOWMELD = ai->getSpellId("shadowmeld"); // night elf + BLOOD_FURY = ai->getSpellId("blood fury"); // orc + BERSERKING = ai->getSpellId("berserking"); // troll + WILL_OF_THE_FORSAKEN = ai->getSpellId("will of the forsaken"); // undead } PlayerbotRogueAI::~PlayerbotRogueAI() {} @@ -69,11 +69,11 @@ bool PlayerbotRogueAI::DoFirstCombatManeuver(Unit *pTarget) if( STEALTH>0 && !m_bot->HasAura( STEALTH ) && ai->CastSpell(STEALTH, *m_bot) ) { - if( ai->GetManager()->m_confDebugWhisper ) + if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "First > Stealth (%d)", STEALTH ); return false; - } - + } + return false; } @@ -149,32 +149,32 @@ void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) { case RogueStealth: out << "Case Stealth"; - if( PREMEDITATION>0 && ai->CastSpell(PREMEDITATION,*pTarget) ) + if( PREMEDITATION>0 && ai->CastSpell(PREMEDITATION,*pTarget) ) out << " > Premeditation"; else if( AMBUSH>0 && ai->GetEnergyAmount()>=60 && ai->CastSpell(AMBUSH,*pTarget) ) out << " > Ambush"; else if( CHEAP_SHOT>0 && !pTarget->HasAura(CHEAP_SHOT, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=60 && ai->CastSpell(CHEAP_SHOT,*pTarget) ) out << " > Cheap Shot"; - else if( GARROTE>0 && ai->GetEnergyAmount()>=50 && ai->CastSpell(GARROTE,*pTarget) ) + else if( GARROTE>0 && ai->GetEnergyAmount()>=50 && ai->CastSpell(GARROTE,*pTarget) ) out << " > Garrote"; else out << " NONE!"; break; case RogueThreat: out << "Case Threat"; - if( GOUGE>0 && ai->GetEnergyAmount()>=45 && !pTarget->HasAura(GOUGE, EFFECT_INDEX_0) && ai->CastSpell(GOUGE,*pTarget) ) + if( GOUGE>0 && ai->GetEnergyAmount()>=45 && !pTarget->HasAura(GOUGE, EFFECT_INDEX_0) && ai->CastSpell(GOUGE,*pTarget) ) out << " > Gouge"; else if( EVASION>0 && ai->GetHealthPercent()<=35 && !m_bot->HasAura(EVASION, EFFECT_INDEX_0) && ai->CastSpell(EVASION) ) out << " > Evasion"; - else if( BLIND>0 && ai->GetHealthPercent()<=30 && !pTarget->HasAura(BLIND, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=30 && ai->CastSpell(BLIND,*pTarget) ) + else if( BLIND>0 && ai->GetHealthPercent()<=30 && !pTarget->HasAura(BLIND, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=30 && ai->CastSpell(BLIND,*pTarget) ) out << " > Blind"; - else if( FEINT>0 && ai->GetHealthPercent()<=25 && ai->GetEnergyAmount()>=20 && ai->CastSpell(FEINT) ) + else if( FEINT>0 && ai->GetHealthPercent()<=25 && ai->GetEnergyAmount()>=20 && ai->CastSpell(FEINT) ) out << " > Feint"; - else if( VANISH>0 && ai->GetHealthPercent()<=20 && !m_bot->HasAura(FEINT, EFFECT_INDEX_0) && ai->CastSpell(VANISH) ) + else if( VANISH>0 && ai->GetHealthPercent()<=20 && !m_bot->HasAura(FEINT, EFFECT_INDEX_0) && ai->CastSpell(VANISH) ) out << " > Vanish"; - else if( PREPARATION>0 && ai->CastSpell(PREPARATION) ) + else if( PREPARATION>0 && ai->CastSpell(PREPARATION) ) out << " > Preparation"; - else if( m_bot->getRace() == RACE_NIGHTELF && ai->GetHealthPercent()<=15 && !m_bot->HasAura( SHADOWMELD, EFFECT_INDEX_0) && ai->CastSpell( SHADOWMELD, *m_bot ) ) + else if( m_bot->getRace() == RACE_NIGHTELF && ai->GetHealthPercent()<=15 && !m_bot->HasAura( SHADOWMELD, EFFECT_INDEX_0) && ai->CastSpell( SHADOWMELD, *m_bot ) ) out << " > Shadowmeld"; else out << " NONE!"; @@ -193,43 +193,43 @@ void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) out << "Case Combat"; if( m_bot->GetComboPoints()<=4 ) { - if( SHADOW_DANCE>0 && !m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && ai->CastSpell(SHADOW_DANCE,*m_bot) ) + if( SHADOW_DANCE>0 && !m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && ai->CastSpell(SHADOW_DANCE,*m_bot) ) out << " > Shadow Dance"; - else if( CHEAP_SHOT>0 && m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && !pTarget->HasAura(CHEAP_SHOT, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=60 && ai->CastSpell(CHEAP_SHOT,*pTarget) ) + else if( CHEAP_SHOT>0 && m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && !pTarget->HasAura(CHEAP_SHOT, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=60 && ai->CastSpell(CHEAP_SHOT,*pTarget) ) out << " > Cheap Shot"; - else if( AMBUSH>0 && m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=60 && ai->CastSpell(AMBUSH,*pTarget) ) + else if( AMBUSH>0 && m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=60 && ai->CastSpell(AMBUSH,*pTarget) ) out << " > Ambush"; - else if( GARROTE>0 && m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=50 && ai->CastSpell(GARROTE,*pTarget) ) + else if( GARROTE>0 && m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=50 && ai->CastSpell(GARROTE,*pTarget) ) out << " > Garrote"; - else if( BACKSTAB>0 && pTarget->isInBackInMap(m_bot,1) && ai->GetEnergyAmount()>=60 && ai->CastSpell(BACKSTAB,*pTarget) ) + else if( BACKSTAB>0 && pTarget->isInBackInMap(m_bot,1) && ai->GetEnergyAmount()>=60 && ai->CastSpell(BACKSTAB,*pTarget) ) out << " > Backstab"; - else if( MUTILATE>0 && ai->GetEnergyAmount()>=60 && ai->CastSpell(MUTILATE,*pTarget) ) + else if( MUTILATE>0 && ai->GetEnergyAmount()>=60 && ai->CastSpell(MUTILATE,*pTarget) ) out << " > Mutilate"; - else if( SINISTER_STRIKE>0 && ai->GetEnergyAmount()>=45 && ai->CastSpell(SINISTER_STRIKE,*pTarget) ) + else if( SINISTER_STRIKE>0 && ai->GetEnergyAmount()>=45 && ai->CastSpell(SINISTER_STRIKE,*pTarget) ) out << " > Sinister Strike"; - else if( GHOSTLY_STRIKE>0 && ai->GetEnergyAmount()>=40 && ai->CastSpell(GHOSTLY_STRIKE,*pTarget) ) + else if( GHOSTLY_STRIKE>0 && ai->GetEnergyAmount()>=40 && ai->CastSpell(GHOSTLY_STRIKE,*pTarget) ) out << " > Ghostly Strike"; - else if( HEMORRHAGE>0 && ai->GetEnergyAmount()>=35 && ai->CastSpell(HEMORRHAGE,*pTarget) ) + else if( HEMORRHAGE>0 && ai->GetEnergyAmount()>=35 && ai->CastSpell(HEMORRHAGE,*pTarget) ) out << " > Hemorrhage"; - else if( DISMANTLE>0 && !pTarget->HasFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISARMED) && ai->GetEnergyAmount()>=25 && ai->CastSpell(DISMANTLE,*pTarget) ) + else if( DISMANTLE>0 && !pTarget->HasFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISARMED) && ai->GetEnergyAmount()>=25 && ai->CastSpell(DISMANTLE,*pTarget) ) out << " > Dismantle"; - else if( SHADOWSTEP>0 && ai->GetEnergyAmount()>=10 && ai->CastSpell(SHADOWSTEP,*pTarget) ) + else if( SHADOWSTEP>0 && ai->GetEnergyAmount()>=10 && ai->CastSpell(SHADOWSTEP,*pTarget) ) out << " > Shadowstep"; - else if( m_bot->getRace() == RACE_BLOODELF && !pTarget->HasAura( ARCANE_TORRENT, EFFECT_INDEX_0) && ai->CastSpell( ARCANE_TORRENT,*pTarget ) ) + else if( m_bot->getRace() == RACE_BLOODELF && !pTarget->HasAura( ARCANE_TORRENT, EFFECT_INDEX_0) && ai->CastSpell( ARCANE_TORRENT,*pTarget ) ) out << " > Arcane Torrent"; - else if( m_bot->getRace() == RACE_HUMAN && m_bot->hasUnitState( UNIT_STAT_STUNNED ) || m_bot->HasAuraType( SPELL_AURA_MOD_FEAR ) || m_bot->HasAuraType( SPELL_AURA_MOD_DECREASE_SPEED ) || m_bot->HasAuraType( SPELL_AURA_MOD_CHARM ) && ai->CastSpell( EVERY_MAN_FOR_HIMSELF, *m_bot ) ) - out << " > Every Man for Himself"; - else if( m_bot->getRace() == RACE_UNDEAD_PLAYER && m_bot->HasAuraType( SPELL_AURA_MOD_FEAR ) || m_bot->HasAuraType( SPELL_AURA_MOD_CHARM ) && ai->CastSpell( WILL_OF_THE_FORSAKEN, *m_bot ) ) + else if( m_bot->getRace() == RACE_HUMAN && m_bot->hasUnitState( UNIT_STAT_STUNNED ) || m_bot->HasAuraType( SPELL_AURA_MOD_FEAR ) || m_bot->HasAuraType( SPELL_AURA_MOD_DECREASE_SPEED ) || m_bot->HasAuraType( SPELL_AURA_MOD_CHARM ) && ai->CastSpell( EVERY_MAN_FOR_HIMSELF, *m_bot ) ) + out << " > Every Man for Himself"; + else if( m_bot->getRace() == RACE_UNDEAD_PLAYER && m_bot->HasAuraType( SPELL_AURA_MOD_FEAR ) || m_bot->HasAuraType( SPELL_AURA_MOD_CHARM ) && ai->CastSpell( WILL_OF_THE_FORSAKEN, *m_bot ) ) out << " > Will of the Forsaken"; - else if( m_bot->getRace() == RACE_DWARF && m_bot->HasAuraState( AURA_STATE_DEADLY_POISON ) && ai->CastSpell( STONEFORM, *m_bot ) ) + else if( m_bot->getRace() == RACE_DWARF && m_bot->HasAuraState( AURA_STATE_DEADLY_POISON ) && ai->CastSpell( STONEFORM, *m_bot ) ) out << " > Stoneform"; - else if( m_bot->getRace() == RACE_GNOME && m_bot->hasUnitState( UNIT_STAT_STUNNED ) || m_bot->HasAuraType( SPELL_AURA_MOD_DECREASE_SPEED ) && ai->CastSpell( ESCAPE_ARTIST, *m_bot ) ) + else if( m_bot->getRace() == RACE_GNOME && m_bot->hasUnitState( UNIT_STAT_STUNNED ) || m_bot->HasAuraType( SPELL_AURA_MOD_DECREASE_SPEED ) && ai->CastSpell( ESCAPE_ARTIST, *m_bot ) ) out << " > Escape Artist"; - else if( m_bot->getRace() == RACE_ORC && !m_bot->HasAura( BLOOD_FURY, EFFECT_INDEX_0) && ai->CastSpell( BLOOD_FURY, *m_bot ) ) + else if( m_bot->getRace() == RACE_ORC && !m_bot->HasAura( BLOOD_FURY, EFFECT_INDEX_0) && ai->CastSpell( BLOOD_FURY, *m_bot ) ) out << " > Blood Fury"; - else if( m_bot->getRace() == RACE_TROLL && !m_bot->HasAura( BERSERKING, EFFECT_INDEX_0) && ai->CastSpell( BERSERKING, *m_bot ) ) + else if( m_bot->getRace() == RACE_TROLL && !m_bot->HasAura( BERSERKING, EFFECT_INDEX_0) && ai->CastSpell( BERSERKING, *m_bot ) ) out << " > Berserking"; - else + else out << " NONE!"; } else diff --git a/src/game/PlayerbotShamanAI.cpp b/src/game/PlayerbotShamanAI.cpp index ee86fa506..52b7dcd08 100644 --- a/src/game/PlayerbotShamanAI.cpp +++ b/src/game/PlayerbotShamanAI.cpp @@ -59,13 +59,13 @@ PlayerbotShamanAI::PlayerbotShamanAI(Player* const master, Player* const bot, Pl TOTEM_OF_WRATH = ai->getSpellId("totem of wrath"); FIRE_ELEMENTAL_TOTEM = ai->getSpellId("fire elemental totem"); - RECENTLY_BANDAGED = 11196; // first aid check + RECENTLY_BANDAGED = 11196; // first aid check - // racial - GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei - BLOOD_FURY = ai->getSpellId("blood fury"); // orc - WAR_STOMP = ai->getSpellId("war stomp"); // tauren - BERSERKING = ai->getSpellId("berserking"); // troll + // racial + GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei + BLOOD_FURY = ai->getSpellId("blood fury"); // orc + WAR_STOMP = ai->getSpellId("war stomp"); // tauren + BERSERKING = ai->getSpellId("berserking"); // troll } PlayerbotShamanAI::~PlayerbotShamanAI() {} @@ -73,13 +73,13 @@ PlayerbotShamanAI::~PlayerbotShamanAI() {} void PlayerbotShamanAI::HealTarget(Unit &target, uint8 hp) { PlayerbotAI* ai = GetAI(); - Player *m_bot = GetPlayerBot(); + Player *m_bot = GetPlayerBot(); if (hp < 30 && HEALING_WAVE > 0 && ai->GetManaPercent() >= 32) ai->CastSpell(HEALING_WAVE, target); - else if (hp < 45 && LESSER_HEALING_WAVE > 0 && ai->GetManaPercent() >= 19) + else if (hp < 45 && LESSER_HEALING_WAVE > 0 && ai->GetManaPercent() >= 19) ai->CastSpell(LESSER_HEALING_WAVE, target); - else if (hp < 55 && RIPTIDE > 0 && !target.HasAura(RIPTIDE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 21) + else if (hp < 55 && RIPTIDE > 0 && !target.HasAura(RIPTIDE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 21) ai->CastSpell(RIPTIDE, target); else if (hp < 70 && CHAIN_HEAL > 0 && ai->GetManaPercent() >= 24) ai->CastSpell(CHAIN_HEAL, target); @@ -262,7 +262,7 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) LastSpellEnhancement = LastSpellEnhancement +1; break; } - else if (SHAMANISTIC_RAGE > 0 && (!m_bot->HasAura(SHAMANISTIC_RAGE, EFFECT_INDEX_0)) && LastSpellEnhancement == 11) + else if (SHAMANISTIC_RAGE > 0 && (!m_bot->HasAura(SHAMANISTIC_RAGE, EFFECT_INDEX_0)) && LastSpellEnhancement == 11) { ai->CastSpell(SHAMANISTIC_RAGE, *m_bot); SpellSequence = SPELL_RESTORATION; @@ -280,7 +280,7 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) //break; case SPELL_RESTORATION: - if (HEALING_STREAM_TOTEM > 0 && LastSpellRestoration < 3 && ai->GetHealthPercent() < 50 && (!m_bot->HasAura(HEALING_STREAM_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(MANA_SPRING_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 4) + if (HEALING_STREAM_TOTEM > 0 && LastSpellRestoration < 3 && ai->GetHealthPercent() < 50 && (!m_bot->HasAura(HEALING_STREAM_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(MANA_SPRING_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 4) { ai->CastSpell(HEALING_STREAM_TOTEM); SpellSequence = SPELL_ELEMENTAL; @@ -301,7 +301,7 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) LastSpellRestoration = LastSpellRestoration +1; break; } - /*else if (TREMOR_TOTEM > 0 && LastSpellRestoration < 6 && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 2) + /*else if (TREMOR_TOTEM > 0 && LastSpellRestoration < 6 && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 2) { ai->CastSpell(TREMOR_TOTEM); SpellSequence = SPELL_ELEMENTAL; @@ -326,35 +326,35 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) LastSpellElemental = LastSpellElemental + 1; break; } - else if (SEARING_TOTEM > 0 && LastSpellElemental == 2 && (!pTarget->HasAura(SEARING_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(TOTEM_OF_WRATH, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 9) + else if (SEARING_TOTEM > 0 && LastSpellElemental == 2 && (!pTarget->HasAura(SEARING_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(TOTEM_OF_WRATH, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 9) { ai->CastSpell(SEARING_TOTEM); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } - else if (STONECLAW_TOTEM > 0 && ai->GetHealthPercent() < 51 && LastSpellElemental == 3 && (!pTarget->HasAura(STONECLAW_TOTEM, EFFECT_INDEX_0)) && (!pTarget->HasAura(EARTHBIND_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 8) + else if (STONECLAW_TOTEM > 0 && ai->GetHealthPercent() < 51 && LastSpellElemental == 3 && (!pTarget->HasAura(STONECLAW_TOTEM, EFFECT_INDEX_0)) && (!pTarget->HasAura(EARTHBIND_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 8) { ai->CastSpell(STONECLAW_TOTEM); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } - else if (FLAME_SHOCK > 0 && LastSpellElemental == 4 && (!pTarget->HasAura(FLAME_SHOCK, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 22) + else if (FLAME_SHOCK > 0 && LastSpellElemental == 4 && (!pTarget->HasAura(FLAME_SHOCK, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 22) { ai->CastSpell(FLAME_SHOCK, *pTarget); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } - else if (LAVA_BURST > 0 && LastSpellElemental == 5 && (pTarget->HasAura(FLAME_SHOCK, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 10) + else if (LAVA_BURST > 0 && LastSpellElemental == 5 && (pTarget->HasAura(FLAME_SHOCK, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 10) { ai->CastSpell(LAVA_BURST, *pTarget); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; } - else if (MAGMA_TOTEM > 0 && LastSpellElemental == 6 && (!m_bot->HasAura(TOTEM_OF_WRATH, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 35) + else if (MAGMA_TOTEM > 0 && LastSpellElemental == 6 && (!m_bot->HasAura(TOTEM_OF_WRATH, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 35) { ai->CastSpell(MAGMA_TOTEM); SpellSequence = SPELL_ENHANCEMENT; @@ -389,7 +389,7 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) LastSpellElemental = LastSpellElemental + 1; break; } - else if (FIRE_NOVA_TOTEM > 0 && LastSpellElemental == 11 && ai->GetManaPercent() >= 33) + else if (FIRE_NOVA_TOTEM > 0 && LastSpellElemental == 11 && ai->GetManaPercent() >= 33) { ai->CastSpell(FIRE_NOVA_TOTEM); SpellSequence = SPELL_ENHANCEMENT; @@ -424,7 +424,7 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) LastSpellElemental = LastSpellElemental + 1; break; } - /*else if (HEX > 0 && LastSpellElemental == 16 && (!pTarget->HasAura(HEX, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 3) + /*else if (HEX > 0 && LastSpellElemental == 16 && (!pTarget->HasAura(HEX, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 3) { ai->CastSpell(HEX); SpellSequence = SPELL_ENHANCEMENT; @@ -460,28 +460,28 @@ void PlayerbotShamanAI::DoNonCombatActions() // buff myself with WATER_SHIELD, LIGHTNING_SHIELD if (WATER_SHIELD > 0) - (!m_bot->HasAura(WATER_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(LIGHTNING_SHIELD, EFFECT_INDEX_0) && ai->CastSpell(WATER_SHIELD,*m_bot) ); - else if (LIGHTNING_SHIELD > 0) - (!m_bot->HasAura(LIGHTNING_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(WATER_SHIELD, EFFECT_INDEX_0) && ai->CastSpell(LIGHTNING_SHIELD,*m_bot) ); + (!m_bot->HasAura(WATER_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(LIGHTNING_SHIELD, EFFECT_INDEX_0) && ai->CastSpell(WATER_SHIELD,*m_bot) ); + else if (LIGHTNING_SHIELD > 0) + (!m_bot->HasAura(LIGHTNING_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(WATER_SHIELD, EFFECT_INDEX_0) && ai->CastSpell(LIGHTNING_SHIELD,*m_bot) ); /* - // buff myself weapon - if (ROCKBITER_WEAPON > 0) - (!m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && ai->CastSpell(ROCKBITER_WEAPON,*m_bot) ); - else if (EARTHLIVING_WEAPON > 0) - (!m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && ai->CastSpell(WINDFURY_WEAPON,*m_bot) ); - else if (WINDFURY_WEAPON > 0) - (!m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && ai->CastSpell(WINDFURY_WEAPON,*m_bot) ); - else if (FLAMETONGUE_WEAPON > 0) - (!m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && ai->CastSpell(FLAMETONGUE_WEAPON,*m_bot) ); - else if (FROSTBRAND_WEAPON > 0) - (!m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && ai->CastSpell(FROSTBRAND_WEAPON,*m_bot) ); + // buff myself weapon + if (ROCKBITER_WEAPON > 0) + (!m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && ai->CastSpell(ROCKBITER_WEAPON,*m_bot) ); + else if (EARTHLIVING_WEAPON > 0) + (!m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && ai->CastSpell(WINDFURY_WEAPON,*m_bot) ); + else if (WINDFURY_WEAPON > 0) + (!m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && ai->CastSpell(WINDFURY_WEAPON,*m_bot) ); + else if (FLAMETONGUE_WEAPON > 0) + (!m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && ai->CastSpell(FLAMETONGUE_WEAPON,*m_bot) ); + else if (FROSTBRAND_WEAPON > 0) + (!m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && ai->CastSpell(FROSTBRAND_WEAPON,*m_bot) ); */ // mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); Item* pItem = ai->FindDrink(); - Item* fItem = ai->FindBandage(); + Item* fItem = ai->FindBandage(); if (pItem != NULL && ai->GetManaPercent() < 30) { diff --git a/src/game/PlayerbotWarlockAI.cpp b/src/game/PlayerbotWarlockAI.cpp index d3901acfa..31d53e723 100644 --- a/src/game/PlayerbotWarlockAI.cpp +++ b/src/game/PlayerbotWarlockAI.cpp @@ -4,7 +4,7 @@ class PlayerbotAI; PlayerbotWarlockAI::PlayerbotWarlockAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) { - // DESTRUCTION + // DESTRUCTION SHADOW_BOLT = ai->getSpellId("shadow bolt"); IMMOLATE = ai->getSpellId("immolate"); INCINERATE = ai->getSpellId("incinerate"); @@ -17,14 +17,14 @@ PlayerbotWarlockAI::PlayerbotWarlockAI(Player* const master, Player* const bot, RAIN_OF_FIRE = ai->getSpellId("rain of fire"); SOUL_FIRE = ai->getSpellId("soul fire"); // soul shard spells SHADOWBURN = ai->getSpellId("shadowburn"); - // CURSE + // CURSE CURSE_OF_WEAKNESS = ai->getSpellId("curse of weakness"); CURSE_OF_THE_ELEMENTS = ai->getSpellId("curse of the elements"); CURSE_OF_AGONY = ai->getSpellId("curse of agony"); CURSE_OF_EXHAUSTION = ai->getSpellId("curse of exhaustion"); CURSE_OF_TONGUES = ai->getSpellId("curse of tongues"); CURSE_OF_DOOM = ai->getSpellId("curse of doom"); - // AFFLICTION + // AFFLICTION CORRUPTION = ai->getSpellId("corruption"); DRAIN_SOUL = ai->getSpellId("drain soul"); DRAIN_LIFE = ai->getSpellId("drain life"); @@ -37,7 +37,7 @@ PlayerbotWarlockAI::PlayerbotWarlockAI(Player* const master, Player* const bot, DARK_PACT = ai->getSpellId("dark pact"); HOWL_OF_TERROR = ai->getSpellId("howl of terror"); FEAR = ai->getSpellId("fear"); - // DEMONOLOGY + // DEMONOLOGY DEMON_SKIN = ai->getSpellId("demon skin"); DEMON_ARMOR = ai->getSpellId("demon armor"); FEL_ARMOR = ai->getSpellId("fel armor"); @@ -46,27 +46,27 @@ PlayerbotWarlockAI::PlayerbotWarlockAI(Player* const master, Player* const bot, SOUL_LINK = ai->getSpellId("soul link"); HEALTH_FUNNEL = ai->getSpellId("health funnel"); DETECT_INVISIBILITY = ai->getSpellId("detect invisibility"); - // demon summon + // demon summon SUMMON_IMP = ai->getSpellId("summon imp"); SUMMON_VOIDWALKER = ai->getSpellId("summon voidwalker"); SUMMON_SUCCUBUS = ai->getSpellId("summon succubus"); - SUMMON_FELHUNTER = ai->getSpellId("summon felhunter"); + SUMMON_FELHUNTER = ai->getSpellId("summon felhunter"); SUMMON_FELGUARD = ai->getSpellId("summon felguard"); - // demon skills + // demon skills BLOOD_PACT = ai->getSpellId("blood pact"); // imp skill CONSUME_SHADOWS = ai->getSpellId("consume shadows"); // voidwalker skill FEL_INTELLIGENCE = ai->getSpellId("fel intelligence"); // felhunter skill - RECENTLY_BANDAGED = 11196; // first aid check + RECENTLY_BANDAGED = 11196; // first aid check - // racial - ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf - ESCAPE_ARTIST = ai->getSpellId("escape artist"); // gnome - EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human - BLOOD_FURY = ai->getSpellId("blood fury"); // orc - WILL_OF_THE_FORSAKEN = ai->getSpellId("will of the forsaken"); // undead + // racial + ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf + ESCAPE_ARTIST = ai->getSpellId("escape artist"); // gnome + EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human + BLOOD_FURY = ai->getSpellId("blood fury"); // orc + WILL_OF_THE_FORSAKEN = ai->getSpellId("will of the forsaken"); // undead - m_demonSummonFailed = false; + m_demonSummonFailed = false; } PlayerbotWarlockAI::~PlayerbotWarlockAI() {} @@ -91,153 +91,153 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) ai->SetInFront( pTarget ); Player *m_bot = GetPlayerBot(); - Unit* pVictim = pTarget->getVictim(); - Pet *pet = m_bot->GetPet(); + Unit* pVictim = pTarget->getVictim(); + Pet *pet = m_bot->GetPet(); - // Damage Spells + // Damage Spells ai->SetInFront( pTarget ); switch (SpellSequence) { case SPELL_CURSES: - if (CURSE_OF_AGONY > 0 && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && LastSpellCurse < 1 && ai->GetManaPercent() >= 14) - { - ai->CastSpell(CURSE_OF_AGONY, *pTarget); - SpellSequence = SPELL_AFFLICTION; - LastSpellCurse = LastSpellCurse +1; - break; - } - else if (CURSE_OF_THE_ELEMENTS > 0 && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && LastSpellCurse < 2 && ai->GetManaPercent() >= 10) - { - ai->CastSpell(CURSE_OF_THE_ELEMENTS, *pTarget); - SpellSequence = SPELL_AFFLICTION; - LastSpellCurse = LastSpellCurse +1; - break; - } - else if (CURSE_OF_EXHAUSTION > 0 && !pTarget->HasAura(CURSE_OF_EXHAUSTION, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && LastSpellCurse < 3 && ai->GetManaPercent() >= 6) - { - ai->CastSpell(CURSE_OF_EXHAUSTION, *pTarget); - SpellSequence = SPELL_AFFLICTION; - LastSpellCurse = LastSpellCurse +1; - break; - } - else if (CURSE_OF_WEAKNESS > 0 && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_EXHAUSTION, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && LastSpellCurse < 4 && ai->GetManaPercent() >= 14) - { - ai->CastSpell(CURSE_OF_WEAKNESS, *pTarget); - SpellSequence = SPELL_AFFLICTION; - LastSpellCurse = LastSpellCurse +1; - break; - } - else if (CURSE_OF_TONGUES > 0 && !pTarget->HasAura(CURSE_OF_TONGUES, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_EXHAUSTION, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && LastSpellCurse < 5 && ai->GetManaPercent() >= 4) - { - ai->CastSpell(CURSE_OF_TONGUES, *pTarget); - SpellSequence = SPELL_AFFLICTION; - LastSpellCurse = LastSpellCurse +1; - break; - } - LastSpellCurse = 0; - //SpellSequence = SPELL_AFFLICTION; - //break; + if (CURSE_OF_AGONY > 0 && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && LastSpellCurse < 1 && ai->GetManaPercent() >= 14) + { + ai->CastSpell(CURSE_OF_AGONY, *pTarget); + SpellSequence = SPELL_AFFLICTION; + LastSpellCurse = LastSpellCurse +1; + break; + } + else if (CURSE_OF_THE_ELEMENTS > 0 && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && LastSpellCurse < 2 && ai->GetManaPercent() >= 10) + { + ai->CastSpell(CURSE_OF_THE_ELEMENTS, *pTarget); + SpellSequence = SPELL_AFFLICTION; + LastSpellCurse = LastSpellCurse +1; + break; + } + else if (CURSE_OF_EXHAUSTION > 0 && !pTarget->HasAura(CURSE_OF_EXHAUSTION, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && LastSpellCurse < 3 && ai->GetManaPercent() >= 6) + { + ai->CastSpell(CURSE_OF_EXHAUSTION, *pTarget); + SpellSequence = SPELL_AFFLICTION; + LastSpellCurse = LastSpellCurse +1; + break; + } + else if (CURSE_OF_WEAKNESS > 0 && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_EXHAUSTION, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && LastSpellCurse < 4 && ai->GetManaPercent() >= 14) + { + ai->CastSpell(CURSE_OF_WEAKNESS, *pTarget); + SpellSequence = SPELL_AFFLICTION; + LastSpellCurse = LastSpellCurse +1; + break; + } + else if (CURSE_OF_TONGUES > 0 && !pTarget->HasAura(CURSE_OF_TONGUES, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_EXHAUSTION, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && LastSpellCurse < 5 && ai->GetManaPercent() >= 4) + { + ai->CastSpell(CURSE_OF_TONGUES, *pTarget); + SpellSequence = SPELL_AFFLICTION; + LastSpellCurse = LastSpellCurse +1; + break; + } + LastSpellCurse = 0; + //SpellSequence = SPELL_AFFLICTION; + //break; case SPELL_AFFLICTION: - if (LIFE_TAP > 0 && LastSpellAffliction < 1 && ai->GetManaPercent() <= 50) - { - ai->CastSpell(LIFE_TAP, *m_bot); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (CORRUPTION > 0 && !pTarget->HasAura(CORRUPTION, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && LastSpellAffliction < 2 && ai->GetManaPercent() >= 19) - { - ai->CastSpell(CORRUPTION, *pTarget); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (DRAIN_SOUL > 0 && pTarget->GetHealth() < pTarget->GetMaxHealth()*0.40 && !pTarget->HasAura(DRAIN_SOUL, EFFECT_INDEX_0) && LastSpellAffliction < 3 && ai->GetManaPercent() >= 19) - { - ai->CastSpell(DRAIN_SOUL, *pTarget); - ai->SetIgnoreUpdateTime(15); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (DRAIN_LIFE > 0 && LastSpellAffliction < 4 && !pTarget->HasAura(DRAIN_SOUL, EFFECT_INDEX_0) && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_LIFE, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_MANA, EFFECT_INDEX_0) && ai->GetHealthPercent() <= 70 && ai->GetManaPercent() >= 23) - { - ai->CastSpell(DRAIN_LIFE, *pTarget); - ai->SetIgnoreUpdateTime(5); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (DRAIN_MANA > 0 && pTarget->GetPower(POWER_MANA) > 0 && !pTarget->HasAura(DRAIN_SOUL, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_MANA, EFFECT_INDEX_0) && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_LIFE, EFFECT_INDEX_0) && LastSpellAffliction < 5 && ai->GetManaPercent() < 70 && ai->GetManaPercent() >= 17) - { - ai->CastSpell(DRAIN_MANA, *pTarget); - ai->SetIgnoreUpdateTime(5); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (UNSTABLE_AFFLICTION > 0 && LastSpellAffliction < 6 && !pTarget->HasAura(UNSTABLE_AFFLICTION, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && ai->GetManaPercent() >= 20) - { - ai->CastSpell(UNSTABLE_AFFLICTION, *pTarget); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (HAUNT > 0 && LastSpellAffliction < 7 && !pTarget->HasAura(HAUNT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 12) - { - ai->CastSpell(HAUNT, *pTarget); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (ATROCITY > 0 && !pTarget->HasAura(ATROCITY, EFFECT_INDEX_0) && LastSpellAffliction < 8 && ai->GetManaPercent() >= 21) - { - ai->CastSpell(ATROCITY, *pTarget); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (SEED_OF_CORRUPTION > 0 && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && LastSpellAffliction < 9 && ai->GetManaPercent() >= 34) - { - ai->CastSpell(SEED_OF_CORRUPTION, *pTarget); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (HOWL_OF_TERROR > 0 && !pTarget->HasAura(HOWL_OF_TERROR, EFFECT_INDEX_0) && ai->GetAttackerCount()>3 && LastSpellAffliction < 10 && ai->GetManaPercent() >= 11) - { - ai->CastSpell(HOWL_OF_TERROR, *pTarget); - ai->TellMaster("casting howl of terror!"); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (FEAR > 0 && !pTarget->HasAura(FEAR, EFFECT_INDEX_0) && pVictim==m_bot && ai->GetAttackerCount()>=2 && LastSpellAffliction < 11 && ai->GetManaPercent() >= 12) - { - ai->CastSpell(FEAR, *pTarget); - //ai->TellMaster("casting fear!"); - ai->SetIgnoreUpdateTime(1.5); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if(( pet ) - && (DARK_PACT > 0 && ai->GetManaPercent() <= 50 && LastSpellAffliction < 12 && pet->GetPower(POWER_MANA) > 0)) - { - ai->CastSpell(DARK_PACT, *m_bot); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - LastSpellAffliction = 0; - //SpellSequence = SPELL_DESTRUCTION; - //break; + if (LIFE_TAP > 0 && LastSpellAffliction < 1 && ai->GetManaPercent() <= 50) + { + ai->CastSpell(LIFE_TAP, *m_bot); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction +1; + break; + } + else if (CORRUPTION > 0 && !pTarget->HasAura(CORRUPTION, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && LastSpellAffliction < 2 && ai->GetManaPercent() >= 19) + { + ai->CastSpell(CORRUPTION, *pTarget); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction +1; + break; + } + else if (DRAIN_SOUL > 0 && pTarget->GetHealth() < pTarget->GetMaxHealth()*0.40 && !pTarget->HasAura(DRAIN_SOUL, EFFECT_INDEX_0) && LastSpellAffliction < 3 && ai->GetManaPercent() >= 19) + { + ai->CastSpell(DRAIN_SOUL, *pTarget); + ai->SetIgnoreUpdateTime(15); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction +1; + break; + } + else if (DRAIN_LIFE > 0 && LastSpellAffliction < 4 && !pTarget->HasAura(DRAIN_SOUL, EFFECT_INDEX_0) && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_LIFE, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_MANA, EFFECT_INDEX_0) && ai->GetHealthPercent() <= 70 && ai->GetManaPercent() >= 23) + { + ai->CastSpell(DRAIN_LIFE, *pTarget); + ai->SetIgnoreUpdateTime(5); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction +1; + break; + } + else if (DRAIN_MANA > 0 && pTarget->GetPower(POWER_MANA) > 0 && !pTarget->HasAura(DRAIN_SOUL, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_MANA, EFFECT_INDEX_0) && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_LIFE, EFFECT_INDEX_0) && LastSpellAffliction < 5 && ai->GetManaPercent() < 70 && ai->GetManaPercent() >= 17) + { + ai->CastSpell(DRAIN_MANA, *pTarget); + ai->SetIgnoreUpdateTime(5); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction +1; + break; + } + else if (UNSTABLE_AFFLICTION > 0 && LastSpellAffliction < 6 && !pTarget->HasAura(UNSTABLE_AFFLICTION, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && ai->GetManaPercent() >= 20) + { + ai->CastSpell(UNSTABLE_AFFLICTION, *pTarget); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction +1; + break; + } + else if (HAUNT > 0 && LastSpellAffliction < 7 && !pTarget->HasAura(HAUNT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 12) + { + ai->CastSpell(HAUNT, *pTarget); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction +1; + break; + } + else if (ATROCITY > 0 && !pTarget->HasAura(ATROCITY, EFFECT_INDEX_0) && LastSpellAffliction < 8 && ai->GetManaPercent() >= 21) + { + ai->CastSpell(ATROCITY, *pTarget); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction +1; + break; + } + else if (SEED_OF_CORRUPTION > 0 && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && LastSpellAffliction < 9 && ai->GetManaPercent() >= 34) + { + ai->CastSpell(SEED_OF_CORRUPTION, *pTarget); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction +1; + break; + } + else if (HOWL_OF_TERROR > 0 && !pTarget->HasAura(HOWL_OF_TERROR, EFFECT_INDEX_0) && ai->GetAttackerCount()>3 && LastSpellAffliction < 10 && ai->GetManaPercent() >= 11) + { + ai->CastSpell(HOWL_OF_TERROR, *pTarget); + ai->TellMaster("casting howl of terror!"); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction +1; + break; + } + else if (FEAR > 0 && !pTarget->HasAura(FEAR, EFFECT_INDEX_0) && pVictim==m_bot && ai->GetAttackerCount()>=2 && LastSpellAffliction < 11 && ai->GetManaPercent() >= 12) + { + ai->CastSpell(FEAR, *pTarget); + //ai->TellMaster("casting fear!"); + ai->SetIgnoreUpdateTime(1.5); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction +1; + break; + } + else if(( pet ) + && (DARK_PACT > 0 && ai->GetManaPercent() <= 50 && LastSpellAffliction < 12 && pet->GetPower(POWER_MANA) > 0)) + { + ai->CastSpell(DARK_PACT, *m_bot); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction +1; + break; + } + LastSpellAffliction = 0; + //SpellSequence = SPELL_DESTRUCTION; + //break; - case SPELL_DESTRUCTION: - if (SHADOWFURY > 0 && LastSpellDestruction < 1 && !pTarget->HasAura(SHADOWFURY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 37) - { + case SPELL_DESTRUCTION: + if (SHADOWFURY > 0 && LastSpellDestruction < 1 && !pTarget->HasAura(SHADOWFURY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 37) + { ai->CastSpell(SHADOWFURY, *pTarget); SpellSequence = SPELL_CURSES; LastSpellDestruction = LastSpellDestruction + 1; @@ -250,16 +250,16 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) LastSpellDestruction = LastSpellDestruction + 1; break; } - else if (RAIN_OF_FIRE > 0 && LastSpellDestruction < 3 && ai->GetAttackerCount()>=3 && ai->GetManaPercent() >= 77) + else if (RAIN_OF_FIRE > 0 && LastSpellDestruction < 3 && ai->GetAttackerCount()>=3 && ai->GetManaPercent() >= 77) { ai->CastSpell(RAIN_OF_FIRE, *pTarget); - //ai->TellMaster("casting rain of fire!"); - ai->SetIgnoreUpdateTime(8); + //ai->TellMaster("casting rain of fire!"); + ai->SetIgnoreUpdateTime(8); SpellSequence = SPELL_CURSES; LastSpellDestruction = LastSpellDestruction + 1; break; } - else if (SHADOWFLAME > 0 && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && LastSpellDestruction < 4 && ai->GetManaPercent() >= 25) + else if (SHADOWFLAME > 0 && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && LastSpellDestruction < 4 && ai->GetManaPercent() >= 25) { ai->CastSpell(SHADOWFLAME, *pTarget); SpellSequence = SPELL_CURSES; @@ -297,7 +297,7 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) else if (SOUL_FIRE > 0 && LastSpellDestruction < 9 && ai->GetManaPercent() >= 13) { ai->CastSpell(SOUL_FIRE, *pTarget); - ai->SetIgnoreUpdateTime(6); + ai->SetIgnoreUpdateTime(6); SpellSequence = SPELL_CURSES; LastSpellDestruction = LastSpellDestruction + 1; break; @@ -309,23 +309,23 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) LastSpellDestruction = LastSpellDestruction + 1; break; } - else if (SHADOWBURN > 0 && LastSpellDestruction < 11 && pTarget->GetHealth() < pTarget->GetMaxHealth()*0.20 && !pTarget->HasAura(SHADOWBURN, EFFECT_INDEX_0) && ai->GetManaPercent() >= 27) + else if (SHADOWBURN > 0 && LastSpellDestruction < 11 && pTarget->GetHealth() < pTarget->GetMaxHealth()*0.20 && !pTarget->HasAura(SHADOWBURN, EFFECT_INDEX_0) && ai->GetManaPercent() >= 27) { ai->CastSpell(SHADOWBURN, *pTarget); SpellSequence = SPELL_CURSES; LastSpellDestruction = LastSpellDestruction + 1; break; } - else if (HELLFIRE > 0 && LastSpellDestruction < 12 && !m_bot->HasAura(HELLFIRE, EFFECT_INDEX_0) && ai->GetAttackerCount()>=5 && ai->GetHealthPercent() >= 10 && ai->GetManaPercent() >= 87) + else if (HELLFIRE > 0 && LastSpellDestruction < 12 && !m_bot->HasAura(HELLFIRE, EFFECT_INDEX_0) && ai->GetAttackerCount()>=5 && ai->GetHealthPercent() >= 10 && ai->GetManaPercent() >= 87) { ai->CastSpell(HELLFIRE); - ai->TellMaster("casting hellfire!"); - ai->SetIgnoreUpdateTime(15); + ai->TellMaster("casting hellfire!"); + ai->SetIgnoreUpdateTime(15); SpellSequence = SPELL_CURSES; LastSpellDestruction = LastSpellDestruction + 1; break; } - else + else { LastSpellDestruction = 0; SpellSequence = SPELL_CURSES; @@ -345,7 +345,7 @@ void PlayerbotWarlockAI::DoNonCombatActions() SpellSequence = SPELL_CURSES; - Pet *pet = m_bot->GetPet(); + Pet *pet = m_bot->GetPet(); // buff myself DEMON_SKIN, DEMON_ARMOR, FEL_ARMOR if (FEL_ARMOR > 0) @@ -355,7 +355,7 @@ void PlayerbotWarlockAI::DoNonCombatActions() else if (DEMON_SKIN > 0) (!m_bot->HasAura(DEMON_SKIN, EFFECT_INDEX_0) && !m_bot->HasAura(FEL_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(DEMON_ARMOR, EFFECT_INDEX_0) && ai->CastSpell(DEMON_SKIN, *m_bot)); - // buff myself & master DETECT_INVISIBILITY + // buff myself & master DETECT_INVISIBILITY if (DETECT_INVISIBILITY > 0) (!m_bot->HasAura(DETECT_INVISIBILITY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 2 && ai->CastSpell(DETECT_INVISIBILITY, *m_bot)); if (DETECT_INVISIBILITY > 0) @@ -375,17 +375,17 @@ void PlayerbotWarlockAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(30); return; } - else if(( pet ) - && (pItem == NULL && DARK_PACT>0 && ai->GetManaPercent() <= 50 && pet->GetPower(POWER_MANA) > 0) ) + else if(( pet ) + && (pItem == NULL && DARK_PACT>0 && ai->GetManaPercent() <= 50 && pet->GetPower(POWER_MANA) > 0) ) { - ai->CastSpell(DARK_PACT, *m_bot); + ai->CastSpell(DARK_PACT, *m_bot); //ai->TellMaster("casting dark pact."); return; } - else if(( !pet ) - && (pItem == NULL && LIFE_TAP>0 && ai->GetManaPercent() <= 50 && ai->GetHealthPercent() > 25) ) + else if(( !pet ) + && (pItem == NULL && LIFE_TAP>0 && ai->GetManaPercent() <= 50 && ai->GetHealthPercent() > 25) ) { - ai->CastSpell(LIFE_TAP, *m_bot); + ai->CastSpell(LIFE_TAP, *m_bot); //ai->TellMaster("casting life tap."); return; } @@ -401,19 +401,19 @@ void PlayerbotWarlockAI::DoNonCombatActions() ai->TellMaster("I could use some food."); ai->UseItem(*pItem); ai->SetIgnoreUpdateTime(30); - return; + return; } - else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) + else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(*fItem); ai->SetIgnoreUpdateTime(8); return; } - else if(( pet ) - && (pItem == NULL && fItem == NULL && CONSUME_SHADOWS>0 && !m_bot->HasAura(CONSUME_SHADOWS, EFFECT_INDEX_0) && ai->GetHealthPercent() < 75) ) + else if(( pet ) + && (pItem == NULL && fItem == NULL && CONSUME_SHADOWS>0 && !m_bot->HasAura(CONSUME_SHADOWS, EFFECT_INDEX_0) && ai->GetHealthPercent() < 75) ) { - ai->CastSpell(CONSUME_SHADOWS, *m_bot); + ai->CastSpell(CONSUME_SHADOWS, *m_bot); //ai->TellMaster("casting consume shadows."); return; } @@ -424,15 +424,15 @@ void PlayerbotWarlockAI::DoNonCombatActions() if( !pet ) { // summon demon - if( SUMMON_FELGUARD>0 && ai->CastSpell(SUMMON_FELGUARD,*m_bot) ) + if( SUMMON_FELGUARD>0 && ai->CastSpell(SUMMON_FELGUARD,*m_bot) ) ai->TellMaster( "summoning felguard." ); - else if( SUMMON_FELHUNTER>0 && ai->CastSpell(SUMMON_FELHUNTER,*m_bot) ) + else if( SUMMON_FELHUNTER>0 && ai->CastSpell(SUMMON_FELHUNTER,*m_bot) ) ai->TellMaster( "summoning felhunter." ); - else if( SUMMON_SUCCUBUS>0 && ai->CastSpell(SUMMON_SUCCUBUS,*m_bot) ) + else if( SUMMON_SUCCUBUS>0 && ai->CastSpell(SUMMON_SUCCUBUS,*m_bot) ) ai->TellMaster( "summoning succubus." ); - else if( SUMMON_VOIDWALKER>0 && ai->CastSpell(SUMMON_VOIDWALKER,*m_bot) ) + else if( SUMMON_VOIDWALKER>0 && ai->CastSpell(SUMMON_VOIDWALKER,*m_bot) ) ai->TellMaster( "summoning voidwalker." ); - else if( SUMMON_IMP>0 && ai->GetManaPercent() >= 64 && ai->CastSpell(SUMMON_IMP,*m_bot) ) + else if( SUMMON_IMP>0 && ai->GetManaPercent() >= 64 && ai->CastSpell(SUMMON_IMP,*m_bot) ) ai->TellMaster( "summoning imp." ); else { @@ -442,23 +442,23 @@ void PlayerbotWarlockAI::DoNonCombatActions() } } - // check for buffs with demon - if(( pet ) - && ( SOUL_LINK>0 && !m_bot->HasAura(SOUL_LINK, EFFECT_INDEX_0) && ai->GetManaPercent() >= 16 && ai->CastSpell(SOUL_LINK,*m_bot) )) - { - //ai->TellMaster( "casting soul link." ); - return; - } - else if(( pet ) - && ( BLOOD_PACT>0 && !m_bot->HasAura(BLOOD_PACT, EFFECT_INDEX_0) && ai->CastSpell(BLOOD_PACT,*m_bot) )) - { - //ai->TellMaster( "casting blood pact." ); - return; - } - else if(( pet ) - && ( FEL_INTELLIGENCE>0 && !m_bot->HasAura(FEL_INTELLIGENCE, EFFECT_INDEX_0) && ai->CastSpell(FEL_INTELLIGENCE,*m_bot) )) - { - //ai->TellMaster( "casting fel intelligence." ); - return; - } + // check for buffs with demon + if(( pet ) + && ( SOUL_LINK>0 && !m_bot->HasAura(SOUL_LINK, EFFECT_INDEX_0) && ai->GetManaPercent() >= 16 && ai->CastSpell(SOUL_LINK,*m_bot) )) + { + //ai->TellMaster( "casting soul link." ); + return; + } + else if(( pet ) + && ( BLOOD_PACT>0 && !m_bot->HasAura(BLOOD_PACT, EFFECT_INDEX_0) && ai->CastSpell(BLOOD_PACT,*m_bot) )) + { + //ai->TellMaster( "casting blood pact." ); + return; + } + else if(( pet ) + && ( FEL_INTELLIGENCE>0 && !m_bot->HasAura(FEL_INTELLIGENCE, EFFECT_INDEX_0) && ai->CastSpell(FEL_INTELLIGENCE,*m_bot) )) + { + //ai->TellMaster( "casting fel intelligence." ); + return; + } } // end DoNonCombatActions diff --git a/src/game/PlayerbotWarlockAI.h b/src/game/PlayerbotWarlockAI.h index 4fe61e32f..8058c4b6f 100644 --- a/src/game/PlayerbotWarlockAI.h +++ b/src/game/PlayerbotWarlockAI.h @@ -29,7 +29,7 @@ class MANGOS_DLL_SPEC PlayerbotWarlockAI : PlayerbotClassAI private: - bool m_demonSummonFailed; + bool m_demonSummonFailed; // CURSES uint32 CURSE_OF_WEAKNESS, CURSE_OF_AGONY, CURSE_OF_EXHAUSTION, CURSE_OF_TONGUES, CURSE_OF_THE_ELEMENTS, CURSE_OF_DOOM; diff --git a/src/game/PlayerbotWarriorAI.cpp b/src/game/PlayerbotWarriorAI.cpp index 7d03c1da4..742bce60b 100644 --- a/src/game/PlayerbotWarriorAI.cpp +++ b/src/game/PlayerbotWarriorAI.cpp @@ -1,4 +1,4 @@ - /* + /* Name : PlayerbotWarriorAI.cpp Complete: maybe around 37% Author : Natsukawa @@ -64,7 +64,7 @@ PlayerbotWarriorAI::PlayerbotWarriorAI(Player* const master, Player* const bot, RECENTLY_BANDAGED = 11196; // first aid check - // racial + // racial GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei STONEFORM = ai->getSpellId("stoneform"); // dwarf ESCAPE_ARTIST = ai->getSpellId("escape artist"); // gnome @@ -86,19 +86,19 @@ bool PlayerbotWarriorAI::DoFirstCombatManeuver(Unit *pTarget) if( (co&PlayerbotAI::ORDERS_TANK) && DEFENSIVE_STANCE>0 && !m_bot->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0) && ai->CastSpell(DEFENSIVE_STANCE) ) { - if( ai->GetManager()->m_confDebugWhisper ) + if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "First > Defensive Stance (%d)", DEFENSIVE_STANCE ); return true; } else if( (co&PlayerbotAI::ORDERS_TANK) && TAUNT>0 && m_bot->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0) && ai->CastSpell(TAUNT,*pTarget) ) { - if( ai->GetManager()->m_confDebugWhisper ) + if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "First > Taunt (%d)", TAUNT ); return false; } else if( BATTLE_STANCE>0 && !m_bot->HasAura(BATTLE_STANCE, EFFECT_INDEX_0) && ai->CastSpell(BATTLE_STANCE) ) { - if( ai->GetManager()->m_confDebugWhisper ) + if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "First > Battle Stance (%d)", BATTLE_STANCE ); return true; } @@ -114,7 +114,7 @@ bool PlayerbotWarriorAI::DoFirstCombatManeuver(Unit *pTarget) pTarget->GetContactPoint( m_bot, x, y, z, 3.666666f ); m_bot->Relocate( x, y, z ); - if( ai->GetManager()->m_confDebugWhisper ) + if( ai->GetManager()->m_confDebugWhisper ) ai->TellMaster( "First > Charge (%d)", CHARGE ); return false; } @@ -184,7 +184,7 @@ void PlayerbotWarriorAI::DoNextCombatManeuver(Unit *pTarget) out << "Case Prevent"; if( SHIELD_BASH>0 && ai->GetRageAmount()>=10 && ai->CastSpell( SHIELD_BASH, *pTarget ) ) out << " > Shield Bash"; - else if( PUMMEL>0 && ai->GetRageAmount()>=10 && ai->CastSpell( PUMMEL, *pTarget ) ) + else if( PUMMEL>0 && ai->GetRageAmount()>=10 && ai->CastSpell( PUMMEL, *pTarget ) ) out << " > Pummel"; else if( SPELL_REFLECTION>0 && ai->GetRageAmount()>=15 && !m_bot->HasAura( SPELL_REFLECTION, EFFECT_INDEX_0) && ai->CastSpell( SPELL_REFLECTION, *m_bot ) ) out << " > Spell Reflection"; @@ -193,78 +193,78 @@ void PlayerbotWarriorAI::DoNextCombatManeuver(Unit *pTarget) break; case WarriorBattle: - out << "Case Battle"; - if( EXECUTE>0 && ai->GetRageAmount()>=15 && pTarget->GetHealth() < pTarget->GetMaxHealth()*0.2 && ai->CastSpell( EXECUTE, *pTarget ) ) + out << "Case Battle"; + if( EXECUTE>0 && ai->GetRageAmount()>=15 && pTarget->GetHealth() < pTarget->GetMaxHealth()*0.2 && ai->CastSpell( EXECUTE, *pTarget ) ) out << " > Execute!"; - else if( LAST_STAND>0 && !m_bot->HasAura( LAST_STAND, EFFECT_INDEX_0) && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.5 && ai->CastSpell( LAST_STAND, *m_bot ) ) + else if( LAST_STAND>0 && !m_bot->HasAura( LAST_STAND, EFFECT_INDEX_0) && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.5 && ai->CastSpell( LAST_STAND, *m_bot ) ) out << " > Last Stand!"; - else if( BLOODRAGE>0 && ai->GetRageAmount()<50 && !m_bot->HasAura( BLOODRAGE, EFFECT_INDEX_0) && ai->CastSpell( BLOODRAGE, *m_bot ) ) + else if( BLOODRAGE>0 && ai->GetRageAmount()<50 && !m_bot->HasAura( BLOODRAGE, EFFECT_INDEX_0) && ai->CastSpell( BLOODRAGE, *m_bot ) ) out << " > Bloodrage"; - else if( DEATH_WISH>0 && ai->GetRageAmount()>=10 && !m_bot->HasAura( DEATH_WISH, EFFECT_INDEX_0) && ai->CastSpell( DEATH_WISH, *m_bot ) ) + else if( DEATH_WISH>0 && ai->GetRageAmount()>=10 && !m_bot->HasAura( DEATH_WISH, EFFECT_INDEX_0) && ai->CastSpell( DEATH_WISH, *m_bot ) ) out << " > Death Wish"; - else if( RETALIATION>0 && pVictim == m_bot && ai->GetAttackerCount()>=2 && !m_bot->HasAura( RETALIATION, EFFECT_INDEX_0) && ai->CastSpell( RETALIATION, *m_bot ) ) + else if( RETALIATION>0 && pVictim == m_bot && ai->GetAttackerCount()>=2 && !m_bot->HasAura( RETALIATION, EFFECT_INDEX_0) && ai->CastSpell( RETALIATION, *m_bot ) ) out << " > Retaliation"; - else if( DEMORALIZING_SHOUT>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( DEMORALIZING_SHOUT, EFFECT_INDEX_0) && ai->CastSpell( DEMORALIZING_SHOUT, *pTarget ) ) + else if( DEMORALIZING_SHOUT>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( DEMORALIZING_SHOUT, EFFECT_INDEX_0) && ai->CastSpell( DEMORALIZING_SHOUT, *pTarget ) ) out << " > Demoralizing Shout"; - else if( SWEEPING_STRIKES>0 && ai->GetRageAmount()>=30 && ai->GetAttackerCount()>=2 && !m_bot->HasAura( SWEEPING_STRIKES, EFFECT_INDEX_0) && ai->CastSpell( SWEEPING_STRIKES, *m_bot ) ) + else if( SWEEPING_STRIKES>0 && ai->GetRageAmount()>=30 && ai->GetAttackerCount()>=2 && !m_bot->HasAura( SWEEPING_STRIKES, EFFECT_INDEX_0) && ai->CastSpell( SWEEPING_STRIKES, *m_bot ) ) out << " > Sweeping Strikes!"; - else if( BLADESTORM>0 && ai->GetRageAmount()>=25 && pVictim == m_bot && !m_bot->HasAura( BLADESTORM, EFFECT_INDEX_0) && ai->GetAttackerCount()>=3 && ai->CastSpell( BLADESTORM, *pTarget ) ) + else if( BLADESTORM>0 && ai->GetRageAmount()>=25 && pVictim == m_bot && !m_bot->HasAura( BLADESTORM, EFFECT_INDEX_0) && ai->GetAttackerCount()>=3 && ai->CastSpell( BLADESTORM, *pTarget ) ) out << " > Bladestorm!"; - else if( MORTAL_STRIKE>0 && ai->GetRageAmount()>=30 && !pTarget->HasAura( MORTAL_STRIKE, EFFECT_INDEX_0) && ai->CastSpell( MORTAL_STRIKE, *pTarget ) ) + else if( MORTAL_STRIKE>0 && ai->GetRageAmount()>=30 && !pTarget->HasAura( MORTAL_STRIKE, EFFECT_INDEX_0) && ai->CastSpell( MORTAL_STRIKE, *pTarget ) ) out << " > Mortal Strike"; - else if( INTIMIDATING_SHOUT>0 && ai->GetRageAmount()>=25 && ai->GetAttackerCount()>5 && ai->CastSpell( INTIMIDATING_SHOUT, *pTarget ) ) + else if( INTIMIDATING_SHOUT>0 && ai->GetRageAmount()>=25 && ai->GetAttackerCount()>5 && ai->CastSpell( INTIMIDATING_SHOUT, *pTarget ) ) out << " > Intimidating Shout"; - else if( THUNDER_CLAP>0 && ai->GetRageAmount()>=20 && pVictim == m_bot && !pTarget->HasAura( THUNDER_CLAP, EFFECT_INDEX_0) && ai->CastSpell( THUNDER_CLAP, *pTarget ) ) + else if( THUNDER_CLAP>0 && ai->GetRageAmount()>=20 && pVictim == m_bot && !pTarget->HasAura( THUNDER_CLAP, EFFECT_INDEX_0) && ai->CastSpell( THUNDER_CLAP, *pTarget ) ) out << " > Thunder Clap"; - else if( ENRAGED_REGENERATION>0 && ai->GetRageAmount()>=15 && !m_bot->HasAura( BERSERKER_RAGE, EFFECT_INDEX_0) && !m_bot->HasAura( ENRAGED_REGENERATION, EFFECT_INDEX_0) && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.5 && ai->CastSpell( ENRAGED_REGENERATION, *m_bot ) ) + else if( ENRAGED_REGENERATION>0 && ai->GetRageAmount()>=15 && !m_bot->HasAura( BERSERKER_RAGE, EFFECT_INDEX_0) && !m_bot->HasAura( ENRAGED_REGENERATION, EFFECT_INDEX_0) && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.5 && ai->CastSpell( ENRAGED_REGENERATION, *m_bot ) ) out << " > Enraged Regeneration"; - else if( SHOCKWAVE>0 && ai->GetRageAmount()>=15 && pVictim == m_bot && !pTarget->HasAura( WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura( PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura( SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura( CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell( SHOCKWAVE, *pTarget ) ) + else if( SHOCKWAVE>0 && ai->GetRageAmount()>=15 && pVictim == m_bot && !pTarget->HasAura( WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura( PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura( SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura( CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell( SHOCKWAVE, *pTarget ) ) out << " > Shockwave"; - else if( REND>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( REND, EFFECT_INDEX_0) && ai->CastSpell( REND, *pTarget ) ) + else if( REND>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( REND, EFFECT_INDEX_0) && ai->CastSpell( REND, *pTarget ) ) out << " > Rend"; - else if( HAMSTRING>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( HAMSTRING, EFFECT_INDEX_0) && ai->CastSpell( HAMSTRING, *pTarget ) ) + else if( HAMSTRING>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( HAMSTRING, EFFECT_INDEX_0) && ai->CastSpell( HAMSTRING, *pTarget ) ) out << " > Hamstring"; else if( CHALLENGING_SHOUT>0 && ai->GetRageAmount()>=5 && pVictim != m_bot && ai->GetHealthPercent() > 25 && !pTarget->HasAura( MOCKING_BLOW, EFFECT_INDEX_0) && !pTarget->HasAura( CHALLENGING_SHOUT, EFFECT_INDEX_0) && ai->CastSpell( CHALLENGING_SHOUT, *pTarget ) ) out << " > Challenging Shout"; - else if( BLOODTHIRST>0 && ai->GetRageAmount()>=20 && !m_bot->HasAura( BLOODTHIRST, EFFECT_INDEX_0) && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.7 && ai->CastSpell( BLOODTHIRST, *pTarget ) ) + else if( BLOODTHIRST>0 && ai->GetRageAmount()>=20 && !m_bot->HasAura( BLOODTHIRST, EFFECT_INDEX_0) && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.7 && ai->CastSpell( BLOODTHIRST, *pTarget ) ) out << " > Bloodthrist"; - else if( CLEAVE>0 && ai->GetRageAmount()>=20 && ai->CastSpell( CLEAVE, *pTarget ) ) + else if( CLEAVE>0 && ai->GetRageAmount()>=20 && ai->CastSpell( CLEAVE, *pTarget ) ) out << " > Cleave"; - else if( HEROIC_STRIKE>0 && ai->GetRageAmount()>=15 && ai->CastSpell( HEROIC_STRIKE, *pTarget ) ) + else if( HEROIC_STRIKE>0 && ai->GetRageAmount()>=15 && ai->CastSpell( HEROIC_STRIKE, *pTarget ) ) out << " > Heroic Strike"; - else if( CONCUSSION_BLOW>0 && ai->GetRageAmount()>=15 && !pTarget->HasAura( WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura( PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura( SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura( CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell( CONCUSSION_BLOW, *pTarget ) ) + else if( CONCUSSION_BLOW>0 && ai->GetRageAmount()>=15 && !pTarget->HasAura( WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura( PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura( SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura( CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell( CONCUSSION_BLOW, *pTarget ) ) out << " > Concussion Blow"; - else if( SLAM>0 && ai->GetRageAmount()>=15 && ai->CastSpell( SLAM, *pTarget ) ) + else if( SLAM>0 && ai->GetRageAmount()>=15 && ai->CastSpell( SLAM, *pTarget ) ) out << " > Slam"; - else if( PIERCING_HOWL>0 && ai->GetRageAmount()>=10 && ai->GetAttackerCount()>=3 && !pTarget->HasAura( WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura( PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura( SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura( CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell( PIERCING_HOWL, *pTarget ) ) + else if( PIERCING_HOWL>0 && ai->GetRageAmount()>=10 && ai->GetAttackerCount()>=3 && !pTarget->HasAura( WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura( PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura( SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura( CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell( PIERCING_HOWL, *pTarget ) ) out << " > Piercing Howl"; - else if( MOCKING_BLOW>0 && ai->GetRageAmount()>=10 && pVictim != m_bot && ai->GetHealthPercent() > 25 && !pTarget->HasAura( MOCKING_BLOW, EFFECT_INDEX_0) && !pTarget->HasAura( CHALLENGING_SHOUT, EFFECT_INDEX_0) && ai->CastSpell( MOCKING_BLOW, *pTarget ) ) + else if( MOCKING_BLOW>0 && ai->GetRageAmount()>=10 && pVictim != m_bot && ai->GetHealthPercent() > 25 && !pTarget->HasAura( MOCKING_BLOW, EFFECT_INDEX_0) && !pTarget->HasAura( CHALLENGING_SHOUT, EFFECT_INDEX_0) && ai->CastSpell( MOCKING_BLOW, *pTarget ) ) out << " > Mocking Blow"; - else if( OVERPOWER>0 && ai->GetRageAmount()>=5 && ai->CastSpell( OVERPOWER, *pTarget ) ) + else if( OVERPOWER>0 && ai->GetRageAmount()>=5 && ai->CastSpell( OVERPOWER, *pTarget ) ) out << " > Overpower"; - else if( SUNDER_ARMOR>0 && ai->CastSpell( SUNDER_ARMOR, *pTarget ) ) + else if( SUNDER_ARMOR>0 && ai->CastSpell( SUNDER_ARMOR, *pTarget ) ) out << " > Sunder Armor"; - else if( SHATTERING_THROW>0 && !pTarget->HasAura( SHATTERING_THROW, EFFECT_INDEX_0) && ai->CastSpell( SHATTERING_THROW, *pTarget ) ) + else if( SHATTERING_THROW>0 && !pTarget->HasAura( SHATTERING_THROW, EFFECT_INDEX_0) && ai->CastSpell( SHATTERING_THROW, *pTarget ) ) out << " > Shattering Throw"; - else if( HEROIC_THROW>0 && ai->CastSpell( HEROIC_THROW, *pTarget ) ) + else if( HEROIC_THROW>0 && ai->CastSpell( HEROIC_THROW, *pTarget ) ) out << " > Heroic Throw"; - else if( m_bot->getRace() == RACE_TAUREN && !pTarget->HasAura( WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura( PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura( SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura( CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell( WAR_STOMP, *pTarget ) ) + else if( m_bot->getRace() == RACE_TAUREN && !pTarget->HasAura( WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura( PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura( SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura( CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell( WAR_STOMP, *pTarget ) ) out << " > War Stomp"; - else if( m_bot->getRace() == RACE_HUMAN && m_bot->hasUnitState( UNIT_STAT_STUNNED ) || m_bot->HasAuraType( SPELL_AURA_MOD_FEAR ) || m_bot->HasAuraType( SPELL_AURA_MOD_DECREASE_SPEED ) || m_bot->HasAuraType( SPELL_AURA_MOD_CHARM ) && ai->CastSpell( EVERY_MAN_FOR_HIMSELF, *m_bot ) ) + else if( m_bot->getRace() == RACE_HUMAN && m_bot->hasUnitState( UNIT_STAT_STUNNED ) || m_bot->HasAuraType( SPELL_AURA_MOD_FEAR ) || m_bot->HasAuraType( SPELL_AURA_MOD_DECREASE_SPEED ) || m_bot->HasAuraType( SPELL_AURA_MOD_CHARM ) && ai->CastSpell( EVERY_MAN_FOR_HIMSELF, *m_bot ) ) out << " > Every Man for Himself"; - else if( m_bot->getRace() == RACE_UNDEAD_PLAYER && m_bot->HasAuraType( SPELL_AURA_MOD_FEAR ) || m_bot->HasAuraType( SPELL_AURA_MOD_CHARM ) && ai->CastSpell( WILL_OF_THE_FORSAKEN, *m_bot ) ) + else if( m_bot->getRace() == RACE_UNDEAD_PLAYER && m_bot->HasAuraType( SPELL_AURA_MOD_FEAR ) || m_bot->HasAuraType( SPELL_AURA_MOD_CHARM ) && ai->CastSpell( WILL_OF_THE_FORSAKEN, *m_bot ) ) out << " > Will of the Forsaken"; - else if( m_bot->getRace() == RACE_DWARF && m_bot->HasAuraState( AURA_STATE_DEADLY_POISON ) && ai->CastSpell( STONEFORM, *m_bot ) ) + else if( m_bot->getRace() == RACE_DWARF && m_bot->HasAuraState( AURA_STATE_DEADLY_POISON ) && ai->CastSpell( STONEFORM, *m_bot ) ) out << " > Stoneform"; - else if( m_bot->getRace() == RACE_GNOME && m_bot->hasUnitState( UNIT_STAT_STUNNED ) || m_bot->HasAuraType( SPELL_AURA_MOD_DECREASE_SPEED ) && ai->CastSpell( ESCAPE_ARTIST, *m_bot ) ) + else if( m_bot->getRace() == RACE_GNOME && m_bot->hasUnitState( UNIT_STAT_STUNNED ) || m_bot->HasAuraType( SPELL_AURA_MOD_DECREASE_SPEED ) && ai->CastSpell( ESCAPE_ARTIST, *m_bot ) ) out << " > Escape Artist"; - else if( m_bot->getRace() == RACE_NIGHTELF && pVictim == m_bot && ai->GetHealthPercent() < 25 && !m_bot->HasAura( SHADOWMELD, EFFECT_INDEX_0) && ai->CastSpell( SHADOWMELD, *m_bot ) ) + else if( m_bot->getRace() == RACE_NIGHTELF && pVictim == m_bot && ai->GetHealthPercent() < 25 && !m_bot->HasAura( SHADOWMELD, EFFECT_INDEX_0) && ai->CastSpell( SHADOWMELD, *m_bot ) ) out << " > Shadowmeld"; - else if( m_bot->getRace() == RACE_ORC && !m_bot->HasAura( BLOOD_FURY, EFFECT_INDEX_0) && ai->CastSpell( BLOOD_FURY, *m_bot ) ) + else if( m_bot->getRace() == RACE_ORC && !m_bot->HasAura( BLOOD_FURY, EFFECT_INDEX_0) && ai->CastSpell( BLOOD_FURY, *m_bot ) ) out << " > Blood Fury"; - else if( m_bot->getRace() == RACE_TROLL && !m_bot->HasAura( BERSERKING, EFFECT_INDEX_0) && ai->CastSpell( BERSERKING, *m_bot ) ) + else if( m_bot->getRace() == RACE_TROLL && !m_bot->HasAura( BERSERKING, EFFECT_INDEX_0) && ai->CastSpell( BERSERKING, *m_bot ) ) out << " > Berserking"; - else if( m_bot->getRace() == RACE_DRAENEI && ai->GetHealthPercent() < 25 && !m_bot->HasAura(GIFT_OF_THE_NAARU, EFFECT_INDEX_0) && ai->CastSpell(GIFT_OF_THE_NAARU, *m_bot) ) + else if( m_bot->getRace() == RACE_DRAENEI && ai->GetHealthPercent() < 25 && !m_bot->HasAura(GIFT_OF_THE_NAARU, EFFECT_INDEX_0) && ai->CastSpell(GIFT_OF_THE_NAARU, *m_bot) ) out << " > Gift of the Naaru"; else out << " > NONE"; @@ -276,19 +276,19 @@ void PlayerbotWarriorAI::DoNextCombatManeuver(Unit *pTarget) out << " > Disarm"; else if( SUNDER_ARMOR>0 && ai->GetRageAmount()>=15 && ai->CastSpell( SUNDER_ARMOR, *pTarget ) ) out << " > Sunder Armor"; - else if( REVENGE>0 && ai->GetRageAmount()>=5 && ai->CastSpell( REVENGE, *pTarget ) ) + else if( REVENGE>0 && ai->GetRageAmount()>=5 && ai->CastSpell( REVENGE, *pTarget ) ) out << " > Revenge"; else if( SHIELD_BLOCK>0 && !m_bot->HasAura( SHIELD_BLOCK, EFFECT_INDEX_0) && ai->CastSpell( SHIELD_BLOCK, *m_bot ) ) out << " > Shield Block"; - else if( SHIELD_WALL>0 && !m_bot->HasAura( SHIELD_WALL, EFFECT_INDEX_0) && ai->CastSpell( SHIELD_WALL, *m_bot ) ) + else if( SHIELD_WALL>0 && !m_bot->HasAura( SHIELD_WALL, EFFECT_INDEX_0) && ai->CastSpell( SHIELD_WALL, *m_bot ) ) out << " > Shield Wall"; else out << " > NONE"; break; case WarriorBerserker: - out << "Case Berserker"; - if( WHIRLWIND>0 && ai->GetRageAmount()>=25 && ai->CastSpell( WHIRLWIND, *pTarget ) ) + out << "Case Berserker"; + if( WHIRLWIND>0 && ai->GetRageAmount()>=25 && ai->CastSpell( WHIRLWIND, *pTarget ) ) out << " > Whirlwind"; out << " > NONE"; break; @@ -304,14 +304,14 @@ void PlayerbotWarriorAI::DoNonCombatActions() if (!m_bot) return; - // TODO (by Runsttren): check if shout aura bot has is casted by this bot, + // TODO (by Runsttren): check if shout aura bot has is casted by this bot, // otherwise cast other useful shout // If the bot is protect talented, she/he needs stamina not attack power. - // With stance change can the shout change to. + // With stance change can the shout change to. // Inserted line to battle shout m_bot->HasAura( COMMANDING_SHOUT, EFFECT_INDEX_0) // Natsukawa if( ( (COMMANDING_SHOUT>0 && !m_bot->HasAura( COMMANDING_SHOUT, EFFECT_INDEX_0)) || - (BATTLE_SHOUT>0 && !m_bot->HasAura( BATTLE_SHOUT, EFFECT_INDEX_0)) ) && + (BATTLE_SHOUT>0 && !m_bot->HasAura( BATTLE_SHOUT, EFFECT_INDEX_0)) ) && ai->GetRageAmount()<10 && BLOODRAGE>0 && !m_bot->HasAura( BLOODRAGE, EFFECT_INDEX_0) ) { // we do have a useful shout, no rage coming but can cast bloodrage... do it @@ -328,16 +328,16 @@ void PlayerbotWarriorAI::DoNonCombatActions() ai->CastSpell( BATTLE_SHOUT, *m_bot ); } - // buff master with VIGILANCE - if (VIGILANCE > 0) - (!GetMaster()->HasAura( VIGILANCE, EFFECT_INDEX_0) && ai->CastSpell( VIGILANCE, *GetMaster() ) ); + // buff master with VIGILANCE + if (VIGILANCE > 0) + (!GetMaster()->HasAura( VIGILANCE, EFFECT_INDEX_0) && ai->CastSpell( VIGILANCE, *GetMaster() ) ); // hp check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); Item* pItem = ai->FindFood(); - Item* fItem = ai->FindBandage(); + Item* fItem = ai->FindBandage(); if (pItem != NULL && ai->GetHealthPercent() < 30) { diff --git a/src/game/PlayerbotWarriorAI.h b/src/game/PlayerbotWarriorAI.h index 5fbe5fc8f..ce82c2403 100644 --- a/src/game/PlayerbotWarriorAI.h +++ b/src/game/PlayerbotWarriorAI.h @@ -33,7 +33,7 @@ class MANGOS_DLL_SPEC PlayerbotWarriorAI : PlayerbotClassAI private: // ARMS uint32 BATTLE_STANCE, CHARGE, HEROIC_STRIKE, REND, THUNDER_CLAP, HAMSTRING, MOCKING_BLOW, RETALIATION, SWEEPING_STRIKES, MORTAL_STRIKE, BLADESTORM, HEROIC_THROW, SHATTERING_THROW; - + // PROTECTION uint32 DEFENSIVE_STANCE, BLOODRAGE, SUNDER_ARMOR, TAUNT, SHIELD_BASH, REVENGE, SHIELD_BLOCK, DISARM, SHIELD_WALL, SHIELD_SLAM, VIGILANCE, DEVASTATE, SHOCKWAVE, CONCUSSION_BLOW, SPELL_REFLECTION, LAST_STAND; diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index 1fca26b5b..2186dfdb8 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -292,7 +292,7 @@ bool WorldSession::Update(uint32 /*diff*/) // since Playerbots are known to the World obj only by its master's WorldSession object // we need to process all master's bot's packets. if (GetPlayer() && GetPlayer()->GetPlayerbotMgr()) { - for (PlayerBotMap::const_iterator itr = GetPlayer()->GetPlayerbotMgr()->GetPlayerBotsBegin(); + for (PlayerBotMap::const_iterator itr = GetPlayer()->GetPlayerbotMgr()->GetPlayerBotsBegin(); itr != GetPlayer()->GetPlayerbotMgr()->GetPlayerBotsEnd(); ++itr) { Player* const botPlayer = itr->second; diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in index 93cfd98e3..55c90c5b9 100644 --- a/src/mangosd/mangosd.conf.dist.in +++ b/src/mangosd/mangosd.conf.dist.in @@ -1447,7 +1447,7 @@ SOAP.Port = 7878 # # PlayerbotAI.RestrictBotLevel # Restrict the allowed bot level (Current Max 80) -# Default: 80 +# Default: 80 # ################################################################################################################### diff --git a/win/VC90/game.vcproj b/win/VC90/game.vcproj index 02af91c20..368ff0648 100644 --- a/win/VC90/game.vcproj +++ b/win/VC90/game.vcproj @@ -1358,7 +1358,7 @@ RelativePath="..\..\src\game\Player.h" > - @@ -1366,7 +1366,7 @@ RelativePath="..\..\src\game\PlayerbotMgr.h" > - From 403ba829e3ffd974e91a14dc2544929ae7945ad7 Mon Sep 17 00:00:00 2001 From: blueboy Date: Sat, 13 Mar 2010 12:27:09 +0000 Subject: [PATCH 018/187] Fix for 'GetObjectByTypeMask' changes --- src/game/PlayerbotAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index 12533fb1f..71c04a165 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -2813,7 +2813,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) uint32 itemId = itemIds.front(); bool wasRewarded = false; uint64 questRewarderGUID = m_bot->GetSelection(); - Object* const pNpc = ObjectAccessor::GetObjectByTypeMask(*m_bot, questRewarderGUID, TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); + Object* const pNpc = (WorldObject*) m_bot->GetObjectByTypeMask(questRewarderGUID, TYPEMASK_CREATURE_OR_GAMEOBJECT); if (!pNpc) return; From e221ee23503ff3f967f83be4092aa149d7eff40f Mon Sep 17 00:00:00 2001 From: blueboy Date: Tue, 16 Mar 2010 01:12:20 +0000 Subject: [PATCH 019/187] Tidy the code --- src/game/Object.cpp | 2 +- src/game/PlayerbotAI.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 603263609..be7d097a2 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -1429,7 +1429,7 @@ void WorldObject::UpdateGroundPositionZ(float x, float y, float &z) const float vmap_z = GetBaseMap()->GetHeight(x,y,z,true); if(vmap_z > INVALID_HEIGHT) - z = vmap_z - 0.03f; // adjust offset to suit + z = vmap_z - 0.02f; // adjust offset to suit if((map_z > vmap_z) && (map_z > z)) z = map_z; diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index 71c04a165..192282819 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -2676,8 +2676,8 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) EquipItem(**it); } - else if (text == "quests") - { + else if (text == "quests") + { bool hasIncompleteQuests = false; std::ostringstream incomout; incomout << "my incomplete quests are:"; From da6873a0bc4f409ca8eed0c41990c4dd37d8d932 Mon Sep 17 00:00:00 2001 From: blueboy Date: Thu, 25 Mar 2010 08:15:53 +0000 Subject: [PATCH 020/187] Remove compiler warnings - DoLoot fix - Add security override to config options --- src/game/PlayerbotAI.cpp | 12 ++++----- src/game/PlayerbotDruidAI.cpp | 4 +-- src/game/PlayerbotMgr.cpp | 49 +++++++++++++++++++---------------- 3 files changed, 34 insertions(+), 31 deletions(-) diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index 192282819..1eb5e78db 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -430,7 +430,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) m_bot->GetSession()->QueuePacket(packet); // queue the packet to get around race condition // follow target in casting range - float angle = rand_float(0, M_PI); + float angle = rand_float(0, M_PI_F); float dist = rand_float(4, 10); m_bot->GetMotionMaster()->Clear(true); @@ -1467,16 +1467,16 @@ void PlayerbotAI::DoLoot() } } // release loot - if( uint64 lguid = m_bot->GetLootGUID() && m_bot->GetSession() ) - m_bot->GetSession()->DoLootRelease( lguid ); + // if( uint64 lguid = m_bot->GetLootGUID() && m_bot->GetSession() ) + m_bot->GetSession()->DoLootRelease( m_lootCurrent ); //else if( !m_bot->GetSession() ) // sLog.outDebug( "[PlayerbotAI]: %s has no session. Cannot release loot!", m_bot->GetName() ); // clear movement target, take next target on next update m_bot->GetMotionMaster()->Clear(); m_bot->GetMotionMaster()->MoveIdle(); + SetQuestNeedItems(); //sLog.outDebug( "[PlayerbotAI]: %s looted target 0x%08X", m_bot->GetName(), m_lootCurrent ); - m_lootCurrent = 0; } } } @@ -1853,7 +1853,7 @@ void PlayerbotAI::MovementReset() { if( m_bot->isAlive() ) { - float angle = rand_float(0, M_PI); + float angle = rand_float(0, M_PI_F); float dist = rand_float( m_mgr->m_confFollowDistance[0], m_mgr->m_confFollowDistance[1] ); m_bot->GetMotionMaster()->MoveFollow( m_followTarget, dist, angle ); } @@ -1891,7 +1891,7 @@ bool PlayerbotAI::IsMoving() void PlayerbotAI::SetInFront( const Unit* obj ) { // removed SendUpdateToPlayer (is not updating movement/orientation) - if( !m_bot->HasInArc( M_PI, obj ) ) + if( !m_bot->HasInArc( M_PI_F, obj ) ) m_bot->SetInFront( obj ); } diff --git a/src/game/PlayerbotDruidAI.cpp b/src/game/PlayerbotDruidAI.cpp index 780e8fbdf..3cf5f6dcf 100644 --- a/src/game/PlayerbotDruidAI.cpp +++ b/src/game/PlayerbotDruidAI.cpp @@ -133,7 +133,7 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) case DruidTank: // Its now a tank druid! //ai->TellMaster("DruidTank"); - if( !m_bot->HasInArc(M_PI, pTarget)) + if( !m_bot->HasInArc(M_PI_F, pTarget)) { m_bot->SetInFront(pTarget); if (pVictim) @@ -441,7 +441,7 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) case DruidCombat: //ai->TellMaster("DruidCombat"); - if( !m_bot->HasInArc(M_PI, pTarget)) + if( !m_bot->HasInArc(M_PI_F, pTarget)) { m_bot->SetInFront(pTarget); if (pVictim) diff --git a/src/game/PlayerbotMgr.cpp b/src/game/PlayerbotMgr.cpp index 63c37d327..c66b4835e 100644 --- a/src/game/PlayerbotMgr.cpp +++ b/src/game/PlayerbotMgr.cpp @@ -465,12 +465,13 @@ void PlayerbotMgr::RemoveAllBotsFromGroup() bool ChatHandler::HandlePlayerbotCommand(const char* args) { - if(sConfig.GetBoolDefault("PlayerbotAI.DisableBots", false)) - { - PSendSysMessage("|cffff0000Playerbot system is currently disabled!"); - SetSentErrorMessage(true); - return false; - } + if(!(m_session->GetSecurity() > SEC_PLAYER)) + if(sConfig.GetBoolDefault("PlayerbotAI.DisableBots", false)) + { + PSendSysMessage("|cffff0000Playerbot system is currently disabled!"); + SetSentErrorMessage(true); + return false; + } if (! m_session) { @@ -529,14 +530,15 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) if(resultchar) { Field *fields=resultchar->Fetch(); - uint32 acctcharcount = fields[0].GetUInt32(); - if((acctcharcount > sConfig.GetIntDefault("PlayerbotAI.MaxNumBots", 9)) && (cmdStr == "add" || cmdStr == "login")) - { - PSendSysMessage("|cffff0000You cannot summon anymore bots, for this account."); - SetSentErrorMessage(true); - delete resultchar; - return false; - } + int acctcharcount = fields[0].GetUInt32(); + if(!(m_session->GetSecurity() > SEC_PLAYER)) + if((acctcharcount > sConfig.GetIntDefault("PlayerbotAI.MaxNumBots", 9)) && (cmdStr == "add" || cmdStr == "login")) + { + PSendSysMessage("|cffff0000You cannot summon anymore bots, for this account."); + SetSentErrorMessage(true); + delete resultchar; + return false; + } } delete resultchar; @@ -544,17 +546,18 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) if(resultlvl) { Field *fields=resultlvl->Fetch(); - uint32 charlvl = fields[0].GetUInt32(); - if(charlvl > sConfig.GetIntDefault("PlayerbotAI.RestrictBotLevel", 80)) - { - PSendSysMessage("|cffff0000You cannot summon |cffffffff[%s]|cffff0000, it's level is too high.",fields[1].GetString()); - SetSentErrorMessage(true); - delete resultlvl; - return false; - } + int charlvl = fields[0].GetUInt32(); + if(!(m_session->GetSecurity() > SEC_PLAYER)) + if(charlvl > sConfig.GetIntDefault("PlayerbotAI.RestrictBotLevel", 80)) + { + PSendSysMessage("|cffff0000You cannot summon |cffffffff[%s]|cffff0000, it's level is too high.",fields[1].GetString()); + SetSentErrorMessage(true); + delete resultlvl; + return false; + } } delete resultlvl; - + // end of gmconfig patch if (cmdStr == "add" || cmdStr == "login") { if (mgr->GetPlayerBot(guid)) From 79a8cde9a913b73f6d5ba3f6fd7c9e815b392098 Mon Sep 17 00:00:00 2001 From: blueboy Date: Thu, 25 Mar 2010 08:30:33 +0000 Subject: [PATCH 021/187] Remove two missed compiler warnings --- src/game/PlayerbotAI.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index 1eb5e78db..1410f1a5b 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -2508,7 +2508,7 @@ void PlayerbotAI::HandleTeleportAck() // Localization support void PlayerbotAI::ItemLocalization(std::string& itemName, const uint32 itemID) const { - int loc = GetMaster()->GetSession()->GetSessionDbLocaleIndex(); + uint32 loc = GetMaster()->GetSession()->GetSessionDbLocaleIndex(); std::wstring wnamepart; ItemLocale const *pItemInfo = sObjectMgr.GetItemLocale(itemID); @@ -2525,7 +2525,7 @@ void PlayerbotAI::ItemLocalization(std::string& itemName, const uint32 itemID) c void PlayerbotAI::QuestLocalization(std::string& questTitle, const uint32 questID) const { - int loc = GetMaster()->GetSession()->GetSessionDbLocaleIndex(); + uint32 loc = GetMaster()->GetSession()->GetSessionDbLocaleIndex(); std::wstring wnamepart; QuestLocale const *pQuestInfo = sObjectMgr.GetQuestLocale(questID); From 699e3b0ce754cd4d40580ccc2218a1257f3f9f67 Mon Sep 17 00:00:00 2001 From: blueboy Date: Tue, 30 Mar 2010 20:17:36 +0100 Subject: [PATCH 022/187] Addition of QuestLocale patch by eqhugo Fix for Priest (Fortitude & Spirit) spells Added control to PlayerbotAI::HasAura function --- src/game/PlayerbotAI.cpp | 13 ++++++++++--- src/game/PlayerbotPriestAI.cpp | 8 ++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index 1410f1a5b..d9c22e5e9 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -863,6 +863,9 @@ uint8 PlayerbotAI::GetRunicPower() const bool PlayerbotAI::HasAura(uint32 spellId, const Unit& player) const { + if(spellId <= 0) + return false; + for (Unit::AuraMap::const_iterator iter = player.GetAuras().begin(); iter != player.GetAuras().end(); ++iter) { if (iter->second->GetId() == spellId) @@ -2689,13 +2692,17 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) if(uint32 questId = m_bot->GetQuestSlotQuestId(slot)) { Quest const* pQuest = sObjectMgr.GetQuestTemplate(questId); - if (m_bot->GetQuestStatus(questId) == QUEST_STATUS_COMPLETE) { + + std::string questTitle = pQuest->GetTitle(); + m_bot->GetPlayerbotAI()->QuestLocalization(questTitle, questId); + + if (m_bot->GetQuestStatus(questId) == QUEST_STATUS_COMPLETE) { hasCompleteQuests = true; - comout << " |cFFFFFF00|Hquest:" << questId << ':' << pQuest->GetQuestLevel() << "|h[" << pQuest->GetTitle() << "]|h|r"; + comout << " |cFFFFFF00|Hquest:" << questId << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r"; } else { hasIncompleteQuests = true; - incomout << " |cFFFFFF00|Hquest:" << questId << ':' << pQuest->GetQuestLevel() << "|h[" << pQuest->GetTitle() << "]|h|r"; + incomout << " |cFFFFFF00|Hquest:" << questId << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r"; } } } diff --git a/src/game/PlayerbotPriestAI.cpp b/src/game/PlayerbotPriestAI.cpp index f66732cd5..fe2403753 100644 --- a/src/game/PlayerbotPriestAI.cpp +++ b/src/game/PlayerbotPriestAI.cpp @@ -41,15 +41,15 @@ PlayerbotPriestAI::PlayerbotPriestAI(Player* const master, Player* const bot, Pl PENANCE = ai->getSpellId("penance"); INNER_FIRE = ai->getSpellId("inner fire"); PWS = ai->getSpellId("power word: shield"); - if((FORTITUDE = ai->getSpellId ("prayer of fortitude"))==1) + if((FORTITUDE = ai->getSpellId ("prayer of fortitude"))>0) FORTITUDE = ai->getSpellId("prayer of fortitude"); - if((FORTITUDE = ai->getSpellId ("power word: fortitude"))==1 && (FORTITUDE = ai->getSpellId ("prayer of fortitude"))==0) + if((FORTITUDE = ai->getSpellId ("power word: fortitude"))>0 && (FORTITUDE = ai->getSpellId ("prayer of fortitude"))==0) FORTITUDE = ai->getSpellId("power word: fortitude"); FEAR_WARD = ai->getSpellId("fear ward"); - if((DSPIRIT = ai->getSpellId ("prayer of spirit"))==1) + if((DSPIRIT = ai->getSpellId ("prayer of spirit"))>0) DSPIRIT = ai->getSpellId("prayer of spirit"); - if((DSPIRIT = ai->getSpellId ("divine spirit"))==1 && (DSPIRIT = ai->getSpellId ("prayer of spirit"))==0) + if((DSPIRIT = ai->getSpellId ("divine spirit"))>0 && (DSPIRIT = ai->getSpellId ("prayer of spirit"))==0) DSPIRIT = ai->getSpellId("divine spirit"); MASS_DISPEL = ai->getSpellId("mass dispel"); From 5bf225c3bd863038fbcb3dcb373b2863fc5daa32 Mon Sep 17 00:00:00 2001 From: blueboy Date: Tue, 30 Mar 2010 20:54:49 +0100 Subject: [PATCH 023/187] Remove two whitespaces --- src/game/PlayerbotAI.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index d9c22e5e9..b9d70303c 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -865,7 +865,7 @@ bool PlayerbotAI::HasAura(uint32 spellId, const Unit& player) const { if(spellId <= 0) return false; - + for (Unit::AuraMap::const_iterator iter = player.GetAuras().begin(); iter != player.GetAuras().end(); ++iter) { if (iter->second->GetId() == spellId) @@ -2692,7 +2692,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) if(uint32 questId = m_bot->GetQuestSlotQuestId(slot)) { Quest const* pQuest = sObjectMgr.GetQuestTemplate(questId); - + std::string questTitle = pQuest->GetTitle(); m_bot->GetPlayerbotAI()->QuestLocalization(questTitle, questId); From 01ab2c519108b4bc8323daac77bafd164c4acb14 Mon Sep 17 00:00:00 2001 From: blueboy Date: Fri, 16 Apr 2010 14:23:55 +0100 Subject: [PATCH 024/187] Fix for 'Instance Teleportation' issue --- src/game/Map.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/Map.cpp b/src/game/Map.cpp index bf2c71ad0..f8c05e9b8 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -761,7 +761,7 @@ void Map::Remove(Player *player, bool remove) UpdateObjectVisibility(player,cell,p); UpdateObjectsVisibilityFor(player,cell,p); - player->ResetMap(); + // player->ResetMap(); if( remove ) DeleteFromWorld(player); } From 9254992730c8d2ea627337d47850716fff202e01 Mon Sep 17 00:00:00 2001 From: blueboy Date: Sat, 17 Apr 2010 14:05:32 +0100 Subject: [PATCH 025/187] Update: Fix for 'Instance Teleport' crash issue --- src/game/PlayerbotAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index b9d70303c..865f0301b 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -2478,7 +2478,7 @@ bool PlayerbotAI::FollowCheckTeleport( WorldObject &obj ) { // if bot has strayed too far from the master, teleport bot - if (!m_bot->IsWithinDistInMap( &obj, 50, true )) + if (!m_bot->IsWithinDistInMap( &obj, 50, true ) && GetMaster()->isAlive()) { m_ignoreAIUpdatesUntilTime = time(0) + 6; PlayerbotChatHandler ch(GetMaster()); From 485b4e0c09b7a3f180c69890eac4effdfcb4f573 Mon Sep 17 00:00:00 2001 From: blueboy Date: Sat, 17 Apr 2010 22:42:35 +0100 Subject: [PATCH 026/187] 2nd Update: Fix for 'Instance Teleport' crash issue --- src/game/PlayerbotMgr.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/game/PlayerbotMgr.cpp b/src/game/PlayerbotMgr.cpp index c66b4835e..f917ea844 100644 --- a/src/game/PlayerbotMgr.cpp +++ b/src/game/PlayerbotMgr.cpp @@ -323,7 +323,18 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) } return; } - + case CMSG_SPIRIT_HEALER_ACTIVATE: + { + // sLog.outDebug("SpiritHealer is resurrecting the Player %s",m_master->GetName()); + for( PlayerBotMap::iterator itr=m_playerBots.begin(); itr!=m_playerBots.end(); ++itr ) + { + Player* const bot = itr->second; + Group *grp = bot->GetGroup(); + if(grp) + grp->RemoveMember(bot->GetGUID(),1); + } + return; + } /* case CMSG_NAME_QUERY: From e6363ea73b54177fbc814a5bf90cce83efca8359 Mon Sep 17 00:00:00 2001 From: blueboy Date: Mon, 19 Apr 2010 19:31:34 +0100 Subject: [PATCH 027/187] Repair for bots & new bot command 'stats' to replace 'free' (see bot_readme.txt) --- bot_readme.txt | 19 +++++++- src/game/PlayerbotAI.cpp | 98 +++++++++++++++++++++++++++++++++++---- src/game/PlayerbotAI.h | 27 ++++++----- src/game/PlayerbotMgr.cpp | 69 ++++++++++++++++++++++++++- 4 files changed, 191 insertions(+), 22 deletions(-) diff --git a/bot_readme.txt b/bot_readme.txt index 9a06ec301..ce2a9a89e 100644 --- a/bot_readme.txt +++ b/bot_readme.txt @@ -27,13 +27,30 @@ Commands: /t BOTNAME equip /t BOTNAME reset (will reset states, orders and loot list) /t BOTNAME report (bot reports all items needed to finish quests) -/t BOTNAME free (bot shows free empty space in its inventory) +/t BOTNAME stats (bot shows available money, free inventory space and estimated item repair costs) Shortcuts: c = cast e = equip u = use +Repair with bots: +================= + + The bot(s) can now be repaired, as the player repairs. You can decide whether you wish the bot(s) to pay for + their own repair or if available, use the guild bank. Choose the appropriate repair 'Anvil' at your local + NPC. Only group bot(s) members can be repaired. If you wish to exclude certain bot(s) from repair, then + temporarily uninvite bot(s) from the group. + + Limitations: Bot(s) cannot repair individual items. + If the player does not require repair, you cannot repair bot(s). + + The new 'stats' command provides useful information to help in the repair decision. + + First: Money available to bot(s) + Second: Free inventory slots for bot(s) + Third: Estimated (excludes NPC reputation discount) item damage cost for bot(s). + Combat Orders explained: ======================== diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index 865f0301b..46af0b121 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -504,7 +504,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) } } else if((pSpellInfo->EffectApplyAuraName[1] == SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED) - && (pSpellInfo->EffectApplyAuraName[2] == SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED)) + && (pSpellInfo->EffectApplyAuraName[2] == SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED)) { if((pSpellInfo->EffectBasePoints[1] == master_speed1) && (pSpellInfo->EffectBasePoints[2] == master_speed2)) @@ -514,7 +514,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) } } else if((pSpellInfo->EffectApplyAuraName[2] == SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED) - && (pSpellInfo->EffectApplyAuraName[1] == SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED)) + && (pSpellInfo->EffectApplyAuraName[1] == SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED)) { if((pSpellInfo->EffectBasePoints[2] == master_speed2) && (pSpellInfo->EffectBasePoints[1] == master_speed1)) @@ -1748,6 +1748,67 @@ void PlayerbotAI::UpdateAttackerInfo() //sLog.outBasic( "[PlayerbotAI]: };" ); } +uint32 PlayerbotAI::EstRepairAll() +{ + uint32 TotalCost = 0; + // equipped, backpack, bags itself + for(int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; ++i) + TotalCost += EstRepair(( (INVENTORY_SLOT_BAG_0 << 8) | i )); + + // bank, buyback and keys not repaired + + // items in inventory bags + for(int j = INVENTORY_SLOT_BAG_START; j < INVENTORY_SLOT_BAG_END; ++j) + for(int i = 0; i < MAX_BAG_SIZE; ++i) + TotalCost += EstRepair(( (j << 8) | i )); + return TotalCost; +} + +uint32 PlayerbotAI::EstRepair(uint16 pos) +{ + Item* item = m_bot->GetItemByPos(pos); + + uint32 TotalCost = 0; + if(!item) + return TotalCost; + + uint32 maxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY); + if(!maxDurability) + return TotalCost; + + uint32 curDurability = item->GetUInt32Value(ITEM_FIELD_DURABILITY); + + uint32 LostDurability = maxDurability - curDurability; + if(LostDurability>0) + { + ItemPrototype const *ditemProto = item->GetProto(); + + DurabilityCostsEntry const *dcost = sDurabilityCostsStore.LookupEntry(ditemProto->ItemLevel); + if(!dcost) + { + sLog.outError("RepairDurability: Wrong item lvl %u", ditemProto->ItemLevel); + return TotalCost; + } + + uint32 dQualitymodEntryId = (ditemProto->Quality+1)*2; + DurabilityQualityEntry const *dQualitymodEntry = sDurabilityQualityStore.LookupEntry(dQualitymodEntryId); + if(!dQualitymodEntry) + { + sLog.outError("RepairDurability: Wrong dQualityModEntry %u", dQualitymodEntryId); + return TotalCost; + } + + uint32 dmultiplier = dcost->multiplier[ItemSubClassToDurabilityMultiplierId(ditemProto->Class,ditemProto->SubClass)]; + uint32 costs = uint32(LostDurability*dmultiplier*double(dQualitymodEntry->quality_mod)); + + if (costs==0) //fix for ITEM_QUALITY_ARTIFACT + costs = 1; + + TotalCost = costs; + } + return TotalCost; +} + Unit *PlayerbotAI::FindAttacker( ATTACKERINFOTYPE ait, Unit *victim ) { // list empty? why are we here? @@ -2778,8 +2839,9 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) SendWhisper("and here's my attack spells:", fromPlayer); ch.SendSysMessage(negOut.str().c_str()); } - // Bag inventory project: 01:42 23/01/10 - else if (text == "free") + + // Bag inventory project: 10:00 19/04/10 version 1.0 + else if (text == "stats") { std::ostringstream out; @@ -2804,13 +2866,33 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) } } - out << totalfree << " Empty Slots (Total)"; + + // calculate how much money bot has + uint32 copper = m_bot->GetMoney(); + uint32 gold = uint32(copper / 10000); + copper -= (gold * 10000); + uint32 silver = uint32(copper / 100); + copper -= (silver * 100); + + out << "|cffffffff[|h|cff00ffff" << m_bot->GetName() << "|h|cffffffff]" << " has |r|cff00ff00" << gold + << "|r|cfffffc00g|r|cff00ff00" << silver + << "|r|cffcdcdcds|r|cff00ff00" << copper + << "|r|cffffd333c" << "|h|cffffffff bag slots |h|cff00ff00" << totalfree; + + // estimate how much item damage the bot has + copper = EstRepairAll(); + gold = uint32(copper / 10000); + copper -= (gold * 10000); + silver = uint32(copper / 100); + copper -= (silver * 100); + + out << "|h|cffffffff & item damage cost " << "|r|cff00ff00" << gold + << "|r|cfffffc00g|r|cff00ff00" << silver + << "|r|cffcdcdcds|r|cff00ff00" << copper + << "|r|cffffd333c"; ChatHandler ch(&fromPlayer); - SendWhisper("I have this much space ", fromPlayer); ch.SendSysMessage(out.str().c_str()); } - - else { // if this looks like an item link, reward item it completed quest and talking to NPC diff --git a/src/game/PlayerbotAI.h b/src/game/PlayerbotAI.h index 377dfaabe..61c1a6e54 100644 --- a/src/game/PlayerbotAI.h +++ b/src/game/PlayerbotAI.h @@ -27,23 +27,23 @@ class MANGOS_DLL_SPEC PlayerbotAI SCENARIO_PVPHARD }; - enum CombatStyle { - COMBAT_MELEE = 0x01, // class melee attacker - COMBAT_RANGED = 0x02 // class is ranged attacker - }; + enum CombatStyle { + COMBAT_MELEE = 0x01, // class melee attacker + COMBAT_RANGED = 0x02 // class is ranged attacker + }; // masters orders that should be obeyed by the AI during the updteAI routine // the master will auto set the target of the bot enum CombatOrderType { - ORDERS_NONE = 0x00, // no special orders given - ORDERS_TANK = 0x01, // bind attackers by gaining threat - ORDERS_ASSIST = 0x02, // assist someone (dps type) - ORDERS_HEAL = 0x04, // concentrate on healing (no attacks, only self defense) - ORDERS_PROTECT = 0x10, // combinable state: check if protectee is attacked - ORDERS_PRIMARY = 0x0F, - ORDERS_SECONDARY = 0xF0, - ORDERS_RESET = 0xFF + ORDERS_NONE = 0x00, // no special orders given + ORDERS_TANK = 0x01, // bind attackers by gaining threat + ORDERS_ASSIST = 0x02, // assist someone (dps type) + ORDERS_HEAL = 0x04, // concentrate on healing (no attacks, only self defense) + ORDERS_PROTECT = 0x10, // combinable state: check if protectee is attacked + ORDERS_PRIMARY = 0x0F, + ORDERS_SECONDARY = 0xF0, + ORDERS_RESET = 0xFF }; enum CombatTargetType @@ -197,6 +197,9 @@ class MANGOS_DLL_SPEC PlayerbotAI bool FollowCheckTeleport( WorldObject &obj ); void DoLoot(); + uint32 EstRepairAll(); + uint32 EstRepair(uint16 pos); + void AcceptQuest( Quest const *qInfo, Player *pGiver ); void TurnInQuests( WorldObject *questgiver ); diff --git a/src/game/PlayerbotMgr.cpp b/src/game/PlayerbotMgr.cpp index f917ea844..b97ba78dd 100644 --- a/src/game/PlayerbotMgr.cpp +++ b/src/game/PlayerbotMgr.cpp @@ -1,4 +1,3 @@ - #include "Config/ConfigEnv.h" #include "Player.h" #include "PlayerbotAI.h" @@ -9,6 +8,7 @@ #include "GossipDef.h" #include "Chat.h" #include "Language.h" +#include "Guild.h" class LoginQueryHolder; class CharacterHandler; @@ -323,6 +323,73 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) } return; } + case CMSG_REPAIR_ITEM: + { + + WorldPacket p(packet); // WorldPacket packet for CMSG_REPAIR_ITEM, (8+8+1) + + sLog.outDebug("PlayerbotMgr: CMSG_REPAIR_ITEM"); + + uint64 npcGUID, itemGUID; + uint8 guildBank; + + p.rpos(0); //reset packet pointer + p >> npcGUID; + p >> itemGUID; // Not used for bot but necessary opcode data retrieval + p >> guildBank; // Flagged if guild repair selected + + for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) + { + + Player* const bot = it->second; + if(!bot) + return; + + Group* group = bot->GetGroup(); // check if bot is a member of group + if(!group) + return; + + Creature *unit = bot->GetNPCIfCanInteractWith(npcGUID, UNIT_NPC_FLAG_REPAIR); + if (!unit) // Check if NPC can repair bot or not + { + sLog.outDebug("PlayerbotMgr: HandleRepairItemOpcode - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(npcGUID))); + return; + } + + // remove fake death + if(bot->hasUnitState(UNIT_STAT_DIED)) + bot->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); + + // reputation discount + float discountMod = bot->GetReputationPriceDiscount(unit); + + uint32 TotalCost = 0; + if (itemGUID) // Handle redundant feature (repair individual item) for bot + { + sLog.outDebug("ITEM: Repair single item is not applicable for %s",bot->GetName()); + continue; + } + else // Handle feature (repair all items) for bot + { + sLog.outDebug("ITEM: Repair all items, npcGUID = %u", GUID_LOPART(npcGUID)); + + TotalCost = bot->DurabilityRepairAll(true,discountMod,guildBank>0?true:false); + } + if (guildBank) // Handle guild repair + { + uint32 GuildId = bot->GetGuildId(); + if (!GuildId) + return; + Guild *pGuild = sObjectMgr.GetGuildById(GuildId); + if (!pGuild) + return; + pGuild->LogBankEvent(GUILD_BANK_LOG_REPAIR_MONEY, 0, bot->GetGUIDLow(), TotalCost); + pGuild->SendMoneyInfo(bot->GetSession(), bot->GetGUIDLow()); + } + + } + return; + } case CMSG_SPIRIT_HEALER_ACTIVATE: { // sLog.outDebug("SpiritHealer is resurrecting the Player %s",m_master->GetName()); From e0fe229609108ce8cbc36036452ca38fc7c08ce4 Mon Sep 17 00:00:00 2001 From: blueboy Date: Mon, 19 Apr 2010 19:58:42 +0100 Subject: [PATCH 028/187] Remove trailing whitespaces --- bot_readme.txt | 12 ++++++------ src/game/PlayerbotAI.cpp | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/bot_readme.txt b/bot_readme.txt index ce2a9a89e..bd7b0f47e 100644 --- a/bot_readme.txt +++ b/bot_readme.txt @@ -36,20 +36,20 @@ u = use Repair with bots: ================= - - The bot(s) can now be repaired, as the player repairs. You can decide whether you wish the bot(s) to pay for + + The bot(s) can now be repaired, as the player repairs. You can decide whether you wish the bot(s) to pay for their own repair or if available, use the guild bank. Choose the appropriate repair 'Anvil' at your local NPC. Only group bot(s) members can be repaired. If you wish to exclude certain bot(s) from repair, then temporarily uninvite bot(s) from the group. - Limitations: Bot(s) cannot repair individual items. + Limitations: Bot(s) cannot repair individual items. If the player does not require repair, you cannot repair bot(s). - + The new 'stats' command provides useful information to help in the repair decision. - + First: Money available to bot(s) Second: Free inventory slots for bot(s) - Third: Estimated (excludes NPC reputation discount) item damage cost for bot(s). + Third: Estimated (excludes NPC reputation discount) item damage cost for bot(s). Combat Orders explained: ======================== diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index 46af0b121..501d35584 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -2839,7 +2839,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) SendWhisper("and here's my attack spells:", fromPlayer); ch.SendSysMessage(negOut.str().c_str()); } - + // Bag inventory project: 10:00 19/04/10 version 1.0 else if (text == "stats") { From f9091226c782cf96393f82b090e3076a2a884b8f Mon Sep 17 00:00:00 2001 From: blueboy Date: Tue, 20 Apr 2010 23:45:12 +0100 Subject: [PATCH 029/187] Update available command text to include 'stats' --- src/game/PlayerbotAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index 501d35584..6e3637363 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -2944,7 +2944,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) } else { - std::string msg = "What? follow, stay, (c)ast , spells, (e)quip , (u)se , drop , report, quests"; + std::string msg = "What? follow, stay, (c)ast , spells, (e)quip , (u)se , drop , report, quests, stats"; SendWhisper(msg, fromPlayer); m_bot->HandleEmoteCommand(EMOTE_ONESHOT_TALK); } From 8f8f5ae64c53fe55c7de69e4b1185a1f5de47487 Mon Sep 17 00:00:00 2001 From: blueboy Date: Fri, 30 Apr 2010 21:30:33 +0100 Subject: [PATCH 030/187] Addition of new commands: 'survey', 'find' & 'get' (see bot_readme.txt) --- bot_readme.txt | 28 +++ src/game/PlayerbotAI.cpp | 376 ++++++++++++++++++++++++++++++++++++++- src/game/PlayerbotAI.h | 6 + 3 files changed, 409 insertions(+), 1 deletion(-) diff --git a/bot_readme.txt b/bot_readme.txt index bd7b0f47e..f4d497544 100644 --- a/bot_readme.txt +++ b/bot_readme.txt @@ -27,13 +27,41 @@ Commands: /t BOTNAME equip /t BOTNAME reset (will reset states, orders and loot list) /t BOTNAME report (bot reports all items needed to finish quests) +/t BOTNAME point (bot will attack selected target) /t BOTNAME stats (bot shows available money, free inventory space and estimated item repair costs) +/t BOTNAME survey (bot shows all available gameobjects, within a local perimeter around the bot) +/t BOTNAME find (bot will travel to the gameobject location and then wait) +/t BOTNAME get (bot will fetch the selected gameobject and then return to the player) Shortcuts: c = cast e = equip u = use +Gameobject interaction with bots: +================================= + + The bot(s) can now interact with gameobjects. This is particularly useful, in order to complete 'gather' type + quests (e.g Milly's harvest in Northshire). The bot(s) can also now, harvest 'ore deposits' and 'herbs' + + Three new commands have been introduced 'survey, 'find' & 'get', to facilitate this new feature. + + The 'survey' command provides the means for bot(s) to detect gameobjects in the world. It can be used to detect + available gameobjects local to a single bot, or more effectively (wider area) those for a party of bots. + + Suggestion: setup the 'survey' command as an assigned macro button, on the client (e.g /p survey). You can + then quickly refresh the gameobject list. + + Gameobject list (Currently bots can only interact with ore, herb and needed quest items) + --------------- + + [Copper Vein][Silverleaf][Earthroot][Milly's Harvest][Battered Chest][Food Crate] + + Then, use the 'find' or 'get' commands to interect with the gameobject. + + Using the gameobject list information, it is possible to locate and/or fetch each of the gameobjects. To select + a , hold down the shift key and click on the relevant link with your mouse. + Repair with bots: ================= diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index 6e3637363..cf4979545 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -2269,6 +2269,90 @@ Item* PlayerbotAI::FindItem(uint32 ItemId) return NULL; } +bool PlayerbotAI::HasPick() +{ + QueryResult *result; + + // list out equiped items + for( uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; slot++) + { + Item* const pItem = m_bot->GetItemByPos( INVENTORY_SLOT_BAG_0, slot ); + if (pItem ) + { + const ItemPrototype* const pItemProto = pItem->GetProto(); + if (!pItemProto ) + continue; + + result = WorldDatabase.PQuery("SELECT TotemCategory FROM item_template WHERE entry = '%i'", pItemProto->ItemId); + if (result) + { + Field *fields = result->Fetch(); + uint32 tc = fields[0].GetUInt32(); + // sLog.outDebug("HasPick %u",tc); + if(tc == 165 || tc == 167) // pick = 165, hammer = 162 or hammer pick = 167 + return true; + } + } + } + + // list out items in backpack + for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; slot++) + { + // sLog.outDebug("[%s's]backpack slot = %u",m_bot->GetName(),slot); // 23 to 38 = 16 + Item* const pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); // 255, 23 to 38 + if (pItem) + { + const ItemPrototype* const pItemProto = pItem->GetProto(); + if (!pItemProto ) + continue; + + result = WorldDatabase.PQuery("SELECT TotemCategory FROM item_template WHERE entry = '%i'", pItemProto->ItemId); + if (result) + { + Field *fields = result->Fetch(); + uint32 tc = fields[0].GetUInt32(); + // sLog.outDebug("HasPick %u",tc); + if(tc == 165 || tc == 167) // pick = 165, hammer = 162 or hammer pick = 167 + return true; + } + } + } + + // list out items in other removable backpacks + for (uint8 bag = INVENTORY_SLOT_BAG_START; bag < INVENTORY_SLOT_BAG_END; ++bag) // 20 to 23 = 4 + { + const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); // 255, 20 to 23 + if (pBag) + { + for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) + { + // sLog.outDebug("[%s's]bag[%u] slot = %u",m_bot->GetName(),bag,slot); // 1 to bagsize = ? + Item* const pItem = m_bot->GetItemByPos(bag, slot); // 20 to 23, 1 to bagsize + if (pItem) + { + const ItemPrototype* const pItemProto = pItem->GetProto(); + if (!pItemProto ) + continue; + + result = WorldDatabase.PQuery("SELECT TotemCategory FROM item_template WHERE entry = '%i'", pItemProto->ItemId); + if (result) + { + Field *fields = result->Fetch(); + uint32 tc = fields[0].GetUInt32(); + // sLog.outDebug("HasPick %u",tc); + if(tc == 165 || tc == 167) + return true; + } + } + } + } + } + std::ostringstream out; + out << "|cffffffffI do not have a pick!"; + TellMaster( out.str().c_str() ); + return false; +} + // extracts all item ids in format below // I decided to roll my own extractor rather then use the one in ChatHandler // because this one works on a const string, and it handles multiple links @@ -2293,6 +2377,75 @@ void PlayerbotAI::extractItemIds(const std::string& text, std::list& ite } } +bool PlayerbotAI::extractGOinfo(const std::string& text, uint32 &guid, uint32 &entry, int &mapid, float &x, float &y, float &z) const +{ + + // Link format + // |cFFFFFF00|Hfound:" << guid << ':' << entry << ':' << x << ':' << y << ':' << z << ':' << mapid << ':' << "|h[" << gInfo->name << "]|h|r"; + // |cFFFFFF00|Hfound:5093:1731:-9295:-270:81.874:0:|h[Copper Vein]|h|r + + uint8 pos = 0; + + // extract GO guid + int i = text.find("Hfound:", pos); // base H = 11 + if (i == -1) // break if error + return false; + + pos = i + 7; //start of window in text 11 + 7 = 18 + int endPos = text.find(':', pos); // end of window in text 22 + if (endPos == -1) //break if error + return false; + std::string guidC = text.substr(pos, endPos - pos); // get string within window i.e guid 22 - 18 = 4 + guid = atol(guidC.c_str()); // convert ascii to long int + + // extract GO entry + pos = endPos + 1; + endPos = text.find(':', pos); // end of window in text + if (endPos == -1) //break if error + return false; + + std::string entryC = text.substr(pos, endPos - pos); // get string within window i.e entry + entry = atol(entryC.c_str()); // convert ascii to float + + // extract GO x + pos = endPos + 1; + endPos = text.find(':', pos); // end of window in text + if (endPos == -1) //break if error + return false; + + std::string xC = text.substr(pos, endPos - pos); // get string within window i.e x + x = atof(xC.c_str()); // convert ascii to float + + // extract GO y + pos = endPos + 1; + endPos = text.find(':', pos); // end of window in text + if (endPos == -1) //break if error + return false; + + std::string yC = text.substr(pos, endPos - pos); // get string within window i.e y + y = atof(yC.c_str()); // convert ascii to float + + // extract GO z + pos = endPos + 1; + endPos = text.find(':', pos); // end of window in text + if (endPos == -1) //break if error + return false; + + std::string zC = text.substr(pos, endPos - pos); // get string within window i.e z + z = atof(zC.c_str()); // convert ascii to float + + //extract GO mapid + pos = endPos + 1; + endPos = text.find(':', pos); // end of window in text + if (endPos == -1) //break if error + return false; + + std::string mapidC = text.substr(pos, endPos - pos); // get string within window i.e mapid + mapid = atoi(mapidC.c_str()); // convert ascii to int + pos = endPos; // end + return true; +} + // extracts currency in #g#s#c format uint32 PlayerbotAI::extractMoney(const std::string& text) const { @@ -2740,6 +2893,167 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) EquipItem(**it); } + // find item in world + else if (text.size() > 2 && text.substr(0, 2) == "f " || text.size() > 5 && text.substr(0, 5) == "find ") + { + uint32 guid; + float x,y,z; + uint32 entry; + int mapid; + if(extractGOinfo(text, guid, entry, mapid, x, y, z)) + { // sLog.outDebug("find: guid : %u entry : %u x : (%f) y : (%f) z : (%f) mapid : %d",guid, entry, x, y, z, mapid); + m_bot->UpdateGroundPositionZ(x,y,z); + SetMovementOrder( MOVEMENT_STAY ); + m_bot->GetMotionMaster()->MovePoint( mapid, x, y, z ); + } + else + SendWhisper("I have no info on that object", fromPlayer); + } + + // get project: 10:50 29/04/10 rev.2 allows bots to loot gameobjects for quest items, herbs and minerals + else if (text.size() > 2 && text.substr(0, 2) == "g " || text.size() > 4 && text.substr(0, 4) == "get ") + { + uint32 guid; + float x,y,z; + uint32 entry; + int mapid; + if (extractGOinfo(text, guid, entry, mapid, x, y, z)) + { + + //sLog.outDebug("find: guid : %u entry : %u x : (%f) y : (%f) z : (%f) mapid : %d",guid, entry, x, y, z, mapid); + m_lootCurrent = MAKE_NEW_GUID(guid, entry, HIGHGUID_GAMEOBJECT); + GameObject *go = m_bot->GetMap()->GetGameObject(m_lootCurrent); + if (!go) + { + m_lootCurrent = 0; + return; + } + + if ( !go->isSpawned() ) + return; + + m_bot->UpdateGroundPositionZ(x,y,z); + m_bot->GetMotionMaster()->MovePoint( mapid, x, y, z ); + m_bot->SetPosition(x, y, z, m_bot->GetOrientation()); + m_bot->SendLoot( m_lootCurrent, LOOT_CORPSE ); + Loot *loot = &go->loot; + uint32 lootNum = loot->GetMaxSlotInLootFor( m_bot ); + //sLog.outDebug( "[PlayerbotAI]: GetGOType %u - %s looting: '%s' got %d items", go->GetGoType(), m_bot->GetName(), go->GetGOInfo()->name, loot->GetMaxSlotInLootFor( m_bot )); + for ( uint32 l=0; lLootItemInSlot( l, m_bot, &qitem, &ffaitem, &conditem ); + if ( !item ) + continue; + + if ( !qitem && item->is_blocked ) + { + m_bot->SendLootRelease( m_lootCurrent ); + continue; + } + + if ( m_needItemList[item->itemid]>0 ) + { + ItemPosCountVec dest; + if ( m_bot->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, item->itemid, item->count ) == EQUIP_ERR_OK ) + { + Item * newitem = m_bot->StoreNewItem( dest, item->itemid, true, item->randomPropertyId); + + if ( qitem ) + { + qitem->is_looted = true; + if ( item->freeforall || loot->GetPlayerQuestItems().size() == 1 ) + m_bot->SendNotifyLootItemRemoved( l ); + else + loot->NotifyQuestItemRemoved( qitem->index ); + } + else + { + if ( ffaitem ) + { + ffaitem->is_looted=true; + m_bot->SendNotifyLootItemRemoved( l ); + } + else + { + if ( conditem ) + conditem->is_looted=true; + loot->NotifyItemRemoved( l ); + } + } + if (!item->freeforall) + item->is_looted = true; + --loot->unlootedCount; + m_bot->SendNewItem( newitem, uint32(item->count), false, false, true ); + m_bot->GetAchievementMgr().UpdateAchievementCriteria( ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item->itemid, item->count ); + } + } + + uint32 lockId = go->GetGOInfo()->GetLockId(); + LockEntry const *lockInfo = sLockStore.LookupEntry(lockId); + + if(lockInfo) + { + uint32 skillId = SkillByLockType(LockType(lockInfo->Index[0])); + + switch(skillId) + { + case SKILL_MINING: + + if (m_bot->HasSkill(SKILL_MINING) && HasPick()) // Has skill & suitable pick + { + ItemPosCountVec dest; + if ( m_bot->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, item->itemid, item->count) == EQUIP_ERR_OK ) + { + Item* pItem = m_bot->StoreNewItem (dest,item->itemid,true,item->randomPropertyId); + uint32 reqSkillValue = lockInfo->Skill[0]; + uint32 SkillValue = m_bot->GetPureSkillValue(SKILL_MINING); + if (SkillValue >= reqSkillValue) + { + m_bot->SendNewItem(pItem, uint32(item->count), false, false, true); + m_bot->UpdateGatherSkill(SKILL_MINING, SkillValue, reqSkillValue); + --loot->unlootedCount; + } + } + } + break; + + case SKILL_HERBALISM: + + if (m_bot->HasSkill(SKILL_HERBALISM)) // Has skill + { + ItemPosCountVec dest; + if ( m_bot->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, item->itemid, item->count) == EQUIP_ERR_OK ) + { + Item* pItem = m_bot->StoreNewItem (dest,item->itemid,true,item->randomPropertyId); + uint32 reqSkillValue = lockInfo->Skill[0]; + uint32 SkillValue = m_bot->GetPureSkillValue(SKILL_HERBALISM); + if (SkillValue >= reqSkillValue) + { + m_bot->SendNewItem(pItem, uint32(item->count), false, false, true); + m_bot->UpdateGatherSkill(SKILL_HERBALISM, SkillValue, reqSkillValue); + --loot->unlootedCount; + } + } + } + break; + } + } + } + // release loot + m_bot->GetSession()->DoLootRelease( m_lootCurrent ); + + // clear movement target, take next target on next update + m_bot->GetMotionMaster()->Clear(); + m_bot->GetMotionMaster()->MoveIdle(); + // sLog.outDebug( "[PlayerbotAI]: %s looted target 0x%08X", m_bot->GetName(), m_lootCurrent ); + SetQuestNeedItems(); + } + else + SendWhisper("I have no info on that object", fromPlayer); + } + else if (text == "quests") { bool hasIncompleteQuests = false; @@ -2840,7 +3154,67 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) ch.SendSysMessage(negOut.str().c_str()); } - // Bag inventory project: 10:00 19/04/10 version 1.0 + // survey project: 18:30 29/04/10 rev.3 filter out event triggered objects & now updates list + else if (text == "survey") + { + uint32 count = 0; + std::ostringstream detectout; + QueryResult *result; + GameEventMgr::ActiveEvents const& activeEventsList = sGameEventMgr.GetActiveEventList(); + std::ostringstream eventFilter; + eventFilter << " AND (event IS NULL "; + bool initString = true; + + for (GameEventMgr::ActiveEvents::const_iterator itr = activeEventsList.begin(); itr != activeEventsList.end(); ++itr) + { + if (initString) + { + eventFilter << "OR event IN (" <<*itr; + initString =false; + } + else + eventFilter << "," << *itr; + } + + if (!initString) + eventFilter << "))"; + else + eventFilter << ")"; + + result = WorldDatabase.PQuery("SELECT gameobject.guid, id, position_x, position_y, position_z, map, " + "(POW(position_x - %f, 2) + POW(position_y - %f, 2) + POW(position_z - %f, 2)) AS order_ FROM gameobject " + "LEFT OUTER JOIN game_event_gameobject on gameobject.guid=game_event_gameobject.guid WHERE map = '%i' %s ORDER BY order_ ASC LIMIT 10", + m_bot->GetPositionX(), m_bot->GetPositionY(), m_bot->GetPositionZ(), m_bot->GetMapId(),eventFilter.str().c_str()); + + if (result) + { + do + { + Field *fields = result->Fetch(); + uint32 guid = fields[0].GetUInt32(); + uint32 entry = fields[1].GetUInt32(); + float x = fields[2].GetFloat(); + float y = fields[3].GetFloat(); + float z = fields[4].GetFloat(); + int mapid = fields[5].GetUInt16(); + + GameObject *go = m_bot->GetMap()->GetGameObject(MAKE_NEW_GUID(guid, entry, HIGHGUID_GAMEOBJECT)); + if (!go) + continue; + + if ( !go->isSpawned() ) + continue; + + detectout << "|cFFFFFF00|Hfound:" << guid << ":" << entry << ":" << x << ":" << y << ":" << z << ":" << mapid << ":" << "|h[" << go->GetGOInfo()->name << "]|h|r"; + ++count; + } while (result->NextRow()); + + delete result; + } + SendWhisper(detectout.str().c_str(), fromPlayer); + } + + // stats project: 10:00 19/04/10 rev.1 display bot statistics else if (text == "stats") { std::ostringstream out; diff --git a/src/game/PlayerbotAI.h b/src/game/PlayerbotAI.h index 61c1a6e54..ef4383fc4 100644 --- a/src/game/PlayerbotAI.h +++ b/src/game/PlayerbotAI.h @@ -3,6 +3,7 @@ #include "Common.h" #include "QuestDef.h" +#include "GameEventMgr.h" class WorldPacket; class WorldObject; @@ -129,6 +130,9 @@ class MANGOS_DLL_SPEC PlayerbotAI // extracts currency from a string as #g#s#c and returns the total in copper uint32 extractMoney(const std::string& text) const; + // extracts gameobject info from link + bool extractGOinfo(const std::string& text, uint32 &guid, uint32 &entry, int &mapid, float &x, float &y, float &z) const; + // finds items in bots equipment and adds them to foundItemList, removes found items from itemIdSearchList void findItemsInEquip(std::list& itemIdSearchList, std::list& foundItemList) const; // finds items in bots inventory and adds them to foundItemList, removes found items from itemIdSearchList @@ -144,6 +148,8 @@ class MANGOS_DLL_SPEC PlayerbotAI bool HasAura(const char* spellName, const Unit& player) const; bool HasAura(const char* spellName) const; + bool HasPick(); + uint8 GetHealthPercent(const Unit& target) const; uint8 GetHealthPercent() const; uint8 GetBaseManaPercent(const Unit& target) const; From 19b1aa5a912540d924e883b9977f9e17f18ee055 Mon Sep 17 00:00:00 2001 From: blueboy Date: Fri, 7 May 2010 21:01:59 +0100 Subject: [PATCH 031/187] Revised 'get' command (rev.3), quest items & lootable gameobjects --- src/game/PlayerbotAI.cpp | 107 ++++++++++++++++++++++----------------- 1 file changed, 61 insertions(+), 46 deletions(-) diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index cf4979545..5403d4ff2 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -2910,13 +2910,14 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) SendWhisper("I have no info on that object", fromPlayer); } - // get project: 10:50 29/04/10 rev.2 allows bots to loot gameobjects for quest items, herbs and minerals + // get project: 18:50 03/05/10 rev.3 allows bots to retrieve all lootable & quest items from gameobjects else if (text.size() > 2 && text.substr(0, 2) == "g " || text.size() > 4 && text.substr(0, 4) == "get ") { uint32 guid; float x,y,z; uint32 entry; int mapid; + bool looted = false; if (extractGOinfo(text, guid, entry, mapid, x, y, z)) { @@ -2938,10 +2939,37 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) m_bot->SendLoot( m_lootCurrent, LOOT_CORPSE ); Loot *loot = &go->loot; uint32 lootNum = loot->GetMaxSlotInLootFor( m_bot ); - //sLog.outDebug( "[PlayerbotAI]: GetGOType %u - %s looting: '%s' got %d items", go->GetGoType(), m_bot->GetName(), go->GetGOInfo()->name, loot->GetMaxSlotInLootFor( m_bot )); + // sLog.outDebug( "[PlayerbotAI]: GetGOType %u - %s looting: '%s' got %d items", go->GetGoType(), m_bot->GetName(), go->GetGOInfo()->name, loot->GetMaxSlotInLootFor( m_bot )); + if(lootNum == 0) // Handle opening gameobjects that contain no items + { + uint32 lockId = go->GetGOInfo()->GetLockId(); + LockEntry const *lockInfo = sLockStore.LookupEntry(lockId); + if(lockInfo) + { + for(int i = 0; i < 8; ++i) + { + uint32 skillId = SkillByLockType(LockType(lockInfo->Index[i])); + if(skillId > 0) + { + if (m_bot->HasSkill(skillId)) // Has skill + { + uint32 reqSkillValue = lockInfo->Skill[i]; + uint32 SkillValue = m_bot->GetPureSkillValue(skillId); + if (SkillValue >= reqSkillValue) + { + // sLog.outDebug("[PlayerbotAI]i: skillId : %u SkillValue : %u reqSkillValue : %u",skillId,SkillValue,reqSkillValue); + m_bot->UpdateGatherSkill(skillId, SkillValue, reqSkillValue); + looted = true; + } + } + break; + } + } + } + } for ( uint32 l=0; lLootItemInSlot( l, m_bot, &qitem, &ffaitem, &conditem ); if ( !item ) @@ -2987,66 +3015,53 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) --loot->unlootedCount; m_bot->SendNewItem( newitem, uint32(item->count), false, false, true ); m_bot->GetAchievementMgr().UpdateAchievementCriteria( ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item->itemid, item->count ); + looted = true; } + continue; } uint32 lockId = go->GetGOInfo()->GetLockId(); LockEntry const *lockInfo = sLockStore.LookupEntry(lockId); - if(lockInfo) { - uint32 skillId = SkillByLockType(LockType(lockInfo->Index[0])); - - switch(skillId) + uint32 skillId = 0; + uint32 reqSkillValue = 0; + for(int i = 0; i < 8; ++i) { - case SKILL_MINING: - - if (m_bot->HasSkill(SKILL_MINING) && HasPick()) // Has skill & suitable pick - { - ItemPosCountVec dest; - if ( m_bot->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, item->itemid, item->count) == EQUIP_ERR_OK ) - { - Item* pItem = m_bot->StoreNewItem (dest,item->itemid,true,item->randomPropertyId); - uint32 reqSkillValue = lockInfo->Skill[0]; - uint32 SkillValue = m_bot->GetPureSkillValue(SKILL_MINING); - if (SkillValue >= reqSkillValue) - { - m_bot->SendNewItem(pItem, uint32(item->count), false, false, true); - m_bot->UpdateGatherSkill(SKILL_MINING, SkillValue, reqSkillValue); - --loot->unlootedCount; - } - } - } + skillId = SkillByLockType(LockType(lockInfo->Index[i])); + if(skillId > 0) + { + reqSkillValue = lockInfo->Skill[i]; break; + } + } - case SKILL_HERBALISM: + if (m_bot->HasSkill(skillId) || skillId == SKILL_NONE) // Has skill or skill not required + { + if((skillId == SKILL_MINING) && !HasPick()) + continue; - if (m_bot->HasSkill(SKILL_HERBALISM)) // Has skill + ItemPosCountVec dest; + if ( m_bot->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, item->itemid, item->count) == EQUIP_ERR_OK ) + { + Item* pItem = m_bot->StoreNewItem (dest,item->itemid,true,item->randomPropertyId); + uint32 SkillValue = m_bot->GetPureSkillValue(skillId); + if (SkillValue >= reqSkillValue) { - ItemPosCountVec dest; - if ( m_bot->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, item->itemid, item->count) == EQUIP_ERR_OK ) - { - Item* pItem = m_bot->StoreNewItem (dest,item->itemid,true,item->randomPropertyId); - uint32 reqSkillValue = lockInfo->Skill[0]; - uint32 SkillValue = m_bot->GetPureSkillValue(SKILL_HERBALISM); - if (SkillValue >= reqSkillValue) - { - m_bot->SendNewItem(pItem, uint32(item->count), false, false, true); - m_bot->UpdateGatherSkill(SKILL_HERBALISM, SkillValue, reqSkillValue); - --loot->unlootedCount; - } - } + m_bot->SendNewItem(pItem, uint32(item->count), false, false, true); + m_bot->UpdateGatherSkill(skillId, SkillValue, reqSkillValue); + --loot->unlootedCount; + looted = true; } - break; + } } } } // release loot - m_bot->GetSession()->DoLootRelease( m_lootCurrent ); - - // clear movement target, take next target on next update - m_bot->GetMotionMaster()->Clear(); - m_bot->GetMotionMaster()->MoveIdle(); + if(looted) + m_bot->GetSession()->DoLootRelease( m_lootCurrent ); + else + m_bot->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_LOOTING); // sLog.outDebug( "[PlayerbotAI]: %s looted target 0x%08X", m_bot->GetName(), m_lootCurrent ); SetQuestNeedItems(); } From 301da603baef71dc4fe80fde6b3ee5e475a452b5 Mon Sep 17 00:00:00 2001 From: blueboy Date: Mon, 17 May 2010 15:41:50 +0100 Subject: [PATCH 032/187] Fix for 'cast' command. Spell must now be in spellbook, to use. Thanks to KiriX --- src/game/PlayerbotAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/PlayerbotAI.cpp b/src/game/PlayerbotAI.cpp index 5403d4ff2..99852ea90 100644 --- a/src/game/PlayerbotAI.cpp +++ b/src/game/PlayerbotAI.cpp @@ -2864,7 +2864,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) spellId = getSpellId(spellStr.c_str(), true); uint64 castOnGuid = fromPlayer.GetSelection(); - if (spellId != 0 && castOnGuid != 0) + if (spellId != 0 && castOnGuid != 0 && m_bot->HasSpell(spellId)) { m_spellIdCommand = spellId; m_targetGuidCommand = castOnGuid; From 84ef54083785ec42b587667d07f9f5a008e4e650 Mon Sep 17 00:00:00 2001 From: blueboy Date: Thu, 3 Jun 2010 10:44:33 +0100 Subject: [PATCH 033/187] Playerbot file migration & new config file --- configure.ac | 8 ++- src/game/Makefile.am | 53 ++++++++++--------- src/game/playerbot/Makefile.am | 43 +++++++++++++++ src/game/{ => playerbot}/PlayerbotAI.cpp | 0 src/game/{ => playerbot}/PlayerbotAI.h | 0 src/game/{ => playerbot}/PlayerbotClassAI.cpp | 0 src/game/{ => playerbot}/PlayerbotClassAI.h | 0 .../PlayerbotDeathKnightAI.cpp | 0 .../{ => playerbot}/PlayerbotDeathKnightAI.h | 0 src/game/{ => playerbot}/PlayerbotDruidAI.cpp | 0 src/game/{ => playerbot}/PlayerbotDruidAI.h | 0 .../{ => playerbot}/PlayerbotHunterAI.cpp | 0 src/game/{ => playerbot}/PlayerbotHunterAI.h | 0 src/game/{ => playerbot}/PlayerbotMageAI.cpp | 0 src/game/{ => playerbot}/PlayerbotMageAI.h | 0 src/game/{ => playerbot}/PlayerbotMgr.cpp | 0 src/game/{ => playerbot}/PlayerbotMgr.h | 0 .../{ => playerbot}/PlayerbotPaladinAI.cpp | 0 src/game/{ => playerbot}/PlayerbotPaladinAI.h | 0 .../{ => playerbot}/PlayerbotPriestAI.cpp | 0 src/game/{ => playerbot}/PlayerbotPriestAI.h | 0 src/game/{ => playerbot}/PlayerbotRogueAI.cpp | 0 src/game/{ => playerbot}/PlayerbotRogueAI.h | 0 .../{ => playerbot}/PlayerbotShamanAI.cpp | 0 src/game/{ => playerbot}/PlayerbotShamanAI.h | 0 .../{ => playerbot}/PlayerbotWarlockAI.cpp | 0 src/game/{ => playerbot}/PlayerbotWarlockAI.h | 0 .../{ => playerbot}/PlayerbotWarriorAI.cpp | 0 src/game/{ => playerbot}/PlayerbotWarriorAI.h | 0 src/game/playerbot/playerbot.conf.dist.in | 39 ++++++++++++++ win/VC90/game.vcproj | 50 ++++++++--------- 31 files changed, 141 insertions(+), 52 deletions(-) create mode 100644 src/game/playerbot/Makefile.am rename src/game/{ => playerbot}/PlayerbotAI.cpp (100%) rename src/game/{ => playerbot}/PlayerbotAI.h (100%) rename src/game/{ => playerbot}/PlayerbotClassAI.cpp (100%) rename src/game/{ => playerbot}/PlayerbotClassAI.h (100%) rename src/game/{ => playerbot}/PlayerbotDeathKnightAI.cpp (100%) rename src/game/{ => playerbot}/PlayerbotDeathKnightAI.h (100%) rename src/game/{ => playerbot}/PlayerbotDruidAI.cpp (100%) rename src/game/{ => playerbot}/PlayerbotDruidAI.h (100%) rename src/game/{ => playerbot}/PlayerbotHunterAI.cpp (100%) rename src/game/{ => playerbot}/PlayerbotHunterAI.h (100%) rename src/game/{ => playerbot}/PlayerbotMageAI.cpp (100%) rename src/game/{ => playerbot}/PlayerbotMageAI.h (100%) rename src/game/{ => playerbot}/PlayerbotMgr.cpp (100%) rename src/game/{ => playerbot}/PlayerbotMgr.h (100%) rename src/game/{ => playerbot}/PlayerbotPaladinAI.cpp (100%) rename src/game/{ => playerbot}/PlayerbotPaladinAI.h (100%) rename src/game/{ => playerbot}/PlayerbotPriestAI.cpp (100%) rename src/game/{ => playerbot}/PlayerbotPriestAI.h (100%) rename src/game/{ => playerbot}/PlayerbotRogueAI.cpp (100%) rename src/game/{ => playerbot}/PlayerbotRogueAI.h (100%) rename src/game/{ => playerbot}/PlayerbotShamanAI.cpp (100%) rename src/game/{ => playerbot}/PlayerbotShamanAI.h (100%) rename src/game/{ => playerbot}/PlayerbotWarlockAI.cpp (100%) rename src/game/{ => playerbot}/PlayerbotWarlockAI.h (100%) rename src/game/{ => playerbot}/PlayerbotWarriorAI.cpp (100%) rename src/game/{ => playerbot}/PlayerbotWarriorAI.h (100%) create mode 100644 src/game/playerbot/playerbot.conf.dist.in diff --git a/configure.ac b/configure.ac index 1fc4248ff..9956c4f5b 100644 --- a/configure.ac +++ b/configure.ac @@ -302,12 +302,18 @@ AC_CONFIG_FILES([ src/shared/vmap/Makefile src/shared/SystemConfig.h src/game/Makefile + src/game/playerbot/Makefile + src/game/playerbot/playerbot.conf.dist src/realmd/Makefile src/realmd/realmd.conf.dist src/mangosd/Makefile src/mangosd/mangosd.conf.dist src/bindings/Makefile - src/bindings/universal/Makefile + src/bindings/ScriptDev2/Makefile + src/bindings/ScriptDev2/scriptdev2.conf.dist + src/bindings/ScriptDev2/config.h + src/bindings/ScriptDev2/sql/Makefile + src/bindings/ScriptDev2/sql/Updates/Makefile ]) ## Configure ACE, if needed diff --git a/src/game/Makefile.am b/src/game/Makefile.am index bff065492..f8c06c617 100644 --- a/src/game/Makefile.am +++ b/src/game/Makefile.am @@ -17,6 +17,7 @@ ## Process this file with automake to produce Makefile.in ## Sub-directories to parse +SUBDIRS = playerbot ## CPP flags for includes, defines, etc. AM_CPPFLAGS = $(MANGOS_INCLUDES) -I$(top_builddir)/src/shared -I$(srcdir) -I$(srcdir)/../../dep/include -I$(srcdir)/../framework -I$(srcdir)/../shared -I$(srcdir)/../shared/vmap -I$(srcdir)/../realmd -DSYSCONFDIR=\"$(sysconfdir)/\" @@ -214,32 +215,32 @@ libmangosgame_a_SOURCES = \ PetitionsHandler.cpp \ Player.cpp \ Player.h \ - PlayerbotMgr.cpp \ - PlayerbotMgr.h \ - PlayerbotAI.cpp \ - PlayerbotAI.h \ - PlayerbotClassAI.cpp \ - PlayerbotClassAI.h \ - PlayerbotDeathKnightAI.cpp \ - PlayerbotDeathKnightAI.h \ - PlayerbotDruidAI.cpp \ - PlayerbotDruidAI.h \ - PlayerbotHunterAI.cpp \ - PlayerbotHunterAI.h \ - PlayerbotMageAI.cpp \ - PlayerbotMageAI.h \ - PlayerbotPaladinAI.cpp \ - PlayerbotPaladinAI.h \ - PlayerbotPriestAI.cpp \ - PlayerbotPriestAI.h \ - PlayerbotRogueAI.cpp \ - PlayerbotRogueAI.h \ - PlayerbotShamanAI.cpp \ - PlayerbotShamanAI.h \ - PlayerbotWarlockAI.cpp \ - PlayerbotWarlockAI.h \ - PlayerbotWarriorAI.cpp \ - PlayerbotWarriorAI.h \ + playerbot/PlayerbotMgr.cpp \ + playerbot/PlayerbotMgr.h \ + playerbot/PlayerbotAI.cpp \ + playerbot/PlayerbotAI.h \ + playerbot/PlayerbotClassAI.cpp \ + playerbot/PlayerbotClassAI.h \ + playerbot/PlayerbotDeathKnightAI.cpp \ + playerbot/PlayerbotDeathKnightAI.h \ + playerbot/PlayerbotDruidAI.cpp \ + playerbot/PlayerbotDruidAI.h \ + playerbot/PlayerbotHunterAI.cpp \ + playerbot/PlayerbotHunterAI.h \ + playerbot/PlayerbotMageAI.cpp \ + playerbot/PlayerbotMageAI.h \ + playerbot/PlayerbotPaladinAI.cpp \ + playerbot/PlayerbotPaladinAI.h \ + playerbot/PlayerbotPriestAI.cpp \ + playerbot/PlayerbotPriestAI.h \ + playerbot/PlayerbotRogueAI.cpp \ + playerbot/PlayerbotRogueAI.h \ + playerbot/PlayerbotShamanAI.cpp \ + playerbot/PlayerbotShamanAI.h \ + playerbot/PlayerbotWarlockAI.cpp \ + playerbot/PlayerbotWarlockAI.h \ + playerbot/PlayerbotWarriorAI.cpp \ + playerbot/PlayerbotWarriorAI.h \ PlayerDump.cpp \ PlayerDump.h \ PointMovementGenerator.cpp \ diff --git a/src/game/playerbot/Makefile.am b/src/game/playerbot/Makefile.am new file mode 100644 index 000000000..5e9c6c28f --- /dev/null +++ b/src/game/playerbot/Makefile.am @@ -0,0 +1,43 @@ +# Copyright (C) 2005-2010 MaNGOS +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +## Process this file with automake to produce Makefile.in + +## Sub-directories to parse + +## Additional files to include when running 'make dist' +# Include world daemon configuration +EXTRA_DIST = \ + playerbot.conf.dist + +## Additional files to install +sysconf_DATA = \ + playerbot.conf.dist + +install-data-hook: + @list='$(sysconf_DATA)' + for p in $$list; do \ + dest=`echo $$p | sed -e s/.dist//`; \ + if test -f $(DESTDIR)$(sysconfdir)/$$dest; then \ + echo "$@ will not overwrite existing $(DESTDIR)$(sysconfdir)/$$dest"; \ + else \ + echo " $(INSTALL_DATA) $$p $(DESTDIR)$(sysconfdir)/$$dest"; \ + $(INSTALL_DATA) $$p $(DESTDIR)$(sysconfdir)/$$dest; \ + fi; \ + done + +clean-local: + rm -f $(sysconf_DATA) diff --git a/src/game/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp similarity index 100% rename from src/game/PlayerbotAI.cpp rename to src/game/playerbot/PlayerbotAI.cpp diff --git a/src/game/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h similarity index 100% rename from src/game/PlayerbotAI.h rename to src/game/playerbot/PlayerbotAI.h diff --git a/src/game/PlayerbotClassAI.cpp b/src/game/playerbot/PlayerbotClassAI.cpp similarity index 100% rename from src/game/PlayerbotClassAI.cpp rename to src/game/playerbot/PlayerbotClassAI.cpp diff --git a/src/game/PlayerbotClassAI.h b/src/game/playerbot/PlayerbotClassAI.h similarity index 100% rename from src/game/PlayerbotClassAI.h rename to src/game/playerbot/PlayerbotClassAI.h diff --git a/src/game/PlayerbotDeathKnightAI.cpp b/src/game/playerbot/PlayerbotDeathKnightAI.cpp similarity index 100% rename from src/game/PlayerbotDeathKnightAI.cpp rename to src/game/playerbot/PlayerbotDeathKnightAI.cpp diff --git a/src/game/PlayerbotDeathKnightAI.h b/src/game/playerbot/PlayerbotDeathKnightAI.h similarity index 100% rename from src/game/PlayerbotDeathKnightAI.h rename to src/game/playerbot/PlayerbotDeathKnightAI.h diff --git a/src/game/PlayerbotDruidAI.cpp b/src/game/playerbot/PlayerbotDruidAI.cpp similarity index 100% rename from src/game/PlayerbotDruidAI.cpp rename to src/game/playerbot/PlayerbotDruidAI.cpp diff --git a/src/game/PlayerbotDruidAI.h b/src/game/playerbot/PlayerbotDruidAI.h similarity index 100% rename from src/game/PlayerbotDruidAI.h rename to src/game/playerbot/PlayerbotDruidAI.h diff --git a/src/game/PlayerbotHunterAI.cpp b/src/game/playerbot/PlayerbotHunterAI.cpp similarity index 100% rename from src/game/PlayerbotHunterAI.cpp rename to src/game/playerbot/PlayerbotHunterAI.cpp diff --git a/src/game/PlayerbotHunterAI.h b/src/game/playerbot/PlayerbotHunterAI.h similarity index 100% rename from src/game/PlayerbotHunterAI.h rename to src/game/playerbot/PlayerbotHunterAI.h diff --git a/src/game/PlayerbotMageAI.cpp b/src/game/playerbot/PlayerbotMageAI.cpp similarity index 100% rename from src/game/PlayerbotMageAI.cpp rename to src/game/playerbot/PlayerbotMageAI.cpp diff --git a/src/game/PlayerbotMageAI.h b/src/game/playerbot/PlayerbotMageAI.h similarity index 100% rename from src/game/PlayerbotMageAI.h rename to src/game/playerbot/PlayerbotMageAI.h diff --git a/src/game/PlayerbotMgr.cpp b/src/game/playerbot/PlayerbotMgr.cpp similarity index 100% rename from src/game/PlayerbotMgr.cpp rename to src/game/playerbot/PlayerbotMgr.cpp diff --git a/src/game/PlayerbotMgr.h b/src/game/playerbot/PlayerbotMgr.h similarity index 100% rename from src/game/PlayerbotMgr.h rename to src/game/playerbot/PlayerbotMgr.h diff --git a/src/game/PlayerbotPaladinAI.cpp b/src/game/playerbot/PlayerbotPaladinAI.cpp similarity index 100% rename from src/game/PlayerbotPaladinAI.cpp rename to src/game/playerbot/PlayerbotPaladinAI.cpp diff --git a/src/game/PlayerbotPaladinAI.h b/src/game/playerbot/PlayerbotPaladinAI.h similarity index 100% rename from src/game/PlayerbotPaladinAI.h rename to src/game/playerbot/PlayerbotPaladinAI.h diff --git a/src/game/PlayerbotPriestAI.cpp b/src/game/playerbot/PlayerbotPriestAI.cpp similarity index 100% rename from src/game/PlayerbotPriestAI.cpp rename to src/game/playerbot/PlayerbotPriestAI.cpp diff --git a/src/game/PlayerbotPriestAI.h b/src/game/playerbot/PlayerbotPriestAI.h similarity index 100% rename from src/game/PlayerbotPriestAI.h rename to src/game/playerbot/PlayerbotPriestAI.h diff --git a/src/game/PlayerbotRogueAI.cpp b/src/game/playerbot/PlayerbotRogueAI.cpp similarity index 100% rename from src/game/PlayerbotRogueAI.cpp rename to src/game/playerbot/PlayerbotRogueAI.cpp diff --git a/src/game/PlayerbotRogueAI.h b/src/game/playerbot/PlayerbotRogueAI.h similarity index 100% rename from src/game/PlayerbotRogueAI.h rename to src/game/playerbot/PlayerbotRogueAI.h diff --git a/src/game/PlayerbotShamanAI.cpp b/src/game/playerbot/PlayerbotShamanAI.cpp similarity index 100% rename from src/game/PlayerbotShamanAI.cpp rename to src/game/playerbot/PlayerbotShamanAI.cpp diff --git a/src/game/PlayerbotShamanAI.h b/src/game/playerbot/PlayerbotShamanAI.h similarity index 100% rename from src/game/PlayerbotShamanAI.h rename to src/game/playerbot/PlayerbotShamanAI.h diff --git a/src/game/PlayerbotWarlockAI.cpp b/src/game/playerbot/PlayerbotWarlockAI.cpp similarity index 100% rename from src/game/PlayerbotWarlockAI.cpp rename to src/game/playerbot/PlayerbotWarlockAI.cpp diff --git a/src/game/PlayerbotWarlockAI.h b/src/game/playerbot/PlayerbotWarlockAI.h similarity index 100% rename from src/game/PlayerbotWarlockAI.h rename to src/game/playerbot/PlayerbotWarlockAI.h diff --git a/src/game/PlayerbotWarriorAI.cpp b/src/game/playerbot/PlayerbotWarriorAI.cpp similarity index 100% rename from src/game/PlayerbotWarriorAI.cpp rename to src/game/playerbot/PlayerbotWarriorAI.cpp diff --git a/src/game/PlayerbotWarriorAI.h b/src/game/playerbot/PlayerbotWarriorAI.h similarity index 100% rename from src/game/PlayerbotWarriorAI.h rename to src/game/playerbot/PlayerbotWarriorAI.h diff --git a/src/game/playerbot/playerbot.conf.dist.in b/src/game/playerbot/playerbot.conf.dist.in new file mode 100644 index 000000000..a44bd73c3 --- /dev/null +++ b/src/game/playerbot/playerbot.conf.dist.in @@ -0,0 +1,39 @@ +##################################### +# Playerbot Configuration file # +##################################### +ConfVersion=2010060201 + +################################################################################################################### +# PLAYERBOTAI CONFIGURATION +# +# PlayerbotAI.DisableBots +# Disable the bot command and bot menu +# Default: 0 - off +# 1 - on +# +# PlayerbotAI.DebugWhisper +# Enable debug output by whispering master +# Default: 0 - off +# 1 - on +# +# PlayerbotAI.FollowDistanceMin +# PlayerbotAI.FollowDistanceMax +# Min. and Max. follow distance for bots +# Default: 0.5 / 1.0 +# +# PlayerbotAI.MaxNumBots +# Limits the number of bots per account (Max 9) +# Default: 9 +# +# PlayerbotAI.RestrictBotLevel +# Restrict the allowed bot level (Current Max 80) +# Default: 80 +# +################################################################################################################### + +PlayerbotAI.DisableBots = 0 +PlayerbotAI.DebugWhisper = 0 +PlayerbotAI.FollowDistanceMin = 0.5 +PlayerbotAI.FollowDistanceMax = 1.0 +PlayerbotAI.MaxNumBots = 9 +PlayerbotAI.RestrictBotLevel = 80 diff --git a/win/VC90/game.vcproj b/win/VC90/game.vcproj index 062f861a3..4dccd4f68 100644 --- a/win/VC90/game.vcproj +++ b/win/VC90/game.vcproj @@ -1359,95 +1359,95 @@ > Date: Thu, 3 Jun 2010 11:15:16 +0100 Subject: [PATCH 034/187] Adjust header paths --- src/game/ChatHandler.cpp | 2 +- src/game/Group.cpp | 2 +- src/game/Player.cpp | 4 ++-- src/game/Player.h | 4 ++-- src/game/QuestHandler.cpp | 2 +- src/game/WorldSession.cpp | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/game/ChatHandler.cpp b/src/game/ChatHandler.cpp index 522aa8431..bf4b7f75b 100644 --- a/src/game/ChatHandler.cpp +++ b/src/game/ChatHandler.cpp @@ -38,7 +38,7 @@ #include "CellImpl.h" // Playerbot mod -#include "PlayerbotAI.h" +#include "playerbot/PlayerbotAI.h" bool WorldSession::processChatmessageFurtherAfterSecurityChecks(std::string& msg, uint32 lang) { diff --git a/src/game/Group.cpp b/src/game/Group.cpp index 8ffe97f16..006d8c0c2 100644 --- a/src/game/Group.cpp +++ b/src/game/Group.cpp @@ -32,7 +32,7 @@ #include "InstanceSaveMgr.h" #include "MapInstanced.h" #include "Util.h" -#include "PlayerbotMgr.h" +#include "playerbot/PlayerbotMgr.h" #include "LootMgr.h" #define LOOT_ROLL_TIMEOUT (1*MINUTE*IN_MILLISECONDS) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index e7bc82d8e..4fb53fcaa 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -63,8 +63,8 @@ #include "Mail.h" // Playerbot mod: -#include "PlayerbotAI.h" -#include "PlayerbotMgr.h" +#include "playerbot/PlayerbotAI.h" +#include "playerbot/PlayerbotMgr.h" #include diff --git a/src/game/Player.h b/src/game/Player.h index 66cdad590..0ab0f67ee 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -56,8 +56,8 @@ class Spell; class Item; // Playerbot mod -class PlayerbotAI; -class PlayerbotMgr; +#include "playerbot/PlayerbotMgr.h" +#include "playerbot/PlayerbotAI.h" typedef std::deque PlayerMails; diff --git a/src/game/QuestHandler.cpp b/src/game/QuestHandler.cpp index 32893c904..6c79e24aa 100644 --- a/src/game/QuestHandler.cpp +++ b/src/game/QuestHandler.cpp @@ -31,7 +31,7 @@ #include "Group.h" // Playerbot mod: -#include "PlayerbotAI.h" +#include "playerbot/PlayerbotAI.h" void WorldSession::HandleQuestgiverStatusQueryOpcode( WorldPacket & recv_data ) { diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index 71e291cde..afd3f1292 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -40,8 +40,8 @@ #include "zlib/zlib.h" // Playerbot mod -#include "PlayerbotMgr.h" -#include "PlayerbotAI.h" +#include "playerbot/PlayerbotMgr.h" +#include "playerbot/PlayerbotAI.h" /// WorldSession constructor WorldSession::WorldSession(uint32 id, WorldSocket *sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale) : From c946c72a8f7c90b0bb112e7f47e27403c7034467 Mon Sep 17 00:00:00 2001 From: blueboy Date: Thu, 3 Jun 2010 14:10:54 +0100 Subject: [PATCH 035/187] Adjustments for _PLAYERBOT_CONFIG --- configure.ac | 6 +----- src/game/CharacterHandler.cpp | 2 +- src/mangosd/Main.cpp | 2 +- src/mangosd/mangosd.conf.dist.in | 35 -------------------------------- src/shared/SystemConfig.h.in | 2 ++ 5 files changed, 5 insertions(+), 42 deletions(-) diff --git a/configure.ac b/configure.ac index 9956c4f5b..2a64ee3da 100644 --- a/configure.ac +++ b/configure.ac @@ -309,11 +309,7 @@ AC_CONFIG_FILES([ src/mangosd/Makefile src/mangosd/mangosd.conf.dist src/bindings/Makefile - src/bindings/ScriptDev2/Makefile - src/bindings/ScriptDev2/scriptdev2.conf.dist - src/bindings/ScriptDev2/config.h - src/bindings/ScriptDev2/sql/Makefile - src/bindings/ScriptDev2/sql/Updates/Makefile + src/bindings/universal/Makefile ]) ## Configure ACE, if needed diff --git a/src/game/CharacterHandler.cpp b/src/game/CharacterHandler.cpp index 530a14fb7..d41e6e7ea 100644 --- a/src/game/CharacterHandler.cpp +++ b/src/game/CharacterHandler.cpp @@ -40,7 +40,7 @@ #include "Language.h" // Playerbot mod: -#include "PlayerbotMgr.h" +#include "playerbot/PlayerbotMgr.h" // config option SkipCinematics supported values enum CinematicsSkipMode diff --git a/src/mangosd/Main.cpp b/src/mangosd/Main.cpp index af5daf420..dece34661 100644 --- a/src/mangosd/Main.cpp +++ b/src/mangosd/Main.cpp @@ -76,7 +76,7 @@ extern int main(int argc, char **argv) //char *leak = new char[1000]; // test leak detection ///- Command line parsing to get the configuration file name - char const* cfg_file = _MANGOSD_CONFIG; + char const* cfg_file = _MANGOSD_CONFIG + _PLAYERBOT_CONFIG; int c=1; while( c < argc ) { diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in index f7079eb8e..673ed2a12 100644 --- a/src/mangosd/mangosd.conf.dist.in +++ b/src/mangosd/mangosd.conf.dist.in @@ -1508,38 +1508,3 @@ SOAP.Port = 7878 CharDelete.Method = 0 CharDelete.MinLevel = 0 CharDelete.KeepDays = 30 - -################################################################################################################### -# PLAYERBOTAI CONFIGURATION -# -# PlayerbotAI.DisableBots -# Disable the bot command and bot menu -# Default: 0 - off -# 1 - on -# -# PlayerbotAI.DebugWhisper -# Enable debug output by whispering master -# Default: 0 - off -# 1 - on -# -# PlayerbotAI.FollowDistanceMin -# PlayerbotAI.FollowDistanceMax -# Min. and Max. follow distance for bots -# Default: 0.5 / 1.0 -# -# PlayerbotAI.MaxNumBots -# Limits the number of bots per account (Max 9) -# Default: 9 -# -# PlayerbotAI.RestrictBotLevel -# Restrict the allowed bot level (Current Max 80) -# Default: 80 -# -################################################################################################################### - -PlayerbotAI.DisableBots = 0 -PlayerbotAI.DebugWhisper = 0 -PlayerbotAI.FollowDistanceMin = 0.5 -PlayerbotAI.FollowDistanceMax = 1.0 -PlayerbotAI.MaxNumBots = 9 -PlayerbotAI.RestrictBotLevel = 80 diff --git a/src/shared/SystemConfig.h.in b/src/shared/SystemConfig.h.in index 57f7e0b89..3622fbf07 100644 --- a/src/shared/SystemConfig.h.in +++ b/src/shared/SystemConfig.h.in @@ -71,6 +71,7 @@ # endif # define _MANGOSD_CONFIG SYSCONFDIR"mangosd.conf" # define _REALMD_CONFIG SYSCONFDIR"realmd.conf" +# define _PLAYERBOT_CONFIG SYSCONFDIR"playerbot.conf" #else # if defined (__FreeBSD__) # define _ENDIAN_PLATFORM "FreeBSD_"ARCHITECTURE" (" _ENDIAN_STRING ")" @@ -89,6 +90,7 @@ # endif # define _MANGOSD_CONFIG SYSCONFDIR"mangosd.conf" # define _REALMD_CONFIG SYSCONFDIR"realmd.conf" +# define _PLAYERBOT_CONFIG SYSCONFDIR"playerbot.conf" #endif #define _FULLVERSION(REVD,REVT,REVN,REVH) _PACKAGENAME "/" _VERSION(REVD,REVT,REVN,REVH) " for " _ENDIAN_PLATFORM From 49379c2fa301dbe105aa6033fe81bf4b57d9a701 Mon Sep 17 00:00:00 2001 From: blueboy Date: Fri, 4 Jun 2010 01:11:48 +0100 Subject: [PATCH 036/187] Addition of botConfig --- src/game/Player.cpp | 2 ++ src/game/World.cpp | 13 +++++++++++++ src/game/playerbot/PlayerbotMgr.cpp | 19 ++++++++++--------- src/game/playerbot/config.h | 21 +++++++++++++++++++++ 4 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 src/game/playerbot/config.h diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 4fb53fcaa..352def800 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -131,6 +131,8 @@ enum CharacterCustomizeFlags #define DEATH_EXPIRE_STEP (5*MINUTE) #define MAX_DEATH_COUNT 3 +Config botConfig; + static uint32 copseReclaimDelay[MAX_DEATH_COUNT] = { 30, 60, 120 }; //== PlayerTaxi ================================================ diff --git a/src/game/World.cpp b/src/game/World.cpp index abf273dce..08d045a63 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -61,6 +61,7 @@ #include "GMTicketMgr.h" #include "Util.h" #include "CharacterDatabaseCleaner.h" +#include "playerbot/config.h" INSTANTIATE_SINGLETON_1( World ); @@ -77,6 +78,8 @@ float World::m_MaxVisibleDistanceInFlight = DEFAULT_VISIBILITY_DISTANCE; float World::m_VisibleUnitGreyDistance = 0; float World::m_VisibleObjectGreyDistance = 0; +extern Config botConfig; + /// World constructor World::World() { @@ -1292,6 +1295,16 @@ void World::SetInitialWorldSettings() // Delete all characters which have been deleted X days before Player::DeleteOldCharacters(); + //Get playerbot configuration file + if (!botConfig.SetSource(_PLAYERBOT_CONFIG)) + sLog.outError("Playerbot: Unable to open configuration file. Database will be unaccessible. Configuration values will use default."); + else + sLog.outString("Playerbot: Using configuration file %s",_PLAYERBOT_CONFIG); + + //Check playerbot config file version + if (botConfig.GetIntDefault("ConfVersion", 0) != PLAYERBOT_CONF_VERSION) + sLog.outError("Playerbot: Configuration file version doesn't match expected version. Some config variables may be wrong or missing."); + sLog.outString( "WORLD: World initialized" ); uint32 uStartInterval = getMSTimeDiff(uStartTime, getMSTime()); diff --git a/src/game/playerbot/PlayerbotMgr.cpp b/src/game/playerbot/PlayerbotMgr.cpp index c095eb1fd..0e52182b6 100644 --- a/src/game/playerbot/PlayerbotMgr.cpp +++ b/src/game/playerbot/PlayerbotMgr.cpp @@ -13,16 +13,17 @@ class LoginQueryHolder; class CharacterHandler; +extern Config botConfig; PlayerbotMgr::PlayerbotMgr(Player* const master) : m_master(master) { // load config variables - m_confMaxNumBots = sConfig.GetIntDefault( "PlayerbotAI.MaxNumBots", 9 ); - m_confRestrictBotLevel = sConfig.GetIntDefault( "PlayerbotAI.RestrictBotLevel", 80 ); - m_confDisableBots = sConfig.GetBoolDefault( "PlayerbotAI.DisableBots", false ); - m_confDebugWhisper = sConfig.GetBoolDefault( "PlayerbotAI.DebugWhisper", false ); - m_confFollowDistance[0] = sConfig.GetFloatDefault( "PlayerbotAI.FollowDistanceMin", 0.5f ); - m_confFollowDistance[1] = sConfig.GetFloatDefault( "PlayerbotAI.FollowDistanceMin", 1.0f ); + m_confMaxNumBots = botConfig.GetIntDefault( "PlayerbotAI.MaxNumBots", 9 ); + m_confRestrictBotLevel = botConfig.GetIntDefault( "PlayerbotAI.RestrictBotLevel", 80 ); + m_confDisableBots = botConfig.GetBoolDefault( "PlayerbotAI.DisableBots", false ); + m_confDebugWhisper = botConfig.GetBoolDefault( "PlayerbotAI.DebugWhisper", false ); + m_confFollowDistance[0] = botConfig.GetFloatDefault( "PlayerbotAI.FollowDistanceMin", 0.5f ); + m_confFollowDistance[1] = botConfig.GetFloatDefault( "PlayerbotAI.FollowDistanceMin", 1.0f ); } PlayerbotMgr::~PlayerbotMgr() @@ -544,7 +545,7 @@ void PlayerbotMgr::RemoveAllBotsFromGroup() bool ChatHandler::HandlePlayerbotCommand(const char* args) { if(!(m_session->GetSecurity() > SEC_PLAYER)) - if(sConfig.GetBoolDefault("PlayerbotAI.DisableBots", false)) + if(botConfig.GetBoolDefault("PlayerbotAI.DisableBots", false)) { PSendSysMessage("|cffff0000Playerbot system is currently disabled!"); SetSentErrorMessage(true); @@ -610,7 +611,7 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) Field *fields=resultchar->Fetch(); int acctcharcount = fields[0].GetUInt32(); if(!(m_session->GetSecurity() > SEC_PLAYER)) - if((acctcharcount > sConfig.GetIntDefault("PlayerbotAI.MaxNumBots", 9)) && (cmdStr == "add" || cmdStr == "login")) + if((acctcharcount > botConfig.GetIntDefault("PlayerbotAI.MaxNumBots", 9)) && (cmdStr == "add" || cmdStr == "login")) { PSendSysMessage("|cffff0000You cannot summon anymore bots, for this account."); SetSentErrorMessage(true); @@ -626,7 +627,7 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) Field *fields=resultlvl->Fetch(); int charlvl = fields[0].GetUInt32(); if(!(m_session->GetSecurity() > SEC_PLAYER)) - if(charlvl > sConfig.GetIntDefault("PlayerbotAI.RestrictBotLevel", 80)) + if(charlvl > botConfig.GetIntDefault("PlayerbotAI.RestrictBotLevel", 80)) { PSendSysMessage("|cffff0000You cannot summon |cffffffff[%s]|cffff0000, it's level is too high.",fields[1].GetString()); SetSentErrorMessage(true); diff --git a/src/game/playerbot/config.h b/src/game/playerbot/config.h new file mode 100644 index 000000000..bf5970795 --- /dev/null +++ b/src/game/playerbot/config.h @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2005-2009 MaNGOS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +// Format is YYYYMMDDRR where RR is the change in the conf file +// for that day. +#define PLAYERBOT_CONF_VERSION 2010060201 From 0154bcdc8988de373476d6e8d4f66fb76b61093c Mon Sep 17 00:00:00 2001 From: blueboy Date: Fri, 4 Jun 2010 02:55:03 +0100 Subject: [PATCH 037/187] Fixed compile error --- src/mangosd/Main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mangosd/Main.cpp b/src/mangosd/Main.cpp index dece34661..af5daf420 100644 --- a/src/mangosd/Main.cpp +++ b/src/mangosd/Main.cpp @@ -76,7 +76,7 @@ extern int main(int argc, char **argv) //char *leak = new char[1000]; // test leak detection ///- Command line parsing to get the configuration file name - char const* cfg_file = _MANGOSD_CONFIG + _PLAYERBOT_CONFIG; + char const* cfg_file = _MANGOSD_CONFIG; int c=1; while( c < argc ) { From 4b4712a91bd2958a74c19cf3e57e74ba15be02ae Mon Sep 17 00:00:00 2001 From: blueboy Date: Tue, 8 Jun 2010 00:35:50 +0100 Subject: [PATCH 038/187] Fixed compile error with 'botConfig' --- src/game/Player.cpp | 2 -- src/game/playerbot/PlayerbotMgr.cpp | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index e70a4cd55..56b22e7a4 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -131,8 +131,6 @@ enum CharacterCustomizeFlags #define DEATH_EXPIRE_STEP (5*MINUTE) #define MAX_DEATH_COUNT 3 -Config botConfig; - static uint32 copseReclaimDelay[MAX_DEATH_COUNT] = { 30, 60, 120 }; //== PlayerTaxi ================================================ diff --git a/src/game/playerbot/PlayerbotMgr.cpp b/src/game/playerbot/PlayerbotMgr.cpp index 0e52182b6..f8cf4183e 100644 --- a/src/game/playerbot/PlayerbotMgr.cpp +++ b/src/game/playerbot/PlayerbotMgr.cpp @@ -13,7 +13,7 @@ class LoginQueryHolder; class CharacterHandler; -extern Config botConfig; +Config botConfig; PlayerbotMgr::PlayerbotMgr(Player* const master) : m_master(master) { From 78cb940875d7e635364fd9fbc1e20cf01be185b2 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 9 Jun 2010 14:38:48 -0300 Subject: [PATCH 039/187] further step into making playerbot modular discussed on topic http://mangos.osh.nu/forums/index.php?showtopic=1143 so if is there problems or room for improvement, reply there --- configure.ac | 1 + src/game/Makefile.am | 26 ----------------- src/game/playerbot/Makefile.am | 40 ++++++++++++++++++++++++++- src/game/playerbot/PlayerbotAI.cpp | 24 ++++++++-------- src/game/playerbot/PlayerbotAI.h | 4 +-- src/game/playerbot/PlayerbotClassAI.h | 14 +++++----- src/game/playerbot/PlayerbotMgr.cpp | 16 +++++------ src/game/playerbot/config.h | 13 +++++++++ src/game/playerbot/config.h.in | 34 +++++++++++++++++++++++ src/mangosd/Makefile.am | 1 + src/shared/SystemConfig.h.in | 2 -- 11 files changed, 117 insertions(+), 58 deletions(-) create mode 100644 src/game/playerbot/config.h.in diff --git a/configure.ac b/configure.ac index 2a64ee3da..19ab24531 100644 --- a/configure.ac +++ b/configure.ac @@ -303,6 +303,7 @@ AC_CONFIG_FILES([ src/shared/SystemConfig.h src/game/Makefile src/game/playerbot/Makefile + src/game/playerbot/config.h src/game/playerbot/playerbot.conf.dist src/realmd/Makefile src/realmd/realmd.conf.dist diff --git a/src/game/Makefile.am b/src/game/Makefile.am index 5a1dc9ccd..c5721aa63 100644 --- a/src/game/Makefile.am +++ b/src/game/Makefile.am @@ -217,32 +217,6 @@ libmangosgame_a_SOURCES = \ PetitionsHandler.cpp \ Player.cpp \ Player.h \ - playerbot/PlayerbotMgr.cpp \ - playerbot/PlayerbotMgr.h \ - playerbot/PlayerbotAI.cpp \ - playerbot/PlayerbotAI.h \ - playerbot/PlayerbotClassAI.cpp \ - playerbot/PlayerbotClassAI.h \ - playerbot/PlayerbotDeathKnightAI.cpp \ - playerbot/PlayerbotDeathKnightAI.h \ - playerbot/PlayerbotDruidAI.cpp \ - playerbot/PlayerbotDruidAI.h \ - playerbot/PlayerbotHunterAI.cpp \ - playerbot/PlayerbotHunterAI.h \ - playerbot/PlayerbotMageAI.cpp \ - playerbot/PlayerbotMageAI.h \ - playerbot/PlayerbotPaladinAI.cpp \ - playerbot/PlayerbotPaladinAI.h \ - playerbot/PlayerbotPriestAI.cpp \ - playerbot/PlayerbotPriestAI.h \ - playerbot/PlayerbotRogueAI.cpp \ - playerbot/PlayerbotRogueAI.h \ - playerbot/PlayerbotShamanAI.cpp \ - playerbot/PlayerbotShamanAI.h \ - playerbot/PlayerbotWarlockAI.cpp \ - playerbot/PlayerbotWarlockAI.h \ - playerbot/PlayerbotWarriorAI.cpp \ - playerbot/PlayerbotWarriorAI.h \ PlayerDump.cpp \ PlayerDump.h \ PointMovementGenerator.cpp \ diff --git a/src/game/playerbot/Makefile.am b/src/game/playerbot/Makefile.am index 5e9c6c28f..3f6b4b7a6 100644 --- a/src/game/playerbot/Makefile.am +++ b/src/game/playerbot/Makefile.am @@ -18,9 +18,47 @@ ## Sub-directories to parse +## CPP flags for includes, defines, etc. +AM_CPPFLAGS = $(MANGOS_INCLUDES) -I$(top_builddir)/src/shared -I$(srcdir) -I$(srcdir)/../../../dep/include -I$(srcdir)/../../framework -I$(srcdir)/../../shared -I$(srcdir)/../../shared/vmap -I$(srcdir)/../../realmd -DSYSCONFDIR=\"$(sysconfdir)/\" + +## Build MaNGOS game library as convenience library. +# libmangosbot shared library will later be reused by world server daemon. +noinst_LIBRARIES = libmangosbot.a + +# libmangossgame library will later be reused by ... +libmangosbot_a_SOURCES = \ + config.h \ + PlayerbotMgr.cpp \ + PlayerbotMgr.h \ + PlayerbotAI.cpp \ + PlayerbotAI.h \ + PlayerbotClassAI.cpp \ + PlayerbotClassAI.h \ + PlayerbotDeathKnightAI.cpp \ + PlayerbotDeathKnightAI.h \ + PlayerbotDruidAI.cpp \ + PlayerbotDruidAI.h \ + PlayerbotHunterAI.cpp \ + PlayerbotHunterAI.h \ + PlayerbotMageAI.cpp \ + PlayerbotMageAI.h \ + PlayerbotPaladinAI.cpp \ + PlayerbotPaladinAI.h \ + PlayerbotPriestAI.cpp \ + PlayerbotPriestAI.h \ + PlayerbotRogueAI.cpp \ + PlayerbotRogueAI.h \ + PlayerbotShamanAI.cpp \ + PlayerbotShamanAI.h \ + PlayerbotWarlockAI.cpp \ + PlayerbotWarlockAI.h \ + PlayerbotWarriorAI.cpp \ + PlayerbotWarriorAI.h + ## Additional files to include when running 'make dist' -# Include world daemon configuration +# Precompiled Headers for WIN EXTRA_DIST = \ + config.h \ playerbot.conf.dist ## Additional files to install diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 99852ea90..c0b441f98 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -1,8 +1,8 @@ #include "Common.h" #include "Database/DatabaseEnv.h" -#include "ItemPrototype.h" -#include "World.h" -#include "SpellMgr.h" +#include "../ItemPrototype.h" +#include "../World.h" +#include "../SpellMgr.h" #include "PlayerbotAI.h" #include "PlayerbotMgr.h" #include "PlayerbotDeathKnightAI.h" @@ -15,16 +15,16 @@ #include "PlayerbotShamanAI.h" #include "PlayerbotWarlockAI.h" #include "PlayerbotWarriorAI.h" -#include "Player.h" -#include "ObjectMgr.h" -#include "Chat.h" -#include "WorldPacket.h" -#include "Spell.h" -#include "Unit.h" -#include "SpellAuras.h" -#include "SharedDefines.h" +#include "../Player.h" +#include "../ObjectMgr.h" +#include "../Chat.h" +#include "../WorldPacket.h" +#include "../Spell.h" +#include "../Unit.h" +#include "../SpellAuras.h" +#include "../SharedDefines.h" #include "Log.h" -#include "GossipDef.h" +#include "../GossipDef.h" // returns a float in range of.. float rand_float(float low, float high) diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index ef4383fc4..bdd591ad5 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -2,8 +2,8 @@ #define _PLAYERBOTAI_H #include "Common.h" -#include "QuestDef.h" -#include "GameEventMgr.h" +#include "../QuestDef.h" +#include "../GameEventMgr.h" class WorldPacket; class WorldObject; diff --git a/src/game/playerbot/PlayerbotClassAI.h b/src/game/playerbot/PlayerbotClassAI.h index 795ea154f..c1f457169 100644 --- a/src/game/playerbot/PlayerbotClassAI.h +++ b/src/game/playerbot/PlayerbotClassAI.h @@ -2,13 +2,13 @@ #define _PLAYERBOTCLASSAI_H #include "Common.h" -#include "World.h" -#include "SpellMgr.h" -#include "Player.h" -#include "ObjectMgr.h" -#include "WorldPacket.h" -#include "Unit.h" -#include "SharedDefines.h" +#include "../World.h" +#include "../SpellMgr.h" +#include "../Player.h" +#include "../ObjectMgr.h" +#include "../WorldPacket.h" +#include "../Unit.h" +#include "../SharedDefines.h" #include "PlayerbotAI.h" class Player; diff --git a/src/game/playerbot/PlayerbotMgr.cpp b/src/game/playerbot/PlayerbotMgr.cpp index f8cf4183e..1b18c263a 100644 --- a/src/game/playerbot/PlayerbotMgr.cpp +++ b/src/game/playerbot/PlayerbotMgr.cpp @@ -1,14 +1,14 @@ #include "Config/ConfigEnv.h" -#include "Player.h" +#include "../Player.h" #include "PlayerbotAI.h" #include "PlayerbotMgr.h" -#include "WorldPacket.h" -#include "Chat.h" -#include "ObjectMgr.h" -#include "GossipDef.h" -#include "Chat.h" -#include "Language.h" -#include "Guild.h" +#include "../WorldPacket.h" +#include "../Chat.h" +#include "../ObjectMgr.h" +#include "../GossipDef.h" +#include "../Chat.h" +#include "../Language.h" +#include "../Guild.h" class LoginQueryHolder; class CharacterHandler; diff --git a/src/game/playerbot/config.h b/src/game/playerbot/config.h index bf5970795..d1e81677c 100644 --- a/src/game/playerbot/config.h +++ b/src/game/playerbot/config.h @@ -16,6 +16,19 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#ifndef PB_CONFIG_H +#define PB_CONFIG_H + +#include "Platform/CompilerDefs.h" + // Format is YYYYMMDDRR where RR is the change in the conf file // for that day. #define PLAYERBOT_CONF_VERSION 2010060201 + +#if PLATFORM == PLATFORM_WINDOWS + #define _PLAYERBOT_CONFIG "playerbot.conf" +#else + #define _PLAYERBOT_CONFIG SYSCONFDIR"playerbot.conf" +#endif + +#endif \ No newline at end of file diff --git a/src/game/playerbot/config.h.in b/src/game/playerbot/config.h.in new file mode 100644 index 000000000..d1e81677c --- /dev/null +++ b/src/game/playerbot/config.h.in @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2005-2009 MaNGOS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef PB_CONFIG_H +#define PB_CONFIG_H + +#include "Platform/CompilerDefs.h" + +// Format is YYYYMMDDRR where RR is the change in the conf file +// for that day. +#define PLAYERBOT_CONF_VERSION 2010060201 + +#if PLATFORM == PLATFORM_WINDOWS + #define _PLAYERBOT_CONFIG "playerbot.conf" +#else + #define _PLAYERBOT_CONFIG SYSCONFDIR"playerbot.conf" +#endif + +#endif \ No newline at end of file diff --git a/src/mangosd/Makefile.am b/src/mangosd/Makefile.am index fe1ace1e2..833d991a5 100644 --- a/src/mangosd/Makefile.am +++ b/src/mangosd/Makefile.am @@ -42,6 +42,7 @@ mangos_worldd_SOURCES = \ mangos_worldd_LDADD = \ ../bindings/universal/libmangosscript.la \ ../game/libmangosgame.a \ + ../game/playerbot/libmangosbot.a \ ../shared/Database/libmangosdatabase.a \ ../shared/Config/libmangosconfig.a \ ../shared/Auth/libmangosauth.a \ diff --git a/src/shared/SystemConfig.h.in b/src/shared/SystemConfig.h.in index 3622fbf07..57f7e0b89 100644 --- a/src/shared/SystemConfig.h.in +++ b/src/shared/SystemConfig.h.in @@ -71,7 +71,6 @@ # endif # define _MANGOSD_CONFIG SYSCONFDIR"mangosd.conf" # define _REALMD_CONFIG SYSCONFDIR"realmd.conf" -# define _PLAYERBOT_CONFIG SYSCONFDIR"playerbot.conf" #else # if defined (__FreeBSD__) # define _ENDIAN_PLATFORM "FreeBSD_"ARCHITECTURE" (" _ENDIAN_STRING ")" @@ -90,7 +89,6 @@ # endif # define _MANGOSD_CONFIG SYSCONFDIR"mangosd.conf" # define _REALMD_CONFIG SYSCONFDIR"realmd.conf" -# define _PLAYERBOT_CONFIG SYSCONFDIR"playerbot.conf" #endif #define _FULLVERSION(REVD,REVT,REVN,REVH) _PACKAGENAME "/" _VERSION(REVD,REVT,REVN,REVH) " for " _ENDIAN_PLATFORM From 4f070a872729e8e90b3e0b4b0fac99946d318488 Mon Sep 17 00:00:00 2001 From: blueboy Date: Thu, 10 Jun 2010 21:59:20 +0100 Subject: [PATCH 040/187] Adjust after rename of function GetItemPosByTradeSlot to GetItemByTradeSlot --- src/game/playerbot/PlayerbotAI.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index c0b441f98..7e8cf7e81 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2612,13 +2612,13 @@ bool PlayerbotAI::TradeItem(const Item& item, int8 slot) int8 tradeSlot = -1; - if( (slot>=0 && slotGetItemPosByTradeSlot(slot)==NULL_SLOT ) + if( (slot>=0 && slotGetItemByTradeSlot(slot)==NULL_SLOT ) tradeSlot = slot; else { for( uint8 i=0; iGetItemPosByTradeSlot(i) == NULL_SLOT ) + if( m_bot->GetItemByTradeSlot(i) == NULL_SLOT ) tradeSlot = i; } } From c6eea770defd9da6d1e7e28bbaf3aa16c89ad7bf Mon Sep 17 00:00:00 2001 From: blueboy Date: Fri, 11 Jun 2010 02:40:39 +0100 Subject: [PATCH 041/187] Fix 'TradeItem' accept error --- src/game/TradeHandler.cpp | 2 +- src/game/playerbot/PlayerbotAI.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/TradeHandler.cpp b/src/game/TradeHandler.cpp index cb1ae3859..ad1e59d82 100644 --- a/src/game/TradeHandler.cpp +++ b/src/game/TradeHandler.cpp @@ -260,7 +260,7 @@ void WorldSession::moveItems(Item* myItems[], Item* hisItems[]) void WorldSession::HandleAcceptTradeOpcode(WorldPacket& recvPacket) { - recvPacket.read_skip(); // 7, amount traded slots ? + // recvPacket.read_skip(); // 7, amount traded slots ? TradeData* my_trade = _player->m_trade; if (!my_trade) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 7e8cf7e81..065c7b17d 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2612,13 +2612,13 @@ bool PlayerbotAI::TradeItem(const Item& item, int8 slot) int8 tradeSlot = -1; - if( (slot>=0 && slotGetItemByTradeSlot(slot)==NULL_SLOT ) + if( (slot>=0 && slotGetItemByTradeSlot(slot) == NULL ) tradeSlot = slot; else { for( uint8 i=0; iGetItemByTradeSlot(i) == NULL_SLOT ) + if( m_bot->GetItemByTradeSlot(i) == NULL ) tradeSlot = i; } } From 5dfa3c534f576d84a984ac8da8429f27587eceaf Mon Sep 17 00:00:00 2001 From: blueboy Date: Sun, 13 Jun 2010 00:22:02 +0100 Subject: [PATCH 042/187] Better solution to trade data issues, in-line with core changes --- src/game/TradeHandler.cpp | 2 +- src/game/playerbot/PlayerbotAI.cpp | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/game/TradeHandler.cpp b/src/game/TradeHandler.cpp index d71d2d626..5fc3ec4c0 100644 --- a/src/game/TradeHandler.cpp +++ b/src/game/TradeHandler.cpp @@ -252,7 +252,7 @@ static void clearAcceptTradeMode(Item **myItems, Item **hisItems) void WorldSession::HandleAcceptTradeOpcode(WorldPacket& recvPacket) { - // recvPacket.read_skip(); // 7, amount traded slots ? + recvPacket.read_skip(); // 7, amount traded slots ? TradeData* my_trade = _player->m_trade; if (!my_trade) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 065c7b17d..332edcb81 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -641,7 +641,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) WorldPacket p(packet); uint32 status; p >> status; - p.clear(); + p.resize(4); //4 == TRADE_STATUS_TRADE_ACCEPT if (status == 4) @@ -2612,13 +2612,14 @@ bool PlayerbotAI::TradeItem(const Item& item, int8 slot) int8 tradeSlot = -1; - if( (slot>=0 && slotGetItemByTradeSlot(slot) == NULL ) + TradeData* pTrade = m_bot->GetTradeData(); + if( (slot>=0 && slotGetTraderData()->GetItem(TradeSlots(slot)) == NULL ) tradeSlot = slot; else { for( uint8 i=0; iGetItemByTradeSlot(i) == NULL ) + if( pTrade->GetTraderData()->GetItem(TradeSlots(i)) == NULL ) tradeSlot = i; } } From 9bd7cfc95a1b51c40035b22fc4ed4488224f8b20 Mon Sep 17 00:00:00 2001 From: blueboy Date: Sun, 13 Jun 2010 00:36:49 +0100 Subject: [PATCH 043/187] Remove trailing whitespace --- src/game/playerbot/PlayerbotAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 332edcb81..9e427714d 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2612,7 +2612,7 @@ bool PlayerbotAI::TradeItem(const Item& item, int8 slot) int8 tradeSlot = -1; - TradeData* pTrade = m_bot->GetTradeData(); + TradeData* pTrade = m_bot->GetTradeData(); if( (slot>=0 && slotGetTraderData()->GetItem(TradeSlots(slot)) == NULL ) tradeSlot = slot; else From 73681f7620147c16756abd49d5387a21ac8d0f16 Mon Sep 17 00:00:00 2001 From: blueboy Date: Tue, 22 Jun 2010 09:17:07 +0100 Subject: [PATCH 044/187] Adjust for core 'config' changes --- src/game/Map.cpp | 2 +- src/game/playerbot/PlayerbotMgr.cpp | 2 +- src/game/playerbot/config.h | 4 ++-- src/game/playerbot/config.h.in | 4 ++-- src/game/playerbot/playerbot.conf.dist.in | 4 +++- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/game/Map.cpp b/src/game/Map.cpp index 9d0b6e3b1..8eb69d6cf 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -659,7 +659,7 @@ void Map::Remove(Player *player, bool remove) if(p.x_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP || p.y_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP) { // invalid coordinates - player->ResetMap(); + // player->ResetMap(); if( remove ) DeleteFromWorld(player); diff --git a/src/game/playerbot/PlayerbotMgr.cpp b/src/game/playerbot/PlayerbotMgr.cpp index 1b18c263a..cbf77284f 100644 --- a/src/game/playerbot/PlayerbotMgr.cpp +++ b/src/game/playerbot/PlayerbotMgr.cpp @@ -1,4 +1,4 @@ -#include "Config/ConfigEnv.h" +#include "Config/Config.h" #include "../Player.h" #include "PlayerbotAI.h" #include "PlayerbotMgr.h" diff --git a/src/game/playerbot/config.h b/src/game/playerbot/config.h index d1e81677c..c26ca2d91 100644 --- a/src/game/playerbot/config.h +++ b/src/game/playerbot/config.h @@ -23,7 +23,7 @@ // Format is YYYYMMDDRR where RR is the change in the conf file // for that day. -#define PLAYERBOT_CONF_VERSION 2010060201 +#define PLAYERBOT_CONF_VERSION 2010062001 #if PLATFORM == PLATFORM_WINDOWS #define _PLAYERBOT_CONFIG "playerbot.conf" @@ -31,4 +31,4 @@ #define _PLAYERBOT_CONFIG SYSCONFDIR"playerbot.conf" #endif -#endif \ No newline at end of file +#endif diff --git a/src/game/playerbot/config.h.in b/src/game/playerbot/config.h.in index d1e81677c..c26ca2d91 100644 --- a/src/game/playerbot/config.h.in +++ b/src/game/playerbot/config.h.in @@ -23,7 +23,7 @@ // Format is YYYYMMDDRR where RR is the change in the conf file // for that day. -#define PLAYERBOT_CONF_VERSION 2010060201 +#define PLAYERBOT_CONF_VERSION 2010062001 #if PLATFORM == PLATFORM_WINDOWS #define _PLAYERBOT_CONFIG "playerbot.conf" @@ -31,4 +31,4 @@ #define _PLAYERBOT_CONFIG SYSCONFDIR"playerbot.conf" #endif -#endif \ No newline at end of file +#endif diff --git a/src/game/playerbot/playerbot.conf.dist.in b/src/game/playerbot/playerbot.conf.dist.in index a44bd73c3..bbfe3c9af 100644 --- a/src/game/playerbot/playerbot.conf.dist.in +++ b/src/game/playerbot/playerbot.conf.dist.in @@ -1,7 +1,9 @@ ##################################### # Playerbot Configuration file # ##################################### -ConfVersion=2010060201 + +[PlayerbotConf] +ConfVersion=2010062001 ################################################################################################################### # PLAYERBOTAI CONFIGURATION From e91373e8b5fed2c436f5680cd4c6e7d61f73a219 Mon Sep 17 00:00:00 2001 From: blueboy Date: Wed, 23 Jun 2010 09:59:39 +0100 Subject: [PATCH 045/187] Reverse an unnecessary change --- src/game/Map.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/Map.cpp b/src/game/Map.cpp index 8eb69d6cf..9d0b6e3b1 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -659,7 +659,7 @@ void Map::Remove(Player *player, bool remove) if(p.x_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP || p.y_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP) { // invalid coordinates - // player->ResetMap(); + player->ResetMap(); if( remove ) DeleteFromWorld(player); From 337081497d2f61c3ec8e6fab8d3d6b98be3009dd Mon Sep 17 00:00:00 2001 From: blueboy Date: Wed, 30 Jun 2010 17:03:17 +0100 Subject: [PATCH 046/187] Fix for 'combat' Instance crash --- src/game/playerbot/PlayerbotAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 9e427714d..9007d30d1 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -1294,7 +1294,7 @@ void PlayerbotAI::DoNextCombatManeuver() // check if we have a target - fixes crash reported by rrtn (kill hunter's pet bug) // if current target for attacks doesn't make sense anymore // clear our orders so we can get orders in next update - if( !m_targetCombat || m_targetCombat->isDead() || !m_targetCombat->IsInWorld() || !m_bot->IsHostileTo(m_targetCombat) ) + if( !m_targetCombat || m_targetCombat->isDead() || !m_targetCombat->IsInWorld() || !m_bot->IsHostileTo(m_targetCombat) || !m_bot->IsInMap(m_targetCombat) ) { m_bot->AttackStop(); m_bot->SetSelection(0); From 8ec535097ca655c545521c8af0ad93802809a7ca Mon Sep 17 00:00:00 2001 From: blueboy Date: Mon, 5 Jul 2010 10:46:50 +0100 Subject: [PATCH 047/187] Enhance 'cast' command to utilize string links --- src/game/playerbot/PlayerbotAI.cpp | 53 ++++++++++++++++++++++++++++++ src/game/playerbot/PlayerbotAI.h | 3 ++ 2 files changed, 56 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 9007d30d1..708402755 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2377,6 +2377,34 @@ void PlayerbotAI::extractItemIds(const std::string& text, std::list& ite } } +bool PlayerbotAI::extractSpellId(const std::string& text, uint32 &spellId) const +{ + + // Link format + // |cffffffff|Hspell:" << spellId << ":" << "|h[" << pSpellInfo->SpellName[loc] << "]|h|r"; + // cast |cff71d5ff|Hspell:686|h[Shadow Bolt]|h|r"; + // 012345678901234567890123456 + // base = 16 >| +7 >| + + uint8 pos = 0; + + int i = text.find("Hspell:", pos); + if (i == -1) + return false; + + // DEBUG_LOG("extractSpellId first pos %u i %u",pos,i); + pos = i + 7; // start of window in text 16 + 7 = 23 + int endPos = text.find('|', pos); + if (endPos == -1) + return false; + + // DEBUG_LOG("extractSpellId second endpos : %u pos : %u",endPos,pos); + std::string idC = text.substr(pos, endPos - pos); // 26 - 23 + spellId = atol(idC.c_str()); + pos = endPos; // end + return true; +} + bool PlayerbotAI::extractGOinfo(const std::string& text, uint32 &guid, uint32 &entry, int &mapid, float &x, float &y, float &z) const { @@ -2857,19 +2885,44 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) // handle cast command else if (text.size() > 2 && text.substr(0, 2) == "c " || text.size() > 5 && text.substr(0, 5) == "cast ") { + // sLog.outErrorDb("Selected link : %s", text.c_str()); + std::string spellStr = text.substr(text.find(" ") + 1); uint32 spellId = (uint32) atol(spellStr.c_str()); // try and get spell ID by name if (spellId == 0) + { spellId = getSpellId(spellStr.c_str(), true); + // try link if text NOT (spellid OR spellname) + if (spellId == 0) + extractSpellId(text, spellId); + + QueryResult *result = WorldDatabase.PQuery("SELECT spell_id FROM spell_chain WHERE first_spell = '%u' ORDER BY rank DESC",spellId); + if (result) + { + do + { + Field *fields = result->Fetch(); + uint32 Id = fields[0].GetUInt32(); + // DEBUG_LOG("SPELLID %u",Id); + if(m_bot->HasSpell(Id)) // examine all spell ranks in decreasing order and select first that is in spellbook + { + spellId = Id; + break; + } + } while (result->NextRow()); + } + } + uint64 castOnGuid = fromPlayer.GetSelection(); if (spellId != 0 && castOnGuid != 0 && m_bot->HasSpell(spellId)) { m_spellIdCommand = spellId; m_targetGuidCommand = castOnGuid; } + } // use items diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index bdd591ad5..dc7ca5e39 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -127,6 +127,9 @@ class MANGOS_DLL_SPEC PlayerbotAI // extracts item ids from links void extractItemIds(const std::string& text, std::list& itemIds) const; + // extract spellid from links + bool extractSpellId(const std::string& text, uint32 &spellId) const; + // extracts currency from a string as #g#s#c and returns the total in copper uint32 extractMoney(const std::string& text) const; From 8e81225c6753dd81dd74b53b673246a010894065 Mon Sep 17 00:00:00 2001 From: blueboy Date: Mon, 5 Jul 2010 10:50:28 +0100 Subject: [PATCH 048/187] Fix for Warlock 'Soul Link' by kyle1 --- src/game/playerbot/PlayerbotWarlockAI.cpp | 3 ++- src/game/playerbot/PlayerbotWarlockAI.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/game/playerbot/PlayerbotWarlockAI.cpp b/src/game/playerbot/PlayerbotWarlockAI.cpp index 31d53e723..d230735a8 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.cpp +++ b/src/game/playerbot/PlayerbotWarlockAI.cpp @@ -44,6 +44,7 @@ PlayerbotWarlockAI::PlayerbotWarlockAI(Player* const master, Player* const bot, SHADOW_WARD = ai->getSpellId("shadow ward"); SOULSHATTER = ai->getSpellId("soulshatter"); SOUL_LINK = ai->getSpellId("soul link"); + SOUL_LINK_AURA = 25228; // dummy aura applied, after spell SOUL_LINK HEALTH_FUNNEL = ai->getSpellId("health funnel"); DETECT_INVISIBILITY = ai->getSpellId("detect invisibility"); // demon summon @@ -444,7 +445,7 @@ void PlayerbotWarlockAI::DoNonCombatActions() // check for buffs with demon if(( pet ) - && ( SOUL_LINK>0 && !m_bot->HasAura(SOUL_LINK, EFFECT_INDEX_0) && ai->GetManaPercent() >= 16 && ai->CastSpell(SOUL_LINK,*m_bot) )) + && ( SOUL_LINK>0 && !m_bot->HasAura(SOUL_LINK_AURA, EFFECT_INDEX_0) && ai->GetBaseManaPercent() >= 16 && ai->CastSpell(SOUL_LINK,*m_bot) )) { //ai->TellMaster( "casting soul link." ); return; diff --git a/src/game/playerbot/PlayerbotWarlockAI.h b/src/game/playerbot/PlayerbotWarlockAI.h index 8058c4b6f..999224c44 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.h +++ b/src/game/playerbot/PlayerbotWarlockAI.h @@ -41,7 +41,7 @@ class MANGOS_DLL_SPEC PlayerbotWarlockAI : PlayerbotClassAI uint32 SHADOW_BOLT, IMMOLATE, INCINERATE, SEARING_PAIN, CONFLAGRATE, SOUL_FIRE, SHADOWFURY, CHAOS_BOLT, SHADOWFLAME, HELLFIRE, RAIN_OF_FIRE, SHADOWBURN; // DEMONOLOGY - uint32 DEMON_SKIN, DEMON_ARMOR, SHADOW_WARD, FEL_ARMOR, SOULSHATTER, SOUL_LINK, HEALTH_FUNNEL, DETECT_INVISIBILITY; + uint32 DEMON_SKIN, DEMON_ARMOR, SHADOW_WARD, FEL_ARMOR, SOULSHATTER, SOUL_LINK, SOUL_LINK_AURA, HEALTH_FUNNEL, DETECT_INVISIBILITY; // DEMON SUMMON uint32 SUMMON_IMP, SUMMON_VOIDWALKER, SUMMON_SUCCUBUS, SUMMON_FELHUNTER, SUMMON_FELGUARD; From f7fa6745c0f6cde25aae06d30f3ea8b67cfd52e1 Mon Sep 17 00:00:00 2001 From: blueboy Date: Tue, 6 Jul 2010 17:17:05 +0100 Subject: [PATCH 049/187] Add full 'botguy' patch, with config controls --- botguy_readme.txt | 12 +++ mangos_botguy.sql | 1 + src/game/Creature.h | 3 + src/game/GossipDef.h | 2 + src/game/Player.cpp | 37 +++++++- src/game/Player.h | 4 + src/game/playerbot/PlayerbotMgr.cpp | 102 ++++++++++++++++++++++ src/game/playerbot/playerbot.conf.dist.in | 13 +++ 8 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 botguy_readme.txt create mode 100644 mangos_botguy.sql diff --git a/botguy_readme.txt b/botguy_readme.txt new file mode 100644 index 000000000..e67cfe889 --- /dev/null +++ b/botguy_readme.txt @@ -0,0 +1,12 @@ +What it is: +=========== + +The new revised'botguy' utilizes NPCs already distributed throughout the world, to allow players to +summon and dismiss bots at will, from their own account. + +This is a revised (more stable) version that utilizes the new 'GOSSIP MENU SYSTEM' to modify the menus of existing NPCs +(e.g Trainers etc) to include the bot Recruit/Dismiss menu. (No GameMaster account necessary). + +Install (Server administrators only) +======= +Please apply 'mangos_botguy.sql' once to the world database to update the 'gossip_menu_option' table. diff --git a/mangos_botguy.sql b/mangos_botguy.sql new file mode 100644 index 000000000..fffcd2e98 --- /dev/null +++ b/mangos_botguy.sql @@ -0,0 +1 @@ +INSERT INTO `gossip_menu_option` VALUES('0','16','0','GOSSIP_OPTION_BOT','99','1','0','0','0','0','0',NULL,'0','0','0','0','0','0','0','0','0'); diff --git a/src/game/Creature.h b/src/game/Creature.h index aa0d0746d..a20ad9824 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -406,6 +406,9 @@ class MANGOS_DLL_SPEC Creature : public Unit bool isTotem() const { return m_subtype == CREATURE_SUBTYPE_TOTEM; } bool isTemporarySummon() const { return m_subtype == CREATURE_SUBTYPE_TEMPORARY_SUMMON; } + // Playerbot mod - adds functionality to load/unload bots from NPC, also need to apply SQL scripts + void LoadBotMenu(Player *pPlayer); + void SetCorpseDelay(uint32 delay) { m_corpseDelay = delay; } bool isRacialLeader() const { return GetCreatureInfo()->RacialLeader; } bool isCivilian() const { return GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_CIVILIAN; } diff --git a/src/game/GossipDef.h b/src/game/GossipDef.h index 98caf2277..df691d7f1 100644 --- a/src/game/GossipDef.h +++ b/src/game/GossipDef.h @@ -48,6 +48,8 @@ enum Gossip_Option GOSSIP_OPTION_ARMORER = 15, //UNIT_NPC_FLAG_ARMORER (4096) GOSSIP_OPTION_UNLEARNTALENTS = 16, //UNIT_NPC_FLAG_TRAINER (16) (bonus option for GOSSIP_OPTION_TRAINER) GOSSIP_OPTION_UNLEARNPETSKILLS = 17, //UNIT_NPC_FLAG_TRAINER (16) (bonus option for GOSSIP_OPTION_TRAINER) + // Playerbot mod + GOSSIP_OPTION_BOT = 99, //UNIT_NPC_FLAG_GOSSIP (1) UNUSED (just for bot system) GOSSIP_OPTION_MAX }; diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 8db7ec2a5..129e9d938 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -65,6 +65,7 @@ // Playerbot mod: #include "playerbot/PlayerbotAI.h" #include "playerbot/PlayerbotMgr.h" +#include "Config/Config.h" #include @@ -82,6 +83,8 @@ #define SKILL_PERM_BONUS(x) int16(PAIR32_HIPART(x)) #define MAKE_SKILL_BONUS(t, p) MAKE_PAIR32(t,p) +extern Config botConfig; + enum CharacterFlags { CHARACTER_FLAG_NONE = 0x00000000, @@ -12748,6 +12751,15 @@ void Player::PrepareGossipMenu(WorldObject *pSource, uint32 menuId) case GOSSIP_OPTION_TABARDDESIGNER: case GOSSIP_OPTION_AUCTIONEER: break; // no checks + case GOSSIP_OPTION_BOT: + { + std::string reqQuestIds = botConfig.GetStringDefault("PlayerbotAI.BotguyQuests",""); + uint32 cost = botConfig.GetIntDefault("PlayerbotAI.BotguyCost",0); + if((reqQuestIds == "" || requiredQuests(reqQuestIds.c_str())) && !pCreature->isInnkeeper() && this->GetMoney() >= cost) + pCreature->LoadBotMenu(this); + hasMenuItem = false; + break; + } default: sLog.outErrorDb("Creature entry %u have unknown gossip option %u for menu %u", pCreature->GetEntry(), itr->second.option_id, itr->second.menu_id); hasMenuItem = false; @@ -12894,12 +12906,12 @@ void Player::OnGossipSelect(WorldObject* pSource, uint32 gossipListId, uint32 me } } - GossipMenuItemData pMenuData = gossipmenu.GetItemData(gossipListId); - switch(gossipOptionId) { case GOSSIP_OPTION_GOSSIP: { + GossipMenuItemData pMenuData = gossipmenu.GetItemData(gossipListId); + if (pMenuData.m_gAction_poi) PlayerTalkClass->SendPointOfInterest(pMenuData.m_gAction_poi); @@ -12983,6 +12995,27 @@ void Player::OnGossipSelect(WorldObject* pSource, uint32 gossipListId, uint32 me GetSession()->SendBattlegGroundList(guid, bgTypeId); break; } + case GOSSIP_OPTION_BOT: + { + // DEBUG_LOG("GOSSIP_OPTION_BOT"); + PlayerTalkClass->CloseGossip(); + uint32 cost = botConfig.GetIntDefault("PlayerbotAI.BotguyCost",0); + + if (!GetPlayerbotMgr()) + SetPlayerbotMgr(new PlayerbotMgr(this)); + + uint64 guidlo = PlayerTalkClass->GossipOptionSender(gossipListId); + if(GetPlayerbotMgr()->GetPlayerBot(guidlo) != NULL) + { + GetPlayerbotMgr()->LogoutPlayerBot(guidlo); + } + else if(GetPlayerbotMgr()->GetPlayerBot(guidlo) == NULL) + { + GetPlayerbotMgr()->AddPlayerBot(guidlo); + this->ModifyMoney(-(int32)cost); + } + break; + } } } diff --git a/src/game/Player.h b/src/game/Player.h index 9fb1b5fea..b075f00dc 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1491,6 +1491,10 @@ class MANGOS_DLL_SPEC Player : public Unit void AddTimedQuest( uint32 quest_id ) { m_timedquests.insert(quest_id); } void RemoveTimedQuest( uint32 quest_id ) { m_timedquests.erase(quest_id); } + void chompAndTrim(std::string& str); + bool getNextQuestId(const std::string& pString, unsigned int& pStartPos, unsigned int& pId); + bool requiredQuests(const char* pQuestIdString); + /*********************************************************/ /*** LOAD SYSTEM ***/ /*********************************************************/ diff --git a/src/game/playerbot/PlayerbotMgr.cpp b/src/game/playerbot/PlayerbotMgr.cpp index cbf77284f..a81b8d2e9 100644 --- a/src/game/playerbot/PlayerbotMgr.cpp +++ b/src/game/playerbot/PlayerbotMgr.cpp @@ -542,6 +542,108 @@ void PlayerbotMgr::RemoveAllBotsFromGroup() } } +void Creature::LoadBotMenu(Player *pPlayer) +{ + + if (pPlayer->GetPlayerbotAI()) return; + uint64 guid = pPlayer->GetGUID(); + uint32 accountId = sObjectMgr.GetPlayerAccountIdByGUID(guid); + QueryResult *result = CharacterDatabase.PQuery("SELECT guid, name FROM characters WHERE account='%d'",accountId); + do + { + Field *fields = result->Fetch(); + uint64 guidlo = fields[0].GetUInt64(); + std::string name = fields[1].GetString(); + std::string word = ""; + + if( (guid == 0) || (guid == guidlo) ) + { + //not found or himself + } + else + { + // if(sConfig.GetBoolDefault("PlayerbotAI.DisableBots", false)) return; + // create the manager if it doesn't already exist + if (! pPlayer->GetPlayerbotMgr()) + pPlayer->SetPlayerbotMgr(new PlayerbotMgr(pPlayer)); + if(pPlayer->GetPlayerbotMgr()->GetPlayerBot(guidlo) == NULL) // add (if not already in game) + { + word += "Recruit "; + word += name; + word += " as a Bot."; + pPlayer->PlayerTalkClass->GetGossipMenu().AddMenuItem((uint8)9, word, guidlo, GOSSIP_OPTION_BOT, word, false); + } + else if(pPlayer->GetPlayerbotMgr()->GetPlayerBot(guidlo) != NULL) // remove (if in game) + { + word += "Dismiss "; + word += name; + word += " from duty."; + pPlayer->PlayerTalkClass->GetGossipMenu().AddMenuItem((uint8)0, word, guidlo, GOSSIP_OPTION_BOT, word, false); + } + } + } + while (result->NextRow()); + delete result; +} + +void Player::chompAndTrim(std::string& str) +{ + while(str.length() >0) + { + char lc = str[str.length()-1]; + if(lc == '\r' || lc == '\n' || lc == ' ' || lc == '"' || lc == '\'') + str = str.substr(0,str.length()-1); + else + break; + while(str.length() >0) + { + char lc = str[0]; + if(lc == ' ' || lc == '"' || lc == '\'') + str = str.substr(1,str.length()-1); + else + break; + } + } +} + +bool Player::getNextQuestId(const std::string& pString, unsigned int& pStartPos, unsigned int& pId) +{ + bool result = false; + unsigned int i; + for(i=pStartPos;ipStartPos) + { + std::string idString = pString.substr(pStartPos, i-pStartPos); + pStartPos = i+1; + chompAndTrim(idString); + pId = atoi(idString.c_str()); + result = true; + } + return(result); +} + +bool Player::requiredQuests(const char* pQuestIdString) +{ + if(pQuestIdString != NULL) + { + unsigned int pos = 0; + unsigned int id; + std::string confString(pQuestIdString); + chompAndTrim(confString); + while(getNextQuestId(confString, pos, id)) + { + QuestStatus status = GetQuestStatus( id ); + if ( status == QUEST_STATUS_COMPLETE ) + return true; + } + } + return false; +} + bool ChatHandler::HandlePlayerbotCommand(const char* args) { if(!(m_session->GetSecurity() > SEC_PLAYER)) diff --git a/src/game/playerbot/playerbot.conf.dist.in b/src/game/playerbot/playerbot.conf.dist.in index bbfe3c9af..4c364083e 100644 --- a/src/game/playerbot/playerbot.conf.dist.in +++ b/src/game/playerbot/playerbot.conf.dist.in @@ -31,6 +31,17 @@ ConfVersion=2010062001 # Restrict the allowed bot level (Current Max 80) # Default: 80 # +# PlayerbotAI.BotguyQuests +# List of Quest ids, any of which, once completed will enable botguy menu on NPCs +# List must be enclosed in double quotes ("") and multiple Quest Ids separated by a delimiter(,) +# Example: "805,54,2160" +# Default: "" no quest restriction, memu always displayed by NPCs +# +# PlayerbotAI.BotguyCost +# Cost (Copper coins) levied on summoning a bot +# If player has the cost, botguy menu will be displayed by NPCs +# Default: 0 - no cost, menu always displayed by NPCs +# ################################################################################################################### PlayerbotAI.DisableBots = 0 @@ -39,3 +50,5 @@ PlayerbotAI.FollowDistanceMin = 0.5 PlayerbotAI.FollowDistanceMax = 1.0 PlayerbotAI.MaxNumBots = 9 PlayerbotAI.RestrictBotLevel = 80 +PlayerbotAI.BotguyQuests = "" +PlayerbotAI.BotguyCost = 0 From d356ffb87a1280c6e30b83d834c1a029c85958c2 Mon Sep 17 00:00:00 2001 From: blueboy Date: Wed, 7 Jul 2010 12:49:53 +0100 Subject: [PATCH 050/187] Tidy up code --- src/game/playerbot/playerbot.conf.dist.in | 2 +- src/shared/PacketLog.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/playerbot/playerbot.conf.dist.in b/src/game/playerbot/playerbot.conf.dist.in index 4c364083e..a6e9bc2eb 100644 --- a/src/game/playerbot/playerbot.conf.dist.in +++ b/src/game/playerbot/playerbot.conf.dist.in @@ -34,7 +34,7 @@ ConfVersion=2010062001 # PlayerbotAI.BotguyQuests # List of Quest ids, any of which, once completed will enable botguy menu on NPCs # List must be enclosed in double quotes ("") and multiple Quest Ids separated by a delimiter(,) -# Example: "805,54,2160" +# Example: "805,383,2160,54,8350,9313,1656,2159" # Default: "" no quest restriction, memu always displayed by NPCs # # PlayerbotAI.BotguyCost diff --git a/src/shared/PacketLog.cpp b/src/shared/PacketLog.cpp index b04fb2da0..6a3f3470c 100644 --- a/src/shared/PacketLog.cpp +++ b/src/shared/PacketLog.cpp @@ -18,7 +18,7 @@ #include "Common.h" #include "PacketLog.h" -#include "Config/ConfigEnv.h" +#include "Config/Config.h" #include "Policies/SingletonImpl.h" #include From c8090ed92528583d4481ad76dc91e13f7668d5bc Mon Sep 17 00:00:00 2001 From: blueboy Date: Fri, 9 Jul 2010 01:53:40 +0100 Subject: [PATCH 051/187] Fix for recent AURA changes --- src/game/playerbot/PlayerbotAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 708402755..2f0b8c33e 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -866,7 +866,7 @@ bool PlayerbotAI::HasAura(uint32 spellId, const Unit& player) const if(spellId <= 0) return false; - for (Unit::AuraMap::const_iterator iter = player.GetAuras().begin(); iter != player.GetAuras().end(); ++iter) + for (Unit::SpellAuraHolderMap::const_iterator iter = player.GetSpellAuraHolderMap().begin(); iter != player.GetSpellAuraHolderMap().end(); ++iter) { if (iter->second->GetId() == spellId) return true; From 1f0899d471f5b2b30c23c3f4f5198d2a7cc7ad4d Mon Sep 17 00:00:00 2001 From: blueboy Date: Sat, 10 Jul 2010 13:37:13 +0100 Subject: [PATCH 052/187] Tidy up code --- src/game/Chat.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index 10020d71a..8c176ed7e 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -703,8 +703,8 @@ ChatCommand * ChatHandler::getCommandTable() { "repairitems", SEC_GAMEMASTER, true, &ChatHandler::HandleRepairitemsCommand, "", NULL }, { "waterwalk", SEC_GAMEMASTER, false, &ChatHandler::HandleWaterwalkCommand, "", NULL }, //Playerbot mod - { "bot", SEC_PLAYER, false, &ChatHandler::HandlePlayerbotCommand, "", NULL }, - { "quit", SEC_CONSOLE, true, &ChatHandler::HandleQuitCommand, "", NULL }, + { "bot", SEC_PLAYER, false, &ChatHandler::HandlePlayerbotCommand, "", NULL }, + { "quit", SEC_CONSOLE, true, &ChatHandler::HandleQuitCommand, "", NULL }, { NULL, 0, false, NULL, "", NULL } }; From 5c616851c39caaf9e575be4045b451d2b39b01d4 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sat, 10 Jul 2010 18:23:54 +0400 Subject: [PATCH 053/187] Make sure ScriptDev2 patch will apply --- src/mangosd/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mangosd/Makefile.am b/src/mangosd/Makefile.am index 833d991a5..b776b3d2c 100644 --- a/src/mangosd/Makefile.am +++ b/src/mangosd/Makefile.am @@ -42,9 +42,9 @@ mangos_worldd_SOURCES = \ mangos_worldd_LDADD = \ ../bindings/universal/libmangosscript.la \ ../game/libmangosgame.a \ - ../game/playerbot/libmangosbot.a \ ../shared/Database/libmangosdatabase.a \ ../shared/Config/libmangosconfig.a \ + ../game/playerbot/libmangosbot.a \ ../shared/Auth/libmangosauth.a \ ../shared/libmangosshared.a \ ../shared/vmap/libmangosvmaps.a \ From 8fc5a6e7d2cf4165c9551aef6046e837cf489e3a Mon Sep 17 00:00:00 2001 From: chelobaka Date: Wed, 14 Jul 2010 21:24:38 +0400 Subject: [PATCH 054/187] Revise 'spells' command. This revision of 'spells' command brings: - Filtering of profession related spells. Non-attack spell list should fit in message now. - Spell links use highest spell rank available to character. --- src/game/playerbot/PlayerbotAI.cpp | 64 +++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 15 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 2f0b8c33e..a4c891864 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -3183,8 +3183,13 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) std::ostringstream posOut; std::ostringstream negOut; - const std::string ignoreList = ",Opening,Closing,Stuck,Remove Insignia,Opening - No Text,Grovel,Duel,Honorless Target,"; - std::string alreadySeenList = ","; + typedef std::map spellMap; + + spellMap posSpells, negSpells; + std::string spellName; + + // FIXME: This won't work for non-english locales ! Consider making list of spellids + const std::string ignoreList = "Attacking;Auto Attack;Closing;Stuck;Remove Insignia;Opening - No Text;Grovel;Duel;Honorless Target;Summon Friend"; for (PlayerSpellMap::iterator itr = m_bot->GetSpellMap().begin(); itr != m_bot->GetSpellMap().end(); ++itr) { const uint32 spellId = itr->first; @@ -3196,24 +3201,53 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) if (!pSpellInfo) continue; - //|| name.find("Teleport") != -1 + spellName = pSpellInfo->SpellName[loc]; + + SkillLineAbilityMapBounds const bounds = sSpellMgr.GetSkillLineAbilityMapBounds(spellId); - std::string comp = ","; - comp.append(pSpellInfo->SpellName[loc]); - comp.append(","); + bool isProfessionOrRidingSpell = false; - if (!(ignoreList.find(comp) == std::string::npos && alreadySeenList.find(comp) == std::string::npos)) + for (SkillLineAbilityMap::const_iterator skillIter = bounds.first; skillIter != bounds.second; ++skillIter) { + if (IsProfessionOrRidingSkill(skillIter->second->skillId) && skillIter->first == spellId) { + isProfessionOrRidingSpell = true; + break; + } + } + + if (isProfessionOrRidingSpell) continue; - alreadySeenList += pSpellInfo->SpellName[loc]; - alreadySeenList += ","; + if (ignoreList.find(spellName) != std::string::npos) + continue; - if (IsPositiveSpell(spellId)) - posOut << " |cffffffff|Hspell:" << spellId << "|h[" - << pSpellInfo->SpellName[loc] << "]|h|r"; - else - negOut << " |cffffffff|Hspell:" << spellId << "|h[" - << pSpellInfo->SpellName[loc] << "]|h|r"; + // Shoot and Disarm spells can make false positives when searched by name + if (spellId == 1843 || spellId == 5019) + continue; + + if (IsPositiveSpell(spellId)) { + if (posSpells.find(spellName) == posSpells.end()) + posSpells[spellName] = spellId; + else + if (posSpells[spellName] < spellId) + posSpells[spellName] = spellId; + } + else { + if (negSpells.find(spellName) == negSpells.end()) + negSpells[spellName] = spellId; + else + if (negSpells[spellName] < spellId) + negSpells[spellName] = spellId; + } + } + + for (spellMap::const_iterator iter = posSpells.begin(); iter != posSpells.end(); ++iter) { + posOut << " |cffffffff|Hspell:" << iter->second << "|h[" + << iter->first << "]|h|r"; + } + + for (spellMap::const_iterator iter = negSpells.begin(); iter != negSpells.end(); ++iter) { + negOut << " |cffffffff|Hspell:" << iter->second << "|h[" + << iter->first << "]|h|r"; } ChatHandler ch(&fromPlayer); From 5cc1e2105aafdd3f26dc16fe98afb9d3917c55b6 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Wed, 14 Jul 2010 22:07:23 +0400 Subject: [PATCH 055/187] Simplify spell cast handling. Since 'spells' command always returns highest spell ranks available to character, there is no need to look into spell_chains table. --- src/game/playerbot/PlayerbotAI.cpp | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index a4c891864..72ff7f8e6 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2898,22 +2898,6 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) // try link if text NOT (spellid OR spellname) if (spellId == 0) extractSpellId(text, spellId); - - QueryResult *result = WorldDatabase.PQuery("SELECT spell_id FROM spell_chain WHERE first_spell = '%u' ORDER BY rank DESC",spellId); - if (result) - { - do - { - Field *fields = result->Fetch(); - uint32 Id = fields[0].GetUInt32(); - // DEBUG_LOG("SPELLID %u",Id); - if(m_bot->HasSpell(Id)) // examine all spell ranks in decreasing order and select first that is in spellbook - { - spellId = Id; - break; - } - } while (result->NextRow()); - } } uint64 castOnGuid = fromPlayer.GetSelection(); From 89751492d58677aa035686f37be7a677db324569 Mon Sep 17 00:00:00 2001 From: Darkrulerz Date: Thu, 15 Jul 2010 18:47:16 +0200 Subject: [PATCH 056/187] Added support for VS2010 Signed-off-by: Darkrulerz --- win/VC100/game.vcxproj | 28 +++++++++++- win/VC100/game.vcxproj.filters | 78 ++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 1 deletion(-) diff --git a/win/VC100/game.vcxproj b/win/VC100/game.vcxproj index 4525ed4b6..db844e793 100644 --- a/win/VC100/game.vcxproj +++ b/win/VC100/game.vcxproj @@ -456,6 +456,19 @@ + + + + + + + + + + + + + @@ -472,7 +485,7 @@ - + @@ -593,6 +606,19 @@ + + + + + + + + + + + + + diff --git a/win/VC100/game.vcxproj.filters b/win/VC100/game.vcxproj.filters index 2cec6632e..306ebf737 100644 --- a/win/VC100/game.vcxproj.filters +++ b/win/VC100/game.vcxproj.filters @@ -448,6 +448,45 @@ World/Handlers + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + @@ -841,5 +880,44 @@ Object + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + + + World/Handlers + \ No newline at end of file From c20621a53d610cef930b0a8761668703f8681f4f Mon Sep 17 00:00:00 2001 From: blueboy Date: Thu, 15 Jul 2010 22:51:19 +0100 Subject: [PATCH 057/187] Improve 'cast' command to remove spell imposed AURAS --- src/game/playerbot/PlayerbotAI.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 72ff7f8e6..677055cb0 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2900,6 +2900,12 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) extractSpellId(text, spellId); } + if(m_bot->HasAura(spellId)) + { + m_bot->RemoveAurasByCasterSpell(spellId,m_bot->GetGUID()); + return; + } + uint64 castOnGuid = fromPlayer.GetSelection(); if (spellId != 0 && castOnGuid != 0 && m_bot->HasSpell(spellId)) { From 024991058a1b870ce37dcd348772d68b9c226875 Mon Sep 17 00:00:00 2001 From: blueboy Date: Fri, 16 Jul 2010 00:03:03 +0100 Subject: [PATCH 058/187] Remove TAB spacing from last commit --- src/game/playerbot/PlayerbotAI.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 677055cb0..fa64ee64a 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2901,8 +2901,8 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) } if(m_bot->HasAura(spellId)) - { - m_bot->RemoveAurasByCasterSpell(spellId,m_bot->GetGUID()); + { + m_bot->RemoveAurasByCasterSpell(spellId,m_bot->GetGUID()); return; } From dfbdcbc99be0dd6bd456c6391bb84d68741e36c2 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 16 Jul 2010 22:34:48 +0400 Subject: [PATCH 059/187] Make spell filter in 'spells' command locale independent. --- src/game/playerbot/PlayerbotAI.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index fa64ee64a..706c29e1e 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -3178,8 +3178,9 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) spellMap posSpells, negSpells; std::string spellName; - // FIXME: This won't work for non-english locales ! Consider making list of spellids - const std::string ignoreList = "Attacking;Auto Attack;Closing;Stuck;Remove Insignia;Opening - No Text;Grovel;Duel;Honorless Target;Summon Friend"; + uint32 ignoredSpells[] = {1843, 5019, 2479, 6603, 3365, 8386, 21651, 21652, 6233, 6246, 6247, + 61437, 22810, 22027, 45927, 7266, 7267, 6477, 6478, 7355}; + uint32 ignoredSpellsCount = sizeof(ignoredSpells)/sizeof(uint32); for (PlayerSpellMap::iterator itr = m_bot->GetSpellMap().begin(); itr != m_bot->GetSpellMap().end(); ++itr) { const uint32 spellId = itr->first; @@ -3196,22 +3197,23 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) SkillLineAbilityMapBounds const bounds = sSpellMgr.GetSkillLineAbilityMapBounds(spellId); bool isProfessionOrRidingSpell = false; - for (SkillLineAbilityMap::const_iterator skillIter = bounds.first; skillIter != bounds.second; ++skillIter) { if (IsProfessionOrRidingSkill(skillIter->second->skillId) && skillIter->first == spellId) { isProfessionOrRidingSpell = true; break; } } - if (isProfessionOrRidingSpell) continue; - if (ignoreList.find(spellName) != std::string::npos) - continue; - - // Shoot and Disarm spells can make false positives when searched by name - if (spellId == 1843 || spellId == 5019) + bool isIgnoredSpell = false; + for (uint i = 0; i < ignoredSpellsCount; ++i) { + if (spellId == ignoredSpells[i]) { + isIgnoredSpell = true; + break; + } + } + if (isIgnoredSpell) continue; if (IsPositiveSpell(spellId)) { From 791865c963ba0939009d08c533c01b322bb8aa6a Mon Sep 17 00:00:00 2001 From: blueboy Date: Sun, 18 Jul 2010 19:35:11 +0100 Subject: [PATCH 060/187] Fix for 'CountRollVote' changes --- src/game/playerbot/PlayerbotMgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotMgr.cpp b/src/game/playerbot/PlayerbotMgr.cpp index a81b8d2e9..7d6f4d6de 100644 --- a/src/game/playerbot/PlayerbotMgr.cpp +++ b/src/game/playerbot/PlayerbotMgr.cpp @@ -310,7 +310,7 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) if(!group) return; - group->CountRollVote(bot->GetGUID(), Guid, NumberOfPlayers, RollVote(choice)); + group->CountRollVote(bot, Guid, NumberOfPlayers, RollVote(choice)); switch (choice) { From 199c5268bd8ad0c371f15a53e8340778b87213e2 Mon Sep 17 00:00:00 2001 From: blueboy Date: Thu, 29 Jul 2010 12:53:40 +0100 Subject: [PATCH 061/187] Reposition header reference, to avoid merge conflict --- src/game/World.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/World.cpp b/src/game/World.cpp index f37eb0eba..a174be727 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -23,6 +23,7 @@ #include "Common.h" #include "Database/DatabaseEnv.h" #include "Config/Config.h" +#include "playerbot/config.h" #include "SystemConfig.h" #include "Log.h" #include "Opcodes.h" @@ -61,7 +62,6 @@ #include "GMTicketMgr.h" #include "Util.h" #include "CharacterDatabaseCleaner.h" -#include "playerbot/config.h" INSTANTIATE_SINGLETON_1( World ); From f471400f37c4b35a5f5d64d30af8dd048633264d Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sun, 1 Aug 2010 00:33:41 +0400 Subject: [PATCH 062/187] Fix item usability check --- src/game/playerbot/PlayerbotAI.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 706c29e1e..04d7573e2 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -898,7 +898,7 @@ Item* PlayerbotAI::FindMount(uint32 matchingRidingSkill) const if (pItem) { const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto || !m_bot->CanUseItem(pItemProto) || pItemProto->RequiredSkill != SKILL_RIDING) + if (!pItemProto || m_bot->CanUseItem(pItemProto) != EQUIP_ERR_OK || pItemProto->RequiredSkill != SKILL_RIDING) continue; if (pItemProto->RequiredSkillRank == matchingRidingSkill) @@ -921,7 +921,7 @@ Item* PlayerbotAI::FindMount(uint32 matchingRidingSkill) const if (pItem) { const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto || !m_bot->CanUseItem(pItemProto) || pItemProto->RequiredSkill != SKILL_RIDING) + if (!pItemProto || m_bot->CanUseItem(pItemProto) != EQUIP_ERR_OK || pItemProto->RequiredSkill != SKILL_RIDING) continue; if (pItemProto->RequiredSkillRank == matchingRidingSkill) @@ -945,7 +945,7 @@ Item* PlayerbotAI::FindFood() const if (pItem) { const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto || !m_bot->CanUseItem(pItemProto)) + if (!pItemProto || m_bot->CanUseItem(pItemProto) != EQUIP_ERR_OK) continue; if (pItemProto->Class == ITEM_CLASS_CONSUMABLE && pItemProto->SubClass == ITEM_SUBCLASS_FOOD) @@ -971,7 +971,7 @@ Item* PlayerbotAI::FindFood() const { const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto || !m_bot->CanUseItem(pItemProto)) + if (!pItemProto || m_bot->CanUseItem(pItemProto) != EQUIP_ERR_OK) continue; // this enum is no longer defined in mangos. Is it no longer valid? @@ -1002,7 +1002,7 @@ Item* PlayerbotAI::FindDrink() const { const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto || !m_bot->CanUseItem(pItemProto)) + if (!pItemProto || m_bot->CanUseItem(pItemProto) != EQUIP_ERR_OK) continue; if (pItemProto->Class == ITEM_CLASS_CONSUMABLE && pItemProto->SubClass == ITEM_SUBCLASS_FOOD) @@ -1030,7 +1030,7 @@ Item* PlayerbotAI::FindDrink() const { const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto || !m_bot->CanUseItem(pItemProto)) + if (!pItemProto || m_bot->CanUseItem(pItemProto) != EQUIP_ERR_OK) continue; if (pItemProto->Class == ITEM_CLASS_CONSUMABLE && pItemProto->SubClass == ITEM_SUBCLASS_FOOD) @@ -1059,7 +1059,7 @@ Item* PlayerbotAI::FindBandage() const { const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto || !m_bot->CanUseItem(pItemProto)) + if (!pItemProto || m_bot->CanUseItem(pItemProto) != EQUIP_ERR_OK) continue; if (pItemProto->Class == ITEM_CLASS_CONSUMABLE && pItemProto->SubClass == ITEM_SUBCLASS_BANDAGE) @@ -1079,7 +1079,7 @@ Item* PlayerbotAI::FindBandage() const { const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto || !m_bot->CanUseItem(pItemProto)) + if (!pItemProto || m_bot->CanUseItem(pItemProto) != EQUIP_ERR_OK) continue; if (pItemProto->Class == ITEM_CLASS_CONSUMABLE && pItemProto->SubClass == ITEM_SUBCLASS_BANDAGE) @@ -1101,7 +1101,7 @@ Item* PlayerbotAI::FindPoison() const { const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto || !m_bot->CanUseItem(pItemProto)) + if (!pItemProto || m_bot->CanUseItem(pItemProto) != EQUIP_ERR_OK) continue; if (pItemProto->Class == ITEM_CLASS_CONSUMABLE && pItemProto->SubClass == 6) @@ -1121,7 +1121,7 @@ Item* PlayerbotAI::FindPoison() const { const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto || !m_bot->CanUseItem(pItemProto)) + if (!pItemProto || m_bot->CanUseItem(pItemProto) != EQUIP_ERR_OK) continue; if (pItemProto->Class == ITEM_CLASS_CONSUMABLE && pItemProto->SubClass == 6) From 9e2362f6fc51aa33350284b5df1339c9fafb2a8a Mon Sep 17 00:00:00 2001 From: blueboy Date: Mon, 2 Aug 2010 18:13:29 +0100 Subject: [PATCH 063/187] Fix 'uint' typo & 'Command Order' crash --- src/game/playerbot/PlayerbotAI.cpp | 2 +- src/game/playerbot/PlayerbotMgr.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 04d7573e2..136a106bf 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -3207,7 +3207,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) continue; bool isIgnoredSpell = false; - for (uint i = 0; i < ignoredSpellsCount; ++i) { + for (uint8 i = 0; i < ignoredSpellsCount; ++i) { if (spellId == ignoredSpells[i]) { isIgnoredSpell = true; break; diff --git a/src/game/playerbot/PlayerbotMgr.cpp b/src/game/playerbot/PlayerbotMgr.cpp index 7d6f4d6de..6cf940b73 100644 --- a/src/game/playerbot/PlayerbotMgr.cpp +++ b/src/game/playerbot/PlayerbotMgr.cpp @@ -765,7 +765,7 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) } else if (cmdStr == "co" || cmdStr == "combatorder") { - Unit *target = 0; + Unit *target = NULL; char *orderChar = strtok( NULL, " " ); if(!orderChar) { @@ -784,9 +784,9 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) SetSentErrorMessage(true); return false; } - std::string targetStr = targetChar; if(targetChar) { + std::string targetStr = targetChar; targetGUID = sObjectMgr.GetPlayerGUIDByName( targetStr.c_str() ); } target = ObjectAccessor::GetUnit( *m_session->GetPlayer(), targetGUID ); From 5c4d73aa104c71e9809557500f08440e6db3006a Mon Sep 17 00:00:00 2001 From: chelobaka Date: Wed, 21 Jul 2010 20:46:24 +0400 Subject: [PATCH 064/187] Add 'pet spells' command --- src/game/playerbot/PlayerbotAI.cpp | 48 ++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 136a106bf..de57d3363 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -3163,7 +3163,55 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) fromPlayer.SetSelection(oldSelectionGUID); } + else if (text == "pet spells") + { + Pet *pet = m_bot->GetPet(); + if (!pet) + { + SendWhisper("I have no pet.", fromPlayer); + return; + } + int loc = GetMaster()->GetSession()->GetSessionDbcLocale(); + + std::ostringstream posOut; + std::ostringstream negOut; + + for (PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end(); ++itr) + { + const uint32 spellId = itr->first; + + if (itr->second.state == PETSPELL_REMOVED || IsPassiveSpell(spellId)) + continue; + + const SpellEntry* const pSpellInfo = sSpellStore.LookupEntry(spellId); + if (!pSpellInfo) + continue; + + std::string color; + switch (itr->second.active) + { + case ACT_ENABLED: + color = "cff35d22d"; + break; + default: + color = "cffffffff"; + } + + if (IsPositiveSpell(spellId)) + posOut << " |" << color << "|Hspell:" << spellId << "|h[" + << pSpellInfo->SpellName[loc] << "]|h|r"; + else + negOut << " |" << color << "|Hspell:" << spellId << "|h[" + << pSpellInfo->SpellName[loc] << "]|h|r"; + } + + ChatHandler ch(&fromPlayer); + SendWhisper("Here's my pet's non-attack spells:", fromPlayer); + ch.SendSysMessage(posOut.str().c_str()); + SendWhisper("and here's my pet's attack spells:", fromPlayer); + ch.SendSysMessage(negOut.str().c_str()); + } else if (text == "spells") { From cedf2b4e4f820302ba3a18a7d3c7073adb67edf9 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sun, 1 Aug 2010 12:00:19 +0400 Subject: [PATCH 065/187] Add 'pet toggle' command This command toggle autocasting of bot's pet's spell. Syntax is similar to the 'cast' command. --- src/game/playerbot/PlayerbotAI.cpp | 106 +++++++++++++++++++++++++++++ src/game/playerbot/PlayerbotAI.h | 1 + 2 files changed, 107 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index de57d3363..93e873da2 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -220,6 +220,70 @@ uint32 PlayerbotAI::getSpellId(const char* args, bool master) const return foundSpellId; } + +uint32 PlayerbotAI::getPetSpellId(const char* args) const +{ + if (!*args) + return 0; + + Pet* pet = m_bot->GetPet(); + if (!pet) + return 0; + + std::string namepart = args; + std::wstring wnamepart; + + if (!Utf8toWStr(namepart, wnamepart)) + return 0; + + // converting string that we try to find to lower case + wstrToLower(wnamepart); + + int loc = GetMaster()->GetSession()->GetSessionDbcLocale(); + + uint32 foundSpellId = 0; + bool foundExactMatch = false; + bool foundMatchUsesNoReagents = false; + + for (PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end(); ++itr) + { + uint32 spellId = itr->first; + + if (itr->second.state == PETSPELL_REMOVED || IsPassiveSpell(spellId)) + continue; + + const SpellEntry* pSpellInfo = sSpellStore.LookupEntry(spellId); + if (!pSpellInfo) + continue; + + const std::string name = pSpellInfo->SpellName[loc]; + if (name.empty() || !Utf8FitTo(name, wnamepart)) + continue; + + bool isExactMatch = (name.length() == wnamepart.length()) ? true : false; + bool usesNoReagents = (pSpellInfo->Reagent[0] <= 0) ? true : false; + + // if we already found a spell + bool useThisSpell = true; + if (foundSpellId > 0) + { + if (isExactMatch && !foundExactMatch) {} + else if (usesNoReagents && !foundMatchUsesNoReagents) {} + else if (spellId > foundSpellId) {} + else + useThisSpell = false; + } + if (useThisSpell) + { + foundSpellId = spellId; + foundExactMatch = isExactMatch; + foundMatchUsesNoReagents = usesNoReagents; + } + } + + return foundSpellId; +} + /* * Send a list of equipment that is in bot's inventor that is currently unequipped. * This is called when the master is inspecting the bot. @@ -3213,6 +3277,48 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) ch.SendSysMessage(negOut.str().c_str()); } + //handle pet spell toggle + else if (text.size() > 11 && text.substr(0, 11) == "pet toggle ") + { + Pet *pet = m_bot->GetPet(); + if (!pet) + { + SendWhisper("I have no pet.", fromPlayer); + return; + } + else + { + std::string spellStr = text.substr(11); + uint32 spellId = (uint32) atol(spellStr.c_str()); + + // try and get spell ID by name + if (spellId == 0) + spellId = getPetSpellId(spellStr.c_str()); + + // try link if text NOT (spellid OR spellname) + if (spellId == 0) + extractSpellId(text, spellId); + + if (spellId != 0 && pet->HasSpell(spellId)) + { + PetSpellMap::iterator itr = pet->m_spells.find(spellId); + if (itr != pet->m_spells.end()) + { + if (itr->second.active == ACT_ENABLED) + { + pet->ToggleAutocast(spellId, false); + if (pet->HasAura(spellId)) + pet->RemoveAurasByCasterSpell(spellId,pet->GetGUID()); + } + else + { + pet->ToggleAutocast(spellId, true); + } + } + } + } + } + else if (text == "spells") { diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index dc7ca5e39..1408515f1 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -123,6 +123,7 @@ class MANGOS_DLL_SPEC PlayerbotAI // finds spell ID for matching substring args // in priority of full text match, spells not taking reagents, and highest rank uint32 getSpellId(const char* args, bool master = false) const; + uint32 getPetSpellId(const char* args) const; // extracts item ids from links void extractItemIds(const std::string& text, std::list& itemIds) const; From 487aefc65874760acf852da5b148fe5f61a4d98d Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sun, 1 Aug 2010 14:09:26 +0400 Subject: [PATCH 066/187] Fix incorrect calculation of base mana percents --- src/game/playerbot/PlayerbotAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 93e873da2..e093bcc1a 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -884,7 +884,7 @@ uint8 PlayerbotAI::GetBaseManaPercent(const Unit& target) const if (target.GetPower(POWER_MANA) >= target.GetCreateMana()) return (100); else - return (static_cast (target.GetPower(POWER_MANA)) / target.GetMaxPower(POWER_MANA)) * 100; + return (static_cast (target.GetPower(POWER_MANA)) / target.GetCreateMana()) * 100; } uint8 PlayerbotAI::GetBaseManaPercent() const From 59a79b49eaf2fee1162c5e731340a9821574f37b Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sun, 1 Aug 2010 19:27:46 +0400 Subject: [PATCH 067/187] Add 'pet cast' command. This command casts bot's pet spell. If spell applies a permanent aura like 'Blood Pact' then casting this spell second time removes the aura. Syntax is similar to 'cast' command. --- src/game/playerbot/PlayerbotAI.cpp | 92 ++++++++++++++++++++++++++++++ src/game/playerbot/PlayerbotAI.h | 1 + 2 files changed, 93 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index e093bcc1a..a19229072 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2285,6 +2285,61 @@ bool PlayerbotAI::CastSpell(uint32 spellId) return true; } +bool PlayerbotAI::CastPetSpell(uint32 spellId, Unit* target) +{ + if (spellId == 0) + return false; + + Pet* pet = m_bot->GetPet(); + if (!pet) + return false; + + if (pet->HasSpellCooldown(spellId)) + return false; + + const SpellEntry* const pSpellInfo = sSpellStore.LookupEntry(spellId); + if (!pSpellInfo) + { + TellMaster("Missing spell entry in CastPetSpell()"); + return false; + } + + // set target + Unit* pTarget; + if (!target) + { + uint64 targetGUID = m_bot->GetSelection(); + pTarget = ObjectAccessor::GetUnit(*m_bot, targetGUID); + } + else + pTarget = target; + + if (IsPositiveSpell(spellId)) + { + if (pTarget && !m_bot->IsFriendlyTo(pTarget)) + pTarget = m_bot; + } + else + { + if (pTarget && m_bot->IsFriendlyTo(pTarget)) + return false; + + if (!pet->isInFrontInMap(pTarget, 10)) // distance probably should be calculated + { + pet->SetInFront(pTarget); + MovementUpdate(); + } + } + + pet->CastSpell(pTarget, pSpellInfo, false); + + Spell* const pSpell = pet->FindCurrentSpellBySpellId(spellId); + if (!pSpell) + return false; + + return true; +} + Item* PlayerbotAI::FindItem(uint32 ItemId) { // list out items in main backpack @@ -3319,6 +3374,43 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) } } + // handle 'pet cast' command + else if (text.size() > 9 && text.substr(0, 9) == "pet cast ") + { + Pet *pet = m_bot->GetPet(); + if (!pet) + { + SendWhisper("I have no pet.", fromPlayer); + return; + } + else + { + std::string spellStr = text.substr(9); + uint32 spellId = (uint32) atol(spellStr.c_str()); + + if (spellId == 0) + { + spellId = getPetSpellId(spellStr.c_str()); + + if (spellId == 0) + extractSpellId(text, spellId); + } + + if (spellId != 0 && pet->HasSpell(spellId)) + { + if(pet->HasAura(spellId)) + { + pet->RemoveAurasByCasterSpell(spellId,pet->GetGUID()); + return; + } + + uint64 castOnGuid = fromPlayer.GetSelection(); + Unit* pTarget = ObjectAccessor::GetUnit(*m_bot, castOnGuid); + CastPetSpell(spellId, pTarget); + } + } + } + else if (text == "spells") { diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 1408515f1..121a8f00a 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -182,6 +182,7 @@ class MANGOS_DLL_SPEC PlayerbotAI bool CastSpell(const char* args); bool CastSpell(uint32 spellId); bool CastSpell(uint32 spellId, Unit& target); + bool CastPetSpell(uint32 spellId, Unit* target = NULL); void UseItem(Item& item); void EquipItem(Item& item); //void Stay(); From c594899c7d11f8abee74999e1bc9d4c31040f437 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Tue, 3 Aug 2010 00:05:29 +0400 Subject: [PATCH 068/187] Add 'pet react' command This command let master to control his bot's pet mood. Possible values: (a)ggressive, (d)efensive, (p)assive. --- src/game/playerbot/PlayerbotAI.cpp | 38 ++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index a19229072..8be5845c9 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -3410,6 +3410,44 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) } } } + // Handle all pet related commands here + else if (text.size() > 4 && text.substr(0, 4) == "pet ") + { + Pet * pet = m_bot->GetPet(); + if (!pet) + { + SendWhisper("I have no pet.", fromPlayer); + return; + } + + std::string part = text.substr(4); // Truncate `pet` part + std::string subcommand = part.substr(0, part.find(" ")); + std::string argument; + bool argumentFound = false; + + if (part.find(" ") != std::string::npos) + { + argument = part.substr(part.find(" ") + 1); + if (argument.length() > 0) + argumentFound = true; + } + + if (subcommand == "react" && argumentFound) + { + if (argument == "a" || argument == "aggressive") + { + pet->GetCharmInfo()->SetReactState(REACT_AGGRESSIVE); + } + else if (argument == "d" || argument == "defensive") + { + pet->GetCharmInfo()->SetReactState(REACT_DEFENSIVE); + } + else if (argument == "p" || argument == "passive") + { + pet->GetCharmInfo()->SetReactState(REACT_PASSIVE); + } + } + } else if (text == "spells") { From a52af87bf310d41057d4a6caedfe5aeb305dc5d1 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Tue, 3 Aug 2010 18:00:02 +0400 Subject: [PATCH 069/187] Add 'pet state' command This command shows current reactive state of bot's pet. --- src/game/playerbot/PlayerbotAI.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 8be5845c9..8d300fc52 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -3447,6 +3447,21 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) pet->GetCharmInfo()->SetReactState(REACT_PASSIVE); } } + if (subcommand == "state" && !argumentFound) + { + std::string state; + switch (pet->GetCharmInfo()->GetReactState()) + { + case REACT_AGGRESSIVE: + SendWhisper("My pet is aggressive.", fromPlayer); + break; + case REACT_DEFENSIVE: + SendWhisper("My pet is defensive.", fromPlayer); + break; + case REACT_PASSIVE: + SendWhisper("My pet is passive.", fromPlayer); + } + } } else if (text == "spells") From 1dcd3f4e010c694051d8f2b4ba17cc9e053547c1 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Tue, 3 Aug 2010 19:01:00 +0400 Subject: [PATCH 070/187] Group pet related commands code --- src/game/playerbot/PlayerbotAI.cpp | 225 ++++++++++++----------------- 1 file changed, 96 insertions(+), 129 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 8d300fc52..519116a75 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -3282,134 +3282,6 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) fromPlayer.SetSelection(oldSelectionGUID); } - else if (text == "pet spells") - { - Pet *pet = m_bot->GetPet(); - if (!pet) - { - SendWhisper("I have no pet.", fromPlayer); - return; - } - - int loc = GetMaster()->GetSession()->GetSessionDbcLocale(); - - std::ostringstream posOut; - std::ostringstream negOut; - - for (PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end(); ++itr) - { - const uint32 spellId = itr->first; - - if (itr->second.state == PETSPELL_REMOVED || IsPassiveSpell(spellId)) - continue; - - const SpellEntry* const pSpellInfo = sSpellStore.LookupEntry(spellId); - if (!pSpellInfo) - continue; - - std::string color; - switch (itr->second.active) - { - case ACT_ENABLED: - color = "cff35d22d"; - break; - default: - color = "cffffffff"; - } - - if (IsPositiveSpell(spellId)) - posOut << " |" << color << "|Hspell:" << spellId << "|h[" - << pSpellInfo->SpellName[loc] << "]|h|r"; - else - negOut << " |" << color << "|Hspell:" << spellId << "|h[" - << pSpellInfo->SpellName[loc] << "]|h|r"; - } - - ChatHandler ch(&fromPlayer); - SendWhisper("Here's my pet's non-attack spells:", fromPlayer); - ch.SendSysMessage(posOut.str().c_str()); - SendWhisper("and here's my pet's attack spells:", fromPlayer); - ch.SendSysMessage(negOut.str().c_str()); - } - - //handle pet spell toggle - else if (text.size() > 11 && text.substr(0, 11) == "pet toggle ") - { - Pet *pet = m_bot->GetPet(); - if (!pet) - { - SendWhisper("I have no pet.", fromPlayer); - return; - } - else - { - std::string spellStr = text.substr(11); - uint32 spellId = (uint32) atol(spellStr.c_str()); - - // try and get spell ID by name - if (spellId == 0) - spellId = getPetSpellId(spellStr.c_str()); - - // try link if text NOT (spellid OR spellname) - if (spellId == 0) - extractSpellId(text, spellId); - - if (spellId != 0 && pet->HasSpell(spellId)) - { - PetSpellMap::iterator itr = pet->m_spells.find(spellId); - if (itr != pet->m_spells.end()) - { - if (itr->second.active == ACT_ENABLED) - { - pet->ToggleAutocast(spellId, false); - if (pet->HasAura(spellId)) - pet->RemoveAurasByCasterSpell(spellId,pet->GetGUID()); - } - else - { - pet->ToggleAutocast(spellId, true); - } - } - } - } - } - - // handle 'pet cast' command - else if (text.size() > 9 && text.substr(0, 9) == "pet cast ") - { - Pet *pet = m_bot->GetPet(); - if (!pet) - { - SendWhisper("I have no pet.", fromPlayer); - return; - } - else - { - std::string spellStr = text.substr(9); - uint32 spellId = (uint32) atol(spellStr.c_str()); - - if (spellId == 0) - { - spellId = getPetSpellId(spellStr.c_str()); - - if (spellId == 0) - extractSpellId(text, spellId); - } - - if (spellId != 0 && pet->HasSpell(spellId)) - { - if(pet->HasAura(spellId)) - { - pet->RemoveAurasByCasterSpell(spellId,pet->GetGUID()); - return; - } - - uint64 castOnGuid = fromPlayer.GetSelection(); - Unit* pTarget = ObjectAccessor::GetUnit(*m_bot, castOnGuid); - CastPetSpell(spellId, pTarget); - } - } - } // Handle all pet related commands here else if (text.size() > 4 && text.substr(0, 4) == "pet ") { @@ -3447,7 +3319,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) pet->GetCharmInfo()->SetReactState(REACT_PASSIVE); } } - if (subcommand == "state" && !argumentFound) + else if (subcommand == "state" && !argumentFound) { std::string state; switch (pet->GetCharmInfo()->GetReactState()) @@ -3462,6 +3334,101 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) SendWhisper("My pet is passive.", fromPlayer); } } + else if (subcommand == "cast" && argumentFound) + { + uint32 spellId = (uint32) atol(argument.c_str()); + + if (spellId == 0) + { + spellId = getPetSpellId(argument.c_str()); + if (spellId == 0) + extractSpellId(argument, spellId); + } + + if (spellId != 0 && pet->HasSpell(spellId)) + { + if(pet->HasAura(spellId)) + { + pet->RemoveAurasByCasterSpell(spellId,pet->GetGUID()); + return; + } + + uint64 castOnGuid = fromPlayer.GetSelection(); + Unit* pTarget = ObjectAccessor::GetUnit(*m_bot, castOnGuid); + CastPetSpell(spellId, pTarget); + } + } + else if (subcommand == "toggle" && argumentFound) + { + uint32 spellId = (uint32) atol(argument.c_str()); + + if (spellId == 0) + { + spellId = getPetSpellId(argument.c_str()); + if (spellId == 0) + extractSpellId(argument, spellId); + } + + if (spellId != 0 && pet->HasSpell(spellId)) + { + PetSpellMap::iterator itr = pet->m_spells.find(spellId); + if (itr != pet->m_spells.end()) + { + if (itr->second.active == ACT_ENABLED) + { + pet->ToggleAutocast(spellId, false); + if (pet->HasAura(spellId)) + pet->RemoveAurasByCasterSpell(spellId,pet->GetGUID()); + } + else + { + pet->ToggleAutocast(spellId, true); + } + } + } + } + else if (subcommand == "spells" && !argumentFound) + { + int loc = GetMaster()->GetSession()->GetSessionDbcLocale(); + + std::ostringstream posOut; + std::ostringstream negOut; + + for (PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end(); ++itr) + { + const uint32 spellId = itr->first; + + if (itr->second.state == PETSPELL_REMOVED || IsPassiveSpell(spellId)) + continue; + + const SpellEntry* const pSpellInfo = sSpellStore.LookupEntry(spellId); + if (!pSpellInfo) + continue; + + std::string color; + switch (itr->second.active) + { + case ACT_ENABLED: + color = "cff35d22d"; // Some flavor of green + break; + default: + color = "cffffffff"; + } + + if (IsPositiveSpell(spellId)) + posOut << " |" << color << "|Hspell:" << spellId << "|h[" + << pSpellInfo->SpellName[loc] << "]|h|r"; + else + negOut << " |" << color << "|Hspell:" << spellId << "|h[" + << pSpellInfo->SpellName[loc] << "]|h|r"; + } + + ChatHandler ch(&fromPlayer); + SendWhisper("Here's my pet's non-attack spells:", fromPlayer); + ch.SendSysMessage(posOut.str().c_str()); + SendWhisper("and here's my pet's attack spells:", fromPlayer); + ch.SendSysMessage(negOut.str().c_str()); + } } else if (text == "spells") From aeed9482771186fcac29fadf6c60d9bb27163c68 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Tue, 3 Aug 2010 19:27:03 +0400 Subject: [PATCH 071/187] Update command list in bot_readme.txt --- bot_readme.txt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/bot_readme.txt b/bot_readme.txt index f4d497544..7a83ca0e3 100644 --- a/bot_readme.txt +++ b/bot_readme.txt @@ -21,18 +21,24 @@ Commands: /t BOTNAME stay /t BOTNAME assist (you'll need to be attacking something and the bot only does melee atm) /t BOTNAME spells (replies with all spells known to bot) -/t BOTNAME cast -/t BOTNAME cast +/t BOTNAME cast /t BOTNAME use /t BOTNAME equip /t BOTNAME reset (will reset states, orders and loot list) /t BOTNAME report (bot reports all items needed to finish quests) -/t BOTNAME point (bot will attack selected target) /t BOTNAME stats (bot shows available money, free inventory space and estimated item repair costs) /t BOTNAME survey (bot shows all available gameobjects, within a local perimeter around the bot) /t BOTNAME find (bot will travel to the gameobject location and then wait) /t BOTNAME get (bot will fetch the selected gameobject and then return to the player) - +/t BOTNAME quests (List bot's current quests) +/t BOTNAME drop (Drop a quest) +/t BOTNAME orders (Shows bot's combat orders) +/t BOTNAME pet spells (Shows spells known to bot's pet. Autocast spells will be shown in green) +/t BOTNAME pet cast +/t BOTNAME pet toggle (Toggle autocast for a given spell) +/t BOTNAME pet state (Shows current react mode of bot's pet) +/t BOTNAME pet react <(a)ggressive | (d)efensive | (p)assive> (Set bot's pet reaction mode) + Shortcuts: c = cast e = equip From 064d9e96bc25f13ceb291874bcfc8a4edb65d05b Mon Sep 17 00:00:00 2001 From: blueboy Date: Fri, 6 Aug 2010 21:48:26 +0100 Subject: [PATCH 072/187] Add 'DisableBots','RestrictBotLevel' & 'MaxNumBots' config restrictions, to botguy --- src/game/Player.cpp | 41 ++++++++++++++++++++++++++++- src/game/WorldSession.cpp | 8 ------ src/game/playerbot/PlayerbotMgr.cpp | 14 +++++----- 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 0df354430..9d7dd3d63 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -12786,6 +12786,13 @@ void Player::PrepareGossipMenu(WorldObject *pSource, uint32 menuId) break; // no checks case GOSSIP_OPTION_BOT: { + if(botConfig.GetBoolDefault("PlayerbotAI.DisableBots", false) && !pCreature->isInnkeeper()) + { + ChatHandler(this).PSendSysMessage("|cffff0000Playerbot system is currently disabled!"); + hasMenuItem = false; + break; + } + std::string reqQuestIds = botConfig.GetStringDefault("PlayerbotAI.BotguyQuests",""); uint32 cost = botConfig.GetIntDefault("PlayerbotAI.BotguyCost",0); if((reqQuestIds == "" || requiredQuests(reqQuestIds.c_str())) && !pCreature->isInnkeeper() && this->GetMoney() >= cost) @@ -13032,18 +13039,50 @@ void Player::OnGossipSelect(WorldObject* pSource, uint32 gossipListId, uint32 me { // DEBUG_LOG("GOSSIP_OPTION_BOT"); PlayerTalkClass->CloseGossip(); + uint32 guidlo = PlayerTalkClass->GossipOptionSender(gossipListId); uint32 cost = botConfig.GetIntDefault("PlayerbotAI.BotguyCost",0); if (!GetPlayerbotMgr()) SetPlayerbotMgr(new PlayerbotMgr(this)); - uint64 guidlo = PlayerTalkClass->GossipOptionSender(gossipListId); if(GetPlayerbotMgr()->GetPlayerBot(guidlo) != NULL) { GetPlayerbotMgr()->LogoutPlayerBot(guidlo); } else if(GetPlayerbotMgr()->GetPlayerBot(guidlo) == NULL) { + QueryResult *resultchar = CharacterDatabase.PQuery("SELECT COUNT(*) FROM characters WHERE online = '1' AND account = '%u'", m_session->GetAccountId()); + if(resultchar) + { + Field *fields = resultchar->Fetch(); + int maxnum = botConfig.GetIntDefault("PlayerbotAI.MaxNumBots", 9); + int acctcharcount = fields[0].GetUInt32(); + if(!(m_session->GetSecurity() > SEC_PLAYER)) + if(acctcharcount > maxnum) + { + ChatHandler(this).PSendSysMessage("|cffff0000You cannot summon anymore bots.(Current Max: |cffffffff%u)",maxnum); + delete resultchar; + break; + } + } + delete resultchar; + + QueryResult *resultlvl = CharacterDatabase.PQuery("SELECT level,name FROM characters WHERE guid = '%u'", guidlo); + if(resultlvl) + { + Field *fields=resultlvl->Fetch(); + int maxlvl = botConfig.GetIntDefault("PlayerbotAI.RestrictBotLevel", 80); + int charlvl = fields[0].GetUInt32(); + if(!(m_session->GetSecurity() > SEC_PLAYER)) + if(charlvl > maxlvl) + { + ChatHandler(this).PSendSysMessage("|cffff0000You cannot summon |cffffffff[%s]|cffff0000, it's level is too high.(Current Max:lvl |cffffffff%u)",fields[1].GetString(),maxlvl); + delete resultlvl; + break; + } + } + delete resultlvl; + GetPlayerbotMgr()->AddPlayerBot(guidlo); this->ModifyMoney(-(int32)cost); } diff --git a/src/game/WorldSession.cpp b/src/game/WorldSession.cpp index 684fe0c63..697d3b4df 100644 --- a/src/game/WorldSession.cpp +++ b/src/game/WorldSession.cpp @@ -487,17 +487,9 @@ void WorldSession::LogoutPlayer(bool Save) WorldPacket data( SMSG_LOGOUT_COMPLETE, 0 ); SendPacket( &data ); - ///- Since each account can only have one online character at any given time, ensure all characters for active account are marked as offline - //No SQL injection as AccountId is uint32 - //CharacterDatabase.PExecute("UPDATE characters SET online = 0 WHERE account = '%u'", - // GetAccountId()); - // Playerbot mod: commented out above and do this one instead CharacterDatabase.PExecute("UPDATE characters SET online = 0 WHERE guid = '%u'", guid); - sLog.outDebug( "SESSION: Sent SMSG_LOGOUT_COMPLETE Message" ); - CharacterDatabase.PExecute("UPDATE characters SET online = 0 WHERE account = '%u'", - GetAccountId()); DEBUG_LOG( "SESSION: Sent SMSG_LOGOUT_COMPLETE Message" ); } diff --git a/src/game/playerbot/PlayerbotMgr.cpp b/src/game/playerbot/PlayerbotMgr.cpp index 6cf940b73..b5df758ea 100644 --- a/src/game/playerbot/PlayerbotMgr.cpp +++ b/src/game/playerbot/PlayerbotMgr.cpp @@ -19,8 +19,6 @@ PlayerbotMgr::PlayerbotMgr(Player* const master) : m_master(master) { // load config variables m_confMaxNumBots = botConfig.GetIntDefault( "PlayerbotAI.MaxNumBots", 9 ); - m_confRestrictBotLevel = botConfig.GetIntDefault( "PlayerbotAI.RestrictBotLevel", 80 ); - m_confDisableBots = botConfig.GetBoolDefault( "PlayerbotAI.DisableBots", false ); m_confDebugWhisper = botConfig.GetBoolDefault( "PlayerbotAI.DebugWhisper", false ); m_confFollowDistance[0] = botConfig.GetFloatDefault( "PlayerbotAI.FollowDistanceMin", 0.5f ); m_confFollowDistance[1] = botConfig.GetFloatDefault( "PlayerbotAI.FollowDistanceMin", 1.0f ); @@ -707,15 +705,16 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) m_session->GetPlayer()->SetPlayerbotMgr(mgr); } - QueryResult *resultchar = CharacterDatabase.PQuery("SELECT Count(*) FROM characters WHERE online = 1 AND account = '%u'", m_session->GetAccountId()); + QueryResult *resultchar = CharacterDatabase.PQuery("SELECT COUNT(*) FROM characters WHERE online = '1' AND account = '%u'", m_session->GetAccountId()); if(resultchar) { Field *fields=resultchar->Fetch(); int acctcharcount = fields[0].GetUInt32(); + int maxnum = botConfig.GetIntDefault("PlayerbotAI.MaxNumBots", 9); if(!(m_session->GetSecurity() > SEC_PLAYER)) - if((acctcharcount > botConfig.GetIntDefault("PlayerbotAI.MaxNumBots", 9)) && (cmdStr == "add" || cmdStr == "login")) + if(acctcharcount > maxnum && (cmdStr == "add" || cmdStr == "login")) { - PSendSysMessage("|cffff0000You cannot summon anymore bots, for this account."); + PSendSysMessage("|cffff0000You cannot summon anymore bots.(Current Max: |cffffffff%u)",maxnum); SetSentErrorMessage(true); delete resultchar; return false; @@ -728,10 +727,11 @@ bool ChatHandler::HandlePlayerbotCommand(const char* args) { Field *fields=resultlvl->Fetch(); int charlvl = fields[0].GetUInt32(); + int maxlvl = botConfig.GetIntDefault("PlayerbotAI.RestrictBotLevel", 80); if(!(m_session->GetSecurity() > SEC_PLAYER)) - if(charlvl > botConfig.GetIntDefault("PlayerbotAI.RestrictBotLevel", 80)) + if(charlvl > maxlvl) { - PSendSysMessage("|cffff0000You cannot summon |cffffffff[%s]|cffff0000, it's level is too high.",fields[1].GetString()); + PSendSysMessage("|cffff0000You cannot summon |cffffffff[%s]|cffff0000, it's level is too high.(Current Max:lvl |cffffffff%u)",fields[1].GetString(),maxlvl); SetSentErrorMessage(true); delete resultlvl; return false; From bf34447478011e7f36609ffaca62c0700ca0eeee Mon Sep 17 00:00:00 2001 From: blueboy Date: Fri, 6 Aug 2010 23:10:41 +0100 Subject: [PATCH 073/187] Remove whitespaces from bot_readme.txt --- bot_readme.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bot_readme.txt b/bot_readme.txt index 7a83ca0e3..5699d41cd 100644 --- a/bot_readme.txt +++ b/bot_readme.txt @@ -34,11 +34,11 @@ Commands: /t BOTNAME drop (Drop a quest) /t BOTNAME orders (Shows bot's combat orders) /t BOTNAME pet spells (Shows spells known to bot's pet. Autocast spells will be shown in green) -/t BOTNAME pet cast +/t BOTNAME pet cast /t BOTNAME pet toggle (Toggle autocast for a given spell) /t BOTNAME pet state (Shows current react mode of bot's pet) /t BOTNAME pet react <(a)ggressive | (d)efensive | (p)assive> (Set bot's pet reaction mode) - + Shortcuts: c = cast e = equip From bafc6dd468a47fefa93a271c2aee750f4f2fe495 Mon Sep 17 00:00:00 2001 From: blueboy Date: Fri, 6 Aug 2010 23:31:49 +0100 Subject: [PATCH 074/187] Remove whitespace from Player.cpp --- src/game/Player.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 7fe27eeab..c4a643c00 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -13069,7 +13069,7 @@ void Player::OnGossipSelect(WorldObject* pSource, uint32 gossipListId, uint32 me } } delete resultchar; - + QueryResult *resultlvl = CharacterDatabase.PQuery("SELECT level,name FROM characters WHERE guid = '%u'", guidlo); if(resultlvl) { From e8bb4928d0100eade0da996cbb9bfdbc8205620b Mon Sep 17 00:00:00 2001 From: blueboy Date: Sat, 7 Aug 2010 05:15:04 +0100 Subject: [PATCH 075/187] Fix for recent 'ChatHandler' changes --- src/game/Chat.h | 1 + src/game/playerbot/PlayerbotAI.cpp | 8 ++++---- src/game/playerbot/PlayerbotMgr.cpp | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/game/Chat.h b/src/game/Chat.h index 1f6de597e..f1c44b73d 100644 --- a/src/game/Chat.h +++ b/src/game/Chat.h @@ -545,6 +545,7 @@ class ChatHandler bool HandleRepairitemsCommand(char* args); bool HandleStableCommand(char* args); bool HandleWaterwalkCommand(char* args); + bool HandlePlayerbotCommand(char* args); bool HandleQuitCommand(char* args); //! Development Commands diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 519116a75..a56b90082 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -72,10 +72,10 @@ class PlayerbotChatHandler: protected ChatHandler { public: explicit PlayerbotChatHandler(Player* pMasterPlayer) : ChatHandler(pMasterPlayer) {} - bool revive(const Player& botPlayer) { return HandleReviveCommand(botPlayer.GetName()); } - bool teleport(const Player& botPlayer) { return HandleNamegoCommand(botPlayer.GetName()); } + bool revive(Player& botPlayer) { return HandleReviveCommand((char*)botPlayer.GetName()); } + bool teleport(Player& botPlayer) { return HandleNamegoCommand((char*)botPlayer.GetName()); } void sysmessage(const char *str) { SendSysMessage(str); } - bool dropQuest(const char *str) { return HandleQuestRemove(str); } + bool dropQuest(char *str) { return HandleQuestRemoveCommand(str); } }; PlayerbotAI::PlayerbotAI(PlayerbotMgr* const mgr, Player* const bot) : @@ -3276,7 +3276,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) fromPlayer.SetSelection(m_bot->GetGUID()); } PlayerbotChatHandler ch(GetMaster()); - if (! ch.dropQuest(text.substr(5).c_str())) + if (! ch.dropQuest((char*)text.substr(5).c_str())) ch.sysmessage("ERROR: could not drop quest"); if (oldSelectionGUID) fromPlayer.SetSelection(oldSelectionGUID); diff --git a/src/game/playerbot/PlayerbotMgr.cpp b/src/game/playerbot/PlayerbotMgr.cpp index b5df758ea..fe04252a7 100644 --- a/src/game/playerbot/PlayerbotMgr.cpp +++ b/src/game/playerbot/PlayerbotMgr.cpp @@ -642,7 +642,7 @@ bool Player::requiredQuests(const char* pQuestIdString) return false; } -bool ChatHandler::HandlePlayerbotCommand(const char* args) +bool ChatHandler::HandlePlayerbotCommand(char* args) { if(!(m_session->GetSecurity() > SEC_PLAYER)) if(botConfig.GetBoolDefault("PlayerbotAI.DisableBots", false)) From a539010d14957c5b4128452db68cb566d880e005 Mon Sep 17 00:00:00 2001 From: blueboy Date: Sun, 8 Aug 2010 07:47:39 +0100 Subject: [PATCH 076/187] Add 'command order' acknowledgement patch by cyberium --- src/game/playerbot/PlayerbotAI.cpp | 36 +++++++++++++++++------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index a56b90082..03353cf88 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -1930,22 +1930,26 @@ void PlayerbotAI::SetCombatOrderByStr( std::string str, Unit *target ) { } void PlayerbotAI::SetCombatOrder( CombatOrderType co, Unit *target ) { - if( (co == ORDERS_ASSIST || co == ORDERS_PROTECT) && !target ) - return; - if( co == ORDERS_RESET ) { - m_combatOrder = ORDERS_NONE; - m_targetAssist = 0; - m_targetProtect = 0; - return; - } - if( co == ORDERS_PROTECT ) - m_targetProtect = target; - else if( co == ORDERS_ASSIST ) - m_targetAssist = target; - if( (co&ORDERS_PRIMARY) ) - m_combatOrder = (CombatOrderType)(((uint32)m_combatOrder&(uint32)ORDERS_SECONDARY)|(uint32)co); - else - m_combatOrder = (CombatOrderType)(((uint32)m_combatOrder&(uint32)ORDERS_PRIMARY)|(uint32)co); + if( (co == ORDERS_ASSIST || co == ORDERS_PROTECT) && !target ){ + TellMaster("Erf, you forget to target assist/protect characters!"); + return; + } + if( co == ORDERS_RESET ) { + m_combatOrder = ORDERS_NONE; + m_targetAssist = 0; + m_targetProtect = 0; + TellMaster("Orders are cleaned!"); + return; + } + if( co == ORDERS_PROTECT ) + m_targetProtect = target; + else if( co == ORDERS_ASSIST ) + m_targetAssist = target; + if( (co&ORDERS_PRIMARY) ) + m_combatOrder = (CombatOrderType)(((uint32)m_combatOrder&(uint32)ORDERS_SECONDARY)|(uint32)co); + else + m_combatOrder = (CombatOrderType)(((uint32)m_combatOrder&(uint32)ORDERS_PRIMARY)|(uint32)co); + SendOrders( *GetMaster() ); } void PlayerbotAI::SetMovementOrder( MovementOrderType mo, Unit *followTarget ) { From d930f0fada6ec1e759a3d751f1b1291727416863 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sun, 8 Aug 2010 18:42:43 +0400 Subject: [PATCH 077/187] Fix possible segmentation fault --- src/game/playerbot/PlayerbotAI.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 03353cf88..a74c084e4 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2237,6 +2237,10 @@ bool PlayerbotAI::CastSpell(uint32 spellId) // set target uint64 targetGUID = m_bot->GetSelection(); Unit* pTarget = ObjectAccessor::GetUnit(*m_bot, m_bot->GetSelection()); + + if (!pTarget) + pTarget = m_bot; + if (IsPositiveSpell(spellId)) { if (pTarget && !m_bot->IsFriendlyTo(pTarget)) From fa0a5156af4e3a2fb179bbef140b1cd0e9b25dac Mon Sep 17 00:00:00 2001 From: chelobaka Date: Tue, 10 Aug 2010 19:11:39 +0400 Subject: [PATCH 078/187] Fix gcc compile warnings --- src/game/playerbot/PlayerbotMgr.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/game/playerbot/PlayerbotMgr.cpp b/src/game/playerbot/PlayerbotMgr.cpp index fe04252a7..217cc0d34 100644 --- a/src/game/playerbot/PlayerbotMgr.cpp +++ b/src/game/playerbot/PlayerbotMgr.cpp @@ -722,7 +722,7 @@ bool ChatHandler::HandlePlayerbotCommand(char* args) } delete resultchar; - QueryResult *resultlvl = CharacterDatabase.PQuery("SELECT level,name FROM characters WHERE guid = '%u'", guid); + QueryResult *resultlvl = CharacterDatabase.PQuery("SELECT level,name FROM characters WHERE guid = '%lu'", guid); if(resultlvl) { Field *fields=resultlvl->Fetch(); @@ -747,7 +747,7 @@ bool ChatHandler::HandlePlayerbotCommand(char* args) SetSentErrorMessage(true); return false; } - CharacterDatabase.DirectPExecute("UPDATE characters SET online = 1 WHERE guid = '%u'", guid); + CharacterDatabase.DirectPExecute("UPDATE characters SET online = 1 WHERE guid = '%lu'", guid); mgr->AddPlayerBot(guid); PSendSysMessage("Bot added successfully."); } @@ -759,7 +759,7 @@ bool ChatHandler::HandlePlayerbotCommand(char* args) SetSentErrorMessage(true); return false; } - CharacterDatabase.DirectPExecute("UPDATE characters SET online = 0 WHERE guid = '%u'", guid); + CharacterDatabase.DirectPExecute("UPDATE characters SET online = 0 WHERE guid = '%lu'", guid); mgr->LogoutPlayerBot(guid); PSendSysMessage("Bot removed successfully."); } From 7f1f69c4c86ad9d684ed8d79886f56aed5a1efd3 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Tue, 10 Aug 2010 20:18:46 +0400 Subject: [PATCH 079/187] Do not teleport bot to master during taxi ride --- src/game/playerbot/PlayerbotAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index a74c084e4..c5c90fd7e 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2848,7 +2848,7 @@ bool PlayerbotAI::FollowCheckTeleport( WorldObject &obj ) { // if bot has strayed too far from the master, teleport bot - if (!m_bot->IsWithinDistInMap( &obj, 50, true ) && GetMaster()->isAlive()) + if (!m_bot->IsWithinDistInMap( &obj, 50, true ) && GetMaster()->isAlive() && !GetMaster()->IsTaxiFlying()) { m_ignoreAIUpdatesUntilTime = time(0) + 6; PlayerbotChatHandler ch(GetMaster()); From 3da1d5ed148b237bfab621c6e291c4a6d95387a5 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Wed, 4 Aug 2010 22:35:53 +0400 Subject: [PATCH 080/187] New method for spellid search This method returns maximum known rank of a spell using spellid of rank 1 of a spell. This allows class AIs to init spells without binding to any names. --- src/game/playerbot/PlayerbotAI.cpp | 25 +++++++++++++++++++++++++ src/game/playerbot/PlayerbotAI.h | 1 + 2 files changed, 26 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index c5c90fd7e..356b7207d 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -284,6 +284,31 @@ uint32 PlayerbotAI::getPetSpellId(const char* args) const return foundSpellId; } + +uint32 PlayerbotAI::getMaxKnownRankSpellId(uint32 spellId) +{ + // Check if bot knows this spell + if (!m_bot->HasSpell(spellId)) + return 0; + + uint32 next = 0; + SpellChainMapNext const& nextMap = sSpellMgr.GetSpellChainNext(); + for(SpellChainMapNext::const_iterator itr = nextMap.lower_bound(spellId); itr != nextMap.upper_bound(spellId); ++itr) + { + SpellChainNode const* node = sSpellMgr.GetSpellChainNode(itr->second); + // If next spell is a requirement for this one then skip it + if (node->req == spellId) + continue; + if (node->prev == spellId) + { + next = getMaxKnownRankSpellId(itr->second); + break; + } + } + sLog.outDebug("Found spellid: %u next: %u", spellId, next); + return (next == 0) ? spellId : next; +} + /* * Send a list of equipment that is in bot's inventor that is currently unequipped. * This is called when the master is inspecting the bot. diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 121a8f00a..d7bc6f32d 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -124,6 +124,7 @@ class MANGOS_DLL_SPEC PlayerbotAI // in priority of full text match, spells not taking reagents, and highest rank uint32 getSpellId(const char* args, bool master = false) const; uint32 getPetSpellId(const char* args) const; + uint32 getMaxKnownRankSpellId(uint32 spellId); // extracts item ids from links void extractItemIds(const std::string& text, std::list& itemIds) const; From f903519847e5f2cb573a99217eb7577b8e6e1115 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Wed, 4 Aug 2010 22:51:32 +0400 Subject: [PATCH 081/187] Make MageAI use locale independent spell init --- src/game/playerbot/PlayerbotAI.h | 60 ++++++++++++++++++ src/game/playerbot/PlayerbotMageAI.cpp | 88 +++++++++++++------------- 2 files changed, 104 insertions(+), 44 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index d7bc6f32d..81f2ef38a 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -16,6 +16,66 @@ class PlayerbotMgr; #define BOTLOOT_DISTANCE 25.0f +enum RankOneSpellId +{ + // Mage spells and talents + CONJURE_FOOD_1 = 587, + CONJURE_MANA_GEM_1 = 759, + CONJURE_REFRESHMENT_1 = 42955, + CONJURE_WATER_1 = 5504, + AMPLIFY_MAGIC_1 = 1008, + ARCANE_BLAST_1 = 30451, + ARCANE_BRILLIANCE_1 = 23028, + ARCANE_EXPLOSION_1 = 1449, + ARCANE_INTELLECT_1 = 1459, + ARCANE_MISSILES_1 = 5143, + BLINK_1 = 1953, + BLIZZARD_1 = 10, + CONE_OF_COLD_1 = 120, + COUNTERSPELL_1 = 2139, + DALARAN_BRILLIANCE_1 = 61316, + DALARAN_INTELLECT_1 = 61024, + DAMPEN_MAGIC_1 = 604, + EVOCATION_1 = 12051, + FIREBALL_1 = 133, + FIRE_BLAST_1 = 2136, + FIRE_WARD_1 = 543, + FLAMESTRIKE_1 = 2120, + FROST_ARMOR_1 = 168, + FROSTBOLT_1 = 116, + FROSTFIRE_BOLT_1 = 44614, + FROST_NOVA_1 = 122, + FROST_WARD_1 = 6143, + ICE_ARMOR_1 = 7302, + ICE_BLOCK_1 = 45438, + ICE_LANCE_1 = 30455, + INVISIBILITY_1 = 66, + MAGE_ARMOR_1 = 6117, + MANA_SHIELD_1 = 1463, + MIRROR_IMAGE_1 = 55342, + MOLTEN_ARMOR_1 = 30482, + REMOVE_CURSE_1 = 475, + RITUAL_OF_REFRESHMENT_1 = 43987, + SCORCH_1 = 2948, + SLOW_FALL_1 = 130, + SPELLSTEAL_1 = 30449, + ARCANE_BARRAGE_1 = 44425, + ARCANE_POWER_1 = 12042, + BLAST_WAVE_1 = 11113, + COLD_SNAP_1 = 11958, + COMBUSTION_1 = 11129, + DEEP_FREEZE_1 = 44572, + DRAGONS_BREATH_1 = 31661, + FOCUS_MAGIC_1 = 54646, + ICE_BARRIER_1 = 11426, + ICY_VEINS_1 = 12472, + LIVING_BOMB_1 = 44457, + PRESENCE_OF_MIND_1 = 12043, + PYROBLAST_1 = 11366, + SLOW_1 = 31589, + SUMMON_WATER_ELEMENTAL_1 = 31687, +}; + class MANGOS_DLL_SPEC PlayerbotAI { public: diff --git a/src/game/playerbot/PlayerbotMageAI.cpp b/src/game/playerbot/PlayerbotMageAI.cpp index 0eb1dfd5a..42cc05191 100644 --- a/src/game/playerbot/PlayerbotMageAI.cpp +++ b/src/game/playerbot/PlayerbotMageAI.cpp @@ -5,50 +5,50 @@ class PlayerbotAI; PlayerbotMageAI::PlayerbotMageAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) { - ARCANE_MISSILES = ai->getSpellId("arcane missiles"); //ARCANE - ARCANE_EXPLOSION = ai->getSpellId("arcane explosion"); - COUNTERSPELL = ai->getSpellId("counterspell"); - SLOW = ai->getSpellId("slow"); - ARCANE_BARRAGE = ai->getSpellId("arcane barrage"); - ARCANE_BLAST = ai->getSpellId("arcane blast"); - ARCANE_POWER = ai->getSpellId("arcane power"); - DAMPEN_MAGIC = ai->getSpellId("dampen magic"); - AMPLIFY_MAGIC = ai->getSpellId("amplify magic"); - MAGE_ARMOR = ai->getSpellId("mage armor"); - MIRROR_IMAGE = ai->getSpellId("mirror image"); - ARCANE_INTELLECT = ai->getSpellId("arcane intellect"); - ARCANE_BRILLIANCE = ai->getSpellId("arcane brilliance"); - DALARAN_INTELLECT = ai->getSpellId("dalaran intellect"); - DALARAN_BRILLIANCE = ai->getSpellId("dalaran brilliance"); - MANA_SHIELD = ai->getSpellId("mana shield"); - CONJURE_WATER = ai->getSpellId("conjure water"); - CONJURE_FOOD = ai->getSpellId("conjure food"); - FIREBALL = ai->getSpellId("fireball"); //FIRE - FIRE_BLAST = ai->getSpellId("fire blast"); - FLAMESTRIKE = ai->getSpellId("flamestrike"); - SCORCH = ai->getSpellId("scorch"); - PYROBLAST = ai->getSpellId("pyroblast"); - BLAST_WAVE = ai->getSpellId("blast wave"); - COMBUSTION = ai->getSpellId("combustion"); - DRAGONS_BREATH = ai->getSpellId("dragon's breath"); - LIVING_BOMB = ai->getSpellId("living bomb"); - FROSTFIRE_BOLT = ai->getSpellId("frostfire bolt"); - FIRE_WARD = ai->getSpellId("fire ward"); - MOLTEN_ARMOR = ai->getSpellId("molten armor"); - ICY_VEINS = ai->getSpellId("icy veins"); //FROST - DEEP_FREEZE = ai->getSpellId("deep freeze"); - FROSTBOLT = ai->getSpellId("frostbolt"); - FROST_NOVA = ai->getSpellId("frost nova"); - BLIZZARD = ai->getSpellId("blizzard"); - CONE_OF_COLD = ai->getSpellId("cone of cold"); - ICE_BARRIER = ai->getSpellId("ice barrier"); - SUMMON_WATER_ELEMENTAL = ai->getSpellId("summon water elemental"); - FROST_WARD = ai->getSpellId("frost ward"); - ICE_LANCE = ai->getSpellId("ice lance"); - FROST_ARMOR = ai->getSpellId("frost armor"); - ICE_ARMOR = ai->getSpellId("ice armor"); - ICE_BLOCK = ai->getSpellId("ice block"); - COLD_SNAP = ai->getSpellId("cold snap"); + ARCANE_MISSILES = ai->getMaxKnownRankSpellId(ARCANE_MISSILES_1); + ARCANE_EXPLOSION = ai->getMaxKnownRankSpellId(ARCANE_EXPLOSION_1); + COUNTERSPELL = ai->getMaxKnownRankSpellId(COUNTERSPELL_1); + SLOW = ai->getMaxKnownRankSpellId(SLOW_1); + ARCANE_BARRAGE = ai->getMaxKnownRankSpellId(ARCANE_BARRAGE_1); + ARCANE_BLAST = ai->getMaxKnownRankSpellId(ARCANE_BLAST_1); + ARCANE_POWER = ai->getMaxKnownRankSpellId(ARCANE_POWER_1); + DAMPEN_MAGIC = ai->getMaxKnownRankSpellId(DAMPEN_MAGIC_1); + AMPLIFY_MAGIC = ai->getMaxKnownRankSpellId(AMPLIFY_MAGIC_1); + MAGE_ARMOR = ai->getMaxKnownRankSpellId(MAGE_ARMOR_1); + MIRROR_IMAGE = ai->getMaxKnownRankSpellId(MIRROR_IMAGE_1); + ARCANE_INTELLECT = ai->getMaxKnownRankSpellId(ARCANE_INTELLECT_1); + ARCANE_BRILLIANCE = ai->getMaxKnownRankSpellId(ARCANE_BRILLIANCE_1); + DALARAN_INTELLECT = ai->getMaxKnownRankSpellId(DALARAN_INTELLECT_1); + DALARAN_BRILLIANCE = ai->getMaxKnownRankSpellId(DALARAN_BRILLIANCE_1); + MANA_SHIELD = ai->getMaxKnownRankSpellId(MANA_SHIELD_1); + CONJURE_WATER = ai->getMaxKnownRankSpellId(CONJURE_WATER_1); + CONJURE_FOOD = ai->getMaxKnownRankSpellId(CONJURE_FOOD_1); + FIREBALL = ai->getMaxKnownRankSpellId(FIREBALL_1); + FIRE_BLAST = ai->getMaxKnownRankSpellId(FIRE_BLAST_1); + FLAMESTRIKE = ai->getMaxKnownRankSpellId(FLAMESTRIKE_1); + SCORCH = ai->getMaxKnownRankSpellId(SCORCH_1); + PYROBLAST = ai->getMaxKnownRankSpellId(PYROBLAST_1); + BLAST_WAVE = ai->getMaxKnownRankSpellId(BLAST_WAVE_1); + COMBUSTION = ai->getMaxKnownRankSpellId(COMBUSTION_1); + DRAGONS_BREATH = ai->getMaxKnownRankSpellId(DRAGONS_BREATH_1); + LIVING_BOMB = ai->getMaxKnownRankSpellId(LIVING_BOMB_1); + FROSTFIRE_BOLT = ai->getMaxKnownRankSpellId(FROSTFIRE_BOLT_1); + FIRE_WARD = ai->getMaxKnownRankSpellId(FIRE_WARD_1); + MOLTEN_ARMOR = ai->getMaxKnownRankSpellId(MOLTEN_ARMOR_1); + ICY_VEINS = ai->getMaxKnownRankSpellId(ICY_VEINS_1); + DEEP_FREEZE = ai->getMaxKnownRankSpellId(DEEP_FREEZE_1); + FROSTBOLT = ai->getMaxKnownRankSpellId(FROSTBOLT_1); + FROST_NOVA = ai->getMaxKnownRankSpellId(FROST_NOVA_1); + BLIZZARD = ai->getMaxKnownRankSpellId(BLIZZARD_1); + CONE_OF_COLD = ai->getMaxKnownRankSpellId(CONE_OF_COLD_1); + ICE_BARRIER = ai->getMaxKnownRankSpellId(ICE_BARRIER_1); + SUMMON_WATER_ELEMENTAL = ai->getMaxKnownRankSpellId(SUMMON_WATER_ELEMENTAL_1); + FROST_WARD = ai->getMaxKnownRankSpellId(FROST_WARD_1); + ICE_LANCE = ai->getMaxKnownRankSpellId(ICE_LANCE_1); + FROST_ARMOR = ai->getMaxKnownRankSpellId(FROST_ARMOR_1); + ICE_ARMOR = ai->getMaxKnownRankSpellId(ICE_ARMOR_1); + ICE_BLOCK = ai->getMaxKnownRankSpellId(ICE_BLOCK_1); + COLD_SNAP = ai->getMaxKnownRankSpellId(COLD_SNAP_1); RECENTLY_BANDAGED = 11196; // first aid check From 42fbee017bde9f825d18b3dbffc1919fa856d522 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Thu, 5 Aug 2010 12:04:46 +0400 Subject: [PATCH 082/187] Add warlock, priest, druid, paladin spellids --- src/game/playerbot/PlayerbotAI.h | 270 +++++++++++++++++++++++++++++++ 1 file changed, 270 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 81f2ef38a..1224cd3be 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -74,6 +74,276 @@ enum RankOneSpellId PYROBLAST_1 = 11366, SLOW_1 = 31589, SUMMON_WATER_ELEMENTAL_1 = 31687, + + // Warlock + CREATE_FIRESTONE_1 = 6366, + CREATE_SOULSTONE_1 = 693, + CREATE_SPELLSTONE_1 = 2362, + BANISH_1 = 710, + CHALLENGING_HOWL_1 = 59671, + CORRUPTION_1 = 172, + CREATE_HEALTHSTONE_1 = 6201, + CURSE_OF_AGONY_1 = 980, + CURSE_OF_DOOM_1 = 603, + CURSE_OF_THE_ELEMENTS_1 = 1490, + CURSE_OF_TONGUES_1 = 1714, + CURSE_OF_WEAKNESS_1 = 702, + DEATH_COIL_1 = 6789, + DEMON_ARMOR_1 = 706, + DEMON_CHARGE_1 = 54785, + DEMONIC_CIRCLE_SUMMON_1 = 48018, + DEMONIC_CIRCLE_TELEPORT_1 = 48020, + DEMONIC_IMMOLATE_1 = 75445, + DEMON_SKIN_1 = 687, + DETECT_INVISIBILITY_1 = 132, + DRAIN_LIFE_1 = 689, + DRAIN_MANA_1 = 5138, + DRAIN_SOUL_1 = 1120, + ENSLAVE_DEMON_1 = 1098, + EYE_OF_KILROGG_1 = 126, + FEAR_1 = 5782, + FEL_ARMOR_1 = 28176, + HEALTH_FUNNEL_1 = 755, + HELLFIRE_1 = 1949, + HOWL_OF_TERROR_1 = 5484, + IMMOLATE_1 = 348, + IMMOLATION_AURA_1 = 50589, + INCINERATE_1 = 29722, + INFERNO_1 = 1122, + LIFE_TAP_1 = 1454, + RAIN_OF_FIRE_1 = 5740, + RITUAL_OF_DOOM_1 = 18540, + RITUAL_OF_SOULS_1 = 29893, + RITUAL_OF_SUMMONING_1 = 698, + SEARING_PAIN_1 = 5676, + SEED_OF_CORRUPTION_1 = 27243, + SENSE_DEMONS_1 = 5500, + SHADOW_BOLT_1 = 686, + SHADOW_CLEAVE_1 = 50581, + SHADOWFLAME_1 = 47897, + SHADOW_WARD_1 = 6229, + SOUL_FIRE_1 = 6353, + SOULSHATTER_1 = 29858, + SUMMON_FELHUNTER_1 = 691, + SUMMON_IMP_1 = 688, + SUMMON_SUCCUBUS_1 = 712, + SUMMON_VOIDWALKER_1 = 697, + UNENDING_BREATH_1 = 5697, + CHAOS_BOLT_1 = 50796, + CONFLAGRATE_1 = 17962, + CURSE_OF_EXHAUSTION_1 = 18223, + DARK_PACT_1 = 18220, + DEMONIC_EMPOWERMENT_1 = 47193, + FEL_DOMINATION_1 = 18708, + HAUNT_1 = 48181, + METAMORPHOSIS_1 = 59672, + SHADOWBURN_1 = 17877, + SHADOWFURY_1 = 30283, + SOUL_LINK_1 = 19028, + SUMMON_FELGUARD_1 = 30146, + UNSTABLE_AFFLICTION_1 = 30108, + + //Paladin + AVENGING_WRATH_1 = 31884, + BLESSING_OF_KINGS_1 = 20217, + BLESSING_OF_MIGHT_1 = 19740, + BLESSING_OF_WISDOM_1 = 19742, + CLEANSE_1 = 4987, + CONCENTRATION_AURA_1 = 19746, + CONSECRATION_1 = 26573, + CRUSADER_AURA_1 = 32223, + DEVOTION_AURA_1 = 465, + DIVINE_INTERVENTION_1 = 19752, + DIVINE_PLEA_1 = 54428, + DIVINE_PROTECTION_1 = 498, + DIVINE_SHIELD_1 = 642, + EXORCISM_1 = 879, + FIRE_RESISTANCE_AURA_1 = 19891, + FLASH_OF_LIGHT_1 = 19750, + FROST_RESISTANCE_AURA_1 = 19888, + GREATER_BLESSING_OF_KINGS_1 = 25898, + GREATER_BLESSING_OF_MIGHT_1 = 25782, + GREATER_BLESSING_OF_SANCTUARY_1 = 25899, + GREATER_BLESSING_OF_WISDOM_1 = 25894, + HAMMER_OF_JUSTICE_1 = 853, + HAMMER_OF_WRATH_1 = 24275, + HAND_OF_FREEDOM_1 = 1044, + HAND_OF_PROTECTION_1 = 1022, + HAND_OF_RECKONING_1 = 62124, + HAND_OF_SACRIFICE_1 = 6940, + HAND_OF_SALVATION_1 = 1038, + HOLY_LIGHT_1 = 635, + HOLY_WRATH_1 = 2812, + JUDGEMENT_OF_JUSTICE_1 = 53407, + JUDGEMENT_OF_LIGHT_1 = 20271, + JUDGEMENT_OF_WISDOM_1 = 53408, + LAY_ON_HANDS_1 = 633, + PURIFY_1 = 1152, + REDEMPTION_1 = 7328, + RETRIBUTION_AURA_1 = 7294, + RIGHTEOUS_DEFENSE_1 = 31789, + RIGHTEOUS_FURY_1 = 25780, + SACRED_SHIELD_1 = 53601, + SEAL_OF_CORRUPTION = 53736, + SEAL_OF_JUSTICE_1 = 20164, + SEAL_OF_LIGHT_1 = 20165, + SEAL_OF_RIGHTEOUSNESS_1 = 20154, + SEAL_OF_VENGEANCE = 31801, + SEAL_OF_WISDOM_1 = 20166, + SENSE_UNDEAD_1 = 5502, + SHADOW_RESISTANCE_AURA_1 = 19876, + SHIELD_OF_RIGHTEOUSNESS_1 = 53600, + TURN_EVIL_1 = 10326, + AURA_MASTERY_1 = 31821, + AVENGERS_SHIELD_1 = 31935, + BEACON_OF_LIGHT_1 = 53563, + BLESSING_OF_SANCTUARY_1 = 20911, + CRUSADER_STRIKE_1 = 35395, + DIVINE_FAVOR_1 = 20216, + DIVINE_ILLUMINATION_1 = 31842, + DIVINE_SACRIFICE_1 = 64205, + DIVINE_STORM_1 = 53385, + HAMMER_OF_THE_RIGHTEOUS_1 = 53595, + HOLY_SHIELD_1 = 20925, + HOLY_SHOCK_1 = 20473, + REPENTANCE_1 = 20066, + SEAL_OF_COMMAND_1 = 20375, + + //Priest + ABOLISH_DISEASE_1 = 552, + BINDING_HEAL_1 = 32546, + BLESSED_HEALING_1 = 70772, + CURE_DISEASE_1 = 528, + DEVOURING_PLAGUE_1 = 2944, + DISPEL_MAGIC_1 = 527, + DIVINE_HYMN_1 = 64843, + DIVINE_SPIRIT_1 = 14752, + FADE_1 = 586, + FEAR_WARD_1 = 6346, + FLASH_HEAL_1 = 2061, + GREATER_HEAL_1 = 2060, + HEAL_1 = 2054, + HOLY_FIRE_1 = 14914, + HOLY_NOVA_1 = 15237, + HYMN_OF_HOPE_1 = 64901, + INNER_FIRE_1 = 588, + LESSER_HEAL_1 = 2050, + LEVITATE_1 = 1706, + MANA_BURN_1 = 8129, + MASS_DISPEL_1 = 32375, + MIND_BLAST_1 = 8092, + MIND_CONTROL_1 = 605, + MIND_SEAR_1 = 48045, + MIND_SOOTHE_1 = 453, + MIND_VISION_1 = 2096, + POWER_WORD_FORTITUDE_1 = 1243, + POWER_WORD_SHIELD_1 = 17, + PRAYER_OF_FORTITUDE_1 = 21562, + PRAYER_OF_HEALING_1 = 596, + PRAYER_OF_MENDING_1 = 33076, + PRAYER_OF_SHADOW_PROTECTION_1 = 27683, + PRAYER_OF_SPIRIT_1 = 27681, + PSYCHIC_SCREAM_1 = 8122, + RENEW_1 = 139, + RESURRECTION_1 = 2006, + SHACKLE_UNDEAD_1 = 9484, + SHADOWFIEND_1 = 34433, + SHADOW_PROTECTION_1 = 976, + SHADOW_WORD_DEATH_1 = 32379, + SHADOW_WORD_PAIN_1 = 589, + SMITE_1 = 585, + CIRCLE_OF_HEALING_1 = 34861, + DESPERATE_PRAYER_1 = 19236, + DISPERSION_1 = 47585, + GUARDIAN_SPIRIT_1 = 47788, + INNER_FOCUS_1 = 14751, + LIGHTWELL_1 = 724, + MIND_FLAY_1 = 15407, + PAIN_SUPPRESSION_1 = 33206, + PENANCE_1 = 47540, + POWER_INFUSION_1 = 10060, + PSYCHIC_HORROR_1 = 64044, + SHADOWFORM_1 = 15473, + SILENCE_1 = 15487, + VAMPIRIC_EMBRACE_1 = 15286, + VAMPIRIC_TOUCH_1 = 34914, + + //Druid + ABOLISH_POISON_1 = 2893, + AQUATIC_FORM_1 = 1066, + BARKSKIN_1 = 22812, + BASH_1 = 5211, + BEAR_FORM_1 = 5487, + CAT_FORM_1 = 768, + CHALLENGING_ROAR_1 = 5209, + CLAW_1 = 1082, + COWER_1 = 8998, + CURE_POISON_1 = 8946, + CYCLONE_1 = 33786, + DASH_1 = 1850, + DEMORALIZING_ROAR_1 = 99, + DIRE_BEAR_FORM_1 = 9634, + ENRAGE_1 = 5229, + ENTANGLING_ROOTS_1 = 339, + FAERIE_FIRE_1 = 770, + FAERIE_FIRE_FERAL_1 = 16857, + FERAL_CHARGE_BEAR_1 = 16979, + FERAL_CHARGE_CAT_1 = 49376, + FEROCIOUS_BITE_1 = 22568, + FLIGHT_FORM_1 = 33943, + FRENZIED_REGENERATION_1 = 22842, + GIFT_OF_THE_WILD_1 = 21849, + GROWL_1 = 6795, + HEALING_TOUCH_1 = 5185, + HIBERNATE_1 = 2637, + HURRICANE_1 = 16914, + INNERVATE_1 = 29166, + LACERATE_1 = 33745, + LIFEBLOOM_1 = 33763, + MAIM_1 = 22570, + MANGLE_BEAR_1 = 33878, + MANGLE_CAT_1 = 33876, + MARK_OF_THE_WILD_1 = 1126, + MAUL_1 = 6807, + MOONFIRE_1 = 8921, + NATURES_GRASP_1 = 16689, + NOURISH_1 = 50464, + POUNCE_1 = 9005, + PROWL_1 = 5215, + RAKE_1 = 1822, + RAVAGE_1 = 6785, + REBIRTH_1 = 20484, + REGROWTH_1 = 8936, + REJUVENATION_1 = 774, + REMOVE_CURSE_1 = 2782, + REVIVE_1 = 50769, + RIP_1 = 1079, + SAVAGE_ROAR_1 = 52610, + SHRED_1 = 5221, + SOOTHE_ANIMAL_1 = 2908, + STARFIRE_1 = 2912, + SWIFT_FLIGHT_FORM_1 = 40120, + SWIPE_BEAR_1 = 779, + SWIPE_CAT_1 = 62078, + THORNS_1 = 467, + TIGERS_FURY_1 = 5217, + TRANQUILITY_1 = 740, + TRAVEL_FORM_1 = 783, + WRATH_1 = 5176, + BERSERK_1 = 50334, + FERAL_CHARGE_1 = 49377, + FORCE_OF_NATURE_1 = 33831, + INSECT_SWARM_1 = 5570, + MANGLE_1 = 33917, + MOONKIN_FORM_1 = 24858, + NATURES_SWIFTNESS_1 = 17116, + STARFALL_1 = 48505, + SURVIVAL_INSTINCTS_1 = 61336, + SWIFTMEND_1 = 18562, + TREE_OF_LIFE_1 = 33891, + TYPHOON_1 = 50516, + WILD_GROWTH_1 = 48438, + }; class MANGOS_DLL_SPEC PlayerbotAI From db4b1965ab5f7c23be56f2a4149dd78c5433d274 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Thu, 5 Aug 2010 21:00:04 +0400 Subject: [PATCH 083/187] Add rest of primal spellids and cleanup code --- src/game/playerbot/PlayerbotAI.h | 940 ++++++++++++++++++++----------- 1 file changed, 612 insertions(+), 328 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 1224cd3be..d634abb28 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -19,331 +19,615 @@ class PlayerbotMgr; enum RankOneSpellId { // Mage spells and talents - CONJURE_FOOD_1 = 587, - CONJURE_MANA_GEM_1 = 759, - CONJURE_REFRESHMENT_1 = 42955, - CONJURE_WATER_1 = 5504, - AMPLIFY_MAGIC_1 = 1008, - ARCANE_BLAST_1 = 30451, - ARCANE_BRILLIANCE_1 = 23028, - ARCANE_EXPLOSION_1 = 1449, - ARCANE_INTELLECT_1 = 1459, - ARCANE_MISSILES_1 = 5143, - BLINK_1 = 1953, - BLIZZARD_1 = 10, - CONE_OF_COLD_1 = 120, - COUNTERSPELL_1 = 2139, - DALARAN_BRILLIANCE_1 = 61316, - DALARAN_INTELLECT_1 = 61024, - DAMPEN_MAGIC_1 = 604, - EVOCATION_1 = 12051, - FIREBALL_1 = 133, - FIRE_BLAST_1 = 2136, - FIRE_WARD_1 = 543, - FLAMESTRIKE_1 = 2120, - FROST_ARMOR_1 = 168, - FROSTBOLT_1 = 116, - FROSTFIRE_BOLT_1 = 44614, - FROST_NOVA_1 = 122, - FROST_WARD_1 = 6143, - ICE_ARMOR_1 = 7302, - ICE_BLOCK_1 = 45438, - ICE_LANCE_1 = 30455, - INVISIBILITY_1 = 66, - MAGE_ARMOR_1 = 6117, - MANA_SHIELD_1 = 1463, - MIRROR_IMAGE_1 = 55342, - MOLTEN_ARMOR_1 = 30482, - REMOVE_CURSE_1 = 475, - RITUAL_OF_REFRESHMENT_1 = 43987, - SCORCH_1 = 2948, - SLOW_FALL_1 = 130, - SPELLSTEAL_1 = 30449, - ARCANE_BARRAGE_1 = 44425, - ARCANE_POWER_1 = 12042, - BLAST_WAVE_1 = 11113, - COLD_SNAP_1 = 11958, - COMBUSTION_1 = 11129, - DEEP_FREEZE_1 = 44572, - DRAGONS_BREATH_1 = 31661, - FOCUS_MAGIC_1 = 54646, - ICE_BARRIER_1 = 11426, - ICY_VEINS_1 = 12472, - LIVING_BOMB_1 = 44457, - PRESENCE_OF_MIND_1 = 12043, - PYROBLAST_1 = 11366, - SLOW_1 = 31589, - SUMMON_WATER_ELEMENTAL_1 = 31687, + AMPLIFY_MAGIC_1 = 1008, + ARCANE_BARRAGE_1 = 44425, + ARCANE_BLAST_1 = 30451, + ARCANE_BRILLIANCE_1 = 23028, + ARCANE_EXPLOSION_1 = 1449, + ARCANE_INTELLECT_1 = 1459, + ARCANE_MISSILES_1 = 5143, + ARCANE_POWER_1 = 12042, + BLAST_WAVE_1 = 11113, + BLINK_1 = 1953, + BLIZZARD_1 = 10, + COLD_SNAP_1 = 11958, + COMBUSTION_1 = 11129, + CONE_OF_COLD_1 = 120, + CONJURE_FOOD_1 = 587, + CONJURE_MANA_GEM_1 = 759, + CONJURE_REFRESHMENT_1 = 42955, + CONJURE_WATER_1 = 5504, + COUNTERSPELL_1 = 2139, + DALARAN_BRILLIANCE_1 = 61316, + DALARAN_INTELLECT_1 = 61024, + DAMPEN_MAGIC_1 = 604, + DEEP_FREEZE_1 = 44572, + DRAGONS_BREATH_1 = 31661, + EVOCATION_1 = 12051, + FIRE_BLAST_1 = 2136, + FIRE_WARD_1 = 543, + FIREBALL_1 = 133, + FLAMESTRIKE_1 = 2120, + FOCUS_MAGIC_1 = 54646, + FROST_ARMOR_1 = 168, + FROST_NOVA_1 = 122, + FROST_WARD_1 = 6143, + FROSTBOLT_1 = 116, + FROSTFIRE_BOLT_1 = 44614, + ICE_ARMOR_1 = 7302, + ICE_BARRIER_1 = 11426, + ICE_BLOCK_1 = 45438, + ICE_LANCE_1 = 30455, + ICY_VEINS_1 = 12472, + INVISIBILITY_1 = 66, + LIVING_BOMB_1 = 44457, + MAGE_ARMOR_1 = 6117, + MANA_SHIELD_1 = 1463, + MIRROR_IMAGE_1 = 55342, + MOLTEN_ARMOR_1 = 30482, + PRESENCE_OF_MIND_1 = 12043, + PYROBLAST_1 = 11366, + REMOVE_CURSE_1 = 475, + RITUAL_OF_REFRESHMENT_1 = 43987, + SCORCH_1 = 2948, + SLOW_1 = 31589, + SLOW_FALL_1 = 130, + SPELLSTEAL_1 = 30449, + SUMMON_WATER_ELEMENTAL_1 = 31687, // Warlock - CREATE_FIRESTONE_1 = 6366, - CREATE_SOULSTONE_1 = 693, - CREATE_SPELLSTONE_1 = 2362, - BANISH_1 = 710, - CHALLENGING_HOWL_1 = 59671, - CORRUPTION_1 = 172, - CREATE_HEALTHSTONE_1 = 6201, - CURSE_OF_AGONY_1 = 980, - CURSE_OF_DOOM_1 = 603, - CURSE_OF_THE_ELEMENTS_1 = 1490, - CURSE_OF_TONGUES_1 = 1714, - CURSE_OF_WEAKNESS_1 = 702, - DEATH_COIL_1 = 6789, - DEMON_ARMOR_1 = 706, - DEMON_CHARGE_1 = 54785, - DEMONIC_CIRCLE_SUMMON_1 = 48018, - DEMONIC_CIRCLE_TELEPORT_1 = 48020, - DEMONIC_IMMOLATE_1 = 75445, - DEMON_SKIN_1 = 687, - DETECT_INVISIBILITY_1 = 132, - DRAIN_LIFE_1 = 689, - DRAIN_MANA_1 = 5138, - DRAIN_SOUL_1 = 1120, - ENSLAVE_DEMON_1 = 1098, - EYE_OF_KILROGG_1 = 126, - FEAR_1 = 5782, - FEL_ARMOR_1 = 28176, - HEALTH_FUNNEL_1 = 755, - HELLFIRE_1 = 1949, - HOWL_OF_TERROR_1 = 5484, - IMMOLATE_1 = 348, - IMMOLATION_AURA_1 = 50589, - INCINERATE_1 = 29722, - INFERNO_1 = 1122, - LIFE_TAP_1 = 1454, - RAIN_OF_FIRE_1 = 5740, - RITUAL_OF_DOOM_1 = 18540, - RITUAL_OF_SOULS_1 = 29893, - RITUAL_OF_SUMMONING_1 = 698, - SEARING_PAIN_1 = 5676, - SEED_OF_CORRUPTION_1 = 27243, - SENSE_DEMONS_1 = 5500, - SHADOW_BOLT_1 = 686, - SHADOW_CLEAVE_1 = 50581, - SHADOWFLAME_1 = 47897, - SHADOW_WARD_1 = 6229, - SOUL_FIRE_1 = 6353, - SOULSHATTER_1 = 29858, - SUMMON_FELHUNTER_1 = 691, - SUMMON_IMP_1 = 688, - SUMMON_SUCCUBUS_1 = 712, - SUMMON_VOIDWALKER_1 = 697, - UNENDING_BREATH_1 = 5697, - CHAOS_BOLT_1 = 50796, - CONFLAGRATE_1 = 17962, - CURSE_OF_EXHAUSTION_1 = 18223, - DARK_PACT_1 = 18220, - DEMONIC_EMPOWERMENT_1 = 47193, - FEL_DOMINATION_1 = 18708, - HAUNT_1 = 48181, - METAMORPHOSIS_1 = 59672, - SHADOWBURN_1 = 17877, - SHADOWFURY_1 = 30283, - SOUL_LINK_1 = 19028, - SUMMON_FELGUARD_1 = 30146, - UNSTABLE_AFFLICTION_1 = 30108, + BANISH_1 = 710, + CHALLENGING_HOWL_1 = 59671, + CHAOS_BOLT_1 = 50796, + CONFLAGRATE_1 = 17962, + CORRUPTION_1 = 172, + CREATE_FIRESTONE_1 = 6366, + CREATE_HEALTHSTONE_1 = 6201, + CREATE_SOULSTONE_1 = 693, + CREATE_SPELLSTONE_1 = 2362, + CURSE_OF_AGONY_1 = 980, + CURSE_OF_DOOM_1 = 603, + CURSE_OF_EXHAUSTION_1 = 18223, + CURSE_OF_THE_ELEMENTS_1 = 1490, + CURSE_OF_TONGUES_1 = 1714, + CURSE_OF_WEAKNESS_1 = 702, + DARK_PACT_1 = 18220, + DEATH_COIL_1 = 6789, + DEMON_ARMOR_1 = 706, + DEMON_CHARGE_1 = 54785, + DEMON_SKIN_1 = 687, + DEMONIC_CIRCLE_SUMMON_1 = 48018, + DEMONIC_CIRCLE_TELEPORT_1 = 48020, + DEMONIC_EMPOWERMENT_1 = 47193, + DEMONIC_IMMOLATE_1 = 75445, + DETECT_INVISIBILITY_1 = 132, + DRAIN_LIFE_1 = 689, + DRAIN_MANA_1 = 5138, + DRAIN_SOUL_1 = 1120, + ENSLAVE_DEMON_1 = 1098, + EYE_OF_KILROGG_1 = 126, + FEAR_1 = 5782, + FEL_ARMOR_1 = 28176, + FEL_DOMINATION_1 = 18708, + HAUNT_1 = 48181, + HEALTH_FUNNEL_1 = 755, + HELLFIRE_1 = 1949, + HOWL_OF_TERROR_1 = 5484, + IMMOLATE_1 = 348, + IMMOLATION_AURA_1 = 50589, + INCINERATE_1 = 29722, + INFERNO_1 = 1122, + LIFE_TAP_1 = 1454, + METAMORPHOSIS_1 = 59672, + RAIN_OF_FIRE_1 = 5740, + RITUAL_OF_DOOM_1 = 18540, + RITUAL_OF_SOULS_1 = 29893, + RITUAL_OF_SUMMONING_1 = 698, + SEARING_PAIN_1 = 5676, + SEED_OF_CORRUPTION_1 = 27243, + SENSE_DEMONS_1 = 5500, + SHADOW_BOLT_1 = 686, + SHADOW_CLEAVE_1 = 50581, + SHADOW_WARD_1 = 6229, + SHADOWBURN_1 = 17877, + SHADOWFLAME_1 = 47897, + SHADOWFURY_1 = 30283, + SOUL_FIRE_1 = 6353, + SOUL_LINK_1 = 19028, + SOULSHATTER_1 = 29858, + SUMMON_FELGUARD_1 = 30146, + SUMMON_FELHUNTER_1 = 691, + SUMMON_IMP_1 = 688, + SUMMON_SUCCUBUS_1 = 712, + SUMMON_VOIDWALKER_1 = 697, + UNENDING_BREATH_1 = 5697, + UNSTABLE_AFFLICTION_1 = 30108, //Paladin - AVENGING_WRATH_1 = 31884, - BLESSING_OF_KINGS_1 = 20217, - BLESSING_OF_MIGHT_1 = 19740, - BLESSING_OF_WISDOM_1 = 19742, - CLEANSE_1 = 4987, - CONCENTRATION_AURA_1 = 19746, - CONSECRATION_1 = 26573, - CRUSADER_AURA_1 = 32223, - DEVOTION_AURA_1 = 465, - DIVINE_INTERVENTION_1 = 19752, - DIVINE_PLEA_1 = 54428, - DIVINE_PROTECTION_1 = 498, - DIVINE_SHIELD_1 = 642, - EXORCISM_1 = 879, - FIRE_RESISTANCE_AURA_1 = 19891, - FLASH_OF_LIGHT_1 = 19750, - FROST_RESISTANCE_AURA_1 = 19888, - GREATER_BLESSING_OF_KINGS_1 = 25898, - GREATER_BLESSING_OF_MIGHT_1 = 25782, + AURA_MASTERY_1 = 31821, + AVENGERS_SHIELD_1 = 31935, + AVENGING_WRATH_1 = 31884, + BEACON_OF_LIGHT_1 = 53563, + BLESSING_OF_KINGS_1 = 20217, + BLESSING_OF_MIGHT_1 = 19740, + BLESSING_OF_SANCTUARY_1 = 20911, + BLESSING_OF_WISDOM_1 = 19742, + CLEANSE_1 = 4987, + CONCENTRATION_AURA_1 = 19746, + CONSECRATION_1 = 26573, + CRUSADER_AURA_1 = 32223, + CRUSADER_STRIKE_1 = 35395, + DEVOTION_AURA_1 = 465, + DIVINE_FAVOR_1 = 20216, + DIVINE_ILLUMINATION_1 = 31842, + DIVINE_INTERVENTION_1 = 19752, + DIVINE_PLEA_1 = 54428, + DIVINE_PROTECTION_1 = 498, + DIVINE_SACRIFICE_1 = 64205, + DIVINE_SHIELD_1 = 642, + DIVINE_STORM_1 = 53385, + EXORCISM_1 = 879, + FIRE_RESISTANCE_AURA_1 = 19891, + FLASH_OF_LIGHT_1 = 19750, + FROST_RESISTANCE_AURA_1 = 19888, + GREATER_BLESSING_OF_KINGS_1 = 25898, + GREATER_BLESSING_OF_MIGHT_1 = 25782, GREATER_BLESSING_OF_SANCTUARY_1 = 25899, - GREATER_BLESSING_OF_WISDOM_1 = 25894, - HAMMER_OF_JUSTICE_1 = 853, - HAMMER_OF_WRATH_1 = 24275, - HAND_OF_FREEDOM_1 = 1044, - HAND_OF_PROTECTION_1 = 1022, - HAND_OF_RECKONING_1 = 62124, - HAND_OF_SACRIFICE_1 = 6940, - HAND_OF_SALVATION_1 = 1038, - HOLY_LIGHT_1 = 635, - HOLY_WRATH_1 = 2812, - JUDGEMENT_OF_JUSTICE_1 = 53407, - JUDGEMENT_OF_LIGHT_1 = 20271, - JUDGEMENT_OF_WISDOM_1 = 53408, - LAY_ON_HANDS_1 = 633, - PURIFY_1 = 1152, - REDEMPTION_1 = 7328, - RETRIBUTION_AURA_1 = 7294, - RIGHTEOUS_DEFENSE_1 = 31789, - RIGHTEOUS_FURY_1 = 25780, - SACRED_SHIELD_1 = 53601, - SEAL_OF_CORRUPTION = 53736, - SEAL_OF_JUSTICE_1 = 20164, - SEAL_OF_LIGHT_1 = 20165, - SEAL_OF_RIGHTEOUSNESS_1 = 20154, - SEAL_OF_VENGEANCE = 31801, - SEAL_OF_WISDOM_1 = 20166, - SENSE_UNDEAD_1 = 5502, - SHADOW_RESISTANCE_AURA_1 = 19876, - SHIELD_OF_RIGHTEOUSNESS_1 = 53600, - TURN_EVIL_1 = 10326, - AURA_MASTERY_1 = 31821, - AVENGERS_SHIELD_1 = 31935, - BEACON_OF_LIGHT_1 = 53563, - BLESSING_OF_SANCTUARY_1 = 20911, - CRUSADER_STRIKE_1 = 35395, - DIVINE_FAVOR_1 = 20216, - DIVINE_ILLUMINATION_1 = 31842, - DIVINE_SACRIFICE_1 = 64205, - DIVINE_STORM_1 = 53385, - HAMMER_OF_THE_RIGHTEOUS_1 = 53595, - HOLY_SHIELD_1 = 20925, - HOLY_SHOCK_1 = 20473, - REPENTANCE_1 = 20066, - SEAL_OF_COMMAND_1 = 20375, + GREATER_BLESSING_OF_WISDOM_1 = 25894, + HAMMER_OF_JUSTICE_1 = 853, + HAMMER_OF_THE_RIGHTEOUS_1 = 53595, + HAMMER_OF_WRATH_1 = 24275, + HAND_OF_FREEDOM_1 = 1044, + HAND_OF_PROTECTION_1 = 1022, + HAND_OF_RECKONING_1 = 62124, + HAND_OF_SACRIFICE_1 = 6940, + HAND_OF_SALVATION_1 = 1038, + HOLY_LIGHT_1 = 635, + HOLY_SHIELD_1 = 20925, + HOLY_SHOCK_1 = 20473, + HOLY_WRATH_1 = 2812, + JUDGEMENT_OF_JUSTICE_1 = 53407, + JUDGEMENT_OF_LIGHT_1 = 20271, + JUDGEMENT_OF_WISDOM_1 = 53408, + LAY_ON_HANDS_1 = 633, + PURIFY_1 = 1152, + REDEMPTION_1 = 7328, + REPENTANCE_1 = 20066, + RETRIBUTION_AURA_1 = 7294, + RIGHTEOUS_DEFENSE_1 = 31789, + RIGHTEOUS_FURY_1 = 25780, + SACRED_SHIELD_1 = 53601, + SEAL_OF_COMMAND_1 = 20375, + SEAL_OF_CORRUPTION = 53736, + SEAL_OF_JUSTICE_1 = 20164, + SEAL_OF_LIGHT_1 = 20165, + SEAL_OF_RIGHTEOUSNESS_1 = 20154, + SEAL_OF_VENGEANCE = 31801, + SEAL_OF_WISDOM_1 = 20166, + SENSE_UNDEAD_1 = 5502, + SHADOW_RESISTANCE_AURA_1 = 19876, + SHIELD_OF_RIGHTEOUSNESS_1 = 53600, + TURN_EVIL_1 = 10326, //Priest - ABOLISH_DISEASE_1 = 552, - BINDING_HEAL_1 = 32546, - BLESSED_HEALING_1 = 70772, - CURE_DISEASE_1 = 528, - DEVOURING_PLAGUE_1 = 2944, - DISPEL_MAGIC_1 = 527, - DIVINE_HYMN_1 = 64843, - DIVINE_SPIRIT_1 = 14752, - FADE_1 = 586, - FEAR_WARD_1 = 6346, - FLASH_HEAL_1 = 2061, - GREATER_HEAL_1 = 2060, - HEAL_1 = 2054, - HOLY_FIRE_1 = 14914, - HOLY_NOVA_1 = 15237, - HYMN_OF_HOPE_1 = 64901, - INNER_FIRE_1 = 588, - LESSER_HEAL_1 = 2050, - LEVITATE_1 = 1706, - MANA_BURN_1 = 8129, - MASS_DISPEL_1 = 32375, - MIND_BLAST_1 = 8092, - MIND_CONTROL_1 = 605, - MIND_SEAR_1 = 48045, - MIND_SOOTHE_1 = 453, - MIND_VISION_1 = 2096, - POWER_WORD_FORTITUDE_1 = 1243, - POWER_WORD_SHIELD_1 = 17, - PRAYER_OF_FORTITUDE_1 = 21562, - PRAYER_OF_HEALING_1 = 596, - PRAYER_OF_MENDING_1 = 33076, - PRAYER_OF_SHADOW_PROTECTION_1 = 27683, - PRAYER_OF_SPIRIT_1 = 27681, - PSYCHIC_SCREAM_1 = 8122, - RENEW_1 = 139, - RESURRECTION_1 = 2006, - SHACKLE_UNDEAD_1 = 9484, - SHADOWFIEND_1 = 34433, - SHADOW_PROTECTION_1 = 976, - SHADOW_WORD_DEATH_1 = 32379, - SHADOW_WORD_PAIN_1 = 589, - SMITE_1 = 585, - CIRCLE_OF_HEALING_1 = 34861, - DESPERATE_PRAYER_1 = 19236, - DISPERSION_1 = 47585, - GUARDIAN_SPIRIT_1 = 47788, - INNER_FOCUS_1 = 14751, - LIGHTWELL_1 = 724, - MIND_FLAY_1 = 15407, - PAIN_SUPPRESSION_1 = 33206, - PENANCE_1 = 47540, - POWER_INFUSION_1 = 10060, - PSYCHIC_HORROR_1 = 64044, - SHADOWFORM_1 = 15473, - SILENCE_1 = 15487, - VAMPIRIC_EMBRACE_1 = 15286, - VAMPIRIC_TOUCH_1 = 34914, + ABOLISH_DISEASE_1 = 552, + BINDING_HEAL_1 = 32546, + BLESSED_HEALING_1 = 70772, + CIRCLE_OF_HEALING_1 = 34861, + CURE_DISEASE_1 = 528, + DESPERATE_PRAYER_1 = 19236, + DEVOURING_PLAGUE_1 = 2944, + DISPEL_MAGIC_1 = 527, + DISPERSION_1 = 47585, + DIVINE_HYMN_1 = 64843, + DIVINE_SPIRIT_1 = 14752, + FADE_1 = 586, + FEAR_WARD_1 = 6346, + FLASH_HEAL_1 = 2061, + GREATER_HEAL_1 = 2060, + GUARDIAN_SPIRIT_1 = 47788, + HEAL_1 = 2054, + HOLY_FIRE_1 = 14914, + HOLY_NOVA_1 = 15237, + HYMN_OF_HOPE_1 = 64901, + INNER_FIRE_1 = 588, + INNER_FOCUS_1 = 14751, + LESSER_HEAL_1 = 2050, + LEVITATE_1 = 1706, + LIGHTWELL_1 = 724, + MANA_BURN_1 = 8129, + MASS_DISPEL_1 = 32375, + MIND_BLAST_1 = 8092, + MIND_CONTROL_1 = 605, + MIND_FLAY_1 = 15407, + MIND_SEAR_1 = 48045, + MIND_SOOTHE_1 = 453, + MIND_VISION_1 = 2096, + PAIN_SUPPRESSION_1 = 33206, + PENANCE_1 = 47540, + POWER_INFUSION_1 = 10060, + POWER_WORD_FORTITUDE_1 = 1243, + POWER_WORD_SHIELD_1 = 17, + PRAYER_OF_FORTITUDE_1 = 21562, + PRAYER_OF_HEALING_1 = 596, + PRAYER_OF_MENDING_1 = 33076, + PRAYER_OF_SHADOW_PROTECTION_1 = 27683, + PRAYER_OF_SPIRIT_1 = 27681, + PSYCHIC_HORROR_1 = 64044, + PSYCHIC_SCREAM_1 = 8122, + RENEW_1 = 139, + RESURRECTION_1 = 2006, + SHACKLE_UNDEAD_1 = 9484, + SHADOW_PROTECTION_1 = 976, + SHADOW_WORD_DEATH_1 = 32379, + SHADOW_WORD_PAIN_1 = 589, + SHADOWFIEND_1 = 34433, + SHADOWFORM_1 = 15473, + SILENCE_1 = 15487, + SMITE_1 = 585, + VAMPIRIC_EMBRACE_1 = 15286, + VAMPIRIC_TOUCH_1 = 34914, //Druid - ABOLISH_POISON_1 = 2893, - AQUATIC_FORM_1 = 1066, - BARKSKIN_1 = 22812, - BASH_1 = 5211, - BEAR_FORM_1 = 5487, - CAT_FORM_1 = 768, - CHALLENGING_ROAR_1 = 5209, - CLAW_1 = 1082, - COWER_1 = 8998, - CURE_POISON_1 = 8946, - CYCLONE_1 = 33786, - DASH_1 = 1850, - DEMORALIZING_ROAR_1 = 99, - DIRE_BEAR_FORM_1 = 9634, - ENRAGE_1 = 5229, - ENTANGLING_ROOTS_1 = 339, - FAERIE_FIRE_1 = 770, - FAERIE_FIRE_FERAL_1 = 16857, - FERAL_CHARGE_BEAR_1 = 16979, - FERAL_CHARGE_CAT_1 = 49376, - FEROCIOUS_BITE_1 = 22568, - FLIGHT_FORM_1 = 33943, - FRENZIED_REGENERATION_1 = 22842, - GIFT_OF_THE_WILD_1 = 21849, - GROWL_1 = 6795, - HEALING_TOUCH_1 = 5185, - HIBERNATE_1 = 2637, - HURRICANE_1 = 16914, - INNERVATE_1 = 29166, - LACERATE_1 = 33745, - LIFEBLOOM_1 = 33763, - MAIM_1 = 22570, - MANGLE_BEAR_1 = 33878, - MANGLE_CAT_1 = 33876, - MARK_OF_THE_WILD_1 = 1126, - MAUL_1 = 6807, - MOONFIRE_1 = 8921, - NATURES_GRASP_1 = 16689, - NOURISH_1 = 50464, - POUNCE_1 = 9005, - PROWL_1 = 5215, - RAKE_1 = 1822, - RAVAGE_1 = 6785, - REBIRTH_1 = 20484, - REGROWTH_1 = 8936, - REJUVENATION_1 = 774, - REMOVE_CURSE_1 = 2782, - REVIVE_1 = 50769, - RIP_1 = 1079, - SAVAGE_ROAR_1 = 52610, - SHRED_1 = 5221, - SOOTHE_ANIMAL_1 = 2908, - STARFIRE_1 = 2912, - SWIFT_FLIGHT_FORM_1 = 40120, - SWIPE_BEAR_1 = 779, - SWIPE_CAT_1 = 62078, - THORNS_1 = 467, - TIGERS_FURY_1 = 5217, - TRANQUILITY_1 = 740, - TRAVEL_FORM_1 = 783, - WRATH_1 = 5176, - BERSERK_1 = 50334, - FERAL_CHARGE_1 = 49377, - FORCE_OF_NATURE_1 = 33831, - INSECT_SWARM_1 = 5570, - MANGLE_1 = 33917, - MOONKIN_FORM_1 = 24858, - NATURES_SWIFTNESS_1 = 17116, - STARFALL_1 = 48505, - SURVIVAL_INSTINCTS_1 = 61336, - SWIFTMEND_1 = 18562, - TREE_OF_LIFE_1 = 33891, - TYPHOON_1 = 50516, - WILD_GROWTH_1 = 48438, - + ABOLISH_POISON_1 = 2893, + AQUATIC_FORM_1 = 1066, + BARKSKIN_1 = 22812, + BASH_1 = 5211, + BEAR_FORM_1 = 5487, + BERSERK_1 = 50334, + CAT_FORM_1 = 768, + CHALLENGING_ROAR_1 = 5209, + CLAW_1 = 1082, + COWER_1 = 8998, + CURE_POISON_1 = 8946, + CYCLONE_1 = 33786, + DASH_1 = 1850, + DEMORALIZING_ROAR_1 = 99, + DIRE_BEAR_FORM_1 = 9634, + ENRAGE_1 = 5229, + ENTANGLING_ROOTS_1 = 339, + FAERIE_FIRE_1 = 770, + FAERIE_FIRE_FERAL_1 = 16857, + FERAL_CHARGE_1 = 49377, + FERAL_CHARGE_BEAR_1 = 16979, + FERAL_CHARGE_CAT_1 = 49376, + FEROCIOUS_BITE_1 = 22568, + FLIGHT_FORM_1 = 33943, + FORCE_OF_NATURE_1 = 33831, + FRENZIED_REGENERATION_1 = 22842, + GIFT_OF_THE_WILD_1 = 21849, + GROWL_1 = 6795, + HEALING_TOUCH_1 = 5185, + HIBERNATE_1 = 2637, + HURRICANE_1 = 16914, + INNERVATE_1 = 29166, + INSECT_SWARM_1 = 5570, + LACERATE_1 = 33745, + LIFEBLOOM_1 = 33763, + MAIM_1 = 22570, + MANGLE_1 = 33917, + MANGLE_BEAR_1 = 33878, + MANGLE_CAT_1 = 33876, + MARK_OF_THE_WILD_1 = 1126, + MAUL_1 = 6807, + MOONFIRE_1 = 8921, + MOONKIN_FORM_1 = 24858, + NATURES_GRASP_1 = 16689, + NATURES_SWIFTNESS_1 = 17116, + NOURISH_1 = 50464, + POUNCE_1 = 9005, + PROWL_1 = 5215, + RAKE_1 = 1822, + RAVAGE_1 = 6785, + REBIRTH_1 = 20484, + REGROWTH_1 = 8936, + REJUVENATION_1 = 774, + REMOVE_CURSE_1 = 2782, + REVIVE_1 = 50769, + RIP_1 = 1079, + SAVAGE_ROAR_1 = 52610, + SHRED_1 = 5221, + SOOTHE_ANIMAL_1 = 2908, + STARFALL_1 = 48505, + STARFIRE_1 = 2912, + SURVIVAL_INSTINCTS_1 = 61336, + SWIFTMEND_1 = 18562, + SWIFT_FLIGHT_FORM_1 = 40120, + SWIPE_BEAR_1 = 779, + SWIPE_CAT_1 = 62078, + THORNS_1 = 467, + TIGERS_FURY_1 = 5217, + TRANQUILITY_1 = 740, + TRAVEL_FORM_1 = 783, + TREE_OF_LIFE_1 = 33891, + TYPHOON_1 = 50516, + WILD_GROWTH_1 = 48438, + WRATH_1 = 5176, + + //Hunter + ARCANE_SHOT_1 = 3044, + ASPECT_OF_THE_BEAST_1 = 13161, + ASPECT_OF_THE_CHEETAH_1 = 5118, + ASPECT_OF_THE_DRAGONHAWK_1 = 61846, + ASPECT_OF_THE_HAWK_1 = 13165, + ASPECT_OF_THE_MONKEY_1 = 13163, + ASPECT_OF_THE_PACK_1 = 13159, + ASPECT_OF_THE_VIPER_1 = 34074, + ASPECT_OF_THE_WILD_1 = 20043, + AUTO_SHOT_1 = 75, + BEAST_LORE_1 = 1462, + CALL_PET_1 = 883, + CALL_STABLED_PET_1 = 62757, + CONCUSSIVE_SHOT_1 = 5116, + DETERRENCE_1 = 19263, + DISENGAGE_1 = 781, + DISMISS_PET_1 = 2641, + DISTRACTING_SHOT_1 = 20736, + EAGLE_EYE_1 = 6197, + EXPLOSIVE_TRAP_1 = 13813, + EYES_OF_THE_BEAST_1 = 1002, + FEED_PET_1 = 6991, + FEIGN_DEATH_1 = 5384, + FLARE_1 = 1543, + FREEZING_ARROW_1 = 60192, + FREEZING_TRAP_1 = 1499, + FROST_TRAP_1 = 13809, + HUNTERS_MARK_1 = 1130, + IMMOLATION_TRAP_1 = 13795, + KILL_COMMAND_1 = 34026, + KILL_SHOT_1 = 53351, + MASTERS_CALL_1 = 53271, + MEND_PET_1 = 136, + MISDIRECTION_1 = 34477, + MONGOOSE_BITE_1 = 1495, + MULTISHOT_1 = 2643, + RAPID_FIRE_1 = 3045, + RAPTOR_STRIKE_1 = 2973, + REVIVE_PET_1 = 982, + SCARE_BEAST_1 = 1513, + SCORPID_STING_1 = 3043, + SERPENT_STING_1 = 1978, + SNAKE_TRAP_1 = 34600, + STEADY_SHOT_1 = 56641, + TAME_BEAST_1 = 1515, + TRACK_BEASTS_1 = 1494, + TRACK_DEMONS_1 = 19878, + TRACK_DRAGONKIN_1 = 19879, + TRACK_ELEMENTALS_1 = 19880, + TRACK_GIANTS_1 = 19882, + TRACK_HIDDEN_1 = 19885, + TRACK_HUMANOIDS_1 = 19883, + TRACK_UNDEAD_1 = 19884, + TRANQUILIZING_SHOT_1 = 19801, + VIPER_STING_1 = 3034, + VOLLEY_1 = 1510, + WING_CLIP_1 = 2974, + AIMED_SHOT_1 = 19434, + BESTIAL_WRATH_1 = 19574, + BLACK_ARROW_1 = 3674, + CHIMERA_SHOT_1 = 53209, + COUNTERATTACK_1 = 19306, + EXPLOSIVE_SHOT_1 = 53301, + INTIMIDATION_1 = 19577, + READINESS_1 = 23989, + SCATTER_SHOT_1 = 19503, + SILENCING_SHOT_1 = 34490, + TRUESHOT_AURA_1 = 19506, + WYVERN_STING_1 = 19386, + + //Death Knight + ANTIMAGIC_SHELL_1 = 48707, + ANTIMAGIC_ZONE_1 = 51052, + ARMY_OF_THE_DEAD_1 = 42650, + BLOOD_BOIL_1 = 48721, + BLOOD_PRESENCE_1 = 48266, + BLOOD_STRIKE_1 = 45902, + BLOOD_TAP_1 = 45529, + BONE_SHIELD_1 = 49222, + CHAINS_OF_ICE_1 = 45524, + CORPSE_EXPLOSION_1 = 49158, + DANCING_RUNE_WEAPON_1 = 49028, + DARK_COMMAND_1 = 56222, + DEATH_AND_DECAY_1 = 43265, + DEATH_COIL_1 = 47541, + DEATH_GRIP_1 = 49576, + DEATH_PACT_1 = 48743, + DEATH_STRIKE_1 = 49998, + DEATHCHILL_1 = 49796, + EMPOWER_RUNE_WEAPON_1 = 47568, + FROST_PRESENCE_1 = 48263, + FROST_STRIKE_1 = 49143, + GHOUL_FRENZY_1 = 63560, + HEART_STRIKE_1 = 55050, + HORN_OF_WINTER_1 = 57330, + HOWLING_BLAST_1 = 49184, + HUNGERING_COLD_1 = 49203, + HYSTERIA_1 = 49016, + ICEBOUND_FORTITUDE_1 = 48792, + ICY_TOUCH_1 = 45477, + LICHBORNE_1 = 49039, + MARK_OF_BLOOD_1 = 49005, + MIND_FREEZE_1 = 47528, + OBLITERATE_1 = 49020, + PATH_OF_FROST_1 = 3714, + PESTILENCE_1 = 50842, + PLAGUE_STRIKE_1 = 45462, + RAISE_ALLY_1 = 61999, + RAISE_DEAD_1 = 46584, + RUNE_STRIKE_1 = 56815, + RUNE_TAP_1 = 48982, + SCOURGE_STRIKE_1 = 55090, + STRANGULATE_1 = 47476, + SUMMON_GARGOYLE_1 = 49206, + UNBREAKABLE_ARMOR_1 = 51271, + UNHOLY_PRESENCE_1 = 48265, + VAMPIRIC_BLOOD_1 = 55233, + + //Rogue + ADRENALINE_RUSH_1 = 13750, + AMBUSH_1 = 8676, + BACKSTAB_1 = 53, + BLADE_FLURRY_1 = 13877, + BLIND_1 = 2094, + CHEAP_SHOT_1 = 1833, + CLOAK_OF_SHADOWS_1 = 31224, + COLD_BLOOD_1 = 14177, + DEADLY_THROW_1 = 26679, + DISARM_TRAP_1 = 1842, + DISMANTLE_1 = 51722, + DISTRACT_1 = 1725, + ENVENOM_1 = 32645, + EVASION_1 = 5277, + EVISCERATE_1 = 2098, + EXPOSE_ARMOR_1 = 8647, + FAN_OF_KNIVES_1 = 51723, + FEINT_1 = 1966, + GARROTE_1 = 703, + GHOSTLY_STRIKE_1 = 14278, + GOUGE_1 = 1776, + HEMORRHAGE_1 = 16511, + HUNGER_FOR_BLOOD_1 = 51662, + KICK_1 = 1766, + KIDNEY_SHOT_1 = 408, + KILLING_SPREE_1 = 51690, + MUTILATE_1 = 1329, + PICK_LOCK_1 = 1804, + PICK_POCKET_1 = 921, + PREMEDITATION_1 = 14183, + PREPARATION_1 = 14185, + RIPOSTE_1 = 14251, + RUPTURE_1 = 1943, + SAP_1 = 6770, + SHADOW_DANCE_1 = 51713, + SHADOWSTEP_1 = 36554, + SHIV_1 = 5938, + SINISTER_STRIKE_1 = 1752, + SLICE_AND_DICE_1 = 5171, + SPRINT_1 = 2983, + STEALTH_1 = 1784, + TRICKS_OF_THE_TRADE_1 = 57934, + VANISH_1 = 1856, + + //Shaman + ANCESTRAL_SPIRIT_1 = 2008, + ASTRAL_RECALL_1 = 556, + BLOODLUST_1 = 2825, + CALL_OF_THE_ANCESTORS_1 = 66843, + CALL_OF_THE_ELEMENTS_1 = 66842, + CALL_OF_THE_SPIRITS_1 = 66844, + CHAIN_HEAL_1 = 1064, + CHAIN_LIGHTNING_1 = 421, + CHAINED_HEAL_1 = 70809, + CLEANSE_SPIRIT_1 = 51886, + CLEANSING_TOTEM_1 = 8170, + CURE_TOXINS_1 = 526, + EARTH_ELEMENTAL_TOTEM_1 = 2062, + EARTH_SHIELD_1 = 974, + EARTH_SHOCK_1 = 8042, + EARTHBIND_TOTEM_1 = 2484, + EARTHLIVING_WEAPON_1 = 51730, + ELEMENTAL_MASTERY_1 = 16166, + FERAL_SPIRIT_1 = 51533, + FIRE_ELEMENTAL_TOTEM_1 = 2894, + FIRE_NOVA_1 = 1535, + FIRE_RESISTANCE_TOTEM_1 = 8184, + FLAME_SHOCK_1 = 8050, + FLAMETONGUE_TOTEM_1 = 8227, + FLAMETONGUE_WEAPON_1 = 8024, + FROST_RESISTANCE_TOTEM_1 = 8181, + FROST_SHOCK_1 = 8056, + FROSTBRAND_WEAPON_1 = 8033, + GHOST_WOLF_1 = 2645, + GROUNDING_TOTEM_1 = 8177, + HEALING_STREAM_TOTEM_1 = 5394, + HEALING_WAVE_1 = 331, + HEROISM_1 = 32182, + HEX_1 = 51514, + LAVA_BURST_1 = 51505, + LAVA_LASH_1 = 60103, + LESSER_HEALING_WAVE_1 = 8004, + LIGHTNING_BOLT_1 = 403, + LIGHTNING_SHIELD_1 = 324, + MAGMA_TOTEM_1 = 8190, + MANA_SPRING_TOTEM_1 = 5675, + MANA_TIDE_TOTEM_1 = 16190, + NATURE_RESISTANCE_TOTEM_1 = 10595, + NATURES_SWIFTNESS_1 = 16188, + PURGE_1 = 370, + RIPTIDE_1 = 61295, + ROCKBITER_WEAPON_1 = 8017, + SEARING_TOTEM_1 = 3599, + SENTRY_TOTEM_1 = 6495, + SHAMANISTIC_RAGE_1 = 30823, + STONECLAW_TOTEM_1 = 5730, + STONESKIN_TOTEM_1 = 8071, + STORMSTRIKE_1 = 17364, + STRENGTH_OF_EARTH_TOTEM_1 = 8075, + THUNDERSTORM_1 = 51490, + TIDAL_FORCE_1 = 55198, + TOTEM_OF_WRATH_1 = 30706, + TOTEMIC_RECALL_1 = 36936, + TREMOR_TOTEM_1 = 8143, + WATER_BREATHING_1 = 131, + WATER_SHIELD_1 = 52127, + WATER_WALKING_1 = 546, + WIND_SHEAR_1 = 57994, + WINDFURY_TOTEM_1 = 8512, + WINDFURY_WEAPON_1 = 8232, + WRATH_OF_AIR_TOTEM_1 = 3738, + + //Warrior + BATTLE_SHOUT_1 = 6673, + BATTLE_STANCE_1 = 2457, + BERSERKER_RAGE_1 = 18499, + BERSERKER_STANCE_1 = 2458, + BLADESTORM_1 = 46924, + BLOODRAGE_1 = 2687, + BLOODTHIRST_1 = 23881, + CHALLENGING_SHOUT_1 = 1161, + CHARGE_1 = 100, + CLEAVE_1 = 845, + COMMANDING_SHOUT_1 = 469, + CONCUSSION_BLOW_1 = 12809, + DEATH_WISH_1 = 12292, + DEFENSIVE_STANCE_1 = 71, + DEMORALIZING_SHOUT_1 = 1160, + DEVASTATE_1 = 20243, + DISARM_1 = 676, + ENRAGED_REGENERATION_1 = 55694, + EXECUTE_1 = 5308, + HAMSTRING_1 = 1715, + HEROIC_FURY_1 = 60970, + HEROIC_STRIKE_1 = 78, + HEROIC_THROW_1 = 57755, + INTERCEPT_1 = 20252, + INTERVENE_1 = 3411, + INTIMIDATING_SHOUT_1 = 5246, + LAST_STAND_1 = 12975, + MOCKING_BLOW_1 = 694, + MORTAL_STRIKE_1 = 12294, + OVERPOWER_1 = 7384, + PIERCING_HOWL_1 = 12323, + PUMMEL_1 = 6552, + RECKLESSNESS_1 = 1719, + REND_1 = 772, + RETALIATION_1 = 20230, + REVENGE_1 = 6572, + SHATTERING_THROW_1 = 64382, + SHIELD_BASH_1 = 72, + SHIELD_BLOCK_1 = 2565, + SHIELD_SLAM_1 = 23922, + SHIELD_WALL_1 = 871, + SHOCKWAVE_1 = 46968, + SLAM_1 = 1464, + SPELL_REFLECTION_1 = 23920, + SUNDER_ARMOR_1 = 7386, + SWEEPING_STRIKES_1 = 12328, + TAUNT_1 = 355, + THUNDER_CLAP_1 = 6343, + VICTORY_RUSH_1 = 34428, + VIGILANCE_1 = 50720, + WHIRLWIND_1 = 1680 }; class MANGOS_DLL_SPEC PlayerbotAI @@ -379,8 +663,8 @@ class MANGOS_DLL_SPEC PlayerbotAI enum CombatTargetType { - TARGET_NORMAL = 0x00, - TARGET_THREATEN = 0x01 + TARGET_NORMAL = 0x00, + TARGET_THREATEN = 0x01 }; enum BotState @@ -394,9 +678,9 @@ class MANGOS_DLL_SPEC PlayerbotAI enum MovementOrderType { - MOVEMENT_NONE = 0x00, - MOVEMENT_FOLLOW = 0x01, - MOVEMENT_STAY = 0x02 + MOVEMENT_NONE = 0x00, + MOVEMENT_FOLLOW = 0x01, + MOVEMENT_STAY = 0x02 }; typedef std::map BotNeedItem; @@ -405,11 +689,11 @@ class MANGOS_DLL_SPEC PlayerbotAI // attacker query used in PlayerbotAI::FindAttacker() enum ATTACKERINFOTYPE { - AIT_NONE = 0x00, - AIT_LOWESTTHREAT = 0x01, - AIT_HIGHESTTHREAT = 0x02, - AIT_VICTIMSELF = 0x04, - AIT_VICTIMNOTSELF = 0x08 // !!! must use victim param in FindAttackers + AIT_NONE = 0x00, + AIT_LOWESTTHREAT = 0x01, + AIT_HIGHESTTHREAT = 0x02, + AIT_VICTIMSELF = 0x04, + AIT_VICTIMNOTSELF = 0x08 // !!! must use victim param in FindAttackers }; struct AttackerInfo { @@ -417,8 +701,8 @@ class MANGOS_DLL_SPEC PlayerbotAI Unit* victim; // combatant's current victim float threat; // own threat on this combatant float threat2; // highest threat not caused by bot - uint32 count; // number of units attacking - uint32 source; // 1=bot, 2=master, 3=group + uint32 count; // number of units attacking + uint32 source; // 1=bot, 2=master, 3=group }; typedef std::map AttackerInfoList; From 2e50c2927b67e84a9e4da5e92932edf723ef22fb Mon Sep 17 00:00:00 2001 From: chelobaka Date: Thu, 5 Aug 2010 21:46:10 +0400 Subject: [PATCH 084/187] Rename method to something less ugly --- src/game/playerbot/PlayerbotAI.cpp | 4 +- src/game/playerbot/PlayerbotAI.h | 3 +- src/game/playerbot/PlayerbotMageAI.cpp | 88 +++++++++++++------------- 3 files changed, 48 insertions(+), 47 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 356b7207d..6b79dbc49 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -285,7 +285,7 @@ uint32 PlayerbotAI::getPetSpellId(const char* args) const } -uint32 PlayerbotAI::getMaxKnownRankSpellId(uint32 spellId) +uint32 PlayerbotAI::initSpell(uint32 spellId) { // Check if bot knows this spell if (!m_bot->HasSpell(spellId)) @@ -301,7 +301,7 @@ uint32 PlayerbotAI::getMaxKnownRankSpellId(uint32 spellId) continue; if (node->prev == spellId) { - next = getMaxKnownRankSpellId(itr->second); + next = initSpell(itr->second); break; } } diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index d634abb28..22c37d0b1 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -738,7 +738,8 @@ class MANGOS_DLL_SPEC PlayerbotAI // in priority of full text match, spells not taking reagents, and highest rank uint32 getSpellId(const char* args, bool master = false) const; uint32 getPetSpellId(const char* args) const; - uint32 getMaxKnownRankSpellId(uint32 spellId); + // Initialize spell using rank 1 spell id + uint32 initSpell(uint32 spellId); // extracts item ids from links void extractItemIds(const std::string& text, std::list& itemIds) const; diff --git a/src/game/playerbot/PlayerbotMageAI.cpp b/src/game/playerbot/PlayerbotMageAI.cpp index 42cc05191..19beeb883 100644 --- a/src/game/playerbot/PlayerbotMageAI.cpp +++ b/src/game/playerbot/PlayerbotMageAI.cpp @@ -5,50 +5,50 @@ class PlayerbotAI; PlayerbotMageAI::PlayerbotMageAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) { - ARCANE_MISSILES = ai->getMaxKnownRankSpellId(ARCANE_MISSILES_1); - ARCANE_EXPLOSION = ai->getMaxKnownRankSpellId(ARCANE_EXPLOSION_1); - COUNTERSPELL = ai->getMaxKnownRankSpellId(COUNTERSPELL_1); - SLOW = ai->getMaxKnownRankSpellId(SLOW_1); - ARCANE_BARRAGE = ai->getMaxKnownRankSpellId(ARCANE_BARRAGE_1); - ARCANE_BLAST = ai->getMaxKnownRankSpellId(ARCANE_BLAST_1); - ARCANE_POWER = ai->getMaxKnownRankSpellId(ARCANE_POWER_1); - DAMPEN_MAGIC = ai->getMaxKnownRankSpellId(DAMPEN_MAGIC_1); - AMPLIFY_MAGIC = ai->getMaxKnownRankSpellId(AMPLIFY_MAGIC_1); - MAGE_ARMOR = ai->getMaxKnownRankSpellId(MAGE_ARMOR_1); - MIRROR_IMAGE = ai->getMaxKnownRankSpellId(MIRROR_IMAGE_1); - ARCANE_INTELLECT = ai->getMaxKnownRankSpellId(ARCANE_INTELLECT_1); - ARCANE_BRILLIANCE = ai->getMaxKnownRankSpellId(ARCANE_BRILLIANCE_1); - DALARAN_INTELLECT = ai->getMaxKnownRankSpellId(DALARAN_INTELLECT_1); - DALARAN_BRILLIANCE = ai->getMaxKnownRankSpellId(DALARAN_BRILLIANCE_1); - MANA_SHIELD = ai->getMaxKnownRankSpellId(MANA_SHIELD_1); - CONJURE_WATER = ai->getMaxKnownRankSpellId(CONJURE_WATER_1); - CONJURE_FOOD = ai->getMaxKnownRankSpellId(CONJURE_FOOD_1); - FIREBALL = ai->getMaxKnownRankSpellId(FIREBALL_1); - FIRE_BLAST = ai->getMaxKnownRankSpellId(FIRE_BLAST_1); - FLAMESTRIKE = ai->getMaxKnownRankSpellId(FLAMESTRIKE_1); - SCORCH = ai->getMaxKnownRankSpellId(SCORCH_1); - PYROBLAST = ai->getMaxKnownRankSpellId(PYROBLAST_1); - BLAST_WAVE = ai->getMaxKnownRankSpellId(BLAST_WAVE_1); - COMBUSTION = ai->getMaxKnownRankSpellId(COMBUSTION_1); - DRAGONS_BREATH = ai->getMaxKnownRankSpellId(DRAGONS_BREATH_1); - LIVING_BOMB = ai->getMaxKnownRankSpellId(LIVING_BOMB_1); - FROSTFIRE_BOLT = ai->getMaxKnownRankSpellId(FROSTFIRE_BOLT_1); - FIRE_WARD = ai->getMaxKnownRankSpellId(FIRE_WARD_1); - MOLTEN_ARMOR = ai->getMaxKnownRankSpellId(MOLTEN_ARMOR_1); - ICY_VEINS = ai->getMaxKnownRankSpellId(ICY_VEINS_1); - DEEP_FREEZE = ai->getMaxKnownRankSpellId(DEEP_FREEZE_1); - FROSTBOLT = ai->getMaxKnownRankSpellId(FROSTBOLT_1); - FROST_NOVA = ai->getMaxKnownRankSpellId(FROST_NOVA_1); - BLIZZARD = ai->getMaxKnownRankSpellId(BLIZZARD_1); - CONE_OF_COLD = ai->getMaxKnownRankSpellId(CONE_OF_COLD_1); - ICE_BARRIER = ai->getMaxKnownRankSpellId(ICE_BARRIER_1); - SUMMON_WATER_ELEMENTAL = ai->getMaxKnownRankSpellId(SUMMON_WATER_ELEMENTAL_1); - FROST_WARD = ai->getMaxKnownRankSpellId(FROST_WARD_1); - ICE_LANCE = ai->getMaxKnownRankSpellId(ICE_LANCE_1); - FROST_ARMOR = ai->getMaxKnownRankSpellId(FROST_ARMOR_1); - ICE_ARMOR = ai->getMaxKnownRankSpellId(ICE_ARMOR_1); - ICE_BLOCK = ai->getMaxKnownRankSpellId(ICE_BLOCK_1); - COLD_SNAP = ai->getMaxKnownRankSpellId(COLD_SNAP_1); + ARCANE_MISSILES = ai->initSpell(ARCANE_MISSILES_1); + ARCANE_EXPLOSION = ai->initSpell(ARCANE_EXPLOSION_1); + COUNTERSPELL = ai->initSpell(COUNTERSPELL_1); + SLOW = ai->initSpell(SLOW_1); + ARCANE_BARRAGE = ai->initSpell(ARCANE_BARRAGE_1); + ARCANE_BLAST = ai->initSpell(ARCANE_BLAST_1); + ARCANE_POWER = ai->initSpell(ARCANE_POWER_1); + DAMPEN_MAGIC = ai->initSpell(DAMPEN_MAGIC_1); + AMPLIFY_MAGIC = ai->initSpell(AMPLIFY_MAGIC_1); + MAGE_ARMOR = ai->initSpell(MAGE_ARMOR_1); + MIRROR_IMAGE = ai->initSpell(MIRROR_IMAGE_1); + ARCANE_INTELLECT = ai->initSpell(ARCANE_INTELLECT_1); + ARCANE_BRILLIANCE = ai->initSpell(ARCANE_BRILLIANCE_1); + DALARAN_INTELLECT = ai->initSpell(DALARAN_INTELLECT_1); + DALARAN_BRILLIANCE = ai->initSpell(DALARAN_BRILLIANCE_1); + MANA_SHIELD = ai->initSpell(MANA_SHIELD_1); + CONJURE_WATER = ai->initSpell(CONJURE_WATER_1); + CONJURE_FOOD = ai->initSpell(CONJURE_FOOD_1); + FIREBALL = ai->initSpell(FIREBALL_1); + FIRE_BLAST = ai->initSpell(FIRE_BLAST_1); + FLAMESTRIKE = ai->initSpell(FLAMESTRIKE_1); + SCORCH = ai->initSpell(SCORCH_1); + PYROBLAST = ai->initSpell(PYROBLAST_1); + BLAST_WAVE = ai->initSpell(BLAST_WAVE_1); + COMBUSTION = ai->initSpell(COMBUSTION_1); + DRAGONS_BREATH = ai->initSpell(DRAGONS_BREATH_1); + LIVING_BOMB = ai->initSpell(LIVING_BOMB_1); + FROSTFIRE_BOLT = ai->initSpell(FROSTFIRE_BOLT_1); + FIRE_WARD = ai->initSpell(FIRE_WARD_1); + MOLTEN_ARMOR = ai->initSpell(MOLTEN_ARMOR_1); + ICY_VEINS = ai->initSpell(ICY_VEINS_1); + DEEP_FREEZE = ai->initSpell(DEEP_FREEZE_1); + FROSTBOLT = ai->initSpell(FROSTBOLT_1); + FROST_NOVA = ai->initSpell(FROST_NOVA_1); + BLIZZARD = ai->initSpell(BLIZZARD_1); + CONE_OF_COLD = ai->initSpell(CONE_OF_COLD_1); + ICE_BARRIER = ai->initSpell(ICE_BARRIER_1); + SUMMON_WATER_ELEMENTAL = ai->initSpell(SUMMON_WATER_ELEMENTAL_1); + FROST_WARD = ai->initSpell(FROST_WARD_1); + ICE_LANCE = ai->initSpell(ICE_LANCE_1); + FROST_ARMOR = ai->initSpell(FROST_ARMOR_1); + ICE_ARMOR = ai->initSpell(ICE_ARMOR_1); + ICE_BLOCK = ai->initSpell(ICE_BLOCK_1); + COLD_SNAP = ai->initSpell(COLD_SNAP_1); RECENTLY_BANDAGED = 11196; // first aid check From 70ee59f72cf41fc287fd2ce78329b665020bc53a Mon Sep 17 00:00:00 2001 From: chelobaka Date: Thu, 5 Aug 2010 23:20:41 +0400 Subject: [PATCH 085/187] Remove dublicates from spellid enum --- src/game/playerbot/PlayerbotAI.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 22c37d0b1..6c3801f0a 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -67,7 +67,7 @@ enum RankOneSpellId MOLTEN_ARMOR_1 = 30482, PRESENCE_OF_MIND_1 = 12043, PYROBLAST_1 = 11366, - REMOVE_CURSE_1 = 475, + REMOVE_CURSE_MAGE_1 = 475, RITUAL_OF_REFRESHMENT_1 = 43987, SCORCH_1 = 2948, SLOW_1 = 31589, @@ -92,7 +92,7 @@ enum RankOneSpellId CURSE_OF_TONGUES_1 = 1714, CURSE_OF_WEAKNESS_1 = 702, DARK_PACT_1 = 18220, - DEATH_COIL_1 = 6789, + DEATH_COIL_WARLOCK_1 = 6789, DEMON_ARMOR_1 = 706, DEMON_CHARGE_1 = 54785, DEMON_SKIN_1 = 687, @@ -313,7 +313,7 @@ enum RankOneSpellId MOONFIRE_1 = 8921, MOONKIN_FORM_1 = 24858, NATURES_GRASP_1 = 16689, - NATURES_SWIFTNESS_1 = 17116, + NATURES_SWIFTNESS_DRUID_1 = 17116, NOURISH_1 = 50464, POUNCE_1 = 9005, PROWL_1 = 5215, @@ -322,7 +322,7 @@ enum RankOneSpellId REBIRTH_1 = 20484, REGROWTH_1 = 8936, REJUVENATION_1 = 774, - REMOVE_CURSE_1 = 2782, + REMOVE_CURSE_DRUID_1 = 2782, REVIVE_1 = 50769, RIP_1 = 1079, SAVAGE_ROAR_1 = 52610, @@ -429,7 +429,7 @@ enum RankOneSpellId DANCING_RUNE_WEAPON_1 = 49028, DARK_COMMAND_1 = 56222, DEATH_AND_DECAY_1 = 43265, - DEATH_COIL_1 = 47541, + DEATH_COIL_DEATH_KNIGHT_1 = 47541, DEATH_GRIP_1 = 49576, DEATH_PACT_1 = 48743, DEATH_STRIKE_1 = 49998, @@ -552,7 +552,7 @@ enum RankOneSpellId MANA_SPRING_TOTEM_1 = 5675, MANA_TIDE_TOTEM_1 = 16190, NATURE_RESISTANCE_TOTEM_1 = 10595, - NATURES_SWIFTNESS_1 = 16188, + NATURES_SWIFTNESS_SHAMAN_1 = 16188, PURGE_1 = 370, RIPTIDE_1 = 61295, ROCKBITER_WEAPON_1 = 8017, From c18e87280cd3414df10c9ce5577c636aaf8c9303 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Thu, 5 Aug 2010 23:23:53 +0400 Subject: [PATCH 086/187] Make spell casting a bit more verbose on errors --- src/game/playerbot/PlayerbotAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 6b79dbc49..c765ea9d8 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2255,7 +2255,7 @@ bool PlayerbotAI::CastSpell(uint32 spellId) const SpellEntry* const pSpellInfo = sSpellStore.LookupEntry(spellId); if (!pSpellInfo) { - TellMaster("missing spell entry in CastSpell."); + TellMaster("missing spell entry in CastSpell for spellid %u.", spellId); return false; } From b16c9ebf8fa015d8ff235a1a4c465f359e3b5446 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Thu, 5 Aug 2010 23:27:38 +0400 Subject: [PATCH 087/187] Update warlock AI to use spellInit --- src/game/playerbot/PlayerbotWarlockAI.cpp | 100 ++++++++++------------ src/game/playerbot/PlayerbotWarlockAI.h | 2 +- 2 files changed, 47 insertions(+), 55 deletions(-) diff --git a/src/game/playerbot/PlayerbotWarlockAI.cpp b/src/game/playerbot/PlayerbotWarlockAI.cpp index d230735a8..31fc19a54 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.cpp +++ b/src/game/playerbot/PlayerbotWarlockAI.cpp @@ -5,58 +5,57 @@ class PlayerbotAI; PlayerbotWarlockAI::PlayerbotWarlockAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) { // DESTRUCTION - SHADOW_BOLT = ai->getSpellId("shadow bolt"); - IMMOLATE = ai->getSpellId("immolate"); - INCINERATE = ai->getSpellId("incinerate"); - SEARING_PAIN = ai->getSpellId("searing pain"); - CONFLAGRATE = ai->getSpellId("conflagrate"); - SHADOWFURY = ai->getSpellId("shadowfury"); - CHAOS_BOLT = ai->getSpellId("chaos bolt"); - SHADOWFLAME = ai->getSpellId("shadowflame"); - HELLFIRE = ai->getSpellId("hellfire"); - RAIN_OF_FIRE = ai->getSpellId("rain of fire"); - SOUL_FIRE = ai->getSpellId("soul fire"); // soul shard spells - SHADOWBURN = ai->getSpellId("shadowburn"); + SHADOW_BOLT = ai->initSpell(SHADOW_BOLT_1); + IMMOLATE = ai->initSpell(IMMOLATE_1); + INCINERATE = ai->initSpell(INCINERATE_1); + SEARING_PAIN = ai->initSpell(SEARING_PAIN_1); + CONFLAGRATE = ai->initSpell(CONFLAGRATE_1); + SHADOWFURY = ai->initSpell(SHADOWFURY_1); + CHAOS_BOLT = ai->initSpell(CHAOS_BOLT_1); + SHADOWFLAME = ai->initSpell(SHADOWFLAME_1); + HELLFIRE = ai->initSpell(HELLFIRE_1); + RAIN_OF_FIRE = ai->initSpell(RAIN_OF_FIRE_1); + SOUL_FIRE = ai->initSpell(SOUL_FIRE_1); // soul shard spells + SHADOWBURN = ai->initSpell(SHADOWBURN_1); // CURSE - CURSE_OF_WEAKNESS = ai->getSpellId("curse of weakness"); - CURSE_OF_THE_ELEMENTS = ai->getSpellId("curse of the elements"); - CURSE_OF_AGONY = ai->getSpellId("curse of agony"); - CURSE_OF_EXHAUSTION = ai->getSpellId("curse of exhaustion"); - CURSE_OF_TONGUES = ai->getSpellId("curse of tongues"); - CURSE_OF_DOOM = ai->getSpellId("curse of doom"); + CURSE_OF_WEAKNESS = ai->initSpell(CURSE_OF_WEAKNESS_1); + CURSE_OF_THE_ELEMENTS = ai->initSpell(CURSE_OF_THE_ELEMENTS_1); + CURSE_OF_AGONY = ai->initSpell(CURSE_OF_AGONY_1); + CURSE_OF_EXHAUSTION = ai->initSpell(CURSE_OF_EXHAUSTION_1); + CURSE_OF_TONGUES = ai->initSpell(CURSE_OF_TONGUES_1); + CURSE_OF_DOOM = ai->initSpell(CURSE_OF_DOOM_1); // AFFLICTION - CORRUPTION = ai->getSpellId("corruption"); - DRAIN_SOUL = ai->getSpellId("drain soul"); - DRAIN_LIFE = ai->getSpellId("drain life"); - DRAIN_MANA = ai->getSpellId("drain mana"); - LIFE_TAP = ai->getSpellId("life tap"); - UNSTABLE_AFFLICTION = ai->getSpellId("unstable affliction"); - HAUNT = ai->getSpellId("haunt"); - ATROCITY = ai->getSpellId("atrocity"); - SEED_OF_CORRUPTION = ai->getSpellId("seed of corruption"); - DARK_PACT = ai->getSpellId("dark pact"); - HOWL_OF_TERROR = ai->getSpellId("howl of terror"); - FEAR = ai->getSpellId("fear"); + CORRUPTION = ai->initSpell(CORRUPTION_1); + DRAIN_SOUL = ai->initSpell(DRAIN_SOUL_1); + DRAIN_LIFE = ai->initSpell(DRAIN_LIFE_1); + DRAIN_MANA = ai->initSpell(DRAIN_MANA_1); + LIFE_TAP = ai->initSpell(LIFE_TAP_1); + UNSTABLE_AFFLICTION = ai->initSpell(UNSTABLE_AFFLICTION_1); + HAUNT = ai->initSpell(HAUNT_1); + SEED_OF_CORRUPTION = ai->initSpell(SEED_OF_CORRUPTION_1); + DARK_PACT = ai->initSpell(DARK_PACT_1); + HOWL_OF_TERROR = ai->initSpell(HOWL_OF_TERROR_1); + FEAR = ai->initSpell(FEAR_1); // DEMONOLOGY - DEMON_SKIN = ai->getSpellId("demon skin"); - DEMON_ARMOR = ai->getSpellId("demon armor"); - FEL_ARMOR = ai->getSpellId("fel armor"); - SHADOW_WARD = ai->getSpellId("shadow ward"); - SOULSHATTER = ai->getSpellId("soulshatter"); - SOUL_LINK = ai->getSpellId("soul link"); + DEMON_SKIN = ai->initSpell(DEMON_SKIN_1); + DEMON_ARMOR = ai->initSpell(DEMON_ARMOR_1); + FEL_ARMOR = ai->initSpell(FEL_ARMOR_1); + SHADOW_WARD = ai->initSpell(SHADOW_WARD_1); + SOULSHATTER = ai->initSpell(SOULSHATTER_1); + SOUL_LINK = ai->initSpell(SOUL_LINK_1); SOUL_LINK_AURA = 25228; // dummy aura applied, after spell SOUL_LINK - HEALTH_FUNNEL = ai->getSpellId("health funnel"); - DETECT_INVISIBILITY = ai->getSpellId("detect invisibility"); + HEALTH_FUNNEL = ai->initSpell(HEALTH_FUNNEL_1); + DETECT_INVISIBILITY = ai->initSpell(DETECT_INVISIBILITY_1); // demon summon - SUMMON_IMP = ai->getSpellId("summon imp"); - SUMMON_VOIDWALKER = ai->getSpellId("summon voidwalker"); - SUMMON_SUCCUBUS = ai->getSpellId("summon succubus"); - SUMMON_FELHUNTER = ai->getSpellId("summon felhunter"); - SUMMON_FELGUARD = ai->getSpellId("summon felguard"); - // demon skills - BLOOD_PACT = ai->getSpellId("blood pact"); // imp skill - CONSUME_SHADOWS = ai->getSpellId("consume shadows"); // voidwalker skill - FEL_INTELLIGENCE = ai->getSpellId("fel intelligence"); // felhunter skill + SUMMON_IMP = ai->initSpell(SUMMON_IMP_1); + SUMMON_VOIDWALKER = ai->initSpell(SUMMON_VOIDWALKER_1); + SUMMON_SUCCUBUS = ai->initSpell(SUMMON_SUCCUBUS_1); + SUMMON_FELHUNTER = ai->initSpell(SUMMON_FELHUNTER_1); + SUMMON_FELGUARD = ai->initSpell(SUMMON_FELGUARD_1); + // demon skills should be initialized on demons + BLOOD_PACT = 0; //ai->getSpellId("blood pact"); // imp skill + CONSUME_SHADOWS = 0; //ai->getSpellId("consume shadows"); // voidwalker skill + FEL_INTELLIGENCE = 0; //ai->getSpellId("fel intelligence"); // felhunter skill RECENTLY_BANDAGED = 11196; // first aid check @@ -193,13 +192,6 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) LastSpellAffliction = LastSpellAffliction +1; break; } - else if (ATROCITY > 0 && !pTarget->HasAura(ATROCITY, EFFECT_INDEX_0) && LastSpellAffliction < 8 && ai->GetManaPercent() >= 21) - { - ai->CastSpell(ATROCITY, *pTarget); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } else if (SEED_OF_CORRUPTION > 0 && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && LastSpellAffliction < 9 && ai->GetManaPercent() >= 34) { ai->CastSpell(SEED_OF_CORRUPTION, *pTarget); diff --git a/src/game/playerbot/PlayerbotWarlockAI.h b/src/game/playerbot/PlayerbotWarlockAI.h index 999224c44..e3a4c5dcb 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.h +++ b/src/game/playerbot/PlayerbotWarlockAI.h @@ -35,7 +35,7 @@ class MANGOS_DLL_SPEC PlayerbotWarlockAI : PlayerbotClassAI uint32 CURSE_OF_WEAKNESS, CURSE_OF_AGONY, CURSE_OF_EXHAUSTION, CURSE_OF_TONGUES, CURSE_OF_THE_ELEMENTS, CURSE_OF_DOOM; // AFFLICTION - uint32 CORRUPTION, DRAIN_SOUL, DRAIN_LIFE, DRAIN_MANA, LIFE_TAP, UNSTABLE_AFFLICTION, HAUNT, ATROCITY, SEED_OF_CORRUPTION, DARK_PACT, HOWL_OF_TERROR, FEAR; + uint32 CORRUPTION, DRAIN_SOUL, DRAIN_LIFE, DRAIN_MANA, LIFE_TAP, UNSTABLE_AFFLICTION, HAUNT, SEED_OF_CORRUPTION, DARK_PACT, HOWL_OF_TERROR, FEAR; // DESTRUCTION uint32 SHADOW_BOLT, IMMOLATE, INCINERATE, SEARING_PAIN, CONFLAGRATE, SOUL_FIRE, SHADOWFURY, CHAOS_BOLT, SHADOWFLAME, HELLFIRE, RAIN_OF_FIRE, SHADOWBURN; From 3fa69190d4e5663b7f6b42dcc7bb713a7a93b40e Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 6 Aug 2010 09:39:12 +0400 Subject: [PATCH 088/187] Add racial traits spellids --- src/game/playerbot/PlayerbotAI.h | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 6c3801f0a..73f85be90 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -627,7 +627,28 @@ enum RankOneSpellId THUNDER_CLAP_1 = 6343, VICTORY_RUSH_1 = 34428, VIGILANCE_1 = 50720, - WHIRLWIND_1 = 1680 + WHIRLWIND_1 = 1680, + + //Racial Traits + ARCANE_TORRENT_MANA_CLASSES = 28730, + ARCANE_TORRENT_DEATH_KNIGHT = 50613, + ARCANE_TORRENT_ROGUE = 25046, + BLOOD_FURY_MELEE_CLASSES = 20572, + BLOOD_FURY_WARLOCK = 33702, + BLOOD_FURY_SHAMAN = 33697, + ESCAPE_ARTIST_ALL = 20589, + EVERY_MAN_FOR_HIMSELF_ALL = 59752, + GIFT_OF_THE_NAARU_DEATH_KNIGHT = 59545, + GIFT_OF_THE_NAARU_HUNTER = 59543, + GIFT_OF_THE_NAARU_MAGE = 59548, + GIFT_OF_THE_NAARU_PALADIN = 59542, + GIFT_OF_THE_NAARU_PRIEST = 59544, + GIFT_OF_THE_NAARU_SHAMAN = 59547, + GIFT_OF_THE_NAARU_WARRIOR = 28880, + STONEFORM_ALL = 20594, + WAR_STOMP_ALL = 20549, + WILL_OF_THE_FORSAKEN_ALL = 7744 + }; class MANGOS_DLL_SPEC PlayerbotAI From 769a0bef5a749412716f4dd596292eb896e07062 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 6 Aug 2010 10:18:38 +0400 Subject: [PATCH 089/187] Move spellid enum to class AI headers --- src/game/playerbot/PlayerbotAI.h | 615 +------------------- src/game/playerbot/PlayerbotDeathKnightAI.h | 49 ++ src/game/playerbot/PlayerbotDruidAI.h | 78 +++ src/game/playerbot/PlayerbotHunterAI.h | 72 +++ src/game/playerbot/PlayerbotMageAI.h | 58 ++ src/game/playerbot/PlayerbotPaladinAI.h | 67 +++ src/game/playerbot/PlayerbotPriestAI.h | 60 ++ src/game/playerbot/PlayerbotRogueAI.h | 46 ++ src/game/playerbot/PlayerbotShamanAI.h | 69 +++ src/game/playerbot/PlayerbotWarlockAI.h | 69 +++ src/game/playerbot/PlayerbotWarriorAI.h | 54 ++ 11 files changed, 623 insertions(+), 614 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 73f85be90..d9d805457 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -16,620 +16,8 @@ class PlayerbotMgr; #define BOTLOOT_DISTANCE 25.0f -enum RankOneSpellId +enum RacialTraits { - // Mage spells and talents - AMPLIFY_MAGIC_1 = 1008, - ARCANE_BARRAGE_1 = 44425, - ARCANE_BLAST_1 = 30451, - ARCANE_BRILLIANCE_1 = 23028, - ARCANE_EXPLOSION_1 = 1449, - ARCANE_INTELLECT_1 = 1459, - ARCANE_MISSILES_1 = 5143, - ARCANE_POWER_1 = 12042, - BLAST_WAVE_1 = 11113, - BLINK_1 = 1953, - BLIZZARD_1 = 10, - COLD_SNAP_1 = 11958, - COMBUSTION_1 = 11129, - CONE_OF_COLD_1 = 120, - CONJURE_FOOD_1 = 587, - CONJURE_MANA_GEM_1 = 759, - CONJURE_REFRESHMENT_1 = 42955, - CONJURE_WATER_1 = 5504, - COUNTERSPELL_1 = 2139, - DALARAN_BRILLIANCE_1 = 61316, - DALARAN_INTELLECT_1 = 61024, - DAMPEN_MAGIC_1 = 604, - DEEP_FREEZE_1 = 44572, - DRAGONS_BREATH_1 = 31661, - EVOCATION_1 = 12051, - FIRE_BLAST_1 = 2136, - FIRE_WARD_1 = 543, - FIREBALL_1 = 133, - FLAMESTRIKE_1 = 2120, - FOCUS_MAGIC_1 = 54646, - FROST_ARMOR_1 = 168, - FROST_NOVA_1 = 122, - FROST_WARD_1 = 6143, - FROSTBOLT_1 = 116, - FROSTFIRE_BOLT_1 = 44614, - ICE_ARMOR_1 = 7302, - ICE_BARRIER_1 = 11426, - ICE_BLOCK_1 = 45438, - ICE_LANCE_1 = 30455, - ICY_VEINS_1 = 12472, - INVISIBILITY_1 = 66, - LIVING_BOMB_1 = 44457, - MAGE_ARMOR_1 = 6117, - MANA_SHIELD_1 = 1463, - MIRROR_IMAGE_1 = 55342, - MOLTEN_ARMOR_1 = 30482, - PRESENCE_OF_MIND_1 = 12043, - PYROBLAST_1 = 11366, - REMOVE_CURSE_MAGE_1 = 475, - RITUAL_OF_REFRESHMENT_1 = 43987, - SCORCH_1 = 2948, - SLOW_1 = 31589, - SLOW_FALL_1 = 130, - SPELLSTEAL_1 = 30449, - SUMMON_WATER_ELEMENTAL_1 = 31687, - - // Warlock - BANISH_1 = 710, - CHALLENGING_HOWL_1 = 59671, - CHAOS_BOLT_1 = 50796, - CONFLAGRATE_1 = 17962, - CORRUPTION_1 = 172, - CREATE_FIRESTONE_1 = 6366, - CREATE_HEALTHSTONE_1 = 6201, - CREATE_SOULSTONE_1 = 693, - CREATE_SPELLSTONE_1 = 2362, - CURSE_OF_AGONY_1 = 980, - CURSE_OF_DOOM_1 = 603, - CURSE_OF_EXHAUSTION_1 = 18223, - CURSE_OF_THE_ELEMENTS_1 = 1490, - CURSE_OF_TONGUES_1 = 1714, - CURSE_OF_WEAKNESS_1 = 702, - DARK_PACT_1 = 18220, - DEATH_COIL_WARLOCK_1 = 6789, - DEMON_ARMOR_1 = 706, - DEMON_CHARGE_1 = 54785, - DEMON_SKIN_1 = 687, - DEMONIC_CIRCLE_SUMMON_1 = 48018, - DEMONIC_CIRCLE_TELEPORT_1 = 48020, - DEMONIC_EMPOWERMENT_1 = 47193, - DEMONIC_IMMOLATE_1 = 75445, - DETECT_INVISIBILITY_1 = 132, - DRAIN_LIFE_1 = 689, - DRAIN_MANA_1 = 5138, - DRAIN_SOUL_1 = 1120, - ENSLAVE_DEMON_1 = 1098, - EYE_OF_KILROGG_1 = 126, - FEAR_1 = 5782, - FEL_ARMOR_1 = 28176, - FEL_DOMINATION_1 = 18708, - HAUNT_1 = 48181, - HEALTH_FUNNEL_1 = 755, - HELLFIRE_1 = 1949, - HOWL_OF_TERROR_1 = 5484, - IMMOLATE_1 = 348, - IMMOLATION_AURA_1 = 50589, - INCINERATE_1 = 29722, - INFERNO_1 = 1122, - LIFE_TAP_1 = 1454, - METAMORPHOSIS_1 = 59672, - RAIN_OF_FIRE_1 = 5740, - RITUAL_OF_DOOM_1 = 18540, - RITUAL_OF_SOULS_1 = 29893, - RITUAL_OF_SUMMONING_1 = 698, - SEARING_PAIN_1 = 5676, - SEED_OF_CORRUPTION_1 = 27243, - SENSE_DEMONS_1 = 5500, - SHADOW_BOLT_1 = 686, - SHADOW_CLEAVE_1 = 50581, - SHADOW_WARD_1 = 6229, - SHADOWBURN_1 = 17877, - SHADOWFLAME_1 = 47897, - SHADOWFURY_1 = 30283, - SOUL_FIRE_1 = 6353, - SOUL_LINK_1 = 19028, - SOULSHATTER_1 = 29858, - SUMMON_FELGUARD_1 = 30146, - SUMMON_FELHUNTER_1 = 691, - SUMMON_IMP_1 = 688, - SUMMON_SUCCUBUS_1 = 712, - SUMMON_VOIDWALKER_1 = 697, - UNENDING_BREATH_1 = 5697, - UNSTABLE_AFFLICTION_1 = 30108, - - //Paladin - AURA_MASTERY_1 = 31821, - AVENGERS_SHIELD_1 = 31935, - AVENGING_WRATH_1 = 31884, - BEACON_OF_LIGHT_1 = 53563, - BLESSING_OF_KINGS_1 = 20217, - BLESSING_OF_MIGHT_1 = 19740, - BLESSING_OF_SANCTUARY_1 = 20911, - BLESSING_OF_WISDOM_1 = 19742, - CLEANSE_1 = 4987, - CONCENTRATION_AURA_1 = 19746, - CONSECRATION_1 = 26573, - CRUSADER_AURA_1 = 32223, - CRUSADER_STRIKE_1 = 35395, - DEVOTION_AURA_1 = 465, - DIVINE_FAVOR_1 = 20216, - DIVINE_ILLUMINATION_1 = 31842, - DIVINE_INTERVENTION_1 = 19752, - DIVINE_PLEA_1 = 54428, - DIVINE_PROTECTION_1 = 498, - DIVINE_SACRIFICE_1 = 64205, - DIVINE_SHIELD_1 = 642, - DIVINE_STORM_1 = 53385, - EXORCISM_1 = 879, - FIRE_RESISTANCE_AURA_1 = 19891, - FLASH_OF_LIGHT_1 = 19750, - FROST_RESISTANCE_AURA_1 = 19888, - GREATER_BLESSING_OF_KINGS_1 = 25898, - GREATER_BLESSING_OF_MIGHT_1 = 25782, - GREATER_BLESSING_OF_SANCTUARY_1 = 25899, - GREATER_BLESSING_OF_WISDOM_1 = 25894, - HAMMER_OF_JUSTICE_1 = 853, - HAMMER_OF_THE_RIGHTEOUS_1 = 53595, - HAMMER_OF_WRATH_1 = 24275, - HAND_OF_FREEDOM_1 = 1044, - HAND_OF_PROTECTION_1 = 1022, - HAND_OF_RECKONING_1 = 62124, - HAND_OF_SACRIFICE_1 = 6940, - HAND_OF_SALVATION_1 = 1038, - HOLY_LIGHT_1 = 635, - HOLY_SHIELD_1 = 20925, - HOLY_SHOCK_1 = 20473, - HOLY_WRATH_1 = 2812, - JUDGEMENT_OF_JUSTICE_1 = 53407, - JUDGEMENT_OF_LIGHT_1 = 20271, - JUDGEMENT_OF_WISDOM_1 = 53408, - LAY_ON_HANDS_1 = 633, - PURIFY_1 = 1152, - REDEMPTION_1 = 7328, - REPENTANCE_1 = 20066, - RETRIBUTION_AURA_1 = 7294, - RIGHTEOUS_DEFENSE_1 = 31789, - RIGHTEOUS_FURY_1 = 25780, - SACRED_SHIELD_1 = 53601, - SEAL_OF_COMMAND_1 = 20375, - SEAL_OF_CORRUPTION = 53736, - SEAL_OF_JUSTICE_1 = 20164, - SEAL_OF_LIGHT_1 = 20165, - SEAL_OF_RIGHTEOUSNESS_1 = 20154, - SEAL_OF_VENGEANCE = 31801, - SEAL_OF_WISDOM_1 = 20166, - SENSE_UNDEAD_1 = 5502, - SHADOW_RESISTANCE_AURA_1 = 19876, - SHIELD_OF_RIGHTEOUSNESS_1 = 53600, - TURN_EVIL_1 = 10326, - - //Priest - ABOLISH_DISEASE_1 = 552, - BINDING_HEAL_1 = 32546, - BLESSED_HEALING_1 = 70772, - CIRCLE_OF_HEALING_1 = 34861, - CURE_DISEASE_1 = 528, - DESPERATE_PRAYER_1 = 19236, - DEVOURING_PLAGUE_1 = 2944, - DISPEL_MAGIC_1 = 527, - DISPERSION_1 = 47585, - DIVINE_HYMN_1 = 64843, - DIVINE_SPIRIT_1 = 14752, - FADE_1 = 586, - FEAR_WARD_1 = 6346, - FLASH_HEAL_1 = 2061, - GREATER_HEAL_1 = 2060, - GUARDIAN_SPIRIT_1 = 47788, - HEAL_1 = 2054, - HOLY_FIRE_1 = 14914, - HOLY_NOVA_1 = 15237, - HYMN_OF_HOPE_1 = 64901, - INNER_FIRE_1 = 588, - INNER_FOCUS_1 = 14751, - LESSER_HEAL_1 = 2050, - LEVITATE_1 = 1706, - LIGHTWELL_1 = 724, - MANA_BURN_1 = 8129, - MASS_DISPEL_1 = 32375, - MIND_BLAST_1 = 8092, - MIND_CONTROL_1 = 605, - MIND_FLAY_1 = 15407, - MIND_SEAR_1 = 48045, - MIND_SOOTHE_1 = 453, - MIND_VISION_1 = 2096, - PAIN_SUPPRESSION_1 = 33206, - PENANCE_1 = 47540, - POWER_INFUSION_1 = 10060, - POWER_WORD_FORTITUDE_1 = 1243, - POWER_WORD_SHIELD_1 = 17, - PRAYER_OF_FORTITUDE_1 = 21562, - PRAYER_OF_HEALING_1 = 596, - PRAYER_OF_MENDING_1 = 33076, - PRAYER_OF_SHADOW_PROTECTION_1 = 27683, - PRAYER_OF_SPIRIT_1 = 27681, - PSYCHIC_HORROR_1 = 64044, - PSYCHIC_SCREAM_1 = 8122, - RENEW_1 = 139, - RESURRECTION_1 = 2006, - SHACKLE_UNDEAD_1 = 9484, - SHADOW_PROTECTION_1 = 976, - SHADOW_WORD_DEATH_1 = 32379, - SHADOW_WORD_PAIN_1 = 589, - SHADOWFIEND_1 = 34433, - SHADOWFORM_1 = 15473, - SILENCE_1 = 15487, - SMITE_1 = 585, - VAMPIRIC_EMBRACE_1 = 15286, - VAMPIRIC_TOUCH_1 = 34914, - - //Druid - ABOLISH_POISON_1 = 2893, - AQUATIC_FORM_1 = 1066, - BARKSKIN_1 = 22812, - BASH_1 = 5211, - BEAR_FORM_1 = 5487, - BERSERK_1 = 50334, - CAT_FORM_1 = 768, - CHALLENGING_ROAR_1 = 5209, - CLAW_1 = 1082, - COWER_1 = 8998, - CURE_POISON_1 = 8946, - CYCLONE_1 = 33786, - DASH_1 = 1850, - DEMORALIZING_ROAR_1 = 99, - DIRE_BEAR_FORM_1 = 9634, - ENRAGE_1 = 5229, - ENTANGLING_ROOTS_1 = 339, - FAERIE_FIRE_1 = 770, - FAERIE_FIRE_FERAL_1 = 16857, - FERAL_CHARGE_1 = 49377, - FERAL_CHARGE_BEAR_1 = 16979, - FERAL_CHARGE_CAT_1 = 49376, - FEROCIOUS_BITE_1 = 22568, - FLIGHT_FORM_1 = 33943, - FORCE_OF_NATURE_1 = 33831, - FRENZIED_REGENERATION_1 = 22842, - GIFT_OF_THE_WILD_1 = 21849, - GROWL_1 = 6795, - HEALING_TOUCH_1 = 5185, - HIBERNATE_1 = 2637, - HURRICANE_1 = 16914, - INNERVATE_1 = 29166, - INSECT_SWARM_1 = 5570, - LACERATE_1 = 33745, - LIFEBLOOM_1 = 33763, - MAIM_1 = 22570, - MANGLE_1 = 33917, - MANGLE_BEAR_1 = 33878, - MANGLE_CAT_1 = 33876, - MARK_OF_THE_WILD_1 = 1126, - MAUL_1 = 6807, - MOONFIRE_1 = 8921, - MOONKIN_FORM_1 = 24858, - NATURES_GRASP_1 = 16689, - NATURES_SWIFTNESS_DRUID_1 = 17116, - NOURISH_1 = 50464, - POUNCE_1 = 9005, - PROWL_1 = 5215, - RAKE_1 = 1822, - RAVAGE_1 = 6785, - REBIRTH_1 = 20484, - REGROWTH_1 = 8936, - REJUVENATION_1 = 774, - REMOVE_CURSE_DRUID_1 = 2782, - REVIVE_1 = 50769, - RIP_1 = 1079, - SAVAGE_ROAR_1 = 52610, - SHRED_1 = 5221, - SOOTHE_ANIMAL_1 = 2908, - STARFALL_1 = 48505, - STARFIRE_1 = 2912, - SURVIVAL_INSTINCTS_1 = 61336, - SWIFTMEND_1 = 18562, - SWIFT_FLIGHT_FORM_1 = 40120, - SWIPE_BEAR_1 = 779, - SWIPE_CAT_1 = 62078, - THORNS_1 = 467, - TIGERS_FURY_1 = 5217, - TRANQUILITY_1 = 740, - TRAVEL_FORM_1 = 783, - TREE_OF_LIFE_1 = 33891, - TYPHOON_1 = 50516, - WILD_GROWTH_1 = 48438, - WRATH_1 = 5176, - - //Hunter - ARCANE_SHOT_1 = 3044, - ASPECT_OF_THE_BEAST_1 = 13161, - ASPECT_OF_THE_CHEETAH_1 = 5118, - ASPECT_OF_THE_DRAGONHAWK_1 = 61846, - ASPECT_OF_THE_HAWK_1 = 13165, - ASPECT_OF_THE_MONKEY_1 = 13163, - ASPECT_OF_THE_PACK_1 = 13159, - ASPECT_OF_THE_VIPER_1 = 34074, - ASPECT_OF_THE_WILD_1 = 20043, - AUTO_SHOT_1 = 75, - BEAST_LORE_1 = 1462, - CALL_PET_1 = 883, - CALL_STABLED_PET_1 = 62757, - CONCUSSIVE_SHOT_1 = 5116, - DETERRENCE_1 = 19263, - DISENGAGE_1 = 781, - DISMISS_PET_1 = 2641, - DISTRACTING_SHOT_1 = 20736, - EAGLE_EYE_1 = 6197, - EXPLOSIVE_TRAP_1 = 13813, - EYES_OF_THE_BEAST_1 = 1002, - FEED_PET_1 = 6991, - FEIGN_DEATH_1 = 5384, - FLARE_1 = 1543, - FREEZING_ARROW_1 = 60192, - FREEZING_TRAP_1 = 1499, - FROST_TRAP_1 = 13809, - HUNTERS_MARK_1 = 1130, - IMMOLATION_TRAP_1 = 13795, - KILL_COMMAND_1 = 34026, - KILL_SHOT_1 = 53351, - MASTERS_CALL_1 = 53271, - MEND_PET_1 = 136, - MISDIRECTION_1 = 34477, - MONGOOSE_BITE_1 = 1495, - MULTISHOT_1 = 2643, - RAPID_FIRE_1 = 3045, - RAPTOR_STRIKE_1 = 2973, - REVIVE_PET_1 = 982, - SCARE_BEAST_1 = 1513, - SCORPID_STING_1 = 3043, - SERPENT_STING_1 = 1978, - SNAKE_TRAP_1 = 34600, - STEADY_SHOT_1 = 56641, - TAME_BEAST_1 = 1515, - TRACK_BEASTS_1 = 1494, - TRACK_DEMONS_1 = 19878, - TRACK_DRAGONKIN_1 = 19879, - TRACK_ELEMENTALS_1 = 19880, - TRACK_GIANTS_1 = 19882, - TRACK_HIDDEN_1 = 19885, - TRACK_HUMANOIDS_1 = 19883, - TRACK_UNDEAD_1 = 19884, - TRANQUILIZING_SHOT_1 = 19801, - VIPER_STING_1 = 3034, - VOLLEY_1 = 1510, - WING_CLIP_1 = 2974, - AIMED_SHOT_1 = 19434, - BESTIAL_WRATH_1 = 19574, - BLACK_ARROW_1 = 3674, - CHIMERA_SHOT_1 = 53209, - COUNTERATTACK_1 = 19306, - EXPLOSIVE_SHOT_1 = 53301, - INTIMIDATION_1 = 19577, - READINESS_1 = 23989, - SCATTER_SHOT_1 = 19503, - SILENCING_SHOT_1 = 34490, - TRUESHOT_AURA_1 = 19506, - WYVERN_STING_1 = 19386, - - //Death Knight - ANTIMAGIC_SHELL_1 = 48707, - ANTIMAGIC_ZONE_1 = 51052, - ARMY_OF_THE_DEAD_1 = 42650, - BLOOD_BOIL_1 = 48721, - BLOOD_PRESENCE_1 = 48266, - BLOOD_STRIKE_1 = 45902, - BLOOD_TAP_1 = 45529, - BONE_SHIELD_1 = 49222, - CHAINS_OF_ICE_1 = 45524, - CORPSE_EXPLOSION_1 = 49158, - DANCING_RUNE_WEAPON_1 = 49028, - DARK_COMMAND_1 = 56222, - DEATH_AND_DECAY_1 = 43265, - DEATH_COIL_DEATH_KNIGHT_1 = 47541, - DEATH_GRIP_1 = 49576, - DEATH_PACT_1 = 48743, - DEATH_STRIKE_1 = 49998, - DEATHCHILL_1 = 49796, - EMPOWER_RUNE_WEAPON_1 = 47568, - FROST_PRESENCE_1 = 48263, - FROST_STRIKE_1 = 49143, - GHOUL_FRENZY_1 = 63560, - HEART_STRIKE_1 = 55050, - HORN_OF_WINTER_1 = 57330, - HOWLING_BLAST_1 = 49184, - HUNGERING_COLD_1 = 49203, - HYSTERIA_1 = 49016, - ICEBOUND_FORTITUDE_1 = 48792, - ICY_TOUCH_1 = 45477, - LICHBORNE_1 = 49039, - MARK_OF_BLOOD_1 = 49005, - MIND_FREEZE_1 = 47528, - OBLITERATE_1 = 49020, - PATH_OF_FROST_1 = 3714, - PESTILENCE_1 = 50842, - PLAGUE_STRIKE_1 = 45462, - RAISE_ALLY_1 = 61999, - RAISE_DEAD_1 = 46584, - RUNE_STRIKE_1 = 56815, - RUNE_TAP_1 = 48982, - SCOURGE_STRIKE_1 = 55090, - STRANGULATE_1 = 47476, - SUMMON_GARGOYLE_1 = 49206, - UNBREAKABLE_ARMOR_1 = 51271, - UNHOLY_PRESENCE_1 = 48265, - VAMPIRIC_BLOOD_1 = 55233, - - //Rogue - ADRENALINE_RUSH_1 = 13750, - AMBUSH_1 = 8676, - BACKSTAB_1 = 53, - BLADE_FLURRY_1 = 13877, - BLIND_1 = 2094, - CHEAP_SHOT_1 = 1833, - CLOAK_OF_SHADOWS_1 = 31224, - COLD_BLOOD_1 = 14177, - DEADLY_THROW_1 = 26679, - DISARM_TRAP_1 = 1842, - DISMANTLE_1 = 51722, - DISTRACT_1 = 1725, - ENVENOM_1 = 32645, - EVASION_1 = 5277, - EVISCERATE_1 = 2098, - EXPOSE_ARMOR_1 = 8647, - FAN_OF_KNIVES_1 = 51723, - FEINT_1 = 1966, - GARROTE_1 = 703, - GHOSTLY_STRIKE_1 = 14278, - GOUGE_1 = 1776, - HEMORRHAGE_1 = 16511, - HUNGER_FOR_BLOOD_1 = 51662, - KICK_1 = 1766, - KIDNEY_SHOT_1 = 408, - KILLING_SPREE_1 = 51690, - MUTILATE_1 = 1329, - PICK_LOCK_1 = 1804, - PICK_POCKET_1 = 921, - PREMEDITATION_1 = 14183, - PREPARATION_1 = 14185, - RIPOSTE_1 = 14251, - RUPTURE_1 = 1943, - SAP_1 = 6770, - SHADOW_DANCE_1 = 51713, - SHADOWSTEP_1 = 36554, - SHIV_1 = 5938, - SINISTER_STRIKE_1 = 1752, - SLICE_AND_DICE_1 = 5171, - SPRINT_1 = 2983, - STEALTH_1 = 1784, - TRICKS_OF_THE_TRADE_1 = 57934, - VANISH_1 = 1856, - - //Shaman - ANCESTRAL_SPIRIT_1 = 2008, - ASTRAL_RECALL_1 = 556, - BLOODLUST_1 = 2825, - CALL_OF_THE_ANCESTORS_1 = 66843, - CALL_OF_THE_ELEMENTS_1 = 66842, - CALL_OF_THE_SPIRITS_1 = 66844, - CHAIN_HEAL_1 = 1064, - CHAIN_LIGHTNING_1 = 421, - CHAINED_HEAL_1 = 70809, - CLEANSE_SPIRIT_1 = 51886, - CLEANSING_TOTEM_1 = 8170, - CURE_TOXINS_1 = 526, - EARTH_ELEMENTAL_TOTEM_1 = 2062, - EARTH_SHIELD_1 = 974, - EARTH_SHOCK_1 = 8042, - EARTHBIND_TOTEM_1 = 2484, - EARTHLIVING_WEAPON_1 = 51730, - ELEMENTAL_MASTERY_1 = 16166, - FERAL_SPIRIT_1 = 51533, - FIRE_ELEMENTAL_TOTEM_1 = 2894, - FIRE_NOVA_1 = 1535, - FIRE_RESISTANCE_TOTEM_1 = 8184, - FLAME_SHOCK_1 = 8050, - FLAMETONGUE_TOTEM_1 = 8227, - FLAMETONGUE_WEAPON_1 = 8024, - FROST_RESISTANCE_TOTEM_1 = 8181, - FROST_SHOCK_1 = 8056, - FROSTBRAND_WEAPON_1 = 8033, - GHOST_WOLF_1 = 2645, - GROUNDING_TOTEM_1 = 8177, - HEALING_STREAM_TOTEM_1 = 5394, - HEALING_WAVE_1 = 331, - HEROISM_1 = 32182, - HEX_1 = 51514, - LAVA_BURST_1 = 51505, - LAVA_LASH_1 = 60103, - LESSER_HEALING_WAVE_1 = 8004, - LIGHTNING_BOLT_1 = 403, - LIGHTNING_SHIELD_1 = 324, - MAGMA_TOTEM_1 = 8190, - MANA_SPRING_TOTEM_1 = 5675, - MANA_TIDE_TOTEM_1 = 16190, - NATURE_RESISTANCE_TOTEM_1 = 10595, - NATURES_SWIFTNESS_SHAMAN_1 = 16188, - PURGE_1 = 370, - RIPTIDE_1 = 61295, - ROCKBITER_WEAPON_1 = 8017, - SEARING_TOTEM_1 = 3599, - SENTRY_TOTEM_1 = 6495, - SHAMANISTIC_RAGE_1 = 30823, - STONECLAW_TOTEM_1 = 5730, - STONESKIN_TOTEM_1 = 8071, - STORMSTRIKE_1 = 17364, - STRENGTH_OF_EARTH_TOTEM_1 = 8075, - THUNDERSTORM_1 = 51490, - TIDAL_FORCE_1 = 55198, - TOTEM_OF_WRATH_1 = 30706, - TOTEMIC_RECALL_1 = 36936, - TREMOR_TOTEM_1 = 8143, - WATER_BREATHING_1 = 131, - WATER_SHIELD_1 = 52127, - WATER_WALKING_1 = 546, - WIND_SHEAR_1 = 57994, - WINDFURY_TOTEM_1 = 8512, - WINDFURY_WEAPON_1 = 8232, - WRATH_OF_AIR_TOTEM_1 = 3738, - - //Warrior - BATTLE_SHOUT_1 = 6673, - BATTLE_STANCE_1 = 2457, - BERSERKER_RAGE_1 = 18499, - BERSERKER_STANCE_1 = 2458, - BLADESTORM_1 = 46924, - BLOODRAGE_1 = 2687, - BLOODTHIRST_1 = 23881, - CHALLENGING_SHOUT_1 = 1161, - CHARGE_1 = 100, - CLEAVE_1 = 845, - COMMANDING_SHOUT_1 = 469, - CONCUSSION_BLOW_1 = 12809, - DEATH_WISH_1 = 12292, - DEFENSIVE_STANCE_1 = 71, - DEMORALIZING_SHOUT_1 = 1160, - DEVASTATE_1 = 20243, - DISARM_1 = 676, - ENRAGED_REGENERATION_1 = 55694, - EXECUTE_1 = 5308, - HAMSTRING_1 = 1715, - HEROIC_FURY_1 = 60970, - HEROIC_STRIKE_1 = 78, - HEROIC_THROW_1 = 57755, - INTERCEPT_1 = 20252, - INTERVENE_1 = 3411, - INTIMIDATING_SHOUT_1 = 5246, - LAST_STAND_1 = 12975, - MOCKING_BLOW_1 = 694, - MORTAL_STRIKE_1 = 12294, - OVERPOWER_1 = 7384, - PIERCING_HOWL_1 = 12323, - PUMMEL_1 = 6552, - RECKLESSNESS_1 = 1719, - REND_1 = 772, - RETALIATION_1 = 20230, - REVENGE_1 = 6572, - SHATTERING_THROW_1 = 64382, - SHIELD_BASH_1 = 72, - SHIELD_BLOCK_1 = 2565, - SHIELD_SLAM_1 = 23922, - SHIELD_WALL_1 = 871, - SHOCKWAVE_1 = 46968, - SLAM_1 = 1464, - SPELL_REFLECTION_1 = 23920, - SUNDER_ARMOR_1 = 7386, - SWEEPING_STRIKES_1 = 12328, - TAUNT_1 = 355, - THUNDER_CLAP_1 = 6343, - VICTORY_RUSH_1 = 34428, - VIGILANCE_1 = 50720, - WHIRLWIND_1 = 1680, - - //Racial Traits ARCANE_TORRENT_MANA_CLASSES = 28730, ARCANE_TORRENT_DEATH_KNIGHT = 50613, ARCANE_TORRENT_ROGUE = 25046, @@ -648,7 +36,6 @@ enum RankOneSpellId STONEFORM_ALL = 20594, WAR_STOMP_ALL = 20549, WILL_OF_THE_FORSAKEN_ALL = 7744 - }; class MANGOS_DLL_SPEC PlayerbotAI diff --git a/src/game/playerbot/PlayerbotDeathKnightAI.h b/src/game/playerbot/PlayerbotDeathKnightAI.h index 14a9d952b..62f023c05 100644 --- a/src/game/playerbot/PlayerbotDeathKnightAI.h +++ b/src/game/playerbot/PlayerbotDeathKnightAI.h @@ -10,6 +10,55 @@ enum SPELL_DK_BLOOD }; +enum DeathKnightSpells +{ + ANTIMAGIC_SHELL_1 = 48707, + ANTIMAGIC_ZONE_1 = 51052, + ARMY_OF_THE_DEAD_1 = 42650, + BLOOD_BOIL_1 = 48721, + BLOOD_PRESENCE_1 = 48266, + BLOOD_STRIKE_1 = 45902, + BLOOD_TAP_1 = 45529, + BONE_SHIELD_1 = 49222, + CHAINS_OF_ICE_1 = 45524, + CORPSE_EXPLOSION_1 = 49158, + DANCING_RUNE_WEAPON_1 = 49028, + DARK_COMMAND_1 = 56222, + DEATH_AND_DECAY_1 = 43265, + DEATH_COIL_1 = 47541, + DEATH_GRIP_1 = 49576, + DEATH_PACT_1 = 48743, + DEATH_STRIKE_1 = 49998, + DEATHCHILL_1 = 49796, + EMPOWER_RUNE_WEAPON_1 = 47568, + FROST_PRESENCE_1 = 48263, + FROST_STRIKE_1 = 49143, + GHOUL_FRENZY_1 = 63560, + HEART_STRIKE_1 = 55050, + HORN_OF_WINTER_1 = 57330, + HOWLING_BLAST_1 = 49184, + HUNGERING_COLD_1 = 49203, + HYSTERIA_1 = 49016, + ICEBOUND_FORTITUDE_1 = 48792, + ICY_TOUCH_1 = 45477, + LICHBORNE_1 = 49039, + MARK_OF_BLOOD_1 = 49005, + MIND_FREEZE_1 = 47528, + OBLITERATE_1 = 49020, + PATH_OF_FROST_1 = 3714, + PESTILENCE_1 = 50842, + PLAGUE_STRIKE_1 = 45462, + RAISE_ALLY_1 = 61999, + RAISE_DEAD_1 = 46584, + RUNE_STRIKE_1 = 56815, + RUNE_TAP_1 = 48982, + SCOURGE_STRIKE_1 = 55090, + STRANGULATE_1 = 47476, + SUMMON_GARGOYLE_1 = 49206, + UNBREAKABLE_ARMOR_1 = 51271, + UNHOLY_PRESENCE_1 = 48265, + VAMPIRIC_BLOOD_1 = 55233 +}; //class Player; class MANGOS_DLL_SPEC PlayerbotDeathKnightAI : PlayerbotClassAI diff --git a/src/game/playerbot/PlayerbotDruidAI.h b/src/game/playerbot/PlayerbotDruidAI.h index 927b74f56..2b870d866 100644 --- a/src/game/playerbot/PlayerbotDruidAI.h +++ b/src/game/playerbot/PlayerbotDruidAI.h @@ -11,6 +11,84 @@ enum DruidSpell }; +enum DruidSpells +{ + ABOLISH_POISON_1 = 2893, + AQUATIC_FORM_1 = 1066, + BARKSKIN_1 = 22812, + BASH_1 = 5211, + BEAR_FORM_1 = 5487, + BERSERK_1 = 50334, + CAT_FORM_1 = 768, + CHALLENGING_ROAR_1 = 5209, + CLAW_1 = 1082, + COWER_1 = 8998, + CURE_POISON_1 = 8946, + CYCLONE_1 = 33786, + DASH_1 = 1850, + DEMORALIZING_ROAR_1 = 99, + DIRE_BEAR_FORM_1 = 9634, + ENRAGE_1 = 5229, + ENTANGLING_ROOTS_1 = 339, + FAERIE_FIRE_1 = 770, + FAERIE_FIRE_FERAL_1 = 16857, + FERAL_CHARGE_1 = 49377, + FERAL_CHARGE_BEAR_1 = 16979, + FERAL_CHARGE_CAT_1 = 49376, + FEROCIOUS_BITE_1 = 22568, + FLIGHT_FORM_1 = 33943, + FORCE_OF_NATURE_1 = 33831, + FRENZIED_REGENERATION_1 = 22842, + GIFT_OF_THE_WILD_1 = 21849, + GROWL_1 = 6795, + HEALING_TOUCH_1 = 5185, + HIBERNATE_1 = 2637, + HURRICANE_1 = 16914, + INNERVATE_1 = 29166, + INSECT_SWARM_1 = 5570, + LACERATE_1 = 33745, + LIFEBLOOM_1 = 33763, + MAIM_1 = 22570, + MANGLE_1 = 33917, + MANGLE_BEAR_1 = 33878, + MANGLE_CAT_1 = 33876, + MARK_OF_THE_WILD_1 = 1126, + MAUL_1 = 6807, + MOONFIRE_1 = 8921, + MOONKIN_FORM_1 = 24858, + NATURES_GRASP_1 = 16689, + NATURES_SWIFTNESS_1 = 17116, + NOURISH_1 = 50464, + POUNCE_1 = 9005, + PROWL_1 = 5215, + RAKE_1 = 1822, + RAVAGE_1 = 6785, + REBIRTH_1 = 20484, + REGROWTH_1 = 8936, + REJUVENATION_1 = 774, + REMOVE_CURSE_1 = 2782, + REVIVE_1 = 50769, + RIP_1 = 1079, + SAVAGE_ROAR_1 = 52610, + SHRED_1 = 5221, + SOOTHE_ANIMAL_1 = 2908, + STARFALL_1 = 48505, + STARFIRE_1 = 2912, + SURVIVAL_INSTINCTS_1 = 61336, + SWIFTMEND_1 = 18562, + SWIFT_FLIGHT_FORM_1 = 40120, + SWIPE_BEAR_1 = 779, + SWIPE_CAT_1 = 62078, + THORNS_1 = 467, + TIGERS_FURY_1 = 5217, + TRANQUILITY_1 = 740, + TRAVEL_FORM_1 = 783, + TREE_OF_LIFE_1 = 33891, + TYPHOON_1 = 50516, + WILD_GROWTH_1 = 48438, + WRATH_1 = 5176 +}; + //class Player; class MANGOS_DLL_SPEC PlayerbotDruidAI : PlayerbotClassAI diff --git a/src/game/playerbot/PlayerbotHunterAI.h b/src/game/playerbot/PlayerbotHunterAI.h index 680b2eab9..85c41c9c0 100644 --- a/src/game/playerbot/PlayerbotHunterAI.h +++ b/src/game/playerbot/PlayerbotHunterAI.h @@ -8,6 +8,78 @@ enum SPELL_HUNTER }; +enum HunterSpells +{ + ARCANE_SHOT_1 = 3044, + ASPECT_OF_THE_BEAST_1 = 13161, + ASPECT_OF_THE_CHEETAH_1 = 5118, + ASPECT_OF_THE_DRAGONHAWK_1 = 61846, + ASPECT_OF_THE_HAWK_1 = 13165, + ASPECT_OF_THE_MONKEY_1 = 13163, + ASPECT_OF_THE_PACK_1 = 13159, + ASPECT_OF_THE_VIPER_1 = 34074, + ASPECT_OF_THE_WILD_1 = 20043, + AUTO_SHOT_1 = 75, + BEAST_LORE_1 = 1462, + CALL_PET_1 = 883, + CALL_STABLED_PET_1 = 62757, + CONCUSSIVE_SHOT_1 = 5116, + DETERRENCE_1 = 19263, + DISENGAGE_1 = 781, + DISMISS_PET_1 = 2641, + DISTRACTING_SHOT_1 = 20736, + EAGLE_EYE_1 = 6197, + EXPLOSIVE_TRAP_1 = 13813, + EYES_OF_THE_BEAST_1 = 1002, + FEED_PET_1 = 6991, + FEIGN_DEATH_1 = 5384, + FLARE_1 = 1543, + FREEZING_ARROW_1 = 60192, + FREEZING_TRAP_1 = 1499, + FROST_TRAP_1 = 13809, + HUNTERS_MARK_1 = 1130, + IMMOLATION_TRAP_1 = 13795, + KILL_COMMAND_1 = 34026, + KILL_SHOT_1 = 53351, + MASTERS_CALL_1 = 53271, + MEND_PET_1 = 136, + MISDIRECTION_1 = 34477, + MONGOOSE_BITE_1 = 1495, + MULTISHOT_1 = 2643, + RAPID_FIRE_1 = 3045, + RAPTOR_STRIKE_1 = 2973, + REVIVE_PET_1 = 982, + SCARE_BEAST_1 = 1513, + SCORPID_STING_1 = 3043, + SERPENT_STING_1 = 1978, + SNAKE_TRAP_1 = 34600, + STEADY_SHOT_1 = 56641, + TAME_BEAST_1 = 1515, + TRACK_BEASTS_1 = 1494, + TRACK_DEMONS_1 = 19878, + TRACK_DRAGONKIN_1 = 19879, + TRACK_ELEMENTALS_1 = 19880, + TRACK_GIANTS_1 = 19882, + TRACK_HIDDEN_1 = 19885, + TRACK_HUMANOIDS_1 = 19883, + TRACK_UNDEAD_1 = 19884, + TRANQUILIZING_SHOT_1 = 19801, + VIPER_STING_1 = 3034, + VOLLEY_1 = 1510, + WING_CLIP_1 = 2974, + AIMED_SHOT_1 = 19434, + BESTIAL_WRATH_1 = 19574, + BLACK_ARROW_1 = 3674, + CHIMERA_SHOT_1 = 53209, + COUNTERATTACK_1 = 19306, + EXPLOSIVE_SHOT_1 = 53301, + INTIMIDATION_1 = 19577, + READINESS_1 = 23989, + SCATTER_SHOT_1 = 19503, + SILENCING_SHOT_1 = 34490, + TRUESHOT_AURA_1 = 19506, + WYVERN_STING_1 = 19386 +}; //class Player; diff --git a/src/game/playerbot/PlayerbotMageAI.h b/src/game/playerbot/PlayerbotMageAI.h index a0955dbc7..40db36e24 100644 --- a/src/game/playerbot/PlayerbotMageAI.h +++ b/src/game/playerbot/PlayerbotMageAI.h @@ -10,6 +10,64 @@ enum SPELL_ARCANE }; +enum MageSpells +{ + AMPLIFY_MAGIC_1 = 1008, + ARCANE_BARRAGE_1 = 44425, + ARCANE_BLAST_1 = 30451, + ARCANE_BRILLIANCE_1 = 23028, + ARCANE_EXPLOSION_1 = 1449, + ARCANE_INTELLECT_1 = 1459, + ARCANE_MISSILES_1 = 5143, + ARCANE_POWER_1 = 12042, + BLAST_WAVE_1 = 11113, + BLINK_1 = 1953, + BLIZZARD_1 = 10, + COLD_SNAP_1 = 11958, + COMBUSTION_1 = 11129, + CONE_OF_COLD_1 = 120, + CONJURE_FOOD_1 = 587, + CONJURE_MANA_GEM_1 = 759, + CONJURE_REFRESHMENT_1 = 42955, + CONJURE_WATER_1 = 5504, + COUNTERSPELL_1 = 2139, + DALARAN_BRILLIANCE_1 = 61316, + DALARAN_INTELLECT_1 = 61024, + DAMPEN_MAGIC_1 = 604, + DEEP_FREEZE_1 = 44572, + DRAGONS_BREATH_1 = 31661, + EVOCATION_1 = 12051, + FIRE_BLAST_1 = 2136, + FIRE_WARD_1 = 543, + FIREBALL_1 = 133, + FLAMESTRIKE_1 = 2120, + FOCUS_MAGIC_1 = 54646, + FROST_ARMOR_1 = 168, + FROST_NOVA_1 = 122, + FROST_WARD_1 = 6143, + FROSTBOLT_1 = 116, + FROSTFIRE_BOLT_1 = 44614, + ICE_ARMOR_1 = 7302, + ICE_BARRIER_1 = 11426, + ICE_BLOCK_1 = 45438, + ICE_LANCE_1 = 30455, + ICY_VEINS_1 = 12472, + INVISIBILITY_1 = 66, + LIVING_BOMB_1 = 44457, + MAGE_ARMOR_1 = 6117, + MANA_SHIELD_1 = 1463, + MIRROR_IMAGE_1 = 55342, + MOLTEN_ARMOR_1 = 30482, + PRESENCE_OF_MIND_1 = 12043, + PYROBLAST_1 = 11366, + REMOVE_CURSE_1 = 475, + RITUAL_OF_REFRESHMENT_1 = 43987, + SCORCH_1 = 2948, + SLOW_1 = 31589, + SLOW_FALL_1 = 130, + SPELLSTEAL_1 = 30449, + SUMMON_WATER_ELEMENTAL_1 = 31687 +}; //class Player; class MANGOS_DLL_SPEC PlayerbotMageAI : PlayerbotClassAI diff --git a/src/game/playerbot/PlayerbotPaladinAI.h b/src/game/playerbot/PlayerbotPaladinAI.h index 74a3a88a5..3931d21d9 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.h +++ b/src/game/playerbot/PlayerbotPaladinAI.h @@ -9,6 +9,73 @@ enum Healing }; +enum PaladinSpells +{ + AURA_MASTERY_1 = 31821, + AVENGERS_SHIELD_1 = 31935, + AVENGING_WRATH_1 = 31884, + BEACON_OF_LIGHT_1 = 53563, + BLESSING_OF_KINGS_1 = 20217, + BLESSING_OF_MIGHT_1 = 19740, + BLESSING_OF_SANCTUARY_1 = 20911, + BLESSING_OF_WISDOM_1 = 19742, + CLEANSE_1 = 4987, + CONCENTRATION_AURA_1 = 19746, + CONSECRATION_1 = 26573, + CRUSADER_AURA_1 = 32223, + CRUSADER_STRIKE_1 = 35395, + DEVOTION_AURA_1 = 465, + DIVINE_FAVOR_1 = 20216, + DIVINE_ILLUMINATION_1 = 31842, + DIVINE_INTERVENTION_1 = 19752, + DIVINE_PLEA_1 = 54428, + DIVINE_PROTECTION_1 = 498, + DIVINE_SACRIFICE_1 = 64205, + DIVINE_SHIELD_1 = 642, + DIVINE_STORM_1 = 53385, + EXORCISM_1 = 879, + FIRE_RESISTANCE_AURA_1 = 19891, + FLASH_OF_LIGHT_1 = 19750, + FROST_RESISTANCE_AURA_1 = 19888, + GREATER_BLESSING_OF_KINGS_1 = 25898, + GREATER_BLESSING_OF_MIGHT_1 = 25782, + GREATER_BLESSING_OF_SANCTUARY_1 = 25899, + GREATER_BLESSING_OF_WISDOM_1 = 25894, + HAMMER_OF_JUSTICE_1 = 853, + HAMMER_OF_THE_RIGHTEOUS_1 = 53595, + HAMMER_OF_WRATH_1 = 24275, + HAND_OF_FREEDOM_1 = 1044, + HAND_OF_PROTECTION_1 = 1022, + HAND_OF_RECKONING_1 = 62124, + HAND_OF_SACRIFICE_1 = 6940, + HAND_OF_SALVATION_1 = 1038, + HOLY_LIGHT_1 = 635, + HOLY_SHIELD_1 = 20925, + HOLY_SHOCK_1 = 20473, + HOLY_WRATH_1 = 2812, + JUDGEMENT_OF_JUSTICE_1 = 53407, + JUDGEMENT_OF_LIGHT_1 = 20271, + JUDGEMENT_OF_WISDOM_1 = 53408, + LAY_ON_HANDS_1 = 633, + PURIFY_1 = 1152, + REDEMPTION_1 = 7328, + REPENTANCE_1 = 20066, + RETRIBUTION_AURA_1 = 7294, + RIGHTEOUS_DEFENSE_1 = 31789, + RIGHTEOUS_FURY_1 = 25780, + SACRED_SHIELD_1 = 53601, + SEAL_OF_COMMAND_1 = 20375, + SEAL_OF_CORRUPTION = 53736, + SEAL_OF_JUSTICE_1 = 20164, + SEAL_OF_LIGHT_1 = 20165, + SEAL_OF_RIGHTEOUSNESS_1 = 20154, + SEAL_OF_VENGEANCE = 31801, + SEAL_OF_WISDOM_1 = 20166, + SENSE_UNDEAD_1 = 5502, + SHADOW_RESISTANCE_AURA_1 = 19876, + SHIELD_OF_RIGHTEOUSNESS_1 = 53600, + TURN_EVIL_1 = 10326 +}; //class Player; class MANGOS_DLL_SPEC PlayerbotPaladinAI : PlayerbotClassAI diff --git a/src/game/playerbot/PlayerbotPriestAI.h b/src/game/playerbot/PlayerbotPriestAI.h index c49ba769a..02a9b41bb 100644 --- a/src/game/playerbot/PlayerbotPriestAI.h +++ b/src/game/playerbot/PlayerbotPriestAI.h @@ -10,6 +10,66 @@ enum SPELL_DISCIPLINE }; +enum PriestSpells +{ + ABOLISH_DISEASE_1 = 552, + BINDING_HEAL_1 = 32546, + BLESSED_HEALING_1 = 70772, + CIRCLE_OF_HEALING_1 = 34861, + CURE_DISEASE_1 = 528, + DESPERATE_PRAYER_1 = 19236, + DEVOURING_PLAGUE_1 = 2944, + DISPEL_MAGIC_1 = 527, + DISPERSION_1 = 47585, + DIVINE_HYMN_1 = 64843, + DIVINE_SPIRIT_1 = 14752, + FADE_1 = 586, + FEAR_WARD_1 = 6346, + FLASH_HEAL_1 = 2061, + GREATER_HEAL_1 = 2060, + GUARDIAN_SPIRIT_1 = 47788, + HEAL_1 = 2054, + HOLY_FIRE_1 = 14914, + HOLY_NOVA_1 = 15237, + HYMN_OF_HOPE_1 = 64901, + INNER_FIRE_1 = 588, + INNER_FOCUS_1 = 14751, + LESSER_HEAL_1 = 2050, + LEVITATE_1 = 1706, + LIGHTWELL_1 = 724, + MANA_BURN_1 = 8129, + MASS_DISPEL_1 = 32375, + MIND_BLAST_1 = 8092, + MIND_CONTROL_1 = 605, + MIND_FLAY_1 = 15407, + MIND_SEAR_1 = 48045, + MIND_SOOTHE_1 = 453, + MIND_VISION_1 = 2096, + PAIN_SUPPRESSION_1 = 33206, + PENANCE_1 = 47540, + POWER_INFUSION_1 = 10060, + POWER_WORD_FORTITUDE_1 = 1243, + POWER_WORD_SHIELD_1 = 17, + PRAYER_OF_FORTITUDE_1 = 21562, + PRAYER_OF_HEALING_1 = 596, + PRAYER_OF_MENDING_1 = 33076, + PRAYER_OF_SHADOW_PROTECTION_1 = 27683, + PRAYER_OF_SPIRIT_1 = 27681, + PSYCHIC_HORROR_1 = 64044, + PSYCHIC_SCREAM_1 = 8122, + RENEW_1 = 139, + RESURRECTION_1 = 2006, + SHACKLE_UNDEAD_1 = 9484, + SHADOW_PROTECTION_1 = 976, + SHADOW_WORD_DEATH_1 = 32379, + SHADOW_WORD_PAIN_1 = 589, + SHADOWFIEND_1 = 34433, + SHADOWFORM_1 = 15473, + SILENCE_1 = 15487, + SMITE_1 = 585, + VAMPIRIC_EMBRACE_1 = 15286, + VAMPIRIC_TOUCH_1 = 34914 +}; //class Player; class MANGOS_DLL_SPEC PlayerbotPriestAI : PlayerbotClassAI diff --git a/src/game/playerbot/PlayerbotRogueAI.h b/src/game/playerbot/PlayerbotRogueAI.h index 862453e99..27af7d1bb 100644 --- a/src/game/playerbot/PlayerbotRogueAI.h +++ b/src/game/playerbot/PlayerbotRogueAI.h @@ -12,6 +12,52 @@ enum RogueStealth }; +enum RogueSpells +{ + ADRENALINE_RUSH_1 = 13750, + AMBUSH_1 = 8676, + BACKSTAB_1 = 53, + BLADE_FLURRY_1 = 13877, + BLIND_1 = 2094, + CHEAP_SHOT_1 = 1833, + CLOAK_OF_SHADOWS_1 = 31224, + COLD_BLOOD_1 = 14177, + DEADLY_THROW_1 = 26679, + DISARM_TRAP_1 = 1842, + DISMANTLE_1 = 51722, + DISTRACT_1 = 1725, + ENVENOM_1 = 32645, + EVASION_1 = 5277, + EVISCERATE_1 = 2098, + EXPOSE_ARMOR_1 = 8647, + FAN_OF_KNIVES_1 = 51723, + FEINT_1 = 1966, + GARROTE_1 = 703, + GHOSTLY_STRIKE_1 = 14278, + GOUGE_1 = 1776, + HEMORRHAGE_1 = 16511, + HUNGER_FOR_BLOOD_1 = 51662, + KICK_1 = 1766, + KIDNEY_SHOT_1 = 408, + KILLING_SPREE_1 = 51690, + MUTILATE_1 = 1329, + PICK_LOCK_1 = 1804, + PICK_POCKET_1 = 921, + PREMEDITATION_1 = 14183, + PREPARATION_1 = 14185, + RIPOSTE_1 = 14251, + RUPTURE_1 = 1943, + SAP_1 = 6770, + SHADOW_DANCE_1 = 51713, + SHADOWSTEP_1 = 36554, + SHIV_1 = 5938, + SINISTER_STRIKE_1 = 1752, + SLICE_AND_DICE_1 = 5171, + SPRINT_1 = 2983, + STEALTH_1 = 1784, + TRICKS_OF_THE_TRADE_1 = 57934, + VANISH_1 = 1856 +}; //class Player; class MANGOS_DLL_SPEC PlayerbotRogueAI : PlayerbotClassAI diff --git a/src/game/playerbot/PlayerbotShamanAI.h b/src/game/playerbot/PlayerbotShamanAI.h index d13383812..426f40fd7 100644 --- a/src/game/playerbot/PlayerbotShamanAI.h +++ b/src/game/playerbot/PlayerbotShamanAI.h @@ -10,6 +10,75 @@ enum SPELL_ELEMENTAL }; +enum +{ + ANCESTRAL_SPIRIT_1 = 2008, + ASTRAL_RECALL_1 = 556, + BLOODLUST_1 = 2825, + CALL_OF_THE_ANCESTORS_1 = 66843, + CALL_OF_THE_ELEMENTS_1 = 66842, + CALL_OF_THE_SPIRITS_1 = 66844, + CHAIN_HEAL_1 = 1064, + CHAIN_LIGHTNING_1 = 421, + CHAINED_HEAL_1 = 70809, + CLEANSE_SPIRIT_1 = 51886, + CLEANSING_TOTEM_1 = 8170, + CURE_TOXINS_1 = 526, + EARTH_ELEMENTAL_TOTEM_1 = 2062, + EARTH_SHIELD_1 = 974, + EARTH_SHOCK_1 = 8042, + EARTHBIND_TOTEM_1 = 2484, + EARTHLIVING_WEAPON_1 = 51730, + ELEMENTAL_MASTERY_1 = 16166, + FERAL_SPIRIT_1 = 51533, + FIRE_ELEMENTAL_TOTEM_1 = 2894, + FIRE_NOVA_1 = 1535, + FIRE_RESISTANCE_TOTEM_1 = 8184, + FLAME_SHOCK_1 = 8050, + FLAMETONGUE_TOTEM_1 = 8227, + FLAMETONGUE_WEAPON_1 = 8024, + FROST_RESISTANCE_TOTEM_1 = 8181, + FROST_SHOCK_1 = 8056, + FROSTBRAND_WEAPON_1 = 8033, + GHOST_WOLF_1 = 2645, + GROUNDING_TOTEM_1 = 8177, + HEALING_STREAM_TOTEM_1 = 5394, + HEALING_WAVE_1 = 331, + HEROISM_1 = 32182, + HEX_1 = 51514, + LAVA_BURST_1 = 51505, + LAVA_LASH_1 = 60103, + LESSER_HEALING_WAVE_1 = 8004, + LIGHTNING_BOLT_1 = 403, + LIGHTNING_SHIELD_1 = 324, + MAGMA_TOTEM_1 = 8190, + MANA_SPRING_TOTEM_1 = 5675, + MANA_TIDE_TOTEM_1 = 16190, + NATURE_RESISTANCE_TOTEM_1 = 10595, + NATURES_SWIFTNESS_1 = 16188, + PURGE_1 = 370, + RIPTIDE_1 = 61295, + ROCKBITER_WEAPON_1 = 8017, + SEARING_TOTEM_1 = 3599, + SENTRY_TOTEM_1 = 6495, + SHAMANISTIC_RAGE_1 = 30823, + STONECLAW_TOTEM_1 = 5730, + STONESKIN_TOTEM_1 = 8071, + STORMSTRIKE_1 = 17364, + STRENGTH_OF_EARTH_TOTEM_1 = 8075, + THUNDERSTORM_1 = 51490, + TIDAL_FORCE_1 = 55198, + TOTEM_OF_WRATH_1 = 30706, + TOTEMIC_RECALL_1 = 36936, + TREMOR_TOTEM_1 = 8143, + WATER_BREATHING_1 = 131, + WATER_SHIELD_1 = 52127, + WATER_WALKING_1 = 546, + WIND_SHEAR_1 = 57994, + WINDFURY_TOTEM_1 = 8512, + WINDFURY_WEAPON_1 = 8232, + WRATH_OF_AIR_TOTEM_1 = 3738 +}; //class Player; class MANGOS_DLL_SPEC PlayerbotShamanAI : PlayerbotClassAI diff --git a/src/game/playerbot/PlayerbotWarlockAI.h b/src/game/playerbot/PlayerbotWarlockAI.h index e3a4c5dcb..37e6dfb3b 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.h +++ b/src/game/playerbot/PlayerbotWarlockAI.h @@ -11,6 +11,75 @@ enum SPELL_DEMONOLOGY }; +enum WarlockSpells +{ + BANISH_1 = 710, + CHALLENGING_HOWL_1 = 59671, + CHAOS_BOLT_1 = 50796, + CONFLAGRATE_1 = 17962, + CORRUPTION_1 = 172, + CREATE_FIRESTONE_1 = 6366, + CREATE_HEALTHSTONE_1 = 6201, + CREATE_SOULSTONE_1 = 693, + CREATE_SPELLSTONE_1 = 2362, + CURSE_OF_AGONY_1 = 980, + CURSE_OF_DOOM_1 = 603, + CURSE_OF_EXHAUSTION_1 = 18223, + CURSE_OF_THE_ELEMENTS_1 = 1490, + CURSE_OF_TONGUES_1 = 1714, + CURSE_OF_WEAKNESS_1 = 702, + DARK_PACT_1 = 18220, + DEATH_COIL_1 = 6789, + DEMON_ARMOR_1 = 706, + DEMON_CHARGE_1 = 54785, + DEMON_SKIN_1 = 687, + DEMONIC_CIRCLE_SUMMON_1 = 48018, + DEMONIC_CIRCLE_TELEPORT_1 = 48020, + DEMONIC_EMPOWERMENT_1 = 47193, + DEMONIC_IMMOLATE_1 = 75445, + DETECT_INVISIBILITY_1 = 132, + DRAIN_LIFE_1 = 689, + DRAIN_MANA_1 = 5138, + DRAIN_SOUL_1 = 1120, + ENSLAVE_DEMON_1 = 1098, + EYE_OF_KILROGG_1 = 126, + FEAR_1 = 5782, + FEL_ARMOR_1 = 28176, + FEL_DOMINATION_1 = 18708, + HAUNT_1 = 48181, + HEALTH_FUNNEL_1 = 755, + HELLFIRE_1 = 1949, + HOWL_OF_TERROR_1 = 5484, + IMMOLATE_1 = 348, + IMMOLATION_AURA_1 = 50589, + INCINERATE_1 = 29722, + INFERNO_1 = 1122, + LIFE_TAP_1 = 1454, + METAMORPHOSIS_1 = 59672, + RAIN_OF_FIRE_1 = 5740, + RITUAL_OF_DOOM_1 = 18540, + RITUAL_OF_SOULS_1 = 29893, + RITUAL_OF_SUMMONING_1 = 698, + SEARING_PAIN_1 = 5676, + SEED_OF_CORRUPTION_1 = 27243, + SENSE_DEMONS_1 = 5500, + SHADOW_BOLT_1 = 686, + SHADOW_CLEAVE_1 = 50581, + SHADOW_WARD_1 = 6229, + SHADOWBURN_1 = 17877, + SHADOWFLAME_1 = 47897, + SHADOWFURY_1 = 30283, + SOUL_FIRE_1 = 6353, + SOUL_LINK_1 = 19028, + SOULSHATTER_1 = 29858, + SUMMON_FELGUARD_1 = 30146, + SUMMON_FELHUNTER_1 = 691, + SUMMON_IMP_1 = 688, + SUMMON_SUCCUBUS_1 = 712, + SUMMON_VOIDWALKER_1 = 697, + UNENDING_BREATH_1 = 5697, + UNSTABLE_AFFLICTION_1 = 30108 +}; //class Player; class MANGOS_DLL_SPEC PlayerbotWarlockAI : PlayerbotClassAI { diff --git a/src/game/playerbot/PlayerbotWarriorAI.h b/src/game/playerbot/PlayerbotWarriorAI.h index ce82c2403..52bfbd3e8 100644 --- a/src/game/playerbot/PlayerbotWarriorAI.h +++ b/src/game/playerbot/PlayerbotWarriorAI.h @@ -11,6 +11,60 @@ enum WarriorBerserker }; +enum WarriorSpells +{ + BATTLE_SHOUT_1 = 6673, + BATTLE_STANCE_1 = 2457, + BERSERKER_RAGE_1 = 18499, + BERSERKER_STANCE_1 = 2458, + BLADESTORM_1 = 46924, + BLOODRAGE_1 = 2687, + BLOODTHIRST_1 = 23881, + CHALLENGING_SHOUT_1 = 1161, + CHARGE_1 = 100, + CLEAVE_1 = 845, + COMMANDING_SHOUT_1 = 469, + CONCUSSION_BLOW_1 = 12809, + DEATH_WISH_1 = 12292, + DEFENSIVE_STANCE_1 = 71, + DEMORALIZING_SHOUT_1 = 1160, + DEVASTATE_1 = 20243, + DISARM_1 = 676, + ENRAGED_REGENERATION_1 = 55694, + EXECUTE_1 = 5308, + HAMSTRING_1 = 1715, + HEROIC_FURY_1 = 60970, + HEROIC_STRIKE_1 = 78, + HEROIC_THROW_1 = 57755, + INTERCEPT_1 = 20252, + INTERVENE_1 = 3411, + INTIMIDATING_SHOUT_1 = 5246, + LAST_STAND_1 = 12975, + MOCKING_BLOW_1 = 694, + MORTAL_STRIKE_1 = 12294, + OVERPOWER_1 = 7384, + PIERCING_HOWL_1 = 12323, + PUMMEL_1 = 6552, + RECKLESSNESS_1 = 1719, + REND_1 = 772, + RETALIATION_1 = 20230, + REVENGE_1 = 6572, + SHATTERING_THROW_1 = 64382, + SHIELD_BASH_1 = 72, + SHIELD_BLOCK_1 = 2565, + SHIELD_SLAM_1 = 23922, + SHIELD_WALL_1 = 871, + SHOCKWAVE_1 = 46968, + SLAM_1 = 1464, + SPELL_REFLECTION_1 = 23920, + SUNDER_ARMOR_1 = 7386, + SWEEPING_STRIKES_1 = 12328, + TAUNT_1 = 355, + THUNDER_CLAP_1 = 6343, + VICTORY_RUSH_1 = 34428, + VIGILANCE_1 = 50720, + WHIRLWIND_1 = 1680 +}; //class Player; From c006c355d339b5c7d90ffcbe29813a2d9524f57b Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 6 Aug 2010 10:30:57 +0400 Subject: [PATCH 090/187] Init racial traits for mage and warlock AIs --- src/game/playerbot/PlayerbotAI.h | 1 + src/game/playerbot/PlayerbotMageAI.cpp | 12 ++++++------ src/game/playerbot/PlayerbotWarlockAI.cpp | 16 ++++++++-------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index d9d805457..324435dbf 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -21,6 +21,7 @@ enum RacialTraits ARCANE_TORRENT_MANA_CLASSES = 28730, ARCANE_TORRENT_DEATH_KNIGHT = 50613, ARCANE_TORRENT_ROGUE = 25046, + BERSERKING_ALL = 26297, BLOOD_FURY_MELEE_CLASSES = 20572, BLOOD_FURY_WARLOCK = 33702, BLOOD_FURY_SHAMAN = 33697, diff --git a/src/game/playerbot/PlayerbotMageAI.cpp b/src/game/playerbot/PlayerbotMageAI.cpp index 19beeb883..d40d1e002 100644 --- a/src/game/playerbot/PlayerbotMageAI.cpp +++ b/src/game/playerbot/PlayerbotMageAI.cpp @@ -53,12 +53,12 @@ PlayerbotMageAI::PlayerbotMageAI(Player* const master, Player* const bot, Player RECENTLY_BANDAGED = 11196; // first aid check // racial - ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf - GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei - ESCAPE_ARTIST = ai->getSpellId("escape artist"); // gnome - EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human - BERSERKING = ai->getSpellId("berserking"); // troll - WILL_OF_THE_FORSAKEN = ai->getSpellId("will of the forsaken"); // undead + ARCANE_TORRENT = ai->initSpell(ARCANE_TORRENT_MANA_CLASSES); // blood elf + GIFT_OF_THE_NAARU = ai->initSpell(GIFT_OF_THE_NAARU_MAGE); // draenei + ESCAPE_ARTIST = ai->initSpell(ESCAPE_ARTIST_ALL); // gnome + EVERY_MAN_FOR_HIMSELF = ai->initSpell(EVERY_MAN_FOR_HIMSELF_ALL); // human + BERSERKING = ai->initSpell(BERSERKING_ALL); // troll + WILL_OF_THE_FORSAKEN = ai->initSpell(WILL_OF_THE_FORSAKEN_ALL); // undead } PlayerbotMageAI::~PlayerbotMageAI() {} diff --git a/src/game/playerbot/PlayerbotWarlockAI.cpp b/src/game/playerbot/PlayerbotWarlockAI.cpp index 31fc19a54..92a22d1c7 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.cpp +++ b/src/game/playerbot/PlayerbotWarlockAI.cpp @@ -53,18 +53,18 @@ PlayerbotWarlockAI::PlayerbotWarlockAI(Player* const master, Player* const bot, SUMMON_FELHUNTER = ai->initSpell(SUMMON_FELHUNTER_1); SUMMON_FELGUARD = ai->initSpell(SUMMON_FELGUARD_1); // demon skills should be initialized on demons - BLOOD_PACT = 0; //ai->getSpellId("blood pact"); // imp skill - CONSUME_SHADOWS = 0; //ai->getSpellId("consume shadows"); // voidwalker skill - FEL_INTELLIGENCE = 0; //ai->getSpellId("fel intelligence"); // felhunter skill + BLOOD_PACT = 0; // imp skill + CONSUME_SHADOWS = 0; // voidwalker skill + FEL_INTELLIGENCE = 0; // felhunter skill RECENTLY_BANDAGED = 11196; // first aid check // racial - ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf - ESCAPE_ARTIST = ai->getSpellId("escape artist"); // gnome - EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human - BLOOD_FURY = ai->getSpellId("blood fury"); // orc - WILL_OF_THE_FORSAKEN = ai->getSpellId("will of the forsaken"); // undead + ARCANE_TORRENT = ai->initSpell(ARCANE_TORRENT_MANA_CLASSES); // blood elf + ESCAPE_ARTIST = ai->initSpell(ESCAPE_ARTIST_ALL); // gnome + EVERY_MAN_FOR_HIMSELF = ai->initSpell(EVERY_MAN_FOR_HIMSELF_ALL); // human + BLOOD_FURY = ai->initSpell(BLOOD_FURY_WARLOCK); // orc + WILL_OF_THE_FORSAKEN = ai->initSpell(WILL_OF_THE_FORSAKEN_ALL); // undead m_demonSummonFailed = false; } From 5a96da46e0437851f7e559cb3bfe7512446a1632 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 6 Aug 2010 10:59:18 +0400 Subject: [PATCH 091/187] Update death knight spell init --- src/game/playerbot/PlayerbotDeathKnightAI.cpp | 110 +++++++++--------- src/game/playerbot/PlayerbotDeathKnightAI.h | 4 +- 2 files changed, 56 insertions(+), 58 deletions(-) diff --git a/src/game/playerbot/PlayerbotDeathKnightAI.cpp b/src/game/playerbot/PlayerbotDeathKnightAI.cpp index e1bb31d1d..733b1dbac 100644 --- a/src/game/playerbot/PlayerbotDeathKnightAI.cpp +++ b/src/game/playerbot/PlayerbotDeathKnightAI.cpp @@ -7,66 +7,64 @@ class PlayerbotAI; PlayerbotDeathKnightAI::PlayerbotDeathKnightAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) { - PLAGUE_STRIKE = ai->getSpellId("plague strike"); // Unholy - DEATH_GRIP = ai->getSpellId("death grip"); - DEATH_COIL = ai->getSpellId("death coil"); - DEATH_STRIKE = ai->getSpellId("death strike"); - UNHOLY_BLIGHT = ai->getSpellId("unholy blight"); - SCOURGE_STRIKE = ai->getSpellId("scourge strike"); - DEATH_AND_DECAY = ai->getSpellId("death and decay"); - CORPSE_EXPLOSION = ai->getSpellId("corpse explosion"); - BONE_SHIELD = ai->getSpellId("shield"); // buffs - ANTI_MAGIC_SHELL = ai->getSpellId("anti-magic shell"); - ANTI_MAGIC_ZONE = ai->getSpellId("anti-magic"); - GHOUL_FRENZY = ai->getSpellId("ghoul frenzy"); - RAISE_DEAD = ai->getSpellId("raise dead"); // pets - SUMMON_GARGOYLE = ai->getSpellId("summon gargoyle"); - ARMY_OF_THE_DEAD = ai->getSpellId("army of the dead"); - ICY_TOUCH = ai->getSpellId("icy touch"); // Frost - OBLITERATE = ai->getSpellId("obliterate"); - HOWLING_BLAST = ai->getSpellId("howling blast"); - FROST_STRIKE = ai->getSpellId("frost strike"); - CHAINS_OF_ICE = ai->getSpellId("chains of ice"); - RUNE_STRIKE = ai->getSpellId("rune strike"); - ICY_CLUTCH = ai->getSpellId("icy clutch"); - MIND_FREEZE = ai->getSpellId("mind freeze"); - HUNGERING_COLD = ai->getSpellId("hungering cold"); - KILLING_MACHINE = ai->getSpellId("killing machine"); // buffs - DEATHCHILL = ai->getSpellId("deathchill"); - HORN_OF_WINTER = ai->getSpellId("horn of winter"); - ICEBOUND_FORTITUDE= ai->getSpellId("icebound fortitude"); - EMPOWER_WEAPON = ai->getSpellId("empower rune weapon"); - UNBREAKABLE_ARMOR = ai->getSpellId("unbreakable armor"); - BLOOD_STRIKE = ai->getSpellId("blood strike"); // Blood - PESTILENCE = ai->getSpellId("pestilence"); - STRANGULATE = ai->getSpellId("strangulate"); - BLOOD_BOIL = ai->getSpellId("blood boil"); - HEART_STRIKE = ai->getSpellId("heart strike"); - DANCING_WEAPON = ai->getSpellId("dancing rune weapon"); - DARK_COMMAND = ai->getSpellId("dark command"); - MARK_OF_BLOOD = ai->getSpellId("mark of blood"); // buffs - RUNE_TAP = ai->getSpellId("rune tap"); - VAMPIRIC_BLOOD = ai->getSpellId("vampiric blood"); - DEATH_PACT = ai->getSpellId("death pact"); - DEATH_RUNE_MASTERY= ai->getSpellId("death rune mastery"); - HYSTERIA = ai->getSpellId("hysteria"); - UNHOLY_PRESENCE = ai->getSpellId("unholy presence"); // presence (TODO: better spell == presence) - FROST_PRESENCE = ai->getSpellId("frost presence"); - BLOOD_PRESENCE = ai->getSpellId("blood presence"); + PLAGUE_STRIKE = ai->initSpell(PLAGUE_STRIKE_1); // Unholy + DEATH_GRIP = ai->initSpell(DEATH_GRIP_1); + DEATH_COIL = ai->initSpell(DEATH_COIL_1); + DEATH_STRIKE = ai->initSpell(DEATH_STRIKE_1); + UNHOLY_BLIGHT = 0; // Passive + SCOURGE_STRIKE = ai->initSpell(SCOURGE_STRIKE_1); + DEATH_AND_DECAY = ai->initSpell(DEATH_AND_DECAY_1); + CORPSE_EXPLOSION = ai->initSpell(CORPSE_EXPLOSION_1); + BONE_SHIELD = ai->initSpell(BONE_SHIELD_1); // buffs + ANTI_MAGIC_SHELL = ai->initSpell(ANTI_MAGIC_SHELL_1); + ANTI_MAGIC_ZONE = ai->initSpell(ANTI_MAGIC_ZONE_1); + GHOUL_FRENZY = ai->initSpell(GHOUL_FRENZY_1); + RAISE_DEAD = ai->initSpell(RAISE_DEAD_1); // pets + SUMMON_GARGOYLE = ai->initSpell(SUMMON_GARGOYLE_1); + ARMY_OF_THE_DEAD = ai->initSpell(ARMY_OF_THE_DEAD_1); + ICY_TOUCH = ai->initSpell(ICY_TOUCH_1); // Frost + OBLITERATE = ai->initSpell(OBLITERATE_1); + HOWLING_BLAST = ai->initSpell(HOWLING_BLAST_1); + FROST_STRIKE = ai->initSpell(FROST_STRIKE_1); + CHAINS_OF_ICE = ai->initSpell(CHAINS_OF_ICE_1); + RUNE_STRIKE = ai->initSpell(RUNE_STRIKE_1); + ICY_CLUTCH = 0; // No such spell + MIND_FREEZE = ai->initSpell(MIND_FREEZE_1); + HUNGERING_COLD = ai->initSpell(HUNGERING_COLD_1); + KILLING_MACHINE = 0; // Passive + DEATHCHILL = ai->initSpell(DEATHCHILL_1); + HORN_OF_WINTER = ai->initSpell(HORN_OF_WINTER_1); + ICEBOUND_FORTITUDE= ai->initSpell(ICEBOUND_FORTITUDE_1); + EMPOWER_WEAPON = ai->initSpell(EMPOWER_RUNE_WEAPON_1); + UNBREAKABLE_ARMOR = ai->initSpell(UNBREAKABLE_ARMOR_1); + BLOOD_STRIKE = ai->initSpell(BLOOD_STRIKE_1); // Blood + PESTILENCE = ai->initSpell(PESTILENCE_1); + STRANGULATE = ai->initSpell(STRANGULATE_1); + BLOOD_BOIL = ai->initSpell(BLOOD_BOIL_1); + HEART_STRIKE = ai->initSpell(HEART_STRIKE_1); + DANCING_WEAPON = ai->initSpell(DANCING_RUNE_WEAPON_1); + DARK_COMMAND = ai->initSpell(DARK_COMMAND_1); + MARK_OF_BLOOD = ai->initSpell(MARK_OF_BLOOD_1); // buffs + RUNE_TAP = ai->initSpell(RUNE_TAP_1); + VAMPIRIC_BLOOD = ai->initSpell(VAMPIRIC_BLOOD_1); + DEATH_PACT = ai->initSpell(DEATH_PACT_1); + HYSTERIA = ai->initSpell(HYSTERIA_1); + UNHOLY_PRESENCE = ai->initSpell(UNHOLY_PRESENCE_1); // presence (TODO: better spell == presence) + FROST_PRESENCE = ai->initSpell(FROST_PRESENCE_1); + BLOOD_PRESENCE = ai->initSpell(BLOOD_PRESENCE_1); RECENTLY_BANDAGED = 11196; // first aid check // racial - ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf - GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei - STONEFORM = ai->getSpellId("stoneform"); // dwarf - ESCAPE_ARTIST = ai->getSpellId("escape artist"); // gnome - EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human - SHADOWMELD = ai->getSpellId("shadowmeld"); // night elf - BLOOD_FURY = ai->getSpellId("blood fury"); // orc - WAR_STOMP = ai->getSpellId("war stomp"); // tauren - BERSERKING = ai->getSpellId("berserking"); // troll - WILL_OF_THE_FORSAKEN = ai->getSpellId("will of the forsaken"); // undead + ARCANE_TORRENT = ai->initSpell(ARCANE_TORRENT_DEATH_KNIGHT); // blood elf + GIFT_OF_THE_NAARU = ai->initSpell(GIFT_OF_THE_NAARU_DEATH_KNIGHT); // draenei + STONEFORM = ai->initSpell(STONEFORM_ALL); // dwarf + ESCAPE_ARTIST = ai->initSpell(ESCAPE_ARTIST_ALL); // gnome + EVERY_MAN_FOR_HIMSELF = ai->initSpell(EVERY_MAN_FOR_HIMSELF_ALL); // human + BLOOD_FURY = ai->initSpell(BLOOD_FURY_MELEE_CLASSES); // orc + WAR_STOMP = ai->initSpell(WAR_STOMP_ALL); // tauren + BERSERKING = ai->initSpell(BERSERKING_ALL); // troll + WILL_OF_THE_FORSAKEN = ai->initSpell(WILL_OF_THE_FORSAKEN_ALL); // undead } PlayerbotDeathKnightAI::~PlayerbotDeathKnightAI() {} diff --git a/src/game/playerbot/PlayerbotDeathKnightAI.h b/src/game/playerbot/PlayerbotDeathKnightAI.h index 62f023c05..c6c70925f 100644 --- a/src/game/playerbot/PlayerbotDeathKnightAI.h +++ b/src/game/playerbot/PlayerbotDeathKnightAI.h @@ -12,8 +12,8 @@ enum enum DeathKnightSpells { - ANTIMAGIC_SHELL_1 = 48707, - ANTIMAGIC_ZONE_1 = 51052, + ANTI_MAGIC_SHELL_1 = 48707, + ANTI_MAGIC_ZONE_1 = 51052, ARMY_OF_THE_DEAD_1 = 42650, BLOOD_BOIL_1 = 48721, BLOOD_PRESENCE_1 = 48266, From caa023b64a3fd00138cfc28a620659a649d4af17 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 6 Aug 2010 11:27:30 +0400 Subject: [PATCH 092/187] Update warrior spell init --- src/game/playerbot/PlayerbotAI.h | 1 + src/game/playerbot/PlayerbotWarriorAI.cpp | 120 +++++++++++----------- 2 files changed, 61 insertions(+), 60 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 324435dbf..3bb802f09 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -34,6 +34,7 @@ enum RacialTraits GIFT_OF_THE_NAARU_PRIEST = 59544, GIFT_OF_THE_NAARU_SHAMAN = 59547, GIFT_OF_THE_NAARU_WARRIOR = 28880, + SHADOWMELD_ALL = 58984, STONEFORM_ALL = 20594, WAR_STOMP_ALL = 20549, WILL_OF_THE_FORSAKEN_ALL = 7744 diff --git a/src/game/playerbot/PlayerbotWarriorAI.cpp b/src/game/playerbot/PlayerbotWarriorAI.cpp index 742bce60b..ff5be130f 100644 --- a/src/game/playerbot/PlayerbotWarriorAI.cpp +++ b/src/game/playerbot/PlayerbotWarriorAI.cpp @@ -10,70 +10,70 @@ class PlayerbotAI; PlayerbotWarriorAI::PlayerbotWarriorAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) { - BATTLE_STANCE = ai->getSpellId("battle stance"); //ARMS - CHARGE = ai->getSpellId("charge"); //ARMS - OVERPOWER = ai->getSpellId("overpower"); // ARMS - HEROIC_STRIKE = ai->getSpellId("heroic strike"); //ARMS - REND = ai->getSpellId("rend"); //ARMS - THUNDER_CLAP = ai->getSpellId("thunder"); //ARMS - HAMSTRING = ai->getSpellId("hamstring"); //ARMS - MOCKING_BLOW = ai->getSpellId("mocking blow"); //ARMS - RETALIATION = ai->getSpellId("retaliation"); //ARMS - SWEEPING_STRIKES = ai->getSpellId("sweeping strikes"); //ARMS - MORTAL_STRIKE = ai->getSpellId("mortal strike"); //ARMS - BLADESTORM = ai->getSpellId("bladestorm"); //ARMS - HEROIC_THROW = ai->getSpellId("heroic throw"); //ARMS - SHATTERING_THROW = ai->getSpellId("shattering throw"); //ARMS - BLOODRAGE = ai->getSpellId("bloodrage"); //PROTECTION - DEFENSIVE_STANCE = ai->getSpellId("defensive stance"); //PROTECTION - DEVASTATE = ai->getSpellId("devastate"); //PROTECTION - SUNDER_ARMOR = ai->getSpellId("sunder armor"); //PROTECTION - TAUNT = ai->getSpellId("taunt"); //PROTECTION - SHIELD_BASH = ai->getSpellId("shield bash"); //PROTECTION - REVENGE = ai->getSpellId("revenge"); //PROTECTION - SHIELD_BLOCK = ai->getSpellId("shield block"); //PROTECTION - DISARM = ai->getSpellId("disarm"); //PROTECTION - SHIELD_WALL = ai->getSpellId("shield wall"); //PROTECTION - SHIELD_SLAM = ai->getSpellId("shield slam"); //PROTECTION - VIGILANCE = ai->getSpellId("vigilance"); //PROTECTION - DEVASTATE = ai->getSpellId("devastate"); //PROTECTION - SHOCKWAVE = ai->getSpellId("shockwave"); //PROTECTION - CONCUSSION_BLOW = ai->getSpellId("blow"); //PROTECTION - SPELL_REFLECTION = ai->getSpellId("spell reflection"); //PROTECTION - LAST_STAND = ai->getSpellId("last stand"); //PROTECTION - BATTLE_SHOUT = ai->getSpellId("battle shout"); //FURY - DEMORALIZING_SHOUT = ai->getSpellId("demoralizing shout"); //FURY - CLEAVE = ai->getSpellId("cleave"); //FURY - INTIMIDATING_SHOUT = ai->getSpellId("shout"); //FURY - EXECUTE = ai->getSpellId("execute"); //FURY - CHALLENGING_SHOUT = ai->getSpellId("challenging shout"); //FURY - SLAM = ai->getSpellId("slam"); //FURY - BERSERKER_STANCE = ai->getSpellId("berserker stance"); //FURY - INTERCEPT = ai->getSpellId("intercept"); //FURY - DEATH_WISH = ai->getSpellId("death wish");//FURY - BERSERKER_RAGE = ai->getSpellId("berserker rage");//FURY - WHIRLWIND = ai->getSpellId("whirlwind");//FURY - PUMMEL = ai->getSpellId("pummel"); //FURY - BLOODTHIRST = ai->getSpellId("bloodthirst"); //FURY - RECKLESSNESS = ai->getSpellId("recklessness"); //FURY - RAMPAGE = ai->getSpellId("rampage"); //FURY - HEROIC_FURY = ai->getSpellId("heroic fury"); //FURY - COMMANDING_SHOUT = ai->getSpellId("commanding shout"); //FURY - ENRAGED_REGENERATION = ai->getSpellId("enraged regeneration"); //FURY - PIERCING_HOWL = ai->getSpellId("piercing howl"); //FURY + BATTLE_STANCE = ai->initSpell(BATTLE_STANCE_1); //ARMS + CHARGE = ai->initSpell(CHARGE_1); //ARMS + OVERPOWER = ai->initSpell(OVERPOWER_1); // ARMS + HEROIC_STRIKE = ai->initSpell(HEROIC_STRIKE_1); //ARMS + REND = ai->initSpell(REND_1); //ARMS + THUNDER_CLAP = ai->initSpell(THUNDER_CLAP_1); //ARMS + HAMSTRING = ai->initSpell(HAMSTRING_1); //ARMS + MOCKING_BLOW = ai->initSpell(MOCKING_BLOW_1); //ARMS + RETALIATION = ai->initSpell(RETALIATION_1); //ARMS + SWEEPING_STRIKES = ai->initSpell(SWEEPING_STRIKES_1); //ARMS + MORTAL_STRIKE = ai->initSpell(MORTAL_STRIKE_1); //ARMS + BLADESTORM = ai->initSpell(BLADESTORM_1); //ARMS + HEROIC_THROW = ai->initSpell(HEROIC_THROW_1); //ARMS + SHATTERING_THROW = ai->initSpell(SHATTERING_THROW_1); //ARMS + BLOODRAGE = ai->initSpell(BLOODRAGE_1); //PROTECTION + DEFENSIVE_STANCE = ai->initSpell(DEFENSIVE_STANCE_1); //PROTECTION + DEVASTATE = ai->initSpell(DEVASTATE_1); //PROTECTION + SUNDER_ARMOR = ai->initSpell(SUNDER_ARMOR_1); //PROTECTION + TAUNT = ai->initSpell(TAUNT_1); //PROTECTION + SHIELD_BASH = ai->initSpell(SHIELD_BASH_1); //PROTECTION + REVENGE = ai->initSpell(REVENGE_1); //PROTECTION + SHIELD_BLOCK = ai->initSpell(SHIELD_BLOCK_1); //PROTECTION + DISARM = ai->initSpell(DISARM_1); //PROTECTION + SHIELD_WALL = ai->initSpell(SHIELD_WALL_1); //PROTECTION + SHIELD_SLAM = ai->initSpell(SHIELD_SLAM_1); //PROTECTION + VIGILANCE = ai->initSpell(VIGILANCE_1); //PROTECTION + DEVASTATE = ai->initSpell(DEVASTATE_1); //PROTECTION + SHOCKWAVE = ai->initSpell(SHOCKWAVE_1); //PROTECTION + CONCUSSION_BLOW = ai->initSpell(CONCUSSION_BLOW_1); //PROTECTION + SPELL_REFLECTION = ai->initSpell(SPELL_REFLECTION_1); //PROTECTION + LAST_STAND = ai->initSpell(LAST_STAND_1); //PROTECTION + BATTLE_SHOUT = ai->initSpell(BATTLE_SHOUT_1); //FURY + DEMORALIZING_SHOUT = ai->initSpell(DEMORALIZING_SHOUT_1); //FURY + CLEAVE = ai->initSpell(CLEAVE_1); //FURY + INTIMIDATING_SHOUT = ai->initSpell(INTIMIDATING_SHOUT_1); //FURY + EXECUTE = ai->initSpell(EXECUTE_1); //FURY + CHALLENGING_SHOUT = ai->initSpell(CHALLENGING_SHOUT_1); //FURY + SLAM = ai->initSpell(SLAM_1); //FURY + BERSERKER_STANCE = ai->initSpell(BERSERKER_STANCE_1); //FURY + INTERCEPT = ai->initSpell(INTERCEPT_1); //FURY + DEATH_WISH = ai->initSpell(DEATH_WISH_1);//FURY + BERSERKER_RAGE = ai->initSpell(BERSERKER_RAGE_1);//FURY + WHIRLWIND = ai->initSpell(WHIRLWIND_1);//FURY + PUMMEL = ai->initSpell(PUMMEL_1); //FURY + BLOODTHIRST = ai->initSpell(BLOODTHIRST_1); //FURY + RECKLESSNESS = ai->initSpell(RECKLESSNESS_1); //FURY + RAMPAGE = 0; // passive + HEROIC_FURY = ai->initSpell(HEROIC_FURY_1); //FURY + COMMANDING_SHOUT = ai->initSpell(COMMANDING_SHOUT_1); //FURY + ENRAGED_REGENERATION = ai->initSpell(ENRAGED_REGENERATION_1); //FURY + PIERCING_HOWL = ai->initSpell(PIERCING_HOWL_1); //FURY RECENTLY_BANDAGED = 11196; // first aid check // racial - GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei - STONEFORM = ai->getSpellId("stoneform"); // dwarf - ESCAPE_ARTIST = ai->getSpellId("escape artist"); // gnome - EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human - SHADOWMELD = ai->getSpellId("shadowmeld"); // night elf - BLOOD_FURY = ai->getSpellId("blood fury"); // orc - WAR_STOMP = ai->getSpellId("war stomp"); // tauren - BERSERKING = ai->getSpellId("berserking"); // troll - WILL_OF_THE_FORSAKEN = ai->getSpellId("will of the forsaken"); // undead + GIFT_OF_THE_NAARU = ai->initSpell(GIFT_OF_THE_NAARU_WARRIOR); // draenei + STONEFORM = ai->initSpell(STONEFORM_ALL); // dwarf + ESCAPE_ARTIST = ai->initSpell(ESCAPE_ARTIST_ALL); // gnome + EVERY_MAN_FOR_HIMSELF = ai->initSpell(EVERY_MAN_FOR_HIMSELF_ALL); // human + SHADOWMELD = ai->initSpell(SHADOWMELD_ALL); // night elf + BLOOD_FURY = ai->initSpell(BLOOD_FURY_MELEE_CLASSES); // orc + WAR_STOMP = ai->initSpell(WAR_STOMP_ALL); // tauren + BERSERKING = ai->initSpell(BERSERKING_ALL); // troll + WILL_OF_THE_FORSAKEN = ai->initSpell(WILL_OF_THE_FORSAKEN_ALL); // undead } PlayerbotWarriorAI::~PlayerbotWarriorAI() {} From 4adb670560be700b04d767af6d7b28d5ff2d7e19 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 6 Aug 2010 12:28:08 +0400 Subject: [PATCH 093/187] Update shaman spell init --- src/game/playerbot/PlayerbotShamanAI.cpp | 110 +++++++++++------------ 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/src/game/playerbot/PlayerbotShamanAI.cpp b/src/game/playerbot/PlayerbotShamanAI.cpp index 52b7dcd08..d06929ed6 100644 --- a/src/game/playerbot/PlayerbotShamanAI.cpp +++ b/src/game/playerbot/PlayerbotShamanAI.cpp @@ -5,67 +5,67 @@ class PlayerbotAI; PlayerbotShamanAI::PlayerbotShamanAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) { // restoration - CHAIN_HEAL = ai->getSpellId("chain heal"); - HEALING_WAVE = ai->getSpellId("healing wave"); - LESSER_HEALING_WAVE = ai->getSpellId("lesser healing wave"); - RIPTIDE = ai->getSpellId("riptide"); - ANCESTRAL_SPIRIT = ai->getSpellId("ancestral spirit"); - EARTH_SHIELD = ai->getSpellId("earth shield"); - WATER_SHIELD = ai->getSpellId("water shield"); - EARTHLIVING_WEAPON = ai->getSpellId("earthliving weapon"); - TREMOR_TOTEM = ai->getSpellId("tremor totem"); // totems - HEALING_STREAM_TOTEM = ai->getSpellId("healing stream totem"); - MANA_SPRING_TOTEM = ai->getSpellId("mana spring totem"); - MANA_TIDE_TOTEM = ai->getSpellId("mana tide totem"); + CHAIN_HEAL = ai->initSpell(CHAIN_HEAL_1); + HEALING_WAVE = ai->initSpell(HEALING_WAVE_1); + LESSER_HEALING_WAVE = ai->initSpell(LESSER_HEALING_WAVE_1); + RIPTIDE = ai->initSpell(RIPTIDE_1); + ANCESTRAL_SPIRIT = ai->initSpell(ANCESTRAL_SPIRIT_1); + EARTH_SHIELD = ai->initSpell(EARTH_SHIELD_1); + WATER_SHIELD = ai->initSpell(WATER_SHIELD_1); + EARTHLIVING_WEAPON = ai->initSpell(EARTHLIVING_WEAPON_1); + TREMOR_TOTEM = ai->initSpell(TREMOR_TOTEM_1); // totems + HEALING_STREAM_TOTEM = ai->initSpell(HEALING_STREAM_TOTEM_1); + MANA_SPRING_TOTEM = ai->initSpell(MANA_SPRING_TOTEM_1); + MANA_TIDE_TOTEM = ai->initSpell(MANA_TIDE_TOTEM_1); // enhancement - FOCUSED = ai->getSpellId("focused"); - STORMSTRIKE = ai->getSpellId("stormstrike"); - LAVA_LASH = ai->getSpellId("lava lash"); - SHAMANISTIC_RAGE = ai->getSpellId("shamanistic rage"); - BLOODLUST = ai->getSpellId("bloodlust"); - HEROISM = ai->getSpellId("heroism"); - FERAL_SPIRIT = ai->getSpellId("feral spirit"); - LIGHTNING_SHIELD = ai->getSpellId("lightning"); - ROCKBITER_WEAPON = ai->getSpellId("rockbiter"); - FLAMETONGUE_WEAPON = ai->getSpellId("flametongue weapon"); - FROSTBRAND_WEAPON = ai->getSpellId("frostbrand weapon"); - WINDFURY_WEAPON = ai->getSpellId("windfury weapon"); - STONESKIN_TOTEM = ai->getSpellId("stoneskin totem"); // totems - STRENGTH_OF_EARTH_TOTEM = ai->getSpellId("strength of earth totem"); - FROST_RESISTANCE_TOTEM = ai->getSpellId("frost resistance totem"); - FLAMETONGUE_TOTEM = ai->getSpellId("flametongue totem"); - FIRE_RESISTANCE_TOTEM = ai->getSpellId("fire resistance totem"); - GROUNDING_TOTEM = ai->getSpellId("grounding totem"); - NATURE_RESISTANCE_TOTEM = ai->getSpellId("nature resistance totem"); - WIND_FURY_TOTEM = ai->getSpellId("wind fury totem"); - STONESKIN_TOTEM = ai->getSpellId("stoneskin totem"); - WRATH_OF_AIR_TOTEM = ai->getSpellId("wrath of air totem"); - EARTH_ELEMENTAL_TOTEM = ai->getSpellId("earth elemental totem"); + FOCUSED = 0; // Focused what? + STORMSTRIKE = ai->initSpell(STORMSTRIKE_1); + LAVA_LASH = ai->initSpell(LAVA_LASH_1); + SHAMANISTIC_RAGE = ai->initSpell(SHAMANISTIC_RAGE_1); + BLOODLUST = ai->initSpell(BLOODLUST_1); + HEROISM = ai->initSpell(HEROISM_1); + FERAL_SPIRIT = ai->initSpell(FERAL_SPIRIT_1); + LIGHTNING_SHIELD = ai->initSpell(LIGHTNING_SHIELD_1); + ROCKBITER_WEAPON = ai->initSpell(ROCKBITER_WEAPON_1); + FLAMETONGUE_WEAPON = ai->initSpell(FLAMETONGUE_WEAPON_1); + FROSTBRAND_WEAPON = ai->initSpell(FROSTBRAND_WEAPON_1); + WINDFURY_WEAPON = ai->initSpell(WINDFURY_WEAPON_1); + STONESKIN_TOTEM = ai->initSpell(STONESKIN_TOTEM_1); // totems + STRENGTH_OF_EARTH_TOTEM = ai->initSpell(STRENGTH_OF_EARTH_TOTEM_1); + FROST_RESISTANCE_TOTEM = ai->initSpell(FROST_RESISTANCE_TOTEM_1); + FLAMETONGUE_TOTEM = ai->initSpell(FLAMETONGUE_TOTEM_1); + FIRE_RESISTANCE_TOTEM = ai->initSpell(FIRE_RESISTANCE_TOTEM_1); + GROUNDING_TOTEM = ai->initSpell(GROUNDING_TOTEM_1); + NATURE_RESISTANCE_TOTEM = ai->initSpell(NATURE_RESISTANCE_TOTEM_1); + WIND_FURY_TOTEM = ai->initSpell(WINDFURY_TOTEM_1); + STONESKIN_TOTEM = ai->initSpell(STONESKIN_TOTEM_1); + WRATH_OF_AIR_TOTEM = ai->initSpell(WRATH_OF_AIR_TOTEM_1); + EARTH_ELEMENTAL_TOTEM = ai->initSpell(EARTH_ELEMENTAL_TOTEM_1); // elemental - LIGHTNING_BOLT = ai->getSpellId("lightning bolt"); - EARTH_SHOCK = ai->getSpellId("earth shock"); - FLAME_SHOCK = ai->getSpellId("flame shock"); - PURGE = ai->getSpellId("purge"); - WIND_SHOCK = ai->getSpellId("wind shock"); - FROST_SHOCK = ai->getSpellId("frost shock"); - CHAIN_LIGHTNING = ai->getSpellId("chain lightning"); - LAVA_BURST = ai->getSpellId("lava burst"); - HEX = ai->getSpellId("hex"); - STONECLAW_TOTEM = ai->getSpellId("stoneclaw totem"); // totems - SEARING_TOTEM = ai->getSpellId("searing totem"); - FIRE_NOVA_TOTEM = ai->getSpellId("fire nova totem"); - MAGMA_TOTEM = ai->getSpellId("magma totem"); - EARTHBIND_TOTEM = ai->getSpellId("earthbind totem"); - TOTEM_OF_WRATH = ai->getSpellId("totem of wrath"); - FIRE_ELEMENTAL_TOTEM = ai->getSpellId("fire elemental totem"); + LIGHTNING_BOLT = ai->initSpell(LIGHTNING_BOLT_1); + EARTH_SHOCK = ai->initSpell(EARTH_SHOCK_1); + FLAME_SHOCK = ai->initSpell(FLAME_SHOCK_1); + PURGE = ai->initSpell(PURGE_1); + WIND_SHOCK = 0; //NPC spell + FROST_SHOCK = ai->initSpell(FROST_SHOCK_1); + CHAIN_LIGHTNING = ai->initSpell(CHAIN_LIGHTNING_1); + LAVA_BURST = ai->initSpell(LAVA_BURST_1); + HEX = ai->initSpell(HEX_1); + STONECLAW_TOTEM = ai->initSpell(STONECLAW_TOTEM_1); // totems + SEARING_TOTEM = ai->initSpell(SEARING_TOTEM_1); + FIRE_NOVA_TOTEM = 0; // NPC only spell, check FIRE_NOVA_1 + MAGMA_TOTEM = ai->initSpell(MAGMA_TOTEM_1); + EARTHBIND_TOTEM = ai->initSpell(EARTHBIND_TOTEM_1); + TOTEM_OF_WRATH = ai->initSpell(TOTEM_OF_WRATH_1); + FIRE_ELEMENTAL_TOTEM = ai->initSpell(FIRE_ELEMENTAL_TOTEM_1); RECENTLY_BANDAGED = 11196; // first aid check // racial - GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei - BLOOD_FURY = ai->getSpellId("blood fury"); // orc - WAR_STOMP = ai->getSpellId("war stomp"); // tauren - BERSERKING = ai->getSpellId("berserking"); // troll + GIFT_OF_THE_NAARU = ai->initSpell(GIFT_OF_THE_NAARU_SHAMAN); // draenei + BLOOD_FURY = ai->initSpell(BLOOD_FURY_SHAMAN); // orc + WAR_STOMP = ai->initSpell(WAR_STOMP_ALL); // tauren + BERSERKING = ai->initSpell(BERSERKING_ALL); // troll } PlayerbotShamanAI::~PlayerbotShamanAI() {} From 1b9b100c8a0865b7f33b5f43d2cb4ade50e9c37f Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 6 Aug 2010 12:34:34 +0400 Subject: [PATCH 094/187] Update rogue spell init --- src/game/playerbot/PlayerbotRogueAI.cpp | 83 ++++++++++++------------- 1 file changed, 40 insertions(+), 43 deletions(-) diff --git a/src/game/playerbot/PlayerbotRogueAI.cpp b/src/game/playerbot/PlayerbotRogueAI.cpp index 4d7618066..386d06d0c 100644 --- a/src/game/playerbot/PlayerbotRogueAI.cpp +++ b/src/game/playerbot/PlayerbotRogueAI.cpp @@ -10,54 +10,51 @@ class PlayerbotAI; PlayerbotRogueAI::PlayerbotRogueAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) { + SINISTER_STRIKE = ai->initSpell(SINISTER_STRIKE_1); + BACKSTAB = ai->initSpell(BACKSTAB_1); + KICK = ai->initSpell(KICK_1); + FEINT = ai->initSpell(FEINT_1); + FAN_OF_KNIVES = ai->initSpell(FAN_OF_KNIVES_1); + DEADLY_POISON = 25351; //SpellID + CRIPPLING_POISON = 3408; //SpellID + MIND_NUMBING_POISON = 5761; //SpellID + GOUGE = ai->initSpell(GOUGE_1); + SPRINT = ai->initSpell(SPRINT_1); - SINISTER_STRIKE = ai->getSpellId("sinister strike"); //COMBAT - BACKSTAB = ai->getSpellId("backstab"); - KICK = ai->getSpellId("kick"); - FEINT = ai->getSpellId("feint"); - FAN_OF_KNIVES = ai->getSpellId("fan of knives"); -// DEADLY_POISON = 20844; //ItemID - DEADLY_POISON = 25351; //SpellID -// CRIPPLING_POISON = 3775; //ItemID - CRIPPLING_POISON = 3408; //SpellID - MIND_NUMBING_POISON = 5761; //SpellID - GOUGE = ai->getSpellId("gouge"); - SPRINT = ai->getSpellId("sprint"); + SHADOWSTEP = ai->initSpell(SHADOWSTEP_1); + STEALTH = ai->initSpell(STEALTH_1); + VANISH = ai->initSpell(VANISH_1); + EVASION = ai->initSpell(EVASION_1); + CLOAK_OF_SHADOWS = ai->initSpell(CLOAK_OF_SHADOWS_1); + HEMORRHAGE = ai->initSpell(HEMORRHAGE_1); + GHOSTLY_STRIKE = ai->initSpell(GHOSTLY_STRIKE_1); + SHADOW_DANCE = ai->initSpell(SHADOW_DANCE_1); + BLIND = ai->initSpell(BLIND_1); + DISTRACT = ai->initSpell(DISTRACT_1); + PREPARATION = ai->initSpell(PREPARATION_1); + PREMEDITATION = ai->initSpell(PREMEDITATION_1); - SHADOWSTEP = ai->getSpellId("shadowstep"); //SUBTLETY - STEALTH = ai->getSpellId("stealth"); - VANISH = ai->getSpellId("vanish"); - EVASION = ai->getSpellId("evasion"); - CLOAK_OF_SHADOWS = ai->getSpellId("cloak of shadows"); - HEMORRHAGE = ai->getSpellId("hemorrhage"); - GHOSTLY_STRIKE = ai->getSpellId("ghostly strike"); - SHADOW_DANCE = ai->getSpellId("shadow dance"); - BLIND = ai->getSpellId("blind"); - DISTRACT = ai->getSpellId("distract"); - PREPARATION = ai->getSpellId("preparation"); - PREMEDITATION = ai->getSpellId("premeditation"); - - EVISCERATE = ai->getSpellId("eviscerate"); //ASSASSINATION - KIDNEY_SHOT = ai->getSpellId("kidney shot"); - SLICE_DICE = ai->getSpellId("slice and dice"); - GARROTE = ai->getSpellId("garrote"); - EXPOSE_ARMOR = ai->getSpellId("expose armor"); - RUPTURE = ai->getSpellId("rupture"); - DISMANTLE = ai->getSpellId("dismantle"); - CHEAP_SHOT = ai->getSpellId("cheap shot"); - AMBUSH = ai->getSpellId("ambush"); - MUTILATE = ai->getSpellId("mutilate"); + EVISCERATE = ai->initSpell(EVISCERATE_1); + KIDNEY_SHOT = ai->initSpell(KIDNEY_SHOT_1); + SLICE_DICE = ai->initSpell(SLICE_AND_DICE_1); + GARROTE = ai->initSpell(GARROTE_1); + EXPOSE_ARMOR = ai->initSpell(EXPOSE_ARMOR_1); + RUPTURE = ai->initSpell(RUPTURE_1); + DISMANTLE = ai->initSpell(DISMANTLE_1); + CHEAP_SHOT = ai->initSpell(CHEAP_SHOT_1); + AMBUSH = ai->initSpell(AMBUSH_1); + MUTILATE = ai->initSpell(MUTILATE_1); RECENTLY_BANDAGED = 11196; // first aid check // racial - ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf - STONEFORM = ai->getSpellId("stoneform"); // dwarf - ESCAPE_ARTIST = ai->getSpellId("escape artist"); // gnome - EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human - SHADOWMELD = ai->getSpellId("shadowmeld"); // night elf - BLOOD_FURY = ai->getSpellId("blood fury"); // orc - BERSERKING = ai->getSpellId("berserking"); // troll - WILL_OF_THE_FORSAKEN = ai->getSpellId("will of the forsaken"); // undead + ARCANE_TORRENT = ai->initSpell(ARCANE_TORRENT_ROGUE); + STONEFORM = ai->initSpell(STONEFORM_ALL); // dwarf + ESCAPE_ARTIST = ai->initSpell(ESCAPE_ARTIST_ALL); // gnome + EVERY_MAN_FOR_HIMSELF = ai->initSpell(EVERY_MAN_FOR_HIMSELF_ALL); // human + SHADOWMELD = ai->initSpell(SHADOWMELD_ALL); + BLOOD_FURY = ai->initSpell(BLOOD_FURY_MELEE_CLASSES); // orc + BERSERKING = ai->initSpell(BERSERKING_ALL); // troll + WILL_OF_THE_FORSAKEN = ai->initSpell(WILL_OF_THE_FORSAKEN_ALL); // undead } PlayerbotRogueAI::~PlayerbotRogueAI() {} From e1783cf2df2f9e0a53ea75a8923cd9ab3caacbe6 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 6 Aug 2010 12:55:10 +0400 Subject: [PATCH 095/187] Update paladin spell init --- src/game/playerbot/PlayerbotPaladinAI.cpp | 116 +++++++++++----------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/src/game/playerbot/PlayerbotPaladinAI.cpp b/src/game/playerbot/PlayerbotPaladinAI.cpp index 399ecce3d..aab0ac4a8 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.cpp +++ b/src/game/playerbot/PlayerbotPaladinAI.cpp @@ -12,64 +12,64 @@ class PlayerbotAI; PlayerbotPaladinAI::PlayerbotPaladinAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) { - - RETRIBUTION_AURA = ai->getSpellId("retribution aura");// Retribution - CRUSADER_AURA = ai->getSpellId("crusader aura"); - CRUSADER_STRIKE = ai->getSpellId("crusader strike"); - SEAL_OF_COMMAND = ai->getSpellId("command"); - JUDGEMENT_OF_LIGHT = ai->getSpellId("judgement of light"); - JUDGEMENT_OF_WISDOM = ai->getSpellId("judgement of wisdom"); - JUDGEMENT_OF_JUSTICE = ai->getSpellId("judgement of justice"); - DIVINE_STORM = ai->getSpellId("divine storm"); - BLESSING_OF_MIGHT = ai->getSpellId("blessing of might"); - GREATER_BLESSING_OF_MIGHT = ai->getSpellId("greater blessing of might"); - HAMMER_OF_WRATH = ai->getSpellId("hammer of wrath"); - FLASH_OF_LIGHT = ai->getSpellId("flash of light"); // Holy - HOLY_LIGHT = ai->getSpellId("holy light"); - HOLY_SHOCK = ai->getSpellId("shock"); - HOLY_WRATH = ai->getSpellId("wrath"); - DIVINE_FAVOR = ai->getSpellId("divine favor"); - CONCENTRATION_AURA = ai->getSpellId("concentration aura"); - BLESSING_OF_WISDOM = ai->getSpellId("blessing of wisdom"); - GREATER_BLESSING_OF_WISDOM = ai->getSpellId("greater blessing of wisdom"); - CONSECRATION = ai->getSpellId("consecration"); - AVENGING_WRATH = ai->getSpellId("avenging wrath"); - LAY_ON_HANDS = ai->getSpellId("lay on hands"); - EXORCISM = ai->getSpellId("exorcism"); - SACRED_SHIELD = ai->getSpellId("sacred shield"); - DIVINE_PLEA = ai->getSpellId("divine plea"); - BLESSING_OF_KINGS = ai->getSpellId("blessing of kings"); // Protection - GREATER_BLESSING_OF_KINGS = ai->getSpellId("greater blessing of kings"); - GREATER_BLESSING_OF_SANCTUARY= ai->getSpellId("greater blessing of sanctuary"); - HAMMER_OF_JUSTICE = ai->getSpellId("hammer of justice"); - RIGHTEOUS_FURY = ai->getSpellId("righteous fury"); - RIGHTEOUS_DEFENSE = ai->getSpellId("righteous defense"); - SHADOW_RESISTANCE_AURA = ai->getSpellId("shadow resistance aura"); - DEVOTION_AURA = ai->getSpellId("devotion aura"); - FIRE_RESISTANCE_AURA = ai->getSpellId("fire resistance aura"); - FROST_RESISTANCE_AURA = ai->getSpellId("frost resistance aura"); - HAND_OF_PROTECTION = ai->getSpellId("hand of protection"); - DIVINE_PROTECTION = ai->getSpellId("divine protection"); - DIVINE_INTERVENTION = ai->getSpellId("divine intervention"); - DIVINE_SACRIFICE = ai->getSpellId("divine"); - DIVINE_SHIELD = ai->getSpellId("divine shield"); - HOLY_SHIELD = ai->getSpellId("holy shield"); - AVENGERS_SHIELD = ai->getSpellId("avenger's shield"); - HAND_OF_SACRIFICE = ai->getSpellId("hand of sacrifice"); - SHIELD_OF_RIGHTEOUSNESS = ai->getSpellId("shield of righteousness"); - DEFENSIVE_STANCE = 71; //Def Stance - BERSERKER_STANCE = 2458; //Ber Stance - BATTLE_STANCE = 2457; //Bat Stance - - FORBEARANCE = 25771; // cannot be protected - - RECENTLY_BANDAGED = 11196; // first aid check - - // racial - ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf - GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei - STONEFORM = ai->getSpellId("stoneform"); // dwarf - EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human + RETRIBUTION_AURA = ai->initSpell(RETRIBUTION_AURA_1); + CRUSADER_AURA = ai->initSpell(CRUSADER_AURA_1); + CRUSADER_STRIKE = ai->initSpell(CRUSADER_STRIKE_1); + SEAL_OF_COMMAND = ai->initSpell(SEAL_OF_COMMAND_1); + JUDGEMENT_OF_LIGHT = ai->initSpell(JUDGEMENT_OF_LIGHT_1); + JUDGEMENT_OF_WISDOM = ai->initSpell(JUDGEMENT_OF_WISDOM_1); + JUDGEMENT_OF_JUSTICE = ai->initSpell(JUDGEMENT_OF_JUSTICE_1); + DIVINE_STORM = ai->initSpell(DIVINE_STORM_1); + BLESSING_OF_MIGHT = ai->initSpell(BLESSING_OF_MIGHT_1); + GREATER_BLESSING_OF_MIGHT = ai->initSpell(GREATER_BLESSING_OF_MIGHT_1); + HAMMER_OF_WRATH = ai->initSpell(HAMMER_OF_WRATH_1); + FLASH_OF_LIGHT = ai->initSpell(FLASH_OF_LIGHT_1); // Holy + HOLY_LIGHT = ai->initSpell(HOLY_LIGHT_1); + HOLY_SHOCK = ai->initSpell(HOLY_SHOCK_1); + HOLY_WRATH = ai->initSpell(HOLY_WRATH_1); + DIVINE_FAVOR = ai->initSpell(DIVINE_FAVOR_1); + CONCENTRATION_AURA = ai->initSpell(CONCENTRATION_AURA_1); + BLESSING_OF_WISDOM = ai->initSpell(BLESSING_OF_WISDOM_1); + GREATER_BLESSING_OF_WISDOM = ai->initSpell(GREATER_BLESSING_OF_WISDOM_1); + CONSECRATION = ai->initSpell(CONSECRATION_1); + AVENGING_WRATH = ai->initSpell(AVENGING_WRATH_1); + LAY_ON_HANDS = ai->initSpell(LAY_ON_HANDS_1); + EXORCISM = ai->initSpell(EXORCISM_1); + SACRED_SHIELD = ai->initSpell(SACRED_SHIELD_1); + DIVINE_PLEA = ai->initSpell(DIVINE_PLEA_1); + BLESSING_OF_KINGS = ai->initSpell(BLESSING_OF_KINGS_1); // Protection + GREATER_BLESSING_OF_KINGS = ai->initSpell(GREATER_BLESSING_OF_KINGS_1); + GREATER_BLESSING_OF_SANCTUARY = ai->initSpell(GREATER_BLESSING_OF_SANCTUARY_1); + HAMMER_OF_JUSTICE = ai->initSpell(HAMMER_OF_JUSTICE_1); + RIGHTEOUS_FURY = ai->initSpell(RIGHTEOUS_FURY_1); + RIGHTEOUS_DEFENSE = ai->initSpell(RIGHTEOUS_DEFENSE_1); + SHADOW_RESISTANCE_AURA = ai->initSpell(SHADOW_RESISTANCE_AURA_1); + DEVOTION_AURA = ai->initSpell(DEVOTION_AURA_1); + FIRE_RESISTANCE_AURA = ai->initSpell(FIRE_RESISTANCE_AURA_1); + FROST_RESISTANCE_AURA = ai->initSpell(FROST_RESISTANCE_AURA_1); + HAND_OF_PROTECTION = ai->initSpell(HAND_OF_PROTECTION_1); + DIVINE_PROTECTION = ai->initSpell(DIVINE_PROTECTION_1); + DIVINE_INTERVENTION = ai->initSpell(DIVINE_INTERVENTION_1); + DIVINE_SACRIFICE = ai->initSpell(DIVINE_SACRIFICE_1); + DIVINE_SHIELD = ai->initSpell(DIVINE_SHIELD_1); + HOLY_SHIELD = ai->initSpell(HOLY_SHIELD_1); + AVENGERS_SHIELD = ai->initSpell(AVENGERS_SHIELD_1); + HAND_OF_SACRIFICE = ai->initSpell(HAND_OF_SACRIFICE_1); + SHIELD_OF_RIGHTEOUSNESS = ai->initSpell(SHIELD_OF_RIGHTEOUSNESS_1); + // Warrior auras + DEFENSIVE_STANCE = 71; //Def Stance + BERSERKER_STANCE = 2458; //Ber Stance + BATTLE_STANCE = 2457; //Bat Stance + + FORBEARANCE = 25771; // cannot be protected + + RECENTLY_BANDAGED = 11196; // first aid check + + // racial + ARCANE_TORRENT = ai->initSpell(ARCANE_TORRENT_MANA_CLASSES); + GIFT_OF_THE_NAARU = ai->initSpell(GIFT_OF_THE_NAARU_PALADIN); // draenei + STONEFORM = ai->initSpell(STONEFORM_ALL); // dwarf + EVERY_MAN_FOR_HIMSELF = ai->initSpell(EVERY_MAN_FOR_HIMSELF_ALL); // human } PlayerbotPaladinAI::~PlayerbotPaladinAI() {} From 83c09548c6a3aea1f1441ae08f84f9bf1a053a65 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 6 Aug 2010 13:11:49 +0400 Subject: [PATCH 096/187] Update hunter spell init --- src/game/playerbot/PlayerbotHunterAI.cpp | 115 ++++++++++++----------- 1 file changed, 58 insertions(+), 57 deletions(-) diff --git a/src/game/playerbot/PlayerbotHunterAI.cpp b/src/game/playerbot/PlayerbotHunterAI.cpp index b2ba9a1d6..381a14553 100644 --- a/src/game/playerbot/PlayerbotHunterAI.cpp +++ b/src/game/playerbot/PlayerbotHunterAI.cpp @@ -8,71 +8,72 @@ class PlayerbotAI; PlayerbotHunterAI::PlayerbotHunterAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) { // PET CTRL - PET_SUMMON = ai->getSpellId("call pet"); - PET_DISMISS = ai->getSpellId("dismiss pet"); - PET_REVIVE = ai->getSpellId("revive pet"); - PET_MEND = ai->getSpellId("mend pet"); - PET_FEED = 1539; - - // PET SKILLS - INTIMIDATION = ai->getSpellId("intimidation"); // (generic) - SONIC_BLAST = ai->getSpellId("sonic blast"); // bat - DEMORALIZING_SCREECH = ai->getSpellId("demoralizing screech"); // carrion bird - BAD_ATTITUDE = ai->getSpellId("bad attitude"); // crocolisk - NETHER_SHOCK = ai->getSpellId("nether shock"); // nether ray + PET_SUMMON = ai->initSpell(PET_SUMMON_1); + PET_DISMISS = ai->initSpell(PET_DISMISS_1); + PET_REVIVE = ai->initSpell(PET_REVIVE_1); + PET_MEND = ai->initSpell(PET_MEND_1); + PET_FEED = 1539; + + INTIMIDATION = ai->initSpell(INTIMIDATION_1); // (generic) + + // PET SKILLS must be initialized by pets + SONIC_BLAST = 0; // bat + DEMORALIZING_SCREECH = 0; + BAD_ATTITUDE = 0; // crocolisk + NETHER_SHOCK = 0; // RANGED COMBAT - AUTO_SHOT = ai->getSpellId("auto shot"); // basic ranged hunter fighting - HUNTERS_MARK = ai->getSpellId("hunter's mark"); // mark target to get higher ranged combat power - ARCANE_SHOT = ai->getSpellId("arcane shot"); - CONCUSSIVE_SHOT = ai->getSpellId("concussive shot"); - DISTRACTING_SHOT = ai->getSpellId("distracting shot"); - MULTI_SHOT = ai->getSpellId("multi-shot"); - EXPLOSIVE_SHOT = ai->getSpellId("explosive shot"); - SERPENT_STING = ai->getSpellId("serpent sting"); - SCORPID_STING = ai->getSpellId("scorpid sting"); - WYVERN_STING = ai->getSpellId("wyvern sting"); - VIPER_STING = ai->getSpellId("viper sting"); - AIMED_SHOT = ai->getSpellId("aimed shot"); - STEADY_SHOT = ai->getSpellId("steady shot"); - CHIMERA_SHOT = ai->getSpellId("chimera shot"); - VOLLEY = ai->getSpellId("volley"); - BLACK_ARROW = ai->getSpellId("black arrow"); - KILL_SHOT = ai->getSpellId("kill shot"); + AUTO_SHOT = ai->initSpell(AUTO_SHOT_1); + HUNTERS_MARK = ai->initSpell(HUNTERS_MARK_1); + ARCANE_SHOT = ai->initSpell(ARCANE_SHOT_1); + CONCUSSIVE_SHOT = ai->initSpell(CONCUSSIVE_SHOT_1); + DISTRACTING_SHOT = ai->initSpell(DISTRACTING_SHOT_1); + MULTI_SHOT = ai->initSpell(MULTISHOT_1); + EXPLOSIVE_SHOT = ai->initSpell(EXPLOSIVE_SHOT_1); + SERPENT_STING = ai->initSpell(SERPENT_STING_1); + SCORPID_STING = ai->initSpell(SCORPID_STING_1); + WYVERN_STING = ai->initSpell(WYVERN_STING_1); + VIPER_STING = ai->initSpell(VIPER_STING_1); + AIMED_SHOT = ai->initSpell(AIMED_SHOT_1); + STEADY_SHOT = ai->initSpell(STEADY_SHOT_1); + CHIMERA_SHOT = ai->initSpell(CHIMERA_SHOT_1); + VOLLEY = ai->initSpell(VOLLEY_1); + BLACK_ARROW = ai->initSpell(BLACK_ARROW_1); + KILL_SHOT = ai->initSpell(KILL_SHOT_1); // MELEE - RAPTOR_STRIKE = ai->getSpellId("raptor strike"); - WING_CLIP = ai->getSpellId("wing clip"); - MONGOOSE_BITE = ai->getSpellId("mongoose bite"); - DISENGAGE = ai->getSpellId("disengage"); - MISDIRECTION = ai->getSpellId("misdirection"); - DETERRENCE = ai->getSpellId("deterrence"); + RAPTOR_STRIKE = ai->initSpell(RAPTOR_STRIKE_1); + WING_CLIP = ai->initSpell(WING_CLIP_1); + MONGOOSE_BITE = ai->initSpell(MONGOOSE_BITE_1); + DISENGAGE = ai->initSpell(DISENGAGE_1); + MISDIRECTION = ai->initSpell(MISDIRECTION_1); + DETERRENCE = ai->initSpell(DETERRENCE_1); // TRAPS - BEAR_TRAP = ai->getSpellId("bear trap"); - FREEZING_TRAP = ai->getSpellId("freezing trap"); - IMMOLATION_TRAP = ai->getSpellId("immolation trap"); - FROST_TRAP = ai->getSpellId("frost trap"); - EXPLOSIVE_TRAP = ai->getSpellId("explosive trap"); - ARCANE_TRAP = ai->getSpellId("arcane trap"); - SNAKE_TRAP = ai->getSpellId("snake trap"); + BEAR_TRAP = 0; // non-player spell + FREEZING_TRAP = ai->initSpell(FREEZING_TRAP_1); + IMMOLATION_TRAP = ai->initSpell(IMMOLATION_TRAP_1); + FROST_TRAP = ai->initSpell(FROST_TRAP_1); + EXPLOSIVE_TRAP = ai->initSpell(EXPLOSIVE_TRAP_1); + ARCANE_TRAP = 0; // non-player spell + SNAKE_TRAP = ai->initSpell(SNAKE_TRAP_1); // BUFFS - ASPECT_OF_THE_HAWK = ai->getSpellId("aspect of the hawk"); - ASPECT_OF_THE_MONKEY = ai->getSpellId("aspect of the monkey"); - RAPID_FIRE = ai->getSpellId("rapid fire"); - TRUESHOT_AURA = 19506; - - RECENTLY_BANDAGED = 11196; // first aid check - - // racial - ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf - GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei - STONEFORM = ai->getSpellId("stoneform"); // dwarf - SHADOWMELD = ai->getSpellId("shadowmeld"); // night elf - BLOOD_FURY = ai->getSpellId("blood fury"); // orc - WAR_STOMP = ai->getSpellId("war stomp"); // tauren - BERSERKING = ai->getSpellId("berserking"); // troll + ASPECT_OF_THE_HAWK = ai->initSpell(ASPECT_OF_THE_HAWK_1); + ASPECT_OF_THE_MONKEY = ai->initSpell(ASPECT_OF_THE_MONKEY_1); + RAPID_FIRE = ai->initSpell(RAPID_FIRE_1); + TRUESHOT_AURA = ai->initSpell(TRUESHOT_AURA_1); + + RECENTLY_BANDAGED = 11196; // first aid check + + // racial + ARCANE_TORRENT = ai->initSpell(ARCANE_TORRENT_MANA_CLASSES); + GIFT_OF_THE_NAARU = ai->initSpell(GIFT_OF_THE_NAARU_HUNTER); // draenei + STONEFORM = ai->initSpell(STONEFORM_ALL); // dwarf + SHADOWMELD = ai->initSpell(SHADOWMELD_ALL); + BLOOD_FURY = ai->initSpell(BLOOD_FURY_MELEE_CLASSES); // orc + WAR_STOMP = ai->initSpell(WAR_STOMP_ALL); // tauren + BERSERKING = ai->initSpell(BERSERKING_ALL); // troll m_petSummonFailed = false; m_rangedCombat = true; From b14af8f3ebb7b73414f389073b266ca85b2d02e9 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 6 Aug 2010 13:25:45 +0400 Subject: [PATCH 097/187] Update druid spell init --- src/game/playerbot/PlayerbotDruidAI.cpp | 105 ++++++++++++------------ 1 file changed, 52 insertions(+), 53 deletions(-) diff --git a/src/game/playerbot/PlayerbotDruidAI.cpp b/src/game/playerbot/PlayerbotDruidAI.cpp index 3cf5f6dcf..2534db91b 100644 --- a/src/game/playerbot/PlayerbotDruidAI.cpp +++ b/src/game/playerbot/PlayerbotDruidAI.cpp @@ -10,59 +10,58 @@ class PlayerbotAI; PlayerbotDruidAI::PlayerbotDruidAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) { - - MOONFIRE = ai->getSpellId("moonfire"); // attacks - STARFIRE = ai->getSpellId("starfire"); - STARFALL = ai->getSpellId("starfall"); - WRATH = ai->getSpellId("wrath"); - ROOTS = ai->getSpellId("roots"); - INSECT_SWARM = ai->getSpellId("insect swarm"); - FORCE_OF_NATURE = ai->getSpellId("force of nature"); - HURRICANE = ai->getSpellId("hurricane"); - MARK_OF_THE_WILD = ai->getSpellId("mark of the wild"); // buffs - THORNS = ai->getSpellId("thorns"); - BARKSKIN = ai->getSpellId("barkskin"); - INNERVATE = ai->getSpellId("innervate"); - MANA_REJUVENATION = ai->getSpellId("mana rejuvenation"); - FAERIE_FIRE = ai->getSpellId("faerie fire"); // debuffs - REJUVENATION = ai->getSpellId("rejuvenation"); // heals - REGROWTH = ai->getSpellId("regrowth"); - WILD_GROWTH = ai->getSpellId("wild growth"); - LIFEBLOOM = ai->getSpellId("lifebloom"); - NOURISH = ai->getSpellId("nourish"); - HEALING_TOUCH = ai->getSpellId("healing touch"); - SWIFTMEND = ai->getSpellId("swiftmend"); - TRANQUILITY = ai->getSpellId("tranquility"); - //Druid Forms - MOONKIN_FORM = ai->getSpellId("moonkin form"); - DIRE_BEAR_FORM = ai->getSpellId("dire bear form"); - BEAR_FORM = ai->getSpellId("bear form"); - CAT_FORM = ai->getSpellId("cat form"); - TREE_OF_LIFE = 33891; - //Cat Attack type's - RAKE = ai->getSpellId("rake"); //40 energy - CLAW = ai->getSpellId("claw"); //45 - COWER = ai->getSpellId("cower"); //20 - MANGLE = ai->getSpellId("mangle"); //45 - TIGERS_FURY = ai->getSpellId("tigers's fury"); - //Cat Finishing Move's - RIP = ai->getSpellId("rip"); //30 - FEROCIOUS_BITE = ai->getSpellId("ferocious bite"); //35 - MAIM = ai->getSpellId("maim"); //35 - //Bear/Dire Bear Attacks & Buffs - BASH = ai->getSpellId("bash"); //10 rage - MAUL = ai->getSpellId("maul"); //15 - SWIPE = ai->getSpellId("swipe"); //20 - DEMORALIZING_ROAR = ai->getSpellId("roar"); //10 - CHALLENGING_ROAR = ai->getSpellId("challenging roar");//15 - ENRAGE = ai->getSpellId("enrage"); - GROWL = ai->getSpellId("growl"); - - RECENTLY_BANDAGED = 11196; // first aid check - - // racial - SHADOWMELD = ai->getSpellId("shadowmeld"); // night elf - WAR_STOMP = ai->getSpellId("war stomp"); // tauren + MOONFIRE = ai->initSpell(MOONFIRE_1); // attacks + STARFIRE = ai->initSpell(STARFIRE_1); + STARFALL = ai->initSpell(STARFALL_1); + WRATH = ai->initSpell(WRATH_1); + ROOTS = ai->initSpell(ENTANGLING_ROOTS_1); + INSECT_SWARM = ai->initSpell(INSECT_SWARM_1); + FORCE_OF_NATURE = ai->initSpell(FORCE_OF_NATURE_1); + HURRICANE = ai->initSpell(HURRICANE_1); + MARK_OF_THE_WILD = ai->initSpell(MARK_OF_THE_WILD_1); // buffs + THORNS = ai->initSpell(THORNS_1); + BARKSKIN = ai->initSpell(BARKSKIN_1); + INNERVATE = ai->initSpell(INNERVATE_1); + MANA_REJUVENATION = 0; // Who on earth put it here? + FAERIE_FIRE = ai->initSpell(FAERIE_FIRE_1); // debuffs + REJUVENATION = ai->initSpell(REJUVENATION_1); // heals + REGROWTH = ai->initSpell(REGROWTH_1); + WILD_GROWTH = ai->initSpell(WILD_GROWTH_1); + LIFEBLOOM = ai->initSpell(LIFEBLOOM_1); + NOURISH = ai->initSpell(NOURISH_1); + HEALING_TOUCH = ai->initSpell(HEALING_TOUCH_1); + SWIFTMEND = ai->initSpell(SWIFTMEND_1); + TRANQUILITY = ai->initSpell(TRANQUILITY_1); + // Druid Forms + MOONKIN_FORM = ai->initSpell(MOONKIN_FORM_1); + DIRE_BEAR_FORM = ai->initSpell(DIRE_BEAR_FORM_1); + BEAR_FORM = ai->initSpell(BEAR_FORM_1); + CAT_FORM = ai->initSpell(CAT_FORM_1); + TREE_OF_LIFE = ai->initSpell(TREE_OF_LIFE_1); + // Cat Attack type's + RAKE = ai->initSpell(RAKE_1); + CLAW = ai->initSpell(CLAW_1); // 45 + COWER = ai->initSpell(COWER_1); // 20 + MANGLE = ai->initSpell(MANGLE_1); // 45 + TIGERS_FURY = ai->initSpell(TIGERS_FURY_1); + // Cat Finishing Move's + RIP = ai->initSpell(RIP_1); // 30 + FEROCIOUS_BITE = ai->initSpell(FEROCIOUS_BITE_1); // 35 + MAIM = ai->initSpell(MAIM_1); // 35 + // Bear/Dire Bear Attacks & Buffs + BASH = ai->initSpell(BASH_1); + MAUL = ai->initSpell(MAUL_1); // 15 + SWIPE = ai->initSpell(SWIPE_BEAR_1); // 20 + DEMORALIZING_ROAR = ai->initSpell(DEMORALIZING_ROAR_1); // 10 + CHALLENGING_ROAR = ai->initSpell(CHALLENGING_ROAR_1); + ENRAGE = ai->initSpell(ENRAGE_1); + GROWL = ai->initSpell(GROWL_1); + + RECENTLY_BANDAGED = 11196; // first aid check + + // racial + SHADOWMELD = ai->initSpell(SHADOWMELD_ALL); + WAR_STOMP = ai->initSpell(WAR_STOMP_ALL); // tauren } PlayerbotDruidAI::~PlayerbotDruidAI() {} From cd49e4576f7d1e21a571c45cf7639d9ae911cc4f Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 6 Aug 2010 14:12:07 +0400 Subject: [PATCH 098/187] Update priest spell init and cleanup code --- src/game/playerbot/PlayerbotPriestAI.cpp | 142 +++++++++++------------ src/game/playerbot/PlayerbotPriestAI.h | 51 +++++++- 2 files changed, 113 insertions(+), 80 deletions(-) diff --git a/src/game/playerbot/PlayerbotPriestAI.cpp b/src/game/playerbot/PlayerbotPriestAI.cpp index fe2403753..8356508b3 100644 --- a/src/game/playerbot/PlayerbotPriestAI.cpp +++ b/src/game/playerbot/PlayerbotPriestAI.cpp @@ -5,68 +5,58 @@ class PlayerbotAI; PlayerbotPriestAI::PlayerbotPriestAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) { - RENEW = ai->getSpellId("renew"); - if((HEAL = ai->getSpellId ("greater heal"))>0) - HEAL = ai->getSpellId("greater heal"); - else if((HEAL = ai->getSpellId ("heal"))>0 && (HEAL = ai->getSpellId ("greater heal"))==0) - HEAL = ai->getSpellId("heal"); - else if((HEAL = ai->getSpellId ("greater heal"))==0 && (HEAL = ai->getSpellId ("heal"))==0) - HEAL = ai->getSpellId("lesser heal"); - - GREAT_HEAL = ai->getSpellId("great heal"); - FLASH_HEAL = ai->getSpellId("flash heal"); - REZZ = ai->getSpellId("resurrection"); - SMITE = ai->getSpellId("smite"); - MANA_BURN = ai->getSpellId("mana burn"); - HOLY_NOVA = ai->getSpellId("holy nova"); - HOLY_FIRE = ai->getSpellId("holy fire"); - DESPERATE_PRAYER = ai->getSpellId("desperate prayer"); - PRAYER_OF_HEALING = ai->getSpellId("prayer of healing"); - CIRCLE_OF_HEALING = ai->getSpellId("circle of healing"); - BINDING_HEAL = ai->getSpellId("binding heal"); - PRAYER_OF_MENDING = ai->getSpellId("prayer of mending"); - //SHADOWMAGIC - FADE = ai->getSpellId("fade"); - PAIN = ai->getSpellId("shadow word: pain"); - MIND_BLAST = ai->getSpellId("mind blast"); - SCREAM = ai->getSpellId("psychic scream"); - MIND_FLAY = ai->getSpellId("mind flay"); - DEVOURING_PLAGUE = ai->getSpellId("devouring plague"); - SHADOW_PROTECTION = ai->getSpellId("shadow protection"); - VAMPIRIC_TOUCH = ai->getSpellId("vampiric touch"); - PRAYER_OF_SHADOW_PROTECTION = ai->getSpellId("prayer of shadow protection"); - SHADOWFIEND = ai->getSpellId("shadowfiend"); - MIND_SEAR = ai->getSpellId("mind sear"); - //DISCIPLINE - PENANCE = ai->getSpellId("penance"); - INNER_FIRE = ai->getSpellId("inner fire"); - PWS = ai->getSpellId("power word: shield"); - if((FORTITUDE = ai->getSpellId ("prayer of fortitude"))>0) - FORTITUDE = ai->getSpellId("prayer of fortitude"); - if((FORTITUDE = ai->getSpellId ("power word: fortitude"))>0 && (FORTITUDE = ai->getSpellId ("prayer of fortitude"))==0) - FORTITUDE = ai->getSpellId("power word: fortitude"); - - FEAR_WARD = ai->getSpellId("fear ward"); - if((DSPIRIT = ai->getSpellId ("prayer of spirit"))>0) - DSPIRIT = ai->getSpellId("prayer of spirit"); - if((DSPIRIT = ai->getSpellId ("divine spirit"))>0 && (DSPIRIT = ai->getSpellId ("prayer of spirit"))==0) - DSPIRIT = ai->getSpellId("divine spirit"); - - MASS_DISPEL = ai->getSpellId("mass dispel"); - POWER_INFUSION = ai->getSpellId("power infusion"); - DIVINE_SPIRIT = ai->getSpellId("divine spirit"); - INNER_FOCUS = ai->getSpellId("inner focus"); + RENEW = ai->initSpell(RENEW_1); + HEAL = ai->initSpell(HEAL_1); + LESSER_HEAL = ai->initSpell(LESSER_HEAL_1); + GREATER_HEAL = ai->initSpell(GREATER_HEAL_1); + FLASH_HEAL = ai->initSpell(FLASH_HEAL_1); + RESURRECTION = ai->initSpell(RESURRECTION_1); + SMITE = ai->initSpell(SMITE_1); + MANA_BURN = ai->initSpell(MANA_BURN_1); + HOLY_NOVA = ai->initSpell(HOLY_NOVA_1); + HOLY_FIRE = ai->initSpell(HOLY_FIRE_1); + DESPERATE_PRAYER = ai->initSpell(DESPERATE_PRAYER_1); + PRAYER_OF_HEALING = ai->initSpell(PRAYER_OF_HEALING_1); + CIRCLE_OF_HEALING = ai->initSpell(CIRCLE_OF_HEALING_1); + BINDING_HEAL = ai->initSpell(BINDING_HEAL_1); + PRAYER_OF_MENDING = ai->initSpell(PRAYER_OF_MENDING_1); + + // SHADOW + FADE = ai->initSpell(FADE_1); + SHADOW_WORD_PAIN = ai->initSpell(SHADOW_WORD_PAIN_1); + MIND_BLAST = ai->initSpell(MIND_BLAST_1); + SCREAM = ai->initSpell(PSYCHIC_SCREAM_1); + MIND_FLAY = ai->initSpell(MIND_FLAY_1); + DEVOURING_PLAGUE = ai->initSpell(DEVOURING_PLAGUE_1); + SHADOW_PROTECTION = ai->initSpell(SHADOW_PROTECTION_1); + VAMPIRIC_TOUCH = ai->initSpell(VAMPIRIC_TOUCH_1); + PRAYER_OF_SHADOW_PROTECTION = ai->initSpell(PRAYER_OF_SHADOW_PROTECTION_1); + SHADOWFIEND = ai->initSpell(SHADOWFIEND_1); + MIND_SEAR = ai->initSpell(MIND_SEAR_1); + + // DISCIPLINE + PENANCE = ai->initSpell(PENANCE_1); + INNER_FIRE = ai->initSpell(INNER_FIRE_1); + POWER_WORD_SHIELD = ai->initSpell(POWER_WORD_SHIELD_1); + POWER_WORD_FORTITUDE = ai->initSpell(POWER_WORD_FORTITUDE_1); + PRAYER_OF_FORTITUDE = ai->initSpell(PRAYER_OF_FORTITUDE_1); + FEAR_WARD = ai->initSpell(FEAR_WARD_1); + DIVINE_SPIRIT = ai->initSpell(DIVINE_SPIRIT_1); + PRAYER_OF_SPIRIT = ai->initSpell(PRAYER_OF_SPIRIT_1); + MASS_DISPEL = ai->initSpell(MASS_DISPEL_1); + POWER_INFUSION = ai->initSpell(POWER_INFUSION_1); + INNER_FOCUS = ai->initSpell(INNER_FOCUS_1); RECENTLY_BANDAGED = 11196; // first aid check // racial - ARCANE_TORRENT = ai->getSpellId("arcane torrent"); // blood elf - GIFT_OF_THE_NAARU = ai->getSpellId("gift of the naaru"); // draenei - STONEFORM = ai->getSpellId("stoneform"); // dwarf - EVERY_MAN_FOR_HIMSELF = ai->getSpellId("every man for himself"); // human - SHADOWMELD = ai->getSpellId("shadowmeld"); // night elf - BERSERKING = ai->getSpellId("berserking"); // troll - WILL_OF_THE_FORSAKEN = ai->getSpellId("will of the forsaken"); // undead + ARCANE_TORRENT = ai->initSpell(ARCANE_TORRENT_MANA_CLASSES); + GIFT_OF_THE_NAARU = ai->initSpell(GIFT_OF_THE_NAARU_PRIEST); // draenei + STONEFORM = ai->initSpell(STONEFORM_ALL); // dwarf + EVERY_MAN_FOR_HIMSELF = ai->initSpell(EVERY_MAN_FOR_HIMSELF_ALL); // human + SHADOWMELD = ai->initSpell(SHADOWMELD_ALL); + BERSERKING = ai->initSpell(BERSERKING_ALL); // troll + WILL_OF_THE_FORSAKEN = ai->initSpell(WILL_OF_THE_FORSAKEN_ALL); // undead } PlayerbotPriestAI::~PlayerbotPriestAI() {} @@ -84,10 +74,10 @@ void PlayerbotPriestAI::HealTarget(Unit &target, uint8 hp) ai->TellMaster("I'm casting flash heal."); ai->CastSpell(FLASH_HEAL, target); } - else if (hp < 30 && GREAT_HEAL > 0 && ai->GetManaPercent() >= 36) + else if (hp < 30 && GREATER_HEAL > 0 && ai->GetManaPercent() >= 36) { ai->TellMaster("I'm casting one of the sorted heal spells."); - ai->CastSpell(GREAT_HEAL, target); + ai->CastSpell(GREATER_HEAL, target); } else if (hp < 33 && BINDING_HEAL > 0 && ai->GetManaPercent() >= 27) { @@ -128,11 +118,11 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) { case PlayerbotAI::SCENARIO_DUEL: (ai->HasAura(SCREAM,*pTarget) && ai->GetHealthPercent() < 60 && ai->CastSpell(HEAL)) || - ai->CastSpell(PAIN) || + ai->CastSpell(SHADOW_WORD_PAIN) || (ai->GetHealthPercent() < 80 && ai->CastSpell(RENEW)) || (ai->GetPlayerBot()->GetDistance(pTarget) <= 5 && ai->CastSpell(SCREAM)) || ai->CastSpell(MIND_BLAST) || - (ai->GetHealthPercent() < 20 && ai->CastSpell(GREAT_HEAL)) || + (ai->GetHealthPercent() < 20 && ai->CastSpell(GREATER_HEAL)) || ai->CastSpell(SMITE); return; } @@ -150,10 +140,10 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) ai->TellMaster("I'm casting fade."); ai->CastSpell(FADE, *m_bot); } - else if (ai->GetHealthPercent() < 25 && PWS > 0 && !m_bot->HasAura(PWS, EFFECT_INDEX_0)) + else if (ai->GetHealthPercent() < 25 && POWER_WORD_SHIELD > 0 && !m_bot->HasAura(POWER_WORD_SHIELD, EFFECT_INDEX_0)) { ai->TellMaster("I'm casting pws on myself."); - ai->CastSpell(PWS); + ai->CastSpell(POWER_WORD_SHIELD); } else if (ai->GetHealthPercent() < 35 && DESPERATE_PRAYER > 0) { @@ -167,8 +157,8 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) uint32 masterHP = GetMaster()->GetHealth()*100 / GetMaster()->GetMaxHealth(); if (GetMaster()->isAlive()) { - if (masterHP < 25 && PWS > 0 && !GetMaster()->HasAura(PWS, EFFECT_INDEX_0)) - ai->CastSpell(PWS, *(GetMaster())); + if (masterHP < 25 && POWER_WORD_SHIELD > 0 && !GetMaster()->HasAura(POWER_WORD_SHIELD, EFFECT_INDEX_0)) + ai->CastSpell(POWER_WORD_SHIELD, *(GetMaster())); else if (masterHP < 80) HealTarget (*GetMaster(), masterHP); } @@ -247,10 +237,10 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) //break; case SPELL_SHADOWMAGIC: - if (PAIN > 0 && LastSpellShadowMagic <1 && !pTarget->HasAura(PAIN, EFFECT_INDEX_0) && ai->GetManaPercent() >= 25) + if (SHADOW_WORD_PAIN > 0 && LastSpellShadowMagic <1 && !pTarget->HasAura(SHADOW_WORD_PAIN, EFFECT_INDEX_0) && ai->GetManaPercent() >= 25) { //ai->TellMaster("I'm casting pain."); - ai->CastSpell(PAIN, *pTarget); + ai->CastSpell(SHADOW_WORD_PAIN, *pTarget); SpellSequence = SPELL_DISCIPLINE; LastSpellShadowMagic = LastSpellShadowMagic +1; break; @@ -392,15 +382,15 @@ void PlayerbotPriestAI::DoNonCombatActions() SpellSequence = SPELL_HOLY; // buff myself - if (FORTITUDE > 0) - (!m_bot->HasAura(FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell (FORTITUDE, *m_bot)); + if (POWER_WORD_FORTITUDE > 0) + (!m_bot->HasAura(POWER_WORD_FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell (POWER_WORD_FORTITUDE, *m_bot)); if (INNER_FIRE > 0) (!m_bot->HasAura(INNER_FIRE, EFFECT_INDEX_0) && ai->CastSpell (INNER_FIRE, *m_bot)); // buff master - if (FORTITUDE > 0) - (!GetMaster()->HasAura(FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell(FORTITUDE,*(GetMaster())) ); + if (POWER_WORD_FORTITUDE > 0) + (!GetMaster()->HasAura(POWER_WORD_FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell(POWER_WORD_FORTITUDE,*(GetMaster())) ); // mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) @@ -451,17 +441,17 @@ void PlayerbotPriestAI::DoNonCombatActions() // first rezz em if ( !tPlayer->isAlive() && !tPlayer->GetPlayerbotAI() ) { - std::string msg = "rezzing "; + std::string msg = "Resurrecting "; msg += tPlayer->GetName(); GetPlayerBot()->Say(msg, LANG_UNIVERSAL); - ai->CastSpell(REZZ, *tPlayer); + ai->CastSpell(RESURRECTION, *tPlayer); // rez is only 10 sec, but give time for lag ai->SetIgnoreUpdateTime(17); } else if( tPlayer->isAlive() ) { // buff and heal - (!tPlayer->HasAura(FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell (FORTITUDE, *tPlayer)); + (!tPlayer->HasAura(POWER_WORD_FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell (POWER_WORD_FORTITUDE, *tPlayer)); (HealTarget(*tPlayer, tPlayer->GetHealth()*100 / tPlayer->GetMaxHealth())); } } @@ -470,5 +460,5 @@ void PlayerbotPriestAI::DoNonCombatActions() void PlayerbotPriestAI::BuffPlayer(Player* target) { - GetAI()->CastSpell(FORTITUDE, *target); + GetAI()->CastSpell(POWER_WORD_FORTITUDE, *target); } diff --git a/src/game/playerbot/PlayerbotPriestAI.h b/src/game/playerbot/PlayerbotPriestAI.h index 02a9b41bb..51aad2b11 100644 --- a/src/game/playerbot/PlayerbotPriestAI.h +++ b/src/game/playerbot/PlayerbotPriestAI.h @@ -92,19 +92,62 @@ class MANGOS_DLL_SPEC PlayerbotPriestAI : PlayerbotClassAI void HealTarget (Unit& target, uint8 hp); // holy - uint32 GREAT_HEAL, RENEW, HEAL, FLASH_HEAL, REZZ, SMITE, CLEARCASTING, HOLY_NOVA, HOLY_FIRE, DESPERATE_PRAYER, PRAYER_OF_HEALING, CIRCLE_OF_HEALING, BINDING_HEAL, PRAYER_OF_MENDING, MANA_BURN; + uint32 BINDING_HEAL, + CIRCLE_OF_HEALING, + CLEARCASTING, + DESPERATE_PRAYER, + FLASH_HEAL, + GREATER_HEAL, + HEAL, + HOLY_FIRE, + HOLY_NOVA, + LESSER_HEAL, + MANA_BURN, + PRAYER_OF_HEALING, + PRAYER_OF_MENDING, + RENEW, + RESURRECTION, + SMITE; // shadowmagic - uint32 FADE, PAIN, MIND_BLAST, SCREAM, MIND_FLAY, DEVOURING_PLAGUE, SHADOW_PROTECTION, VAMPIRIC_TOUCH, PRAYER_OF_SHADOW_PROTECTION, SHADOWFIEND, MIND_SEAR; + uint32 FADE, + SHADOW_WORD_PAIN, + MIND_BLAST, + SCREAM, + MIND_FLAY, + DEVOURING_PLAGUE, + SHADOW_PROTECTION, + VAMPIRIC_TOUCH, + PRAYER_OF_SHADOW_PROTECTION, + SHADOWFIEND, + MIND_SEAR; // discipline - uint32 PWS, INNER_FIRE, FORTITUDE, TOUCH_OF_WEAKNESS, FEAR_WARD, DSPIRIT, POWER_INFUSION, MASS_DISPEL, PENANCE, DIVINE_SPIRIT, INNER_FOCUS; + uint32 POWER_WORD_SHIELD, + INNER_FIRE, + POWER_WORD_FORTITUDE, + PRAYER_OF_FORTITUDE, + FEAR_WARD, + POWER_INFUSION, + MASS_DISPEL, + PENANCE, + DIVINE_SPIRIT, + PRAYER_OF_SPIRIT, + INNER_FOCUS; // first aid uint32 RECENTLY_BANDAGED; // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + uint32 ARCANE_TORRENT, + GIFT_OF_THE_NAARU, + STONEFORM, + ESCAPE_ARTIST, + EVERY_MAN_FOR_HIMSELF, + SHADOWMELD, + WAR_STOMP, + BERSERKING, + WILL_OF_THE_FORSAKEN; uint32 SpellSequence, LastSpellHoly, LastSpellShadowMagic, LastSpellDiscipline; }; From b96263e6ec8bcfc5d8669ba2ba5b4eb2c30fcb58 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 6 Aug 2010 14:53:46 +0400 Subject: [PATCH 099/187] Fix enum dublicates ...again --- src/game/playerbot/PlayerbotDeathKnightAI.cpp | 2 +- src/game/playerbot/PlayerbotDeathKnightAI.h | 2 +- src/game/playerbot/PlayerbotDruidAI.h | 4 ++-- src/game/playerbot/PlayerbotMageAI.h | 2 +- src/game/playerbot/PlayerbotShamanAI.h | 2 +- src/game/playerbot/PlayerbotWarlockAI.h | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/game/playerbot/PlayerbotDeathKnightAI.cpp b/src/game/playerbot/PlayerbotDeathKnightAI.cpp index 733b1dbac..12e116d94 100644 --- a/src/game/playerbot/PlayerbotDeathKnightAI.cpp +++ b/src/game/playerbot/PlayerbotDeathKnightAI.cpp @@ -9,7 +9,7 @@ PlayerbotDeathKnightAI::PlayerbotDeathKnightAI(Player* const master, Player* con PLAGUE_STRIKE = ai->initSpell(PLAGUE_STRIKE_1); // Unholy DEATH_GRIP = ai->initSpell(DEATH_GRIP_1); - DEATH_COIL = ai->initSpell(DEATH_COIL_1); + DEATH_COIL = ai->initSpell(DEATH_COIL_DEATH_KNIGHT_1); DEATH_STRIKE = ai->initSpell(DEATH_STRIKE_1); UNHOLY_BLIGHT = 0; // Passive SCOURGE_STRIKE = ai->initSpell(SCOURGE_STRIKE_1); diff --git a/src/game/playerbot/PlayerbotDeathKnightAI.h b/src/game/playerbot/PlayerbotDeathKnightAI.h index c6c70925f..16627dcf4 100644 --- a/src/game/playerbot/PlayerbotDeathKnightAI.h +++ b/src/game/playerbot/PlayerbotDeathKnightAI.h @@ -25,7 +25,7 @@ enum DeathKnightSpells DANCING_RUNE_WEAPON_1 = 49028, DARK_COMMAND_1 = 56222, DEATH_AND_DECAY_1 = 43265, - DEATH_COIL_1 = 47541, + DEATH_COIL_DEATH_KNIGHT_1 = 47541, DEATH_GRIP_1 = 49576, DEATH_PACT_1 = 48743, DEATH_STRIKE_1 = 49998, diff --git a/src/game/playerbot/PlayerbotDruidAI.h b/src/game/playerbot/PlayerbotDruidAI.h index 2b870d866..de357697a 100644 --- a/src/game/playerbot/PlayerbotDruidAI.h +++ b/src/game/playerbot/PlayerbotDruidAI.h @@ -57,7 +57,7 @@ enum DruidSpells MOONFIRE_1 = 8921, MOONKIN_FORM_1 = 24858, NATURES_GRASP_1 = 16689, - NATURES_SWIFTNESS_1 = 17116, + NATURES_SWIFTNESS_DRUID_1 = 17116, NOURISH_1 = 50464, POUNCE_1 = 9005, PROWL_1 = 5215, @@ -66,7 +66,7 @@ enum DruidSpells REBIRTH_1 = 20484, REGROWTH_1 = 8936, REJUVENATION_1 = 774, - REMOVE_CURSE_1 = 2782, + REMOVE_CURSE_DRUID_1 = 2782, REVIVE_1 = 50769, RIP_1 = 1079, SAVAGE_ROAR_1 = 52610, diff --git a/src/game/playerbot/PlayerbotMageAI.h b/src/game/playerbot/PlayerbotMageAI.h index 40db36e24..509e3a35b 100644 --- a/src/game/playerbot/PlayerbotMageAI.h +++ b/src/game/playerbot/PlayerbotMageAI.h @@ -60,7 +60,7 @@ enum MageSpells MOLTEN_ARMOR_1 = 30482, PRESENCE_OF_MIND_1 = 12043, PYROBLAST_1 = 11366, - REMOVE_CURSE_1 = 475, + REMOVE_CURSE_MAGE_1 = 475, RITUAL_OF_REFRESHMENT_1 = 43987, SCORCH_1 = 2948, SLOW_1 = 31589, diff --git a/src/game/playerbot/PlayerbotShamanAI.h b/src/game/playerbot/PlayerbotShamanAI.h index 426f40fd7..a25078443 100644 --- a/src/game/playerbot/PlayerbotShamanAI.h +++ b/src/game/playerbot/PlayerbotShamanAI.h @@ -55,7 +55,7 @@ enum MANA_SPRING_TOTEM_1 = 5675, MANA_TIDE_TOTEM_1 = 16190, NATURE_RESISTANCE_TOTEM_1 = 10595, - NATURES_SWIFTNESS_1 = 16188, + NATURES_SWIFTNESS_SHAMAN_1 = 16188, PURGE_1 = 370, RIPTIDE_1 = 61295, ROCKBITER_WEAPON_1 = 8017, diff --git a/src/game/playerbot/PlayerbotWarlockAI.h b/src/game/playerbot/PlayerbotWarlockAI.h index 37e6dfb3b..18d526f7e 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.h +++ b/src/game/playerbot/PlayerbotWarlockAI.h @@ -29,7 +29,7 @@ enum WarlockSpells CURSE_OF_TONGUES_1 = 1714, CURSE_OF_WEAKNESS_1 = 702, DARK_PACT_1 = 18220, - DEATH_COIL_1 = 6789, + DEATH_COIL_WARLOCK_1 = 6789, DEMON_ARMOR_1 = 706, DEMON_CHARGE_1 = 54785, DEMON_SKIN_1 = 687, From ed4cde12317fb2e3ec76733cbf5aed8a33ff06be Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 6 Aug 2010 15:00:22 +0400 Subject: [PATCH 100/187] Fix hunter spell init --- src/game/playerbot/PlayerbotHunterAI.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/game/playerbot/PlayerbotHunterAI.cpp b/src/game/playerbot/PlayerbotHunterAI.cpp index 381a14553..42911bc19 100644 --- a/src/game/playerbot/PlayerbotHunterAI.cpp +++ b/src/game/playerbot/PlayerbotHunterAI.cpp @@ -8,10 +8,10 @@ class PlayerbotAI; PlayerbotHunterAI::PlayerbotHunterAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) { // PET CTRL - PET_SUMMON = ai->initSpell(PET_SUMMON_1); - PET_DISMISS = ai->initSpell(PET_DISMISS_1); - PET_REVIVE = ai->initSpell(PET_REVIVE_1); - PET_MEND = ai->initSpell(PET_MEND_1); + PET_SUMMON = ai->initSpell(CALL_PET_1); + PET_DISMISS = ai->initSpell(DISMISS_PET_1); + PET_REVIVE = ai->initSpell(REVIVE_PET_1); + PET_MEND = ai->initSpell(MEND_PET_1); PET_FEED = 1539; INTIMIDATION = ai->initSpell(INTIMIDATION_1); // (generic) From 1c46413c046bfda297672bb02d1ed4d87cb4d151 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 6 Aug 2010 15:15:37 +0400 Subject: [PATCH 101/187] Tweak spell init debug output --- src/game/playerbot/PlayerbotAI.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index c765ea9d8..7f3134dc7 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -305,7 +305,8 @@ uint32 PlayerbotAI::initSpell(uint32 spellId) break; } } - sLog.outDebug("Found spellid: %u next: %u", spellId, next); + if (next == 0) + sLog.outDebug("initSpell: Found spellid: %u", spellId); return (next == 0) ? spellId : next; } From 21b455b701898e6dd2e041556c0e0c52a3a9b588 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 13 Aug 2010 11:37:54 +0400 Subject: [PATCH 102/187] Skip class specific non-combat actions when mounted --- src/game/playerbot/PlayerbotAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 7f3134dc7..ff26f253a 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2183,7 +2183,7 @@ void PlayerbotAI::UpdateAI(const uint32 p_time) MovementReset(); // do class specific non combat actions - else if (GetClassAI()) + else if (GetClassAI() && !m_bot->IsMounted()) (GetClassAI())->DoNonCombatActions(); } } From 7042fa39f67165ee3b180a0dd7a7985617011576 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 13 Aug 2010 15:30:35 +0400 Subject: [PATCH 103/187] Add debug notice on movement reset due to spell cast --- src/game/playerbot/PlayerbotAI.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index ff26f253a..89b156424 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2289,6 +2289,7 @@ bool PlayerbotAI::CastSpell(uint32 spellId) return false; // stop movement to prevent cancel spell casting + sLog.outDebug("Bot movement reset for casting %s (%u)", pSpellInfo->SpellName[0], spellId); MovementClear(); // actually cast spell From c2169f24c4fcc1a894d639d25e95727743598be8 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sat, 14 Aug 2010 00:38:03 +0400 Subject: [PATCH 104/187] Add another dummy spell id to ignore by 'spells' command --- src/game/playerbot/PlayerbotAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 89b156424..d20c9e38b 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -3480,7 +3480,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) std::string spellName; uint32 ignoredSpells[] = {1843, 5019, 2479, 6603, 3365, 8386, 21651, 21652, 6233, 6246, 6247, - 61437, 22810, 22027, 45927, 7266, 7267, 6477, 6478, 7355}; + 61437, 22810, 22027, 45927, 7266, 7267, 6477, 6478, 7355, 68398}; uint32 ignoredSpellsCount = sizeof(ignoredSpells)/sizeof(uint32); for (PlayerSpellMap::iterator itr = m_bot->GetSpellMap().begin(); itr != m_bot->GetSpellMap().end(); ++itr) { From 5036faaca545d129c52fe1f8af8d752a5e58073f Mon Sep 17 00:00:00 2001 From: blueboy Date: Wed, 18 Aug 2010 19:21:19 +0100 Subject: [PATCH 105/187] Fix for recent core changes --- src/game/playerbot/PlayerbotAI.cpp | 2 +- src/game/playerbot/PlayerbotDruidAI.cpp | 2 +- src/game/playerbot/PlayerbotMageAI.cpp | 2 +- src/game/playerbot/PlayerbotPaladinAI.cpp | 2 +- src/game/playerbot/PlayerbotPriestAI.cpp | 2 +- src/game/playerbot/PlayerbotShamanAI.cpp | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index d20c9e38b..f6ac30bea 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -702,7 +702,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) if (!grp) return; - Player* const inviter = sObjectMgr.GetPlayer(grp->GetLeaderGUID()); + Player* const inviter = sObjectMgr.GetPlayer(grp->GetLeaderGuid()); if (!inviter) return; diff --git a/src/game/playerbot/PlayerbotDruidAI.cpp b/src/game/playerbot/PlayerbotDruidAI.cpp index 2534db91b..f8fb7d4a4 100644 --- a/src/game/playerbot/PlayerbotDruidAI.cpp +++ b/src/game/playerbot/PlayerbotDruidAI.cpp @@ -662,7 +662,7 @@ void PlayerbotDruidAI::DoNonCombatActions() Group::MemberSlotList const& groupSlot = GetMaster()->GetGroup()->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { - Player *tPlayer = sObjectMgr.GetPlayer(uint64 (itr->guid)); + Player *tPlayer = sObjectMgr.GetPlayer(itr->guid); if( !tPlayer || !tPlayer->isAlive() ) continue; diff --git a/src/game/playerbot/PlayerbotMageAI.cpp b/src/game/playerbot/PlayerbotMageAI.cpp index d40d1e002..e9437f08c 100644 --- a/src/game/playerbot/PlayerbotMageAI.cpp +++ b/src/game/playerbot/PlayerbotMageAI.cpp @@ -370,7 +370,7 @@ void PlayerbotMageAI::DoNonCombatActions() Group::MemberSlotList const& groupSlot = GetMaster()->GetGroup()->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { - Player *tPlayer = sObjectMgr.GetPlayer(uint64 (itr->guid)); + Player *tPlayer = sObjectMgr.GetPlayer(itr->guid); if( !tPlayer || !tPlayer->isAlive() ) continue; // buff diff --git a/src/game/playerbot/PlayerbotPaladinAI.cpp b/src/game/playerbot/PlayerbotPaladinAI.cpp index aab0ac4a8..377b69c08 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.cpp +++ b/src/game/playerbot/PlayerbotPaladinAI.cpp @@ -431,7 +431,7 @@ void PlayerbotPaladinAI::DoNonCombatActions() Group::MemberSlotList const& groupSlot = GetMaster()->GetGroup()->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { - Player *tPlayer = sObjectMgr.GetPlayer(uint64 (itr->guid)); + Player *tPlayer = sObjectMgr.GetPlayer(itr->guid); if( !tPlayer || !tPlayer->isAlive() ) continue; diff --git a/src/game/playerbot/PlayerbotPriestAI.cpp b/src/game/playerbot/PlayerbotPriestAI.cpp index 8356508b3..a966e788c 100644 --- a/src/game/playerbot/PlayerbotPriestAI.cpp +++ b/src/game/playerbot/PlayerbotPriestAI.cpp @@ -434,7 +434,7 @@ void PlayerbotPriestAI::DoNonCombatActions() Group::MemberSlotList const& groupSlot = GetMaster()->GetGroup()->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { - Player *tPlayer = sObjectMgr.GetPlayer(uint64 (itr->guid)); + Player *tPlayer = sObjectMgr.GetPlayer(itr->guid); if( !tPlayer ) continue; diff --git a/src/game/playerbot/PlayerbotShamanAI.cpp b/src/game/playerbot/PlayerbotShamanAI.cpp index d06929ed6..3cbff6daf 100644 --- a/src/game/playerbot/PlayerbotShamanAI.cpp +++ b/src/game/playerbot/PlayerbotShamanAI.cpp @@ -518,7 +518,7 @@ void PlayerbotShamanAI::DoNonCombatActions() Group::MemberSlotList const& groupSlot = GetMaster()->GetGroup()->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { - Player *tPlayer = sObjectMgr.GetPlayer(uint64 (itr->guid)); + Player *tPlayer = sObjectMgr.GetPlayer(itr->guid); if( !tPlayer || !tPlayer->isAlive() ) continue; From c3e40a05006e7c3fee0df03b30bd5c56876662cc Mon Sep 17 00:00:00 2001 From: blueboy Date: Thu, 19 Aug 2010 15:14:18 +0100 Subject: [PATCH 106/187] Fix for 'MAKE_NEW_GUID' removal --- src/game/playerbot/PlayerbotAI.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index f6ac30bea..9a1a36b11 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -3120,11 +3120,11 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) { //sLog.outDebug("find: guid : %u entry : %u x : (%f) y : (%f) z : (%f) mapid : %d",guid, entry, x, y, z, mapid); - m_lootCurrent = MAKE_NEW_GUID(guid, entry, HIGHGUID_GAMEOBJECT); - GameObject *go = m_bot->GetMap()->GetGameObject(m_lootCurrent); + ObjectGuid lootCurrent = ObjectGuid(HIGHGUID_GAMEOBJECT,entry,guid); + GameObject *go = m_bot->GetMap()->GetGameObject(lootCurrent); if (!go) { - m_lootCurrent = 0; + lootCurrent = 0; return; } @@ -3134,7 +3134,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) m_bot->UpdateGroundPositionZ(x,y,z); m_bot->GetMotionMaster()->MovePoint( mapid, x, y, z ); m_bot->SetPosition(x, y, z, m_bot->GetOrientation()); - m_bot->SendLoot( m_lootCurrent, LOOT_CORPSE ); + m_bot->SendLoot( lootCurrent, LOOT_CORPSE ); Loot *loot = &go->loot; uint32 lootNum = loot->GetMaxSlotInLootFor( m_bot ); // sLog.outDebug( "[PlayerbotAI]: GetGOType %u - %s looting: '%s' got %d items", go->GetGoType(), m_bot->GetName(), go->GetGOInfo()->name, loot->GetMaxSlotInLootFor( m_bot )); @@ -3175,7 +3175,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) if ( !qitem && item->is_blocked ) { - m_bot->SendLootRelease( m_lootCurrent ); + m_bot->SendLootRelease( lootCurrent ); continue; } @@ -3257,10 +3257,10 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) } // release loot if(looted) - m_bot->GetSession()->DoLootRelease( m_lootCurrent ); + m_bot->GetSession()->DoLootRelease( lootCurrent ); else m_bot->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_LOOTING); - // sLog.outDebug( "[PlayerbotAI]: %s looted target 0x%08X", m_bot->GetName(), m_lootCurrent ); + // sLog.outDebug( "[PlayerbotAI]: %s looted target 0x%08X", m_bot->GetName(), lootCurrent ); SetQuestNeedItems(); } else @@ -3594,7 +3594,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) float z = fields[4].GetFloat(); int mapid = fields[5].GetUInt16(); - GameObject *go = m_bot->GetMap()->GetGameObject(MAKE_NEW_GUID(guid, entry, HIGHGUID_GAMEOBJECT)); + GameObject *go = m_bot->GetMap()->GetGameObject(ObjectGuid(HIGHGUID_GAMEOBJECT,entry,guid)); if (!go) continue; From 95a46a15d2abf9faff925e37ca46ebf959e329a5 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sun, 8 Aug 2010 19:32:52 +0400 Subject: [PATCH 107/187] Add method to find consumable items by their icon --- src/game/playerbot/PlayerbotAI.cpp | 42 ++++++++++++++++++++++++++++++ src/game/playerbot/PlayerbotAI.h | 1 + 2 files changed, 43 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 9a1a36b11..3753e88df 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -1223,6 +1223,48 @@ Item* PlayerbotAI::FindPoison() const return NULL; } +Item* PlayerbotAI::FindConsumable(uint32 displayId) const +{ + // list out items in main backpack + for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; slot++) + { + Item* const pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); + if (pItem) + { + const ItemPrototype* const pItemProto = pItem->GetProto(); + + if (!pItemProto || m_bot->CanUseItem(pItemProto) != EQUIP_ERR_OK) + continue; + + if (pItemProto->Class == ITEM_CLASS_CONSUMABLE && pItemProto->DisplayInfoID == displayId) + return pItem; + } + } + // list out items in other removable backpacks + for (uint8 bag = INVENTORY_SLOT_BAG_START; bag < INVENTORY_SLOT_BAG_END; ++bag) + { + const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); + if (pBag) + { + for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) + { + Item* const pItem = m_bot->GetItemByPos(bag, slot); + if (pItem) + { + const ItemPrototype* const pItemProto = pItem->GetProto(); + + if (!pItemProto || m_bot->CanUseItem(pItemProto) != EQUIP_ERR_OK) + continue; + + if (pItemProto->Class == ITEM_CLASS_CONSUMABLE && pItemProto->DisplayInfoID == displayId) + return pItem; + } + } + } + } + return NULL; +} + void PlayerbotAI::InterruptCurrentCastingSpell() { //TellMaster("I'm interrupting my current spell!"); diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 3bb802f09..bb8292176 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -199,6 +199,7 @@ class MANGOS_DLL_SPEC PlayerbotAI Item* FindPoison() const; Item* FindMount(uint32 matchingRidingSkill) const; Item* FindItem(uint32 ItemId); + Item* FindConsumable(uint32 displayId) const; // ******* Actions **************************************** // Your handlers can call these actions to make the bot do things. From 7e554d14dc053e2a98518ef73fd825fd1c34c14a Mon Sep 17 00:00:00 2001 From: chelobaka Date: Mon, 9 Aug 2010 19:25:29 +0400 Subject: [PATCH 108/187] Allow using inventory items on equipped items This will let bots use temporary enchantments on thier equipment. These include poisons, warlock stones, oils and so on. --- src/game/playerbot/PlayerbotAI.cpp | 37 ++++++++++++++++++++++-------- src/game/playerbot/PlayerbotAI.h | 2 +- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 3753e88df..9999c2205 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2777,26 +2777,43 @@ void PlayerbotAI::findItemsInInv(std::list& itemIdSearchList, std::list< } // submits packet to use an item -void PlayerbotAI::UseItem(Item& item) +void PlayerbotAI::UseItem(Item& item, uint8 targetSlot) { - uint8 bagIndex = item.GetBagSlot(); - uint8 slot = item.GetSlot(); - uint8 cast_count = 1; - uint32 spellid = 0; // only used in combat + uint8 bagIndex = item.GetBagSlot(); + uint8 slot = item.GetSlot(); + uint8 cast_count = 1; + uint32 spellid; uint64 item_guid = item.GetGUID(); uint32 glyphIndex = 0; // ?? - uint8 unk_flags = 0; // not 0x02 + uint8 unk_flags = 0; // not 0x02 + uint32 targetFlag; + + WorldPacket* packet; // create target data // note other targets are possible but not supported at the moment // see SpellCastTargets::read in Spell.cpp to see other options // for setting target - uint32 target = TARGET_FLAG_SELF; + if (targetSlot < EQUIPMENT_SLOT_END) + { + targetFlag = TARGET_FLAG_ITEM; + Item* const targetItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, targetSlot); + PackedGuid targetGUID = targetItem->GetObjectGuid().WriteAsPacked(); + spellid = item.GetProto()->Spells[0].SpellId; + packet = new WorldPacket(CMSG_USE_ITEM, 1 + 1 + 1 + 4 + 8 + 4 + 1 + 8); + *packet << bagIndex << slot << cast_count << spellid << item_guid + << glyphIndex << unk_flags << targetFlag << targetGUID; + } + else + { + targetFlag = TARGET_FLAG_SELF; + spellid = 0; + packet = new WorldPacket(CMSG_USE_ITEM, 1 + 1 + 1 + 4 + 8 + 4 + 1); + *packet << bagIndex << slot << cast_count << spellid << item_guid + << glyphIndex << unk_flags << targetFlag; + } - WorldPacket* const packet = new WorldPacket(CMSG_USE_ITEM, 1 + 1 + 1 + 4 + 8 + 4 + 1); - *packet << bagIndex << slot << cast_count << spellid << item_guid - << glyphIndex << unk_flags << target; m_bot->GetSession()->QueuePacket(packet); // queue the packet to get around race condition // certain items cause player to sit (food,drink) diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index bb8292176..992f16e54 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -210,7 +210,7 @@ class MANGOS_DLL_SPEC PlayerbotAI bool CastSpell(uint32 spellId); bool CastSpell(uint32 spellId, Unit& target); bool CastPetSpell(uint32 spellId, Unit* target = NULL); - void UseItem(Item& item); + void UseItem(Item& item, uint8 targetSlot = 255); void EquipItem(Item& item); //void Stay(); //bool Follow(Player& player); From 251e690b375804440b052a72669922d9b60e0f07 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Wed, 18 Aug 2010 21:08:11 +0400 Subject: [PATCH 109/187] Make warlock create and use firestones. Also cleanup code a little. --- src/game/playerbot/PlayerbotWarlockAI.cpp | 21 +++++++ src/game/playerbot/PlayerbotWarlockAI.h | 74 ++++++++++++++++++++--- 2 files changed, 88 insertions(+), 7 deletions(-) diff --git a/src/game/playerbot/PlayerbotWarlockAI.cpp b/src/game/playerbot/PlayerbotWarlockAI.cpp index 92a22d1c7..852b5ca6c 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.cpp +++ b/src/game/playerbot/PlayerbotWarlockAI.cpp @@ -46,6 +46,7 @@ PlayerbotWarlockAI::PlayerbotWarlockAI(Player* const master, Player* const bot, SOUL_LINK_AURA = 25228; // dummy aura applied, after spell SOUL_LINK HEALTH_FUNNEL = ai->initSpell(HEALTH_FUNNEL_1); DETECT_INVISIBILITY = ai->initSpell(DETECT_INVISIBILITY_1); + CREATE_FIRESTONE = ai->initSpell(CREATE_FIRESTONE_1); // demon summon SUMMON_IMP = ai->initSpell(SUMMON_IMP_1); SUMMON_VOIDWALKER = ai->initSpell(SUMMON_VOIDWALKER_1); @@ -354,6 +355,26 @@ void PlayerbotWarlockAI::DoNonCombatActions() if (DETECT_INVISIBILITY > 0) (!GetMaster()->HasAura(DETECT_INVISIBILITY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 2 && ai->CastSpell(DETECT_INVISIBILITY, *GetMaster())); + // firestone creation and use - proof of concept for updated UseItem method. + Item* const weapon = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); + if (weapon && weapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) == 0) + { + Item* const stone = ai->FindConsumable(FIRESTONE_DISPLAYID); + if (!stone) + { + if (CREATE_FIRESTONE > 0 && m_bot->HasItemCount(SOUL_SHARD, 1, false)) + { + ai->CastSpell(CREATE_FIRESTONE); + ai->SetIgnoreUpdateTime(5); + } + } + else + { + ai->UseItem(*stone, EQUIPMENT_SLOT_MAINHAND); + ai->SetIgnoreUpdateTime(5); + } + } + // mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); diff --git a/src/game/playerbot/PlayerbotWarlockAI.h b/src/game/playerbot/PlayerbotWarlockAI.h index 18d526f7e..bebefee8b 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.h +++ b/src/game/playerbot/PlayerbotWarlockAI.h @@ -3,6 +3,8 @@ #include "PlayerbotClassAI.h" +#define SOUL_SHARD 6265 + enum { SPELL_CURSES, @@ -11,6 +13,13 @@ enum SPELL_DEMONOLOGY }; +enum StoneDisplayId +{ + FIRESTONE_DISPLAYID = 7409, + SPELLSTONE_DISPLAYID = 13291, + SOULSTONE_DISPLAYID = 6009 +}; + enum WarlockSpells { BANISH_1 = 710, @@ -80,6 +89,7 @@ enum WarlockSpells UNENDING_BREATH_1 = 5697, UNSTABLE_AFFLICTION_1 = 30108 }; + //class Player; class MANGOS_DLL_SPEC PlayerbotWarlockAI : PlayerbotClassAI { @@ -101,28 +111,78 @@ class MANGOS_DLL_SPEC PlayerbotWarlockAI : PlayerbotClassAI bool m_demonSummonFailed; // CURSES - uint32 CURSE_OF_WEAKNESS, CURSE_OF_AGONY, CURSE_OF_EXHAUSTION, CURSE_OF_TONGUES, CURSE_OF_THE_ELEMENTS, CURSE_OF_DOOM; + uint32 CURSE_OF_WEAKNESS, + CURSE_OF_AGONY, + CURSE_OF_EXHAUSTION, + CURSE_OF_TONGUES, + CURSE_OF_THE_ELEMENTS, + CURSE_OF_DOOM, // AFFLICTION - uint32 CORRUPTION, DRAIN_SOUL, DRAIN_LIFE, DRAIN_MANA, LIFE_TAP, UNSTABLE_AFFLICTION, HAUNT, SEED_OF_CORRUPTION, DARK_PACT, HOWL_OF_TERROR, FEAR; + uint32 CORRUPTION, + DRAIN_SOUL, + DRAIN_LIFE, + DRAIN_MANA, + LIFE_TAP, + UNSTABLE_AFFLICTION, + HAUNT, + SEED_OF_CORRUPTION, + DARK_PACT, + HOWL_OF_TERROR, + FEAR; // DESTRUCTION - uint32 SHADOW_BOLT, IMMOLATE, INCINERATE, SEARING_PAIN, CONFLAGRATE, SOUL_FIRE, SHADOWFURY, CHAOS_BOLT, SHADOWFLAME, HELLFIRE, RAIN_OF_FIRE, SHADOWBURN; + uint32 SHADOW_BOLT, + IMMOLATE, + INCINERATE, + SEARING_PAIN, + CONFLAGRATE, + SOUL_FIRE, + SHADOWFURY, + CHAOS_BOLT, + SHADOWFLAME, + HELLFIRE, + RAIN_OF_FIRE, + SHADOWBURN; // DEMONOLOGY - uint32 DEMON_SKIN, DEMON_ARMOR, SHADOW_WARD, FEL_ARMOR, SOULSHATTER, SOUL_LINK, SOUL_LINK_AURA, HEALTH_FUNNEL, DETECT_INVISIBILITY; + uint32 DEMON_SKIN, + DEMON_ARMOR, + SHADOW_WARD, + FEL_ARMOR, + SOULSHATTER, + SOUL_LINK, + SOUL_LINK_AURA, + HEALTH_FUNNEL, + DETECT_INVISIBILITY, + CREATE_FIRESTONE; // DEMON SUMMON - uint32 SUMMON_IMP, SUMMON_VOIDWALKER, SUMMON_SUCCUBUS, SUMMON_FELHUNTER, SUMMON_FELGUARD; + uint32 SUMMON_IMP, + SUMMON_VOIDWALKER, + SUMMON_SUCCUBUS, + SUMMON_FELHUNTER, + SUMMON_FELGUARD; // DEMON SKILLS - uint32 BLOOD_PACT, CONSUME_SHADOWS, FEL_INTELLIGENCE; + uint32 BLOOD_PACT, + CONSUME_SHADOWS, + FEL_INTELLIGENCE; // first aid uint32 RECENTLY_BANDAGED; // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + uint32 ARCANE_TORRENT, + GIFT_OF_THE_NAARU, + STONEFORM, + ESCAPE_ARTIST, + EVERY_MAN_FOR_HIMSELF, + SHADOWMELD, + BLOOD_FURY, + WAR_STOMP, + BERSERKING, + WILL_OF_THE_FORSAKEN; uint32 SpellSequence, LastSpellCurse, LastSpellAffliction, LastSpellDestruction; }; From 0c73c881aa43df788e20ffa61f5048c37cb78b1b Mon Sep 17 00:00:00 2001 From: chelobaka Date: Wed, 18 Aug 2010 21:50:16 +0400 Subject: [PATCH 110/187] Typo fix --- src/game/playerbot/PlayerbotWarlockAI.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotWarlockAI.h b/src/game/playerbot/PlayerbotWarlockAI.h index bebefee8b..608cccd72 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.h +++ b/src/game/playerbot/PlayerbotWarlockAI.h @@ -116,7 +116,7 @@ class MANGOS_DLL_SPEC PlayerbotWarlockAI : PlayerbotClassAI CURSE_OF_EXHAUSTION, CURSE_OF_TONGUES, CURSE_OF_THE_ELEMENTS, - CURSE_OF_DOOM, + CURSE_OF_DOOM; // AFFLICTION uint32 CORRUPTION, From 922e5a5ac9676a99b5108cf64567fc6ae5b6dbf9 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Tue, 31 Aug 2010 21:21:10 +0400 Subject: [PATCH 111/187] Search and apply poisons to rogue weapons Bot will use instant, wound and deadly poisons only (in this sequence for mainhand weapon and in reverse one for offhand). --- src/game/playerbot/PlayerbotRogueAI.cpp | 76 +++++++++++-------------- src/game/playerbot/PlayerbotRogueAI.h | 7 +++ 2 files changed, 40 insertions(+), 43 deletions(-) diff --git a/src/game/playerbot/PlayerbotRogueAI.cpp b/src/game/playerbot/PlayerbotRogueAI.cpp index 386d06d0c..e709954ba 100644 --- a/src/game/playerbot/PlayerbotRogueAI.cpp +++ b/src/game/playerbot/PlayerbotRogueAI.cpp @@ -15,9 +15,6 @@ PlayerbotRogueAI::PlayerbotRogueAI(Player* const master, Player* const bot, Play KICK = ai->initSpell(KICK_1); FEINT = ai->initSpell(FEINT_1); FAN_OF_KNIVES = ai->initSpell(FAN_OF_KNIVES_1); - DEADLY_POISON = 25351; //SpellID - CRIPPLING_POISON = 3408; //SpellID - MIND_NUMBING_POISON = 5761; //SpellID GOUGE = ai->initSpell(GOUGE_1); SPRINT = ai->initSpell(SPRINT_1); @@ -266,6 +263,10 @@ void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) void PlayerbotRogueAI::DoNonCombatActions() { + PlayerbotAI *ai = GetAI(); + if (!ai) + return; + Player * m_bot = GetPlayerBot(); if (!m_bot) return; @@ -295,50 +296,39 @@ void PlayerbotRogueAI::DoNonCombatActions() GetAI()->SetIgnoreUpdateTime(8); return; } -/* - // Poison check //Not working needs some mor testing...i think need to tell the bott where "slot" to apply poison. - enum EquipmentSlots // 19 slots + // Search and apply poisons to weapons + // Mainhand ... + Item * poison, * weapon; + weapon = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); + if (weapon && weapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) == 0) { - EQUIPMENT_SLOT_START = 0, - EQUIPMENT_SLOT_HEAD = 0, - EQUIPMENT_SLOT_NECK = 1, - EQUIPMENT_SLOT_SHOULDERS = 2, - EQUIPMENT_SLOT_BODY = 3, - EQUIPMENT_SLOT_CHEST = 4, - EQUIPMENT_SLOT_WAIST = 5, - EQUIPMENT_SLOT_LEGS = 6, - EQUIPMENT_SLOT_FEET = 7, - EQUIPMENT_SLOT_WRISTS = 8, - EQUIPMENT_SLOT_HANDS = 9, - EQUIPMENT_SLOT_FINGER1 = 10, - EQUIPMENT_SLOT_FINGER2 = 11, - EQUIPMENT_SLOT_TRINKET1 = 12, - EQUIPMENT_SLOT_TRINKET2 = 13, - EQUIPMENT_SLOT_BACK = 14, - EQUIPMENT_SLOT_MAINHAND = 15, - EQUIPMENT_SLOT_OFFHAND = 16, - EQUIPMENT_SLOT_RANGED = 17, - EQUIPMENT_SLOT_TABARD = 18, - EQUIPMENT_SLOT_END = 19 - }; - -//thi is only a guess, dont get how to apply temp enchant on weapons. - if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) - m_bot->SetStandState(UNIT_STAND_STATE_STAND); - - pItem = GetAI()->FindPoison(); - Item* item = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); - - if (pItem != NULL) + poison = ai->FindConsumable(INSTANT_POISON_DISPLAYID); + if (!poison) + poison = ai->FindConsumable(WOUND_POISON_DISPLAYID); + if (!poison) + poison = ai->FindConsumable(DEADLY_POISON_DISPLAYID); + if (poison) + { + ai->UseItem(*poison, EQUIPMENT_SLOT_MAINHAND); + ai->SetIgnoreUpdateTime(5); + } + } + //... and offhand + weapon = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); + if (weapon && weapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) == 0) { - GetAI()->TellMaster("I could use some poison."); -// GetAI()->UseItem(*pItem); - m_bot->ApplyEnchantment(item,TEMP_ENCHANTMENT_SLOT,true); - GetAI()->SetIgnoreUpdateTime(10); - return; + poison = ai->FindConsumable(DEADLY_POISON_DISPLAYID); + if (!poison) + poison = ai->FindConsumable(WOUND_POISON_DISPLAYID); + if (!poison) + poison = ai->FindConsumable(INSTANT_POISON_DISPLAYID); + if (poison) + { + ai->UseItem(*poison, EQUIPMENT_SLOT_OFFHAND); + ai->SetIgnoreUpdateTime(5); + } } -*/ } // end DoNonCombatActions diff --git a/src/game/playerbot/PlayerbotRogueAI.h b/src/game/playerbot/PlayerbotRogueAI.h index 27af7d1bb..6ce1132ff 100644 --- a/src/game/playerbot/PlayerbotRogueAI.h +++ b/src/game/playerbot/PlayerbotRogueAI.h @@ -12,6 +12,13 @@ enum RogueStealth }; +enum RoguePoisonDisplayId +{ + DEADLY_POISON_DISPLAYID = 13707, + INSTANT_POISON_DISPLAYID = 13710, + WOUND_POISON_DISPLAYID = 37278 +}; + enum RogueSpells { ADRENALINE_RUSH_1 = 13750, From e819ec1973d02290a2a6f697cbc7bac5f182947e Mon Sep 17 00:00:00 2001 From: chelobaka Date: Tue, 31 Aug 2010 21:47:35 +0400 Subject: [PATCH 112/187] Remove redundant method calls in rogue class AI --- src/game/playerbot/PlayerbotRogueAI.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/game/playerbot/PlayerbotRogueAI.cpp b/src/game/playerbot/PlayerbotRogueAI.cpp index e709954ba..935aebea2 100644 --- a/src/game/playerbot/PlayerbotRogueAI.cpp +++ b/src/game/playerbot/PlayerbotRogueAI.cpp @@ -279,21 +279,21 @@ void PlayerbotRogueAI::DoNonCombatActions() if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); - Item* pItem = GetAI()->FindFood(); - Item* fItem = GetAI()->FindBandage(); + Item* pItem = ai->FindFood(); + Item* fItem = ai->FindBandage(); - if (pItem != NULL && GetAI()->GetHealthPercent() < 30) + if (pItem != NULL && ai->GetHealthPercent() < 30) { - GetAI()->TellMaster("I could use some food."); - GetAI()->UseItem(*pItem); - GetAI()->SetIgnoreUpdateTime(30); + ai->TellMaster("I could use some food."); + ai->UseItem(*pItem); + ai->SetIgnoreUpdateTime(30); return; } - else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && GetAI()->GetHealthPercent() < 70) + else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { - GetAI()->TellMaster("I could use first aid."); - GetAI()->UseItem(*fItem); - GetAI()->SetIgnoreUpdateTime(8); + ai->TellMaster("I could use first aid."); + ai->UseItem(*fItem); + ai->SetIgnoreUpdateTime(8); return; } From d5b6147690532d2292e400a270d296cba31c9fd4 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Wed, 1 Sep 2010 20:57:59 +0400 Subject: [PATCH 113/187] Update bot_todo.txt --- bot_todo.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bot_todo.txt b/bot_todo.txt index bc3fe15f6..59d71e654 100644 --- a/bot_todo.txt +++ b/bot_todo.txt @@ -16,7 +16,7 @@ Combat order TANK Combat order HEAL ///---Temporary item enchantments---/// -Rogue : Poison +[DONE] Rogue : Poison Warrior : Sharpening Stone, Rune of Warding, Rune of Shielding. //---After fear bot's lose target---/// @@ -26,4 +26,4 @@ Needs some fix. Rogue : some abilitys require Rogue to be stealthed and behind target. ///---Implement locale independet way of getting spellIDs---/// -Hardcode lowest rank spellID, use function to get highest rank +[DONE] Hardcode lowest rank spellID, use function to get highest rank From 2bad05b7c42b86d5b22770372e58ba386cec2904 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sat, 4 Sep 2010 23:38:10 +0400 Subject: [PATCH 114/187] New method to calculate free bag space --- src/game/playerbot/PlayerbotAI.cpp | 18 ++++++++++++++++++ src/game/playerbot/PlayerbotAI.h | 2 ++ 2 files changed, 20 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 9999c2205..773a86318 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -1511,6 +1511,24 @@ void PlayerbotAI::SetState( BotState state ) m_botState = state; } +uint8 PlayerbotAI::GetFreeBagSpace() const +{ + uint8 space = 0; + for (uint8 i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; ++i) + { + Item *pItem = m_bot->GetItemByPos( INVENTORY_SLOT_BAG_0, i ); + if (!pItem) + ++space; + } + for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i) + { + Bag* pBag = (Bag*)m_bot->GetItemByPos( INVENTORY_SLOT_BAG_0, i ); + if (pBag && pBag->GetProto()->BagFamily == BAG_FAMILY_MASK_NONE) + space += pBag->GetFreeSlots(); + } + return space; +} + void PlayerbotAI::DoLoot() { if( !m_lootCurrent && m_lootCreature.empty() ) diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 992f16e54..7065a8b11 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -260,6 +260,8 @@ class MANGOS_DLL_SPEC PlayerbotAI void ItemLocalization(std::string& itemName, const uint32 itemID) const; void QuestLocalization(std::string& questTitle, const uint32 questID) const; + uint8 GetFreeBagSpace() const; + private: // ****** Closed Actions ******************************** // These actions may only be called at special times. From d0d759b866a7e61cd1c23ae60f71dc9cabc6706e Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sat, 4 Sep 2010 23:41:59 +0400 Subject: [PATCH 115/187] Manage soul shard count Warlock class AI has new variable now MAX_SHARD_COUNT and will destroy all extra soul shards if their count > MAX_SHARD_COUNT. If bot will run out of bag space it will destroy shards to try to free at least one bag slot, leaving maximum of one shard left in its inventory. --- src/game/playerbot/PlayerbotWarlockAI.cpp | 6 ++++++ src/game/playerbot/PlayerbotWarlockAI.h | 1 + 2 files changed, 7 insertions(+) diff --git a/src/game/playerbot/PlayerbotWarlockAI.cpp b/src/game/playerbot/PlayerbotWarlockAI.cpp index 852b5ca6c..b8ede2099 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.cpp +++ b/src/game/playerbot/PlayerbotWarlockAI.cpp @@ -337,6 +337,12 @@ void PlayerbotWarlockAI::DoNonCombatActions() if (!m_bot) return; + // Destroy extra soul shards + uint8 shardCount = m_bot->GetItemCount(SOUL_SHARD, false, NULL); + uint8 freeSpace = ai->GetFreeBagSpace(); + if (shardCount > MAX_SHARD_COUNT || (freeSpace == 0 && shardCount > 1)) + m_bot->DestroyItemCount(SOUL_SHARD, shardCount > MAX_SHARD_COUNT ? shardCount - MAX_SHARD_COUNT : 1, true, false); + SpellSequence = SPELL_CURSES; Pet *pet = m_bot->GetPet(); diff --git a/src/game/playerbot/PlayerbotWarlockAI.h b/src/game/playerbot/PlayerbotWarlockAI.h index 608cccd72..a8b18e17c 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.h +++ b/src/game/playerbot/PlayerbotWarlockAI.h @@ -4,6 +4,7 @@ #include "PlayerbotClassAI.h" #define SOUL_SHARD 6265 +#define MAX_SHARD_COUNT 4 // Maximum soul shard count bot should keep enum { From 1246bccd00e4226ba6f9d4be7a41e8070dae1c9e Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sun, 5 Sep 2010 17:48:52 +0400 Subject: [PATCH 116/187] Fix SMSG_SPELL_FAILURE packet handler --- src/game/playerbot/PlayerbotAI.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 773a86318..6249cc9d4 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -541,14 +541,17 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) case SMSG_SPELL_FAILURE: { WorldPacket p(packet); - uint64 casterGuid = extractGuid(p); + uint8 castCount; + uint32 spellId; + + uint64 casterGuid = p.readPackGUID(); if (casterGuid != m_bot->GetGUID()) return; - uint32 spellId; - p >> spellId; + + p >> castCount >> spellId; if (m_CurrentlyCastingSpellId == spellId) { - m_ignoreAIUpdatesUntilTime = time(0) + 1; + m_ignoreAIUpdatesUntilTime = time(0); m_CurrentlyCastingSpellId = 0; } return; From ee9c1850718e63a2dcfa407485389e6d3672c48e Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sun, 5 Sep 2010 17:50:30 +0400 Subject: [PATCH 117/187] Optimize bot reaction during loot phase --- src/game/playerbot/PlayerbotAI.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 6249cc9d4..e852046b9 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2233,9 +2233,13 @@ void PlayerbotAI::UpdateAI(const uint32 p_time) { SetState( BOTSTATE_LOOTING ); m_attackerInfo.clear(); + m_ignoreAIUpdatesUntilTime = time(0); } else if (m_botState == BOTSTATE_LOOTING) + { DoLoot(); + m_ignoreAIUpdatesUntilTime = time(0); + } /* // are we sitting, if so feast if possible else if (m_bot->getStandState() == UNIT_STAND_STATE_SIT) From ffd380b961f9bc7df2b38f110dc747679d9dfc6a Mon Sep 17 00:00:00 2001 From: chelobaka Date: Mon, 6 Sep 2010 15:41:51 +0400 Subject: [PATCH 118/187] Apply single coding style to whole project --- src/game/playerbot/PlayerbotAI.cpp | 1614 ++++++++--------- src/game/playerbot/PlayerbotAI.h | 548 +++--- src/game/playerbot/PlayerbotClassAI.cpp | 2 +- src/game/playerbot/PlayerbotClassAI.h | 36 +- src/game/playerbot/PlayerbotDeathKnightAI.cpp | 714 ++++---- src/game/playerbot/PlayerbotDeathKnightAI.h | 42 +- src/game/playerbot/PlayerbotDruidAI.cpp | 176 +- src/game/playerbot/PlayerbotDruidAI.h | 58 +- src/game/playerbot/PlayerbotHunterAI.cpp | 246 +-- src/game/playerbot/PlayerbotHunterAI.h | 46 +- src/game/playerbot/PlayerbotMageAI.cpp | 142 +- src/game/playerbot/PlayerbotMageAI.h | 46 +- src/game/playerbot/PlayerbotMgr.cpp | 522 +++--- src/game/playerbot/PlayerbotMgr.h | 78 +- src/game/playerbot/PlayerbotPaladinAI.cpp | 88 +- src/game/playerbot/PlayerbotPaladinAI.h | 50 +- src/game/playerbot/PlayerbotPriestAI.cpp | 164 +- src/game/playerbot/PlayerbotPriestAI.h | 132 +- src/game/playerbot/PlayerbotRogueAI.cpp | 147 +- src/game/playerbot/PlayerbotRogueAI.h | 44 +- src/game/playerbot/PlayerbotShamanAI.cpp | 101 +- src/game/playerbot/PlayerbotShamanAI.h | 46 +- src/game/playerbot/PlayerbotWarlockAI.cpp | 498 ++--- src/game/playerbot/PlayerbotWarlockAI.h | 184 +- src/game/playerbot/PlayerbotWarriorAI.cpp | 219 ++- src/game/playerbot/PlayerbotWarriorAI.h | 44 +- src/game/playerbot/config.h | 2 +- 27 files changed, 2993 insertions(+), 2996 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index e852046b9..c87acfd88 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -68,12 +68,12 @@ uint64 extractGuid(WorldPacket& packet) // ChatHandler already implements some useful commands the master can call on bots // These commands are protected inside the ChatHandler class so this class provides access to the commands // we'd like to call on our bots -class PlayerbotChatHandler: protected ChatHandler +class PlayerbotChatHandler : protected ChatHandler { public: explicit PlayerbotChatHandler(Player* pMasterPlayer) : ChatHandler(pMasterPlayer) {} - bool revive(Player& botPlayer) { return HandleReviveCommand((char*)botPlayer.GetName()); } - bool teleport(Player& botPlayer) { return HandleNamegoCommand((char*)botPlayer.GetName()); } + bool revive(Player& botPlayer) { return HandleReviveCommand((char*) botPlayer.GetName()); } + bool teleport(Player& botPlayer) { return HandleNamegoCommand((char*) botPlayer.GetName()); } void sysmessage(const char *str) { SendSysMessage(str); } bool dropQuest(char *str) { return HandleQuestRemoveCommand(str); } }; @@ -83,64 +83,64 @@ PlayerbotAI::PlayerbotAI(PlayerbotMgr* const mgr, Player* const bot) : m_combatOrder(ORDERS_NONE), m_ScenarioType(SCENARIO_PVEEASY), m_TimeDoneEating(0), m_TimeDoneDrinking(0), m_CurrentlyCastingSpellId(0), m_spellIdCommand(0), - m_targetGuidCommand(0), m_classAI(0) { + m_targetGuidCommand(0), m_classAI(0) { // set bot state and needed item list m_botState = BOTSTATE_NORMAL; SetQuestNeedItems(); - // reset some pointers + // reset some pointers m_targetChanged = false; m_targetType = TARGET_NORMAL; - m_targetCombat = 0; - m_targetAssist = 0; - m_targetProtect = 0; + m_targetCombat = 0; + m_targetAssist = 0; + m_targetProtect = 0; - // start following master (will also teleport bot to master) - SetMovementOrder( MOVEMENT_FOLLOW, GetMaster() ); + // start following master (will also teleport bot to master) + SetMovementOrder(MOVEMENT_FOLLOW, GetMaster()); // get class specific ai switch (m_bot->getClass()) { case CLASS_PRIEST: - m_combatStyle = COMBAT_RANGED; + m_combatStyle = COMBAT_RANGED; m_classAI = (PlayerbotClassAI*) new PlayerbotPriestAI(GetMaster(), m_bot, this); break; case CLASS_MAGE: - m_combatStyle = COMBAT_RANGED; + m_combatStyle = COMBAT_RANGED; m_classAI = (PlayerbotClassAI*) new PlayerbotMageAI(GetMaster(), m_bot, this); break; case CLASS_WARLOCK: - m_combatStyle = COMBAT_RANGED; + m_combatStyle = COMBAT_RANGED; m_classAI = (PlayerbotClassAI*) new PlayerbotWarlockAI(GetMaster(), m_bot, this); break; case CLASS_WARRIOR: - m_combatStyle = COMBAT_MELEE; + m_combatStyle = COMBAT_MELEE; m_classAI = (PlayerbotClassAI*) new PlayerbotWarriorAI(GetMaster(), m_bot, this); break; case CLASS_SHAMAN: - m_combatStyle = COMBAT_MELEE; + m_combatStyle = COMBAT_MELEE; m_classAI = (PlayerbotClassAI*) new PlayerbotShamanAI(GetMaster(), m_bot, this); break; case CLASS_PALADIN: - m_combatStyle = COMBAT_MELEE; + m_combatStyle = COMBAT_MELEE; m_classAI = (PlayerbotClassAI*) new PlayerbotPaladinAI(GetMaster(), m_bot, this); break; case CLASS_ROGUE: - m_combatStyle = COMBAT_MELEE; + m_combatStyle = COMBAT_MELEE; m_classAI = (PlayerbotClassAI*) new PlayerbotRogueAI(GetMaster(), m_bot, this); break; case CLASS_DRUID: - m_combatStyle = COMBAT_MELEE; + m_combatStyle = COMBAT_MELEE; m_classAI = (PlayerbotClassAI*) new PlayerbotDruidAI(GetMaster(), m_bot, this); break; case CLASS_HUNTER: - m_combatStyle = COMBAT_RANGED; - m_classAI = (PlayerbotClassAI*)new PlayerbotHunterAI(GetMaster(), m_bot, this); + m_combatStyle = COMBAT_RANGED; + m_classAI = (PlayerbotClassAI*) new PlayerbotHunterAI(GetMaster(), m_bot, this); break; case CLASS_DEATH_KNIGHT: - m_combatStyle = COMBAT_MELEE; - m_classAI = (PlayerbotClassAI*)new PlayerbotDeathKnightAI(GetMaster(), m_bot, this); + m_combatStyle = COMBAT_MELEE; + m_classAI = (PlayerbotClassAI*) new PlayerbotDeathKnightAI(GetMaster(), m_bot, this); break; } } @@ -172,10 +172,10 @@ uint32 PlayerbotAI::getSpellId(const char* args, bool master) const wstrToLower(wnamepart); int loc = 0; - if (master) - loc = GetMaster()->GetSession()->GetSessionDbcLocale(); - else - loc = m_bot->GetSession()->GetSessionDbcLocale(); + if (master) + loc = GetMaster()->GetSession()->GetSessionDbcLocale(); + else + loc = m_bot->GetSession()->GetSessionDbcLocale(); uint32 foundSpellId = 0; bool foundExactMatch = false; @@ -246,40 +246,40 @@ uint32 PlayerbotAI::getPetSpellId(const char* args) const bool foundMatchUsesNoReagents = false; for (PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end(); ++itr) - { - uint32 spellId = itr->first; - - if (itr->second.state == PETSPELL_REMOVED || IsPassiveSpell(spellId)) - continue; - - const SpellEntry* pSpellInfo = sSpellStore.LookupEntry(spellId); - if (!pSpellInfo) - continue; - - const std::string name = pSpellInfo->SpellName[loc]; - if (name.empty() || !Utf8FitTo(name, wnamepart)) - continue; - - bool isExactMatch = (name.length() == wnamepart.length()) ? true : false; - bool usesNoReagents = (pSpellInfo->Reagent[0] <= 0) ? true : false; - - // if we already found a spell - bool useThisSpell = true; - if (foundSpellId > 0) - { - if (isExactMatch && !foundExactMatch) {} - else if (usesNoReagents && !foundMatchUsesNoReagents) {} - else if (spellId > foundSpellId) {} - else - useThisSpell = false; - } - if (useThisSpell) - { - foundSpellId = spellId; - foundExactMatch = isExactMatch; - foundMatchUsesNoReagents = usesNoReagents; - } - } + { + uint32 spellId = itr->first; + + if (itr->second.state == PETSPELL_REMOVED || IsPassiveSpell(spellId)) + continue; + + const SpellEntry* pSpellInfo = sSpellStore.LookupEntry(spellId); + if (!pSpellInfo) + continue; + + const std::string name = pSpellInfo->SpellName[loc]; + if (name.empty() || !Utf8FitTo(name, wnamepart)) + continue; + + bool isExactMatch = (name.length() == wnamepart.length()) ? true : false; + bool usesNoReagents = (pSpellInfo->Reagent[0] <= 0) ? true : false; + + // if we already found a spell + bool useThisSpell = true; + if (foundSpellId > 0) + { + if (isExactMatch && !foundExactMatch) {} + else if (usesNoReagents && !foundMatchUsesNoReagents) {} + else if (spellId > foundSpellId) {} + else + useThisSpell = false; + } + if (useThisSpell) + { + foundSpellId = spellId; + foundExactMatch = isExactMatch; + foundMatchUsesNoReagents = usesNoReagents; + } + } return foundSpellId; } @@ -293,7 +293,7 @@ uint32 PlayerbotAI::initSpell(uint32 spellId) uint32 next = 0; SpellChainMapNext const& nextMap = sSpellMgr.GetSpellChainNext(); - for(SpellChainMapNext::const_iterator itr = nextMap.lower_bound(spellId); itr != nextMap.upper_bound(spellId); ++itr) + for (SpellChainMapNext::const_iterator itr = nextMap.lower_bound(spellId); itr != nextMap.upper_bound(spellId); ++itr) { SpellChainNode const* node = sSpellMgr.GetSpellChainNode(itr->second); // If next spell is a requirement for this one then skip it @@ -387,9 +387,9 @@ void PlayerbotAI::SendNotEquipList(Player& player) ChatHandler ch(GetMaster()); const std::string descr[] = { "head", "neck", "shoulders", "body", "chest", - "waist", "legs", "feet", "wrists", "hands", "finger1", "finger2", - "trinket1", "trinket2", "back", "mainhand", "offhand", "ranged", - "tabard" }; + "waist", "legs", "feet", "wrists", "hands", "finger1", "finger2", + "trinket1", "trinket2", "back", "mainhand", "offhand", "ranged", + "tabard" }; // now send client all items that can be equipped by slot for (uint8 equipSlot = 0; equipSlot < 19; ++equipSlot) @@ -415,13 +415,13 @@ void PlayerbotAI::SendNotEquipList(Player& player) } } -void PlayerbotAI::SendQuestItemList( Player& player ) +void PlayerbotAI::SendQuestItemList(Player& player) { std::ostringstream out; - for( BotNeedItem::iterator itr=m_needItemList.begin(); itr!=m_needItemList.end(); ++itr ) + for (BotNeedItem::iterator itr = m_needItemList.begin(); itr != m_needItemList.end(); ++itr) { - const ItemPrototype * pItemProto = sObjectMgr.GetItemPrototype( itr->first ); + const ItemPrototype * pItemProto = sObjectMgr.GetItemPrototype(itr->first); std::string itemName = pItemProto->Name1; ItemLocalization(itemName, pItemProto->ItemId); @@ -431,54 +431,54 @@ void PlayerbotAI::SendQuestItemList( Player& player ) << "]|h|r"; } - TellMaster( "Here's a list of all items I need for quests:" ); - TellMaster( out.str().c_str() ); + TellMaster("Here's a list of all items I need for quests:"); + TellMaster(out.str().c_str()); } -void PlayerbotAI::SendOrders( Player& player ) +void PlayerbotAI::SendOrders(Player& player) { - std::ostringstream out; + std::ostringstream out; - if( !m_combatOrder ) - out << "Got no combat orders!"; - else if( m_combatOrder&ORDERS_TANK ) - out << "I TANK"; - else if( m_combatOrder&ORDERS_ASSIST ) - out << "I ASSIST " << (m_targetAssist?m_targetAssist->GetName():"unknown"); - else if( m_combatOrder&ORDERS_HEAL ) - out << "I HEAL"; - if( (m_combatOrder&ORDERS_PRIMARY) && (m_combatOrder&ORDERS_SECONDARY) ) - out << " and "; - if( m_combatOrder&ORDERS_PROTECT ) - out << "I PROTECT " << (m_targetProtect?m_targetProtect->GetName():"unknown"); + if (!m_combatOrder) + out << "Got no combat orders!"; + else if (m_combatOrder & ORDERS_TANK) + out << "I TANK"; + else if (m_combatOrder & ORDERS_ASSIST) + out << "I ASSIST " << (m_targetAssist ? m_targetAssist->GetName() : "unknown"); + else if (m_combatOrder & ORDERS_HEAL) + out << "I HEAL"; + if ((m_combatOrder & ORDERS_PRIMARY) && (m_combatOrder & ORDERS_SECONDARY)) + out << " and "; + if (m_combatOrder & ORDERS_PROTECT) + out << "I PROTECT " << (m_targetProtect ? m_targetProtect->GetName() : "unknown"); out << "."; - if( m_mgr->m_confDebugWhisper ) + if (m_mgr->m_confDebugWhisper) { - out << " " << (IsInCombat()?"I'm in COMBAT! ":"Not in combat. "); + out << " " << (IsInCombat() ? "I'm in COMBAT! " : "Not in combat. "); out << "Current state is "; - if( m_botState == BOTSTATE_NORMAL ) + if (m_botState == BOTSTATE_NORMAL) out << "NORMAL"; - else if( m_botState == BOTSTATE_COMBAT ) + else if (m_botState == BOTSTATE_COMBAT) out << "COMBAT"; - else if( m_botState == BOTSTATE_DEAD ) + else if (m_botState == BOTSTATE_DEAD) out << "DEAD"; - else if( m_botState == BOTSTATE_DEADRELEASED ) + else if (m_botState == BOTSTATE_DEADRELEASED) out << "RELEASED"; - else if( m_botState == BOTSTATE_LOOTING ) + else if (m_botState == BOTSTATE_LOOTING) out << "LOOTING"; out << ". Movement order is "; - if( m_movementOrder == MOVEMENT_NONE ) + if (m_movementOrder == MOVEMENT_NONE) out << "NONE"; - else if( m_movementOrder == MOVEMENT_FOLLOW ) - out << "FOLLOW " << (m_followTarget?m_followTarget->GetName():"unknown"); - else if( m_movementOrder == MOVEMENT_STAY ) + else if (m_movementOrder == MOVEMENT_FOLLOW) + out << "FOLLOW " << (m_followTarget ? m_followTarget->GetName() : "unknown"); + else if (m_movementOrder == MOVEMENT_STAY) out << "STAY"; out << ". Got " << m_attackerInfo.size() << " attacker(s) in list."; - out << " Next action in " << (m_ignoreAIUpdatesUntilTime-time(0)) << "sec."; + out << " Next action in " << (m_ignoreAIUpdatesUntilTime - time(0)) << "sec."; } - TellMaster( out.str().c_str() ); + TellMaster(out.str().c_str()); } // handle outgoing packets the server would send to the client @@ -577,39 +577,39 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) //Bot Part uint32 spellMount = 0; - for(PlayerSpellMap::iterator itr = m_bot->GetSpellMap().begin(); itr != m_bot->GetSpellMap().end(); ++itr) + for (PlayerSpellMap::iterator itr = m_bot->GetSpellMap().begin(); itr != m_bot->GetSpellMap().end(); ++itr) { uint32 spellId = itr->first; - if(itr->second.state == PLAYERSPELL_REMOVED || itr->second.disabled || IsPassiveSpell(spellId)) + if (itr->second.state == PLAYERSPELL_REMOVED || itr->second.disabled || IsPassiveSpell(spellId)) continue; const SpellEntry* pSpellInfo = sSpellStore.LookupEntry(spellId); if (!pSpellInfo) continue; - if(pSpellInfo->EffectApplyAuraName[0] == SPELL_AURA_MOUNTED) + if (pSpellInfo->EffectApplyAuraName[0] == SPELL_AURA_MOUNTED) { - if(pSpellInfo->EffectApplyAuraName[1] == SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED) + if (pSpellInfo->EffectApplyAuraName[1] == SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED) { - if(pSpellInfo->EffectBasePoints[1] == master_speed1) + if (pSpellInfo->EffectBasePoints[1] == master_speed1) { spellMount = spellId; break; } } - else if((pSpellInfo->EffectApplyAuraName[1] == SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED) - && (pSpellInfo->EffectApplyAuraName[2] == SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED)) + else if ((pSpellInfo->EffectApplyAuraName[1] == SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED) + && (pSpellInfo->EffectApplyAuraName[2] == SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED)) { - if((pSpellInfo->EffectBasePoints[1] == master_speed1) + if ((pSpellInfo->EffectBasePoints[1] == master_speed1) && (pSpellInfo->EffectBasePoints[2] == master_speed2)) { spellMount = spellId; break; } } - else if((pSpellInfo->EffectApplyAuraName[2] == SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED) - && (pSpellInfo->EffectApplyAuraName[1] == SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED)) + else if ((pSpellInfo->EffectApplyAuraName[2] == SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED) + && (pSpellInfo->EffectApplyAuraName[1] == SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED)) { - if((pSpellInfo->EffectBasePoints[2] == master_speed2) + if ((pSpellInfo->EffectBasePoints[2] == master_speed2) && (pSpellInfo->EffectBasePoints[1] == master_speed1)) { spellMount = spellId; @@ -618,7 +618,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) } } } - if(spellMount > 0) m_bot->CastSpell(m_bot, spellMount, false); + if (spellMount > 0) m_bot->CastSpell(m_bot, spellMount, false); } } else if (!GetMaster()->IsMounted() && m_bot->IsMounted()) @@ -636,7 +636,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) uint64 guid = extractGuid(p); if (guid != m_bot->GetGUID()) return; - m_bot->m_movementInfo.AddMovementFlag(MOVEFLAG_FLYING); + m_bot->m_movementInfo.AddMovementFlag(MOVEFLAG_FLYING); //m_bot->SetSpeed(MOVE_RUN, GetMaster()->GetSpeed(MOVE_FLIGHT) +0.1f, true); return; } @@ -648,7 +648,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) uint64 guid = extractGuid(p); if (guid != m_bot->GetGUID()) return; - m_bot->m_movementInfo.RemoveMovementFlag(MOVEFLAG_FLYING); + m_bot->m_movementInfo.RemoveMovementFlag(MOVEFLAG_FLYING); //m_bot->SetSpeed(MOVE_RUN,GetMaster()->GetSpeedRate(MOVE_RUN),true); return; } @@ -691,7 +691,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) if (operation == PARTY_OP_LEAVE) { if (member == GetMaster()->GetName()) - m_bot->GetSession()->HandleGroupDisbandOpcode(p); // packet not used updated code + m_bot->GetSession()->HandleGroupDisbandOpcode(p); // packet not used updated code } return; } @@ -719,7 +719,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) m_bot->GetSession()->HandleGroupDeclineOpcode(p); // packet not used } else - m_bot->GetSession()->HandleGroupAcceptOpcode(p); // packet not used + m_bot->GetSession()->HandleGroupAcceptOpcode(p); // packet not used } return; } @@ -738,7 +738,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) //4 == TRADE_STATUS_TRADE_ACCEPT if (status == 4) - m_bot->GetSession()->HandleAcceptTradeOpcode(p); // packet not used + m_bot->GetSession()->HandleAcceptTradeOpcode(p); // packet not used //1 == TRADE_STATUS_BEGIN_TRADE else if (status == 1) @@ -855,36 +855,36 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) return; } - /* uncomment this and your bots will tell you all their outgoing packet opcode names - case SMSG_MONSTER_MOVE: - case SMSG_UPDATE_WORLD_STATE: - case SMSG_COMPRESSED_UPDATE_OBJECT: - case MSG_MOVE_SET_FACING: - case MSG_MOVE_STOP: - case MSG_MOVE_HEARTBEAT: - case MSG_MOVE_STOP_STRAFE: - case MSG_MOVE_START_STRAFE_LEFT: - case SMSG_UPDATE_OBJECT: - case MSG_MOVE_START_FORWARD: - case MSG_MOVE_START_STRAFE_RIGHT: - case SMSG_DESTROY_OBJECT: - case MSG_MOVE_START_BACKWARD: - case SMSG_AURA_UPDATE_ALL: - case MSG_MOVE_FALL_LAND: - case MSG_MOVE_JUMP: - return; + /* uncomment this and your bots will tell you all their outgoing packet opcode names + case SMSG_MONSTER_MOVE: + case SMSG_UPDATE_WORLD_STATE: + case SMSG_COMPRESSED_UPDATE_OBJECT: + case MSG_MOVE_SET_FACING: + case MSG_MOVE_STOP: + case MSG_MOVE_HEARTBEAT: + case MSG_MOVE_STOP_STRAFE: + case MSG_MOVE_START_STRAFE_LEFT: + case SMSG_UPDATE_OBJECT: + case MSG_MOVE_START_FORWARD: + case MSG_MOVE_START_STRAFE_RIGHT: + case SMSG_DESTROY_OBJECT: + case MSG_MOVE_START_BACKWARD: + case SMSG_AURA_UPDATE_ALL: + case MSG_MOVE_FALL_LAND: + case MSG_MOVE_JUMP: + return; - default: - { - const char* oc = LookupOpcodeName(packet.GetOpcode()); + default: + { + const char* oc = LookupOpcodeName(packet.GetOpcode()); - std::ostringstream out; - out << "botout: " << oc; - sLog.outError(out.str().c_str()); + std::ostringstream out; + out << "botout: " << oc; + sLog.outError(out.str().c_str()); - //TellMaster(oc); - } - */ + //TellMaster(oc); + } + */ } } @@ -956,7 +956,7 @@ uint8 PlayerbotAI::GetRunicPower() const bool PlayerbotAI::HasAura(uint32 spellId, const Unit& player) const { - if(spellId <= 0) + if (spellId <= 0) return false; for (Unit::SpellAuraHolderMap::const_iterator iter = player.GetSpellAuraHolderMap().begin(); iter != player.GetSpellAuraHolderMap().end(); ++iter) @@ -1293,7 +1293,7 @@ void PlayerbotAI::Feast() // should we drink another if (m_bot->getPowerType() == POWER_MANA && currentTime > m_TimeDoneDrinking - && ((static_cast (m_bot->GetPower(POWER_MANA)) / m_bot->GetMaxPower(POWER_MANA)) < 0.8)) + && ((static_cast (m_bot->GetPower(POWER_MANA)) / m_bot->GetMaxPower(POWER_MANA)) < 0.8)) { Item* pItem = FindDrink(); if (pItem != NULL) @@ -1330,66 +1330,66 @@ void PlayerbotAI::Feast() // intelligently sets a reasonable combat order for this bot // based on its class / level / etc -void PlayerbotAI::GetCombatTarget( Unit* forcedTarget ) +void PlayerbotAI::GetCombatTarget(Unit* forcedTarget) { // set combat state, and clear looting, etc... - if( m_botState != BOTSTATE_COMBAT ) + if (m_botState != BOTSTATE_COMBAT) { - SetState( BOTSTATE_COMBAT ); + SetState(BOTSTATE_COMBAT); SetQuestNeedItems(); m_lootCreature.clear(); m_lootCurrent = 0; - m_targetCombat = 0; + m_targetCombat = 0; } // update attacker info now UpdateAttackerInfo(); - // check for attackers on protected unit, and make it a forcedTarget if any - if( !forcedTarget && (m_combatOrder&ORDERS_PROTECT) && m_targetProtect!=0 ) + // check for attackers on protected unit, and make it a forcedTarget if any + if (!forcedTarget && (m_combatOrder & ORDERS_PROTECT) && m_targetProtect != 0) { - Unit *newTarget = FindAttacker( (ATTACKERINFOTYPE)(AIT_VICTIMNOTSELF|AIT_HIGHESTTHREAT), m_targetProtect ); - if( newTarget && newTarget!=m_targetCombat ) + Unit *newTarget = FindAttacker((ATTACKERINFOTYPE) (AIT_VICTIMNOTSELF | AIT_HIGHESTTHREAT), m_targetProtect); + if (newTarget && newTarget != m_targetCombat) { forcedTarget = newTarget; m_targetType = TARGET_THREATEN; - if( m_mgr->m_confDebugWhisper ) - TellMaster( "Changing target to %s to protect %s", forcedTarget->GetName(), m_targetProtect->GetName() ); + if (m_mgr->m_confDebugWhisper) + TellMaster("Changing target to %s to protect %s", forcedTarget->GetName(), m_targetProtect->GetName()); } - } else if( forcedTarget ) + } else if (forcedTarget) { - if( m_mgr->m_confDebugWhisper ) - TellMaster( "Changing target to %s by force!", forcedTarget->GetName() ); - m_targetType = (m_combatOrder==ORDERS_TANK ? TARGET_THREATEN : TARGET_NORMAL); + if (m_mgr->m_confDebugWhisper) + TellMaster("Changing target to %s by force!", forcedTarget->GetName()); + m_targetType = (m_combatOrder == ORDERS_TANK ? TARGET_THREATEN : TARGET_NORMAL); } - // we already have a target and we are not forced to change it - if( m_targetCombat && !forcedTarget ) - return; + // we already have a target and we are not forced to change it + if (m_targetCombat && !forcedTarget) + return; - // are we forced on a target? - if( forcedTarget ) + // are we forced on a target? + if (forcedTarget) { m_targetCombat = forcedTarget; m_targetChanged = true; } - // do we have to assist someone? - if( !m_targetCombat && (m_combatOrder&ORDERS_ASSIST) && m_targetAssist!=0 ) + // do we have to assist someone? + if (!m_targetCombat && (m_combatOrder & ORDERS_ASSIST) && m_targetAssist != 0) { - m_targetCombat = FindAttacker( (ATTACKERINFOTYPE)(AIT_VICTIMNOTSELF|AIT_LOWESTTHREAT), m_targetAssist ); - if( m_mgr->m_confDebugWhisper && m_targetCombat ) - TellMaster( "Attacking %s to assist %s", m_targetCombat->GetName(), m_targetAssist->GetName() ); - m_targetType = (m_combatOrder==ORDERS_TANK ? TARGET_THREATEN : TARGET_NORMAL); + m_targetCombat = FindAttacker((ATTACKERINFOTYPE) (AIT_VICTIMNOTSELF | AIT_LOWESTTHREAT), m_targetAssist); + if (m_mgr->m_confDebugWhisper && m_targetCombat) + TellMaster("Attacking %s to assist %s", m_targetCombat->GetName(), m_targetAssist->GetName()); + m_targetType = (m_combatOrder == ORDERS_TANK ? TARGET_THREATEN : TARGET_NORMAL); m_targetChanged = true; } - // are there any other attackers? - if( !m_targetCombat ) + // are there any other attackers? + if (!m_targetCombat) { - m_targetCombat = FindAttacker(); - m_targetType = (m_combatOrder==ORDERS_TANK ? TARGET_THREATEN : TARGET_NORMAL); + m_targetCombat = FindAttacker(); + m_targetType = (m_combatOrder == ORDERS_TANK ? TARGET_THREATEN : TARGET_NORMAL); m_targetChanged = true; } - // no attacker found anyway + // no attacker found anyway if (!m_targetCombat) { m_targetType = TARGET_NORMAL; @@ -1415,68 +1415,68 @@ void PlayerbotAI::GetCombatTarget( Unit* forcedTarget ) m_bot->Attack(m_targetCombat, true); // add thingToAttack to loot list - m_lootCreature.push_back( m_targetCombat->GetGUID() ); + m_lootCreature.push_back(m_targetCombat->GetGUID()); - // set movement generators for combat movement - MovementClear(); + // set movement generators for combat movement + MovementClear(); return; } void PlayerbotAI::DoNextCombatManeuver() { // check for new targets - GetCombatTarget(); - // check if we have a target - fixes crash reported by rrtn (kill hunter's pet bug) - // if current target for attacks doesn't make sense anymore + GetCombatTarget(); + // check if we have a target - fixes crash reported by rrtn (kill hunter's pet bug) + // if current target for attacks doesn't make sense anymore // clear our orders so we can get orders in next update - if( !m_targetCombat || m_targetCombat->isDead() || !m_targetCombat->IsInWorld() || !m_bot->IsHostileTo(m_targetCombat) || !m_bot->IsInMap(m_targetCombat) ) + if (!m_targetCombat || m_targetCombat->isDead() || !m_targetCombat->IsInWorld() || !m_bot->IsHostileTo(m_targetCombat) || !m_bot->IsInMap(m_targetCombat)) { m_bot->AttackStop(); m_bot->SetSelection(0); MovementReset(); m_bot->InterruptNonMeleeSpells(true); - m_targetCombat = 0; + m_targetCombat = 0; m_targetChanged = false; m_targetType = TARGET_NORMAL; return; } // do opening moves, if we changed target - if( m_targetChanged ) + if (m_targetChanged) { - if( GetClassAI() ) - m_targetChanged = GetClassAI()->DoFirstCombatManeuver( m_targetCombat ); + if (GetClassAI()) + m_targetChanged = GetClassAI()->DoFirstCombatManeuver(m_targetCombat); else m_targetChanged = false; } // do normal combat movement - DoCombatMovement(); + DoCombatMovement(); - if (GetClassAI() && !m_targetChanged ) - (GetClassAI())->DoNextCombatManeuver( m_targetCombat ); + if (GetClassAI() && !m_targetChanged) + (GetClassAI())->DoNextCombatManeuver(m_targetCombat); } void PlayerbotAI::DoCombatMovement() { - if( !m_targetCombat ) return; - - float targetDist = m_bot->GetDistance( m_targetCombat ); - - if( m_combatStyle==COMBAT_MELEE && !m_bot->hasUnitState( UNIT_STAT_CHASE ) && ( (m_movementOrder==MOVEMENT_STAY && targetDist<=ATTACK_DISTANCE) || (m_movementOrder!=MOVEMENT_STAY) ) ) - { - // melee combat - chase target if in range or if we are not forced to stay - m_bot->GetMotionMaster()->MoveChase( m_targetCombat ); - } - else if( m_combatStyle==COMBAT_RANGED && m_movementOrder!=MOVEMENT_STAY ) - { - // ranged combat - just move within spell range - // TODO: just follow in spell range! how to determine bots spell range? - if( targetDist>25.0f ) { - m_bot->GetMotionMaster()->MoveChase( m_targetCombat ); - } else { - MovementClear(); - } - } + if (!m_targetCombat) return; + + float targetDist = m_bot->GetDistance(m_targetCombat); + + if (m_combatStyle == COMBAT_MELEE && !m_bot->hasUnitState(UNIT_STAT_CHASE) && ((m_movementOrder == MOVEMENT_STAY && targetDist <= ATTACK_DISTANCE) || (m_movementOrder != MOVEMENT_STAY))) + { + // melee combat - chase target if in range or if we are not forced to stay + m_bot->GetMotionMaster()->MoveChase(m_targetCombat); + } + else if (m_combatStyle == COMBAT_RANGED && m_movementOrder != MOVEMENT_STAY) + { + // ranged combat - just move within spell range + // TODO: just follow in spell range! how to determine bots spell range? + if (targetDist > 25.0f) { + m_bot->GetMotionMaster()->MoveChase(m_targetCombat); + } else { + MovementClear(); + } + } } void PlayerbotAI::SetQuestNeedItems() @@ -1487,28 +1487,28 @@ void PlayerbotAI::SetQuestNeedItems() m_lootCurrent = 0; // run through accepted quests, get quest infoand data - for( QuestStatusMap::iterator iter=m_bot->getQuestStatusMap().begin(); iter!=m_bot->getQuestStatusMap().end(); ++iter ) + for (QuestStatusMap::iterator iter = m_bot->getQuestStatusMap().begin(); iter != m_bot->getQuestStatusMap().end(); ++iter) { - const Quest *qInfo = sObjectMgr.GetQuestTemplate( iter->first ); - if( !qInfo ) + const Quest *qInfo = sObjectMgr.GetQuestTemplate(iter->first); + if (!qInfo) continue; QuestStatusData *qData = &iter->second; // only check quest if it is incomplete - if( qData->m_status != QUEST_STATUS_INCOMPLETE ) + if (qData->m_status != QUEST_STATUS_INCOMPLETE) continue; // check for items we not have enough of - for( int i=0; iReqItemCount[i] || (qInfo->ReqItemCount[i]-qData->m_itemcount[i])<=0 ) + if (!qInfo->ReqItemCount[i] || (qInfo->ReqItemCount[i] - qData->m_itemcount[i]) <= 0) continue; - m_needItemList[qInfo->ReqItemId[i]] = (qInfo->ReqItemCount[i]-qData->m_itemcount[i]); + m_needItemList[qInfo->ReqItemId[i]] = (qInfo->ReqItemCount[i] - qData->m_itemcount[i]); } } } -void PlayerbotAI::SetState( BotState state ) +void PlayerbotAI::SetState(BotState state) { //sLog.outDebug( "[PlayerbotAI]: %s switch state %d to %d", m_bot->GetName(), m_botState, state ); m_botState = state; @@ -1519,13 +1519,13 @@ uint8 PlayerbotAI::GetFreeBagSpace() const uint8 space = 0; for (uint8 i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; ++i) { - Item *pItem = m_bot->GetItemByPos( INVENTORY_SLOT_BAG_0, i ); + Item *pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, i); if (!pItem) ++space; } for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i) { - Bag* pBag = (Bag*)m_bot->GetItemByPos( INVENTORY_SLOT_BAG_0, i ); + Bag* pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, i); if (pBag && pBag->GetProto()->BagFamily == BAG_FAMILY_MASK_NONE) space += pBag->GetFreeSlots(); } @@ -1534,7 +1534,7 @@ uint8 PlayerbotAI::GetFreeBagSpace() const void PlayerbotAI::DoLoot() { - if( !m_lootCurrent && m_lootCreature.empty() ) + if (!m_lootCurrent && m_lootCreature.empty()) { //sLog.outDebug( "[PlayerbotAI]: %s reset loot list / go back to idle", m_bot->GetName() ); m_botState = BOTSTATE_NORMAL; @@ -1542,89 +1542,89 @@ void PlayerbotAI::DoLoot() return; } - if( !m_lootCurrent ) + if (!m_lootCurrent) { m_lootCurrent = m_lootCreature.front(); m_lootCreature.pop_front(); - Creature *c = m_bot->GetMap()->GetCreature( m_lootCurrent ); + Creature *c = m_bot->GetMap()->GetCreature(m_lootCurrent); // check if we got a creature and if it is still a corpse, otherwise bot runs to spawn point - if( !c || c->getDeathState()!=CORPSE || GetMaster()->GetDistance( c )>BOTLOOT_DISTANCE ) + if (!c || c->getDeathState() != CORPSE || GetMaster()->GetDistance(c) > BOTLOOT_DISTANCE) { m_lootCurrent = 0; return; } - m_bot->GetMotionMaster()->MovePoint( c->GetMapId(), c->GetPositionX(), c->GetPositionY(), c->GetPositionZ() ); + m_bot->GetMotionMaster()->MovePoint(c->GetMapId(), c->GetPositionX(), c->GetPositionY(), c->GetPositionZ()); //sLog.outDebug( "[PlayerbotAI]: %s is going to loot '%s' deathState=%d", m_bot->GetName(), c->GetName(), c->getDeathState() ); } else { - Creature *c = m_bot->GetMap()->GetCreature( m_lootCurrent ); - if( !c || c->getDeathState()!=CORPSE || GetMaster()->GetDistance( c )>BOTLOOT_DISTANCE ) + Creature *c = m_bot->GetMap()->GetCreature(m_lootCurrent); + if (!c || c->getDeathState() != CORPSE || GetMaster()->GetDistance(c) > BOTLOOT_DISTANCE) { m_lootCurrent = 0; return; } - if( m_bot->IsWithinDistInMap( c, INTERACTION_DISTANCE ) ) + if (m_bot->IsWithinDistInMap(c, INTERACTION_DISTANCE)) { // check for needed items - m_bot->SendLoot( m_lootCurrent, LOOT_CORPSE ); + m_bot->SendLoot(m_lootCurrent, LOOT_CORPSE); Loot *loot = &c->loot; - uint32 lootNum = loot->GetMaxSlotInLootFor( m_bot ); + uint32 lootNum = loot->GetMaxSlotInLootFor(m_bot); //sLog.outDebug( "[PlayerbotAI]: %s looting: '%s' got %d items", m_bot->GetName(), c->GetName(), loot->GetMaxSlotInLootFor( m_bot ) ); - for( uint32 l=0; lLootItemInSlot( l, m_bot, &qitem, &ffaitem, &conditem ); - if( !item ) + QuestItem *qitem = 0, *ffaitem = 0, *conditem = 0; + LootItem *item = loot->LootItemInSlot(l, m_bot, &qitem, &ffaitem, &conditem); + if (!item) continue; - if( !qitem && item->is_blocked ) + if (!qitem && item->is_blocked) { - m_bot->SendLootRelease( m_bot->GetLootGUID() ); + m_bot->SendLootRelease(m_bot->GetLootGUID()); continue; } - if( m_needItemList[item->itemid]>0 ) + if (m_needItemList[item->itemid] > 0) { //sLog.outDebug( "[PlayerbotAI]: %s looting: needed item '%s'", m_bot->GetName(), sObjectMgr.GetItemLocale(item->itemid)->Name ); ItemPosCountVec dest; - if( m_bot->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, item->itemid, item->count ) == EQUIP_ERR_OK ) + if (m_bot->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item->itemid, item->count) == EQUIP_ERR_OK) { - Item * newitem = m_bot->StoreNewItem( dest, item->itemid, true, item->randomPropertyId); + Item * newitem = m_bot->StoreNewItem(dest, item->itemid, true, item->randomPropertyId); - if( qitem ) + if (qitem) { qitem->is_looted = true; - if( item->freeforall || loot->GetPlayerQuestItems().size() == 1 ) - m_bot->SendNotifyLootItemRemoved( l ); + if (item->freeforall || loot->GetPlayerQuestItems().size() == 1) + m_bot->SendNotifyLootItemRemoved(l); else - loot->NotifyQuestItemRemoved( qitem->index ); + loot->NotifyQuestItemRemoved(qitem->index); } else { - if( ffaitem ) + if (ffaitem) { - ffaitem->is_looted=true; - m_bot->SendNotifyLootItemRemoved( l ); + ffaitem->is_looted = true; + m_bot->SendNotifyLootItemRemoved(l); } else { - if( conditem ) - conditem->is_looted=true; - loot->NotifyItemRemoved( l ); + if (conditem) + conditem->is_looted = true; + loot->NotifyItemRemoved(l); } } if (!item->freeforall) item->is_looted = true; --loot->unlootedCount; - m_bot->SendNewItem( newitem, uint32(item->count), false, false, true ); - m_bot->GetAchievementMgr().UpdateAchievementCriteria( ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item->itemid, item->count ); + m_bot->SendNewItem(newitem, uint32(item->count), false, false, true); + m_bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item->itemid, item->count); } } } // release loot // if( uint64 lguid = m_bot->GetLootGUID() && m_bot->GetSession() ) - m_bot->GetSession()->DoLootRelease( m_lootCurrent ); + m_bot->GetSession()->DoLootRelease(m_lootCurrent); //else if( !m_bot->GetSession() ) // sLog.outDebug( "[PlayerbotAI]: %s has no session. Cannot release loot!", m_bot->GetName() ); @@ -1637,80 +1637,80 @@ void PlayerbotAI::DoLoot() } } -void PlayerbotAI::AcceptQuest( Quest const *qInfo, Player *pGiver ) +void PlayerbotAI::AcceptQuest(Quest const *qInfo, Player *pGiver) { - if( !qInfo || !pGiver ) + if (!qInfo || !pGiver) return; uint32 quest = qInfo->GetQuestId(); - if( !pGiver->CanShareQuest( qInfo->GetQuestId() ) ) + if (!pGiver->CanShareQuest(qInfo->GetQuestId())) { // giver can't share quest - m_bot->SetDivider( 0 ); + m_bot->SetDivider(0); return; } - if( !m_bot->CanTakeQuest( qInfo, false ) ) + if (!m_bot->CanTakeQuest(qInfo, false)) { // can't take quest - m_bot->SetDivider( 0 ); + m_bot->SetDivider(0); return; } - if( m_bot->GetDivider() != 0 ) + if (m_bot->GetDivider() != 0) { // send msg to quest giving player - pGiver->SendPushToPartyResponse( m_bot, QUEST_PARTY_MSG_ACCEPT_QUEST ); - m_bot->SetDivider( 0 ); + pGiver->SendPushToPartyResponse(m_bot, QUEST_PARTY_MSG_ACCEPT_QUEST); + m_bot->SetDivider(0); } - if( m_bot->CanAddQuest( qInfo, false ) ) + if (m_bot->CanAddQuest(qInfo, false)) { - m_bot->AddQuest( qInfo, pGiver ); + m_bot->AddQuest(qInfo, pGiver); - if( m_bot->CanCompleteQuest( quest ) ) - m_bot->CompleteQuest( quest ); + if (m_bot->CanCompleteQuest(quest)) + m_bot->CompleteQuest(quest); // Runsttren: did not add typeid switch from WorldSession::HandleQuestgiverAcceptQuestOpcode! // I think it's not needed, cause typeid should be TYPEID_PLAYER - and this one is not handled // there and there is no default case also. - if( qInfo->GetSrcSpell() > 0 ) - m_bot->CastSpell( m_bot, qInfo->GetSrcSpell(), true ); + if (qInfo->GetSrcSpell() > 0) + m_bot->CastSpell(m_bot, qInfo->GetSrcSpell(), true); } } -void PlayerbotAI::TurnInQuests( WorldObject *questgiver ) +void PlayerbotAI::TurnInQuests(WorldObject *questgiver) { uint64 giverGUID = questgiver->GetGUID(); - if( !m_bot->IsInMap( questgiver ) ) + if (!m_bot->IsInMap(questgiver)) TellMaster("hey you are turning in quests without me!"); else { - m_bot->SetSelection( giverGUID ); + m_bot->SetSelection(giverGUID); // auto complete every completed quest this NPC has - m_bot->PrepareQuestMenu( giverGUID ); + m_bot->PrepareQuestMenu(giverGUID); QuestMenu& questMenu = m_bot->PlayerTalkClass->GetQuestMenu(); for (uint32 iI = 0; iI < questMenu.MenuItemCount(); ++iI) { - QuestMenuItem const& qItem = questMenu.GetItem(iI); - uint32 questID = qItem.m_qId; - Quest const* pQuest = sObjectMgr.GetQuestTemplate(questID); + QuestMenuItem const& qItem = questMenu.GetItem(iI); + uint32 questID = qItem.m_qId; + Quest const* pQuest = sObjectMgr.GetQuestTemplate(questID); - std::ostringstream out; - std::string questTitle = pQuest->GetTitle(); - QuestLocalization(questTitle, questID); + std::ostringstream out; + std::string questTitle = pQuest->GetTitle(); + QuestLocalization(questTitle, questID); QuestStatus status = m_bot->GetQuestStatus(questID); - // if quest is complete, turn it in - if (status == QUEST_STATUS_COMPLETE) - { + // if quest is complete, turn it in + if (status == QUEST_STATUS_COMPLETE) + { // if bot hasn't already turned quest in - if (! m_bot->GetQuestRewardStatus(questID)) + if (!m_bot->GetQuestRewardStatus(questID)) { // auto reward quest if no choice in reward if (pQuest->GetRewChoiceItemsCount() == 0) @@ -1759,7 +1759,7 @@ void PlayerbotAI::TurnInQuests( WorldObject *questgiver ) else { out << "What reward should I take for |cff808080|Hquest:" << questID << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r? "; - for (uint8 i=0; i < pQuest->GetRewChoiceItemsCount(); ++i) + for (uint8 i = 0; i < pQuest->GetRewChoiceItemsCount(); ++i) { ItemPrototype const * const pRewardItem = sObjectMgr.GetItemPrototype(pQuest->RewChoiceItemId[i]); std::string itemName = pRewardItem->Name1; @@ -1775,12 +1775,12 @@ void PlayerbotAI::TurnInQuests( WorldObject *questgiver ) << " |cff808080|Hquest:" << questID << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r"; } - else if (status == QUEST_STATUS_AVAILABLE){ + else if (status == QUEST_STATUS_AVAILABLE) { out << "|cff00ff00Quest available:|r " << " |cff808080|Hquest:" << questID << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r"; } - if (! out.str().empty()) + if (!out.str().empty()) TellMaster(out.str()); } } @@ -1791,10 +1791,10 @@ bool PlayerbotAI::IsInCombat() bool inCombat = false; inCombat |= m_bot->isInCombat(); inCombat |= GetMaster()->isInCombat(); - if( m_bot->GetGroup() ) + if (m_bot->GetGroup()) { GroupReference *ref = m_bot->GetGroup()->GetFirstMember(); - while( ref ) + while (ref) { inCombat |= ref->getSource()->isInCombat(); ref = ref->next(); @@ -1810,13 +1810,13 @@ void PlayerbotAI::UpdateAttackerInfo() // check own attackers HostileReference *ref = m_bot->getHostileRefManager().getFirst(); - while( ref ) + while (ref) { ThreatManager *target = ref->getSource(); uint64 guid = target->getOwner()->GetGUID(); m_attackerInfo[guid].attacker = target->getOwner(); m_attackerInfo[guid].victim = target->getOwner()->getVictim(); - m_attackerInfo[guid].threat = target->getThreat( m_bot ); + m_attackerInfo[guid].threat = target->getThreat(m_bot); m_attackerInfo[guid].count = 1; m_attackerInfo[guid].source = 1; ref = ref->next(); @@ -1824,46 +1824,46 @@ void PlayerbotAI::UpdateAttackerInfo() // check master's attackers ref = GetMaster()->getHostileRefManager().getFirst(); - while( ref ) + while (ref) { ThreatManager *target = ref->getSource(); uint64 guid = target->getOwner()->GetGUID(); - if( m_attackerInfo.find( guid ) == m_attackerInfo.end() ) + if (m_attackerInfo.find(guid) == m_attackerInfo.end()) { m_attackerInfo[guid].attacker = target->getOwner(); m_attackerInfo[guid].victim = target->getOwner()->getVictim(); m_attackerInfo[guid].count = 0; m_attackerInfo[guid].source = 2; } - m_attackerInfo[guid].threat = target->getThreat( m_bot ); + m_attackerInfo[guid].threat = target->getThreat(m_bot); m_attackerInfo[guid].count++; ref = ref->next(); } // check all group members now - if( m_bot->GetGroup() ) + if (m_bot->GetGroup()) { GroupReference *gref = m_bot->GetGroup()->GetFirstMember(); - while( gref ) + while (gref) { - if( gref->getSource() == m_bot || gref->getSource() == GetMaster() ) + if (gref->getSource() == m_bot || gref->getSource() == GetMaster()) { gref = gref->next(); continue; } ref = gref->getSource()->getHostileRefManager().getFirst(); - while( ref ) + while (ref) { ThreatManager *target = ref->getSource(); uint64 guid = target->getOwner()->GetGUID(); - if( m_attackerInfo.find( guid ) == m_attackerInfo.end() ) + if (m_attackerInfo.find(guid) == m_attackerInfo.end()) { m_attackerInfo[guid].attacker = target->getOwner(); m_attackerInfo[guid].victim = target->getOwner()->getVictim(); m_attackerInfo[guid].count = 0; m_attackerInfo[guid].source = 3; } - m_attackerInfo[guid].threat = target->getThreat( m_bot ); + m_attackerInfo[guid].threat = target->getThreat(m_bot); m_attackerInfo[guid].count++; ref = ref->next(); } @@ -1872,16 +1872,16 @@ void PlayerbotAI::UpdateAttackerInfo() } // get highest threat not caused by bot for every entry in AttackerInfoList... - for( AttackerInfoList::iterator itr=m_attackerInfo.begin(); itr!=m_attackerInfo.end(); ++itr ) + for (AttackerInfoList::iterator itr = m_attackerInfo.begin(); itr != m_attackerInfo.end(); ++itr) { - if( !itr->second.attacker ) + if (!itr->second.attacker) continue; Unit *a = itr->second.attacker; float t = 0.00; - std::list::const_iterator i=a->getThreatManager().getThreatList().begin(); - for( ; i!=a->getThreatManager().getThreatList().end(); ++i ) + std::list::const_iterator i = a->getThreatManager().getThreatList().begin(); + for (; i != a->getThreatManager().getThreatList().end(); ++i) { - if( (*i)->getThreat() > t && (*i)->getTarget() != m_bot ) + if ((*i)->getThreat() > t && (*i)->getTarget() != m_bot) t = (*i)->getThreat(); } m_attackerInfo[itr->first].threat2 = t; @@ -1905,15 +1905,15 @@ uint32 PlayerbotAI::EstRepairAll() { uint32 TotalCost = 0; // equipped, backpack, bags itself - for(int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; ++i) - TotalCost += EstRepair(( (INVENTORY_SLOT_BAG_0 << 8) | i )); + for (int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; ++i) + TotalCost += EstRepair(((INVENTORY_SLOT_BAG_0 << 8) | i )); // bank, buyback and keys not repaired // items in inventory bags - for(int j = INVENTORY_SLOT_BAG_START; j < INVENTORY_SLOT_BAG_END; ++j) - for(int i = 0; i < MAX_BAG_SIZE; ++i) - TotalCost += EstRepair(( (j << 8) | i )); + for (int j = INVENTORY_SLOT_BAG_START; j < INVENTORY_SLOT_BAG_END; ++j) + for (int i = 0; i < MAX_BAG_SIZE; ++i) + TotalCost += EstRepair(((j << 8) | i )); return TotalCost; } @@ -1922,39 +1922,39 @@ uint32 PlayerbotAI::EstRepair(uint16 pos) Item* item = m_bot->GetItemByPos(pos); uint32 TotalCost = 0; - if(!item) + if (!item) return TotalCost; uint32 maxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY); - if(!maxDurability) + if (!maxDurability) return TotalCost; uint32 curDurability = item->GetUInt32Value(ITEM_FIELD_DURABILITY); uint32 LostDurability = maxDurability - curDurability; - if(LostDurability>0) + if (LostDurability > 0) { ItemPrototype const *ditemProto = item->GetProto(); DurabilityCostsEntry const *dcost = sDurabilityCostsStore.LookupEntry(ditemProto->ItemLevel); - if(!dcost) + if (!dcost) { sLog.outError("RepairDurability: Wrong item lvl %u", ditemProto->ItemLevel); return TotalCost; } - uint32 dQualitymodEntryId = (ditemProto->Quality+1)*2; + uint32 dQualitymodEntryId = (ditemProto->Quality + 1) * 2; DurabilityQualityEntry const *dQualitymodEntry = sDurabilityQualityStore.LookupEntry(dQualitymodEntryId); - if(!dQualitymodEntry) + if (!dQualitymodEntry) { sLog.outError("RepairDurability: Wrong dQualityModEntry %u", dQualitymodEntryId); return TotalCost; } - uint32 dmultiplier = dcost->multiplier[ItemSubClassToDurabilityMultiplierId(ditemProto->Class,ditemProto->SubClass)]; - uint32 costs = uint32(LostDurability*dmultiplier*double(dQualitymodEntry->quality_mod)); + uint32 dmultiplier = dcost->multiplier[ItemSubClassToDurabilityMultiplierId(ditemProto->Class, ditemProto->SubClass)]; + uint32 costs = uint32(LostDurability * dmultiplier * double(dQualitymodEntry->quality_mod)); - if (costs==0) //fix for ITEM_QUALITY_ARTIFACT + if (costs == 0) //fix for ITEM_QUALITY_ARTIFACT costs = 1; TotalCost = costs; @@ -1962,43 +1962,43 @@ uint32 PlayerbotAI::EstRepair(uint16 pos) return TotalCost; } -Unit *PlayerbotAI::FindAttacker( ATTACKERINFOTYPE ait, Unit *victim ) +Unit *PlayerbotAI::FindAttacker(ATTACKERINFOTYPE ait, Unit *victim) { // list empty? why are we here? - if( m_attackerInfo.empty() ) + if (m_attackerInfo.empty()) return 0; // not searching something specific - return first in list - if( !ait ) + if (!ait) return (m_attackerInfo.begin())->second.attacker; - float t = ( (ait & AIT_HIGHESTTHREAT) ? 0.00 : 9999.00 ); + float t = ((ait & AIT_HIGHESTTHREAT) ? 0.00 : 9999.00 ); Unit *a = 0; AttackerInfoList::iterator itr = m_attackerInfo.begin(); - for( ; itr != m_attackerInfo.end(); ++itr ) + for (; itr != m_attackerInfo.end(); ++itr) { - if( (ait & AIT_VICTIMSELF) && !(ait & AIT_VICTIMNOTSELF) && itr->second.victim != m_bot ) + if ((ait & AIT_VICTIMSELF) && !(ait & AIT_VICTIMNOTSELF) && itr->second.victim != m_bot) continue; - if( !(ait & AIT_VICTIMSELF) && (ait & AIT_VICTIMNOTSELF) && itr->second.victim == m_bot ) + if (!(ait & AIT_VICTIMSELF) && (ait & AIT_VICTIMNOTSELF) && itr->second.victim == m_bot) continue; - if( (ait & AIT_VICTIMNOTSELF) && victim && itr->second.victim != victim ) + if ((ait & AIT_VICTIMNOTSELF) && victim && itr->second.victim != victim) continue; - if( !(ait & (AIT_LOWESTTHREAT|AIT_HIGHESTTHREAT)) ) + if (!(ait & (AIT_LOWESTTHREAT | AIT_HIGHESTTHREAT))) { a = itr->second.attacker; itr = m_attackerInfo.end(); } else { - if( (ait & AIT_HIGHESTTHREAT) && /*(itr->second.victim==m_bot) &&*/ itr->second.threat>=t ) + if ((ait & AIT_HIGHESTTHREAT) && /*(itr->second.victim==m_bot) &&*/ itr->second.threat >= t) { t = itr->second.threat; a = itr->second.attacker; } - else if( (ait & AIT_LOWESTTHREAT) && /*(itr->second.victim==m_bot) &&*/ itr->second.threat<=t ) + else if ((ait & AIT_LOWESTTHREAT) && /*(itr->second.victim==m_bot) &&*/ itr->second.threat <= t) { t = itr->second.threat; a = itr->second.attacker; @@ -2008,112 +2008,112 @@ Unit *PlayerbotAI::FindAttacker( ATTACKERINFOTYPE ait, Unit *victim ) return a; } -void PlayerbotAI::SetCombatOrderByStr( std::string str, Unit *target ) { - CombatOrderType co; - if( str == "tank" ) co = ORDERS_TANK; - else if( str == "assist" ) co = ORDERS_ASSIST; - else if( str == "heal" ) co = ORDERS_HEAL; - else if( str == "protect" ) co = ORDERS_PROTECT; - else co = ORDERS_RESET; - SetCombatOrder( co, target ); +void PlayerbotAI::SetCombatOrderByStr(std::string str, Unit *target) { + CombatOrderType co; + if (str == "tank") co = ORDERS_TANK; + else if (str == "assist") co = ORDERS_ASSIST; + else if (str == "heal") co = ORDERS_HEAL; + else if (str == "protect") co = ORDERS_PROTECT; + else co = ORDERS_RESET; + SetCombatOrder(co, target); } -void PlayerbotAI::SetCombatOrder( CombatOrderType co, Unit *target ) { - if( (co == ORDERS_ASSIST || co == ORDERS_PROTECT) && !target ){ +void PlayerbotAI::SetCombatOrder(CombatOrderType co, Unit *target) { + if ((co == ORDERS_ASSIST || co == ORDERS_PROTECT) && !target) { TellMaster("Erf, you forget to target assist/protect characters!"); return; } - if( co == ORDERS_RESET ) { + if (co == ORDERS_RESET) { m_combatOrder = ORDERS_NONE; m_targetAssist = 0; m_targetProtect = 0; TellMaster("Orders are cleaned!"); return; } - if( co == ORDERS_PROTECT ) + if (co == ORDERS_PROTECT) m_targetProtect = target; - else if( co == ORDERS_ASSIST ) + else if (co == ORDERS_ASSIST) m_targetAssist = target; - if( (co&ORDERS_PRIMARY) ) - m_combatOrder = (CombatOrderType)(((uint32)m_combatOrder&(uint32)ORDERS_SECONDARY)|(uint32)co); + if ((co & ORDERS_PRIMARY)) + m_combatOrder = (CombatOrderType) (((uint32) m_combatOrder & (uint32) ORDERS_SECONDARY) | (uint32) co); else - m_combatOrder = (CombatOrderType)(((uint32)m_combatOrder&(uint32)ORDERS_PRIMARY)|(uint32)co); - SendOrders( *GetMaster() ); + m_combatOrder = (CombatOrderType) (((uint32) m_combatOrder & (uint32) ORDERS_PRIMARY) | (uint32) co); + SendOrders(*GetMaster()); } -void PlayerbotAI::SetMovementOrder( MovementOrderType mo, Unit *followTarget ) { - m_movementOrder = mo; - m_followTarget = followTarget; - MovementReset(); +void PlayerbotAI::SetMovementOrder(MovementOrderType mo, Unit *followTarget) { + m_movementOrder = mo; + m_followTarget = followTarget; + MovementReset(); } void PlayerbotAI::MovementReset() { - // stop moving... - MovementClear(); + // stop moving... + MovementClear(); - if( m_movementOrder == MOVEMENT_FOLLOW ) + if (m_movementOrder == MOVEMENT_FOLLOW) { - if( !m_followTarget ) return; + if (!m_followTarget) return; - // target player is teleporting... - if( m_followTarget->GetTypeId()==TYPEID_PLAYER && ((Player*)m_followTarget)->IsBeingTeleported() ) - return; + // target player is teleporting... + if (m_followTarget->GetTypeId() == TYPEID_PLAYER && ((Player*) m_followTarget)->IsBeingTeleported()) + return; - // check if bot needs to teleport to reach target... - if( !m_bot->isInCombat() ) + // check if bot needs to teleport to reach target... + if (!m_bot->isInCombat()) { - if( m_followTarget->GetTypeId()==TYPEID_PLAYER && ((Player*)m_followTarget)->GetCorpse() ) + if (m_followTarget->GetTypeId() == TYPEID_PLAYER && ((Player*) m_followTarget)->GetCorpse()) { - if( !FollowCheckTeleport( *((Player*)m_followTarget)->GetCorpse() ) ) return; + if (!FollowCheckTeleport(*((Player*) m_followTarget)->GetCorpse())) return; } - else + else { - if( !FollowCheckTeleport( *m_followTarget ) ) return; + if (!FollowCheckTeleport(*m_followTarget)) return; } } - if( m_bot->isAlive() ) + if (m_bot->isAlive()) { - float angle = rand_float(0, M_PI_F); - float dist = rand_float( m_mgr->m_confFollowDistance[0], m_mgr->m_confFollowDistance[1] ); - m_bot->GetMotionMaster()->MoveFollow( m_followTarget, dist, angle ); + float angle = rand_float(0, M_PI_F); + float dist = rand_float(m_mgr->m_confFollowDistance[0], m_mgr->m_confFollowDistance[1]); + m_bot->GetMotionMaster()->MoveFollow(m_followTarget, dist, angle); } - } + } } void PlayerbotAI::MovementUpdate() { - // send heartbeats to world - WorldPacket data; - m_bot->BuildHeartBeatMsg( &data ); - m_bot->SendMessageToSet( &data, false ); + // send heartbeats to world + WorldPacket data; + m_bot->BuildHeartBeatMsg(&data); + m_bot->SendMessageToSet(&data, false); // call set position (updates states, exploration, etc.) - m_bot->SetPosition( m_bot->GetPositionX(), m_bot->GetPositionY(), m_bot->GetPositionZ(), m_bot->GetOrientation(), false ); + m_bot->SetPosition(m_bot->GetPositionX(), m_bot->GetPositionY(), m_bot->GetPositionZ(), m_bot->GetOrientation(), false); } void PlayerbotAI::MovementClear() { // stop... - m_bot->GetMotionMaster()->Clear( true ); - m_bot->clearUnitState( UNIT_STAT_CHASE ); - m_bot->clearUnitState( UNIT_STAT_FOLLOW ); + m_bot->GetMotionMaster()->Clear(true); + m_bot->clearUnitState(UNIT_STAT_CHASE); + m_bot->clearUnitState(UNIT_STAT_FOLLOW); - // stand up... + // stand up... if (!m_bot->IsStandState()) m_bot->SetStandState(UNIT_STAND_STATE_STAND); } bool PlayerbotAI::IsMoving() { - return (m_bot->GetMotionMaster()->GetCurrentMovementGeneratorType() == IDLE_MOTION_TYPE ? false : true); + return (m_bot->GetMotionMaster()->GetCurrentMovementGeneratorType() == IDLE_MOTION_TYPE ? false : true); } -void PlayerbotAI::SetInFront( const Unit* obj ) +void PlayerbotAI::SetInFront(const Unit* obj) { - // removed SendUpdateToPlayer (is not updating movement/orientation) - if( !m_bot->HasInArc( M_PI_F, obj ) ) - m_bot->SetInFront( obj ); + // removed SendUpdateToPlayer (is not updating movement/orientation) + if (!m_bot->HasInArc(M_PI_F, obj)) + m_bot->SetInFront(obj); } // some possible things to use in AI @@ -2137,12 +2137,12 @@ void PlayerbotAI::UpdateAI(const uint32 p_time) // default updates occur every two seconds m_ignoreAIUpdatesUntilTime = time(0) + 2; - // send heartbeat - MovementUpdate(); + // send heartbeat + MovementUpdate(); - if( !m_bot->isAlive() ) + if (!m_bot->isAlive()) { - if( m_botState != BOTSTATE_DEAD && m_botState != BOTSTATE_DEADRELEASED ) + if (m_botState != BOTSTATE_DEAD && m_botState != BOTSTATE_DEADRELEASED) { //sLog.outDebug( "[PlayerbotAI]: %s died and is not in correct state...", m_bot->GetName() ); // clear loot list on death @@ -2152,16 +2152,16 @@ void PlayerbotAI::UpdateAI(const uint32 p_time) m_bot->SetSelection(0); m_bot->GetMotionMaster()->Clear(true); // set state to dead - SetState( BOTSTATE_DEAD ); + SetState(BOTSTATE_DEAD); // wait 30sec m_ignoreAIUpdatesUntilTime = time(0) + 30; } - else if( m_botState == BOTSTATE_DEAD ) + else if (m_botState == BOTSTATE_DEAD) { // become ghost - if( m_bot->GetCorpse() ){ + if (m_bot->GetCorpse()) { //sLog.outDebug( "[PlayerbotAI]: %s already has a corpse...", m_bot->GetName() ); - SetState( BOTSTATE_DEADRELEASED ); + SetState(BOTSTATE_DEADRELEASED); return; } m_bot->SetBotDeathTimer(); @@ -2169,27 +2169,27 @@ void PlayerbotAI::UpdateAI(const uint32 p_time) // relocate ghost WorldLocation loc; Corpse *corpse = m_bot->GetCorpse(); - corpse->GetPosition( loc ); - m_bot->TeleportTo( loc.mapid, loc.coord_x, loc.coord_y, loc.coord_z, m_bot->GetOrientation() ); + corpse->GetPosition(loc); + m_bot->TeleportTo(loc.mapid, loc.coord_x, loc.coord_y, loc.coord_z, m_bot->GetOrientation()); // set state to released - SetState( BOTSTATE_DEADRELEASED ); + SetState(BOTSTATE_DEADRELEASED); } - else if( m_botState == BOTSTATE_DEADRELEASED ) + else if (m_botState == BOTSTATE_DEADRELEASED) { // get bot's corpse Corpse *corpse = m_bot->GetCorpse(); - if( !corpse ) + if (!corpse) { //sLog.outDebug( "[PlayerbotAI]: %s has no corpse!", m_bot->GetName() ); return; } // teleport ghost from graveyard to corpse //sLog.outDebug( "[PlayerbotAI]: Teleport %s to corpse...", m_bot->GetName() ); - FollowCheckTeleport( *corpse ); + FollowCheckTeleport(*corpse); // check if we are allowed to resurrect now - if( corpse->GetGhostTime() + m_bot->GetCorpseReclaimDelay( corpse->GetType()==CORPSE_RESURRECTABLE_PVP ) > time(0) ) + if (corpse->GetGhostTime() + m_bot->GetCorpseReclaimDelay(corpse->GetType() == CORPSE_RESURRECTABLE_PVP) > time(0)) { - m_ignoreAIUpdatesUntilTime = corpse->GetGhostTime() + m_bot->GetCorpseReclaimDelay( corpse->GetType()==CORPSE_RESURRECTABLE_PVP ); + m_ignoreAIUpdatesUntilTime = corpse->GetGhostTime() + m_bot->GetCorpseReclaimDelay(corpse->GetType() == CORPSE_RESURRECTABLE_PVP); //sLog.outDebug( "[PlayerbotAI]: %s has to wait for %d seconds to revive...", m_bot->GetName(), m_ignoreAIUpdatesUntilTime-time(0) ); return; } @@ -2197,13 +2197,13 @@ void PlayerbotAI::UpdateAI(const uint32 p_time) //sLog.outDebug( "[PlayerbotAI]: Reviving %s to corpse...", m_bot->GetName() ); m_ignoreAIUpdatesUntilTime = time(0) + 6; PlayerbotChatHandler ch(GetMaster()); - if (! ch.revive(*m_bot)) + if (!ch.revive(*m_bot)) { ch.sysmessage(".. could not be revived .."); return; } // set back to normal - SetState( BOTSTATE_NORMAL ); + SetState(BOTSTATE_NORMAL); } } else @@ -2225,13 +2225,13 @@ void PlayerbotAI::UpdateAI(const uint32 p_time) } // handle combat (either self/master/group in combat, or combat state and valid target) - else if ( IsInCombat() || (m_botState == BOTSTATE_COMBAT && m_targetCombat) ) + else if (IsInCombat() || (m_botState == BOTSTATE_COMBAT && m_targetCombat)) DoNextCombatManeuver(); // bot was in combat recently - loot now else if (m_botState == BOTSTATE_COMBAT) { - SetState( BOTSTATE_LOOTING ); + SetState(BOTSTATE_LOOTING); m_attackerInfo.clear(); m_ignoreAIUpdatesUntilTime = time(0); } @@ -2244,9 +2244,9 @@ void PlayerbotAI::UpdateAI(const uint32 p_time) // are we sitting, if so feast if possible else if (m_bot->getStandState() == UNIT_STAND_STATE_SIT) Feast(); -*/ + */ // if commanded to follow master and not already following master then follow master - else if (!m_bot->isInCombat() && !IsMoving() ) + else if (!m_bot->isInCombat() && !IsMoving()) MovementReset(); // do class specific non combat actions @@ -2269,15 +2269,15 @@ void PlayerbotAI::TellMaster(const std::string& text) const SendWhisper(text, *GetMaster()); } -void PlayerbotAI::TellMaster( const char *fmt, ... ) const +void PlayerbotAI::TellMaster(const char *fmt, ...) const { char temp_buf[1024]; va_list ap; - va_start( ap, fmt ); - size_t temp_len = vsnprintf( temp_buf, 1024, fmt, ap ); - va_end( ap ); + va_start(ap, fmt); + size_t temp_len = vsnprintf(temp_buf, 1024, fmt, ap); + va_end(ap); std::string str = temp_buf; - TellMaster( str ); + TellMaster(str); } void PlayerbotAI::SendWhisper(const std::string& text, Player& player) const @@ -2315,7 +2315,7 @@ bool PlayerbotAI::CastSpell(uint32 spellId) return false; // check spell cooldown - if( m_bot->HasSpellCooldown( spellId ) ) + if (m_bot->HasSpellCooldown(spellId)) return false; // see Creature.cpp 1738 for reference @@ -2367,21 +2367,21 @@ bool PlayerbotAI::CastSpell(uint32 spellId) return false; m_CurrentlyCastingSpellId = spellId; - m_ignoreAIUpdatesUntilTime = time(0) + (int32)((float)pSpell->GetCastTime()/1000.0f) + 1; + m_ignoreAIUpdatesUntilTime = time(0) + (int32) ((float) pSpell->GetCastTime() / 1000.0f) + 1; // if this caused the caster to move (blink) update the position // I think this is normally done on the client // this should be done on spell success /* - if (name == "Blink") { - float x,y,z; - m_bot->GetPosition(x,y,z); - m_bot->GetNearPoint(m_bot, x, y, z, 1, 5, 0); - m_bot->Relocate(x,y,z); - WorldPacket data; - m_bot->BuildHeartBeatMsg(&data); - m_bot->SendMessageToSet(&data,true); - } + if (name == "Blink") { + float x,y,z; + m_bot->GetPosition(x,y,z); + m_bot->GetNearPoint(m_bot, x, y, z, 1, 5, 0); + m_bot->Relocate(x,y,z); + WorldPacket data; + m_bot->BuildHeartBeatMsg(&data); + m_bot->SendMessageToSet(&data,true); + } */ return true; @@ -2444,50 +2444,50 @@ bool PlayerbotAI::CastPetSpell(uint32 spellId, Unit* target) Item* PlayerbotAI::FindItem(uint32 ItemId) { - // list out items in main backpack - //INVENTORY_SLOT_ITEM_START = 23 - //INVENTORY_SLOT_ITEM_END = 39 - - for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; slot++) - { - // sLog.outDebug("[%s's]backpack slot = %u",m_bot->GetName(),slot); // 23 to 38 = 16 - Item* const pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); // 255, 23 to 38 - if (pItem) - { - const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto ) - continue; - - if( pItemProto->ItemId == ItemId) // have required item - return pItem; - } - } - // list out items in other removable backpacks - //INVENTORY_SLOT_BAG_START = 19 - //INVENTORY_SLOT_BAG_END = 23 - - for (uint8 bag = INVENTORY_SLOT_BAG_START; bag < INVENTORY_SLOT_BAG_END; ++bag) // 20 to 23 = 4 - { - const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); // 255, 20 to 23 - if (pBag) - { - for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) - { - sLog.outDebug("[%s's]bag[%u] slot = %u",m_bot->GetName(),bag,slot); // 1 to bagsize = ? - Item* const pItem = m_bot->GetItemByPos(bag, slot); // 20 to 23, 1 to bagsize - if (pItem) - { - const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto ) - continue; + // list out items in main backpack + //INVENTORY_SLOT_ITEM_START = 23 + //INVENTORY_SLOT_ITEM_END = 39 - if( pItemProto->ItemId == ItemId ) // have required item - return pItem; - } - } - } - } - return NULL; + for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; slot++) + { + // sLog.outDebug("[%s's]backpack slot = %u",m_bot->GetName(),slot); // 23 to 38 = 16 + Item* const pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); // 255, 23 to 38 + if (pItem) + { + const ItemPrototype* const pItemProto = pItem->GetProto(); + if (!pItemProto) + continue; + + if (pItemProto->ItemId == ItemId) // have required item + return pItem; + } + } + // list out items in other removable backpacks + //INVENTORY_SLOT_BAG_START = 19 + //INVENTORY_SLOT_BAG_END = 23 + + for (uint8 bag = INVENTORY_SLOT_BAG_START; bag < INVENTORY_SLOT_BAG_END; ++bag) // 20 to 23 = 4 + { + const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); // 255, 20 to 23 + if (pBag) + { + for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) + { + sLog.outDebug("[%s's]bag[%u] slot = %u", m_bot->GetName(), bag, slot); // 1 to bagsize = ? + Item* const pItem = m_bot->GetItemByPos(bag, slot); // 20 to 23, 1 to bagsize + if (pItem) + { + const ItemPrototype* const pItemProto = pItem->GetProto(); + if (!pItemProto) + continue; + + if (pItemProto->ItemId == ItemId) // have required item + return pItem; + } + } + } + } + return NULL; } bool PlayerbotAI::HasPick() @@ -2495,13 +2495,13 @@ bool PlayerbotAI::HasPick() QueryResult *result; // list out equiped items - for( uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; slot++) + for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; slot++) { - Item* const pItem = m_bot->GetItemByPos( INVENTORY_SLOT_BAG_0, slot ); - if (pItem ) - { + Item* const pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); + if (pItem) + { const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto ) + if (!pItemProto) continue; result = WorldDatabase.PQuery("SELECT TotemCategory FROM item_template WHERE entry = '%i'", pItemProto->ItemId); @@ -2510,7 +2510,7 @@ bool PlayerbotAI::HasPick() Field *fields = result->Fetch(); uint32 tc = fields[0].GetUInt32(); // sLog.outDebug("HasPick %u",tc); - if(tc == 165 || tc == 167) // pick = 165, hammer = 162 or hammer pick = 167 + if (tc == 165 || tc == 167) // pick = 165, hammer = 162 or hammer pick = 167 return true; } } @@ -2524,7 +2524,7 @@ bool PlayerbotAI::HasPick() if (pItem) { const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto ) + if (!pItemProto) continue; result = WorldDatabase.PQuery("SELECT TotemCategory FROM item_template WHERE entry = '%i'", pItemProto->ItemId); @@ -2533,7 +2533,7 @@ bool PlayerbotAI::HasPick() Field *fields = result->Fetch(); uint32 tc = fields[0].GetUInt32(); // sLog.outDebug("HasPick %u",tc); - if(tc == 165 || tc == 167) // pick = 165, hammer = 162 or hammer pick = 167 + if (tc == 165 || tc == 167) // pick = 165, hammer = 162 or hammer pick = 167 return true; } } @@ -2552,7 +2552,7 @@ bool PlayerbotAI::HasPick() if (pItem) { const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto ) + if (!pItemProto) continue; result = WorldDatabase.PQuery("SELECT TotemCategory FROM item_template WHERE entry = '%i'", pItemProto->ItemId); @@ -2561,7 +2561,7 @@ bool PlayerbotAI::HasPick() Field *fields = result->Fetch(); uint32 tc = fields[0].GetUInt32(); // sLog.outDebug("HasPick %u",tc); - if(tc == 165 || tc == 167) + if (tc == 165 || tc == 167) return true; } } @@ -2570,7 +2570,7 @@ bool PlayerbotAI::HasPick() } std::ostringstream out; out << "|cffffffffI do not have a pick!"; - TellMaster( out.str().c_str() ); + TellMaster(out.str().c_str()); return false; } @@ -2601,98 +2601,98 @@ void PlayerbotAI::extractItemIds(const std::string& text, std::list& ite bool PlayerbotAI::extractSpellId(const std::string& text, uint32 &spellId) const { - // Link format - // |cffffffff|Hspell:" << spellId << ":" << "|h[" << pSpellInfo->SpellName[loc] << "]|h|r"; - // cast |cff71d5ff|Hspell:686|h[Shadow Bolt]|h|r"; - // 012345678901234567890123456 - // base = 16 >| +7 >| + // Link format + // |cffffffff|Hspell:" << spellId << ":" << "|h[" << pSpellInfo->SpellName[loc] << "]|h|r"; + // cast |cff71d5ff|Hspell:686|h[Shadow Bolt]|h|r"; + // 012345678901234567890123456 + // base = 16 >| +7 >| uint8 pos = 0; - int i = text.find("Hspell:", pos); - if (i == -1) - return false; + int i = text.find("Hspell:", pos); + if (i == -1) + return false; - // DEBUG_LOG("extractSpellId first pos %u i %u",pos,i); - pos = i + 7; // start of window in text 16 + 7 = 23 - int endPos = text.find('|', pos); - if (endPos == -1) - return false; + // DEBUG_LOG("extractSpellId first pos %u i %u",pos,i); + pos = i + 7; // start of window in text 16 + 7 = 23 + int endPos = text.find('|', pos); + if (endPos == -1) + return false; - // DEBUG_LOG("extractSpellId second endpos : %u pos : %u",endPos,pos); - std::string idC = text.substr(pos, endPos - pos); // 26 - 23 - spellId = atol(idC.c_str()); - pos = endPos; // end - return true; + // DEBUG_LOG("extractSpellId second endpos : %u pos : %u",endPos,pos); + std::string idC = text.substr(pos, endPos - pos); // 26 - 23 + spellId = atol(idC.c_str()); + pos = endPos; // end + return true; } bool PlayerbotAI::extractGOinfo(const std::string& text, uint32 &guid, uint32 &entry, int &mapid, float &x, float &y, float &z) const { - // Link format - // |cFFFFFF00|Hfound:" << guid << ':' << entry << ':' << x << ':' << y << ':' << z << ':' << mapid << ':' << "|h[" << gInfo->name << "]|h|r"; - // |cFFFFFF00|Hfound:5093:1731:-9295:-270:81.874:0:|h[Copper Vein]|h|r + // Link format + // |cFFFFFF00|Hfound:" << guid << ':' << entry << ':' << x << ':' << y << ':' << z << ':' << mapid << ':' << "|h[" << gInfo->name << "]|h|r"; + // |cFFFFFF00|Hfound:5093:1731:-9295:-270:81.874:0:|h[Copper Vein]|h|r uint8 pos = 0; - // extract GO guid - int i = text.find("Hfound:", pos); // base H = 11 - if (i == -1) // break if error - return false; + // extract GO guid + int i = text.find("Hfound:", pos); // base H = 11 + if (i == -1) // break if error + return false; - pos = i + 7; //start of window in text 11 + 7 = 18 - int endPos = text.find(':', pos); // end of window in text 22 - if (endPos == -1) //break if error - return false; - std::string guidC = text.substr(pos, endPos - pos); // get string within window i.e guid 22 - 18 = 4 - guid = atol(guidC.c_str()); // convert ascii to long int + pos = i + 7; //start of window in text 11 + 7 = 18 + int endPos = text.find(':', pos); // end of window in text 22 + if (endPos == -1) //break if error + return false; + std::string guidC = text.substr(pos, endPos - pos); // get string within window i.e guid 22 - 18 = 4 + guid = atol(guidC.c_str()); // convert ascii to long int - // extract GO entry - pos = endPos + 1; - endPos = text.find(':', pos); // end of window in text - if (endPos == -1) //break if error - return false; + // extract GO entry + pos = endPos + 1; + endPos = text.find(':', pos); // end of window in text + if (endPos == -1) //break if error + return false; - std::string entryC = text.substr(pos, endPos - pos); // get string within window i.e entry - entry = atol(entryC.c_str()); // convert ascii to float + std::string entryC = text.substr(pos, endPos - pos); // get string within window i.e entry + entry = atol(entryC.c_str()); // convert ascii to float - // extract GO x - pos = endPos + 1; - endPos = text.find(':', pos); // end of window in text - if (endPos == -1) //break if error - return false; + // extract GO x + pos = endPos + 1; + endPos = text.find(':', pos); // end of window in text + if (endPos == -1) //break if error + return false; - std::string xC = text.substr(pos, endPos - pos); // get string within window i.e x - x = atof(xC.c_str()); // convert ascii to float + std::string xC = text.substr(pos, endPos - pos); // get string within window i.e x + x = atof(xC.c_str()); // convert ascii to float - // extract GO y - pos = endPos + 1; - endPos = text.find(':', pos); // end of window in text - if (endPos == -1) //break if error - return false; + // extract GO y + pos = endPos + 1; + endPos = text.find(':', pos); // end of window in text + if (endPos == -1) //break if error + return false; - std::string yC = text.substr(pos, endPos - pos); // get string within window i.e y - y = atof(yC.c_str()); // convert ascii to float + std::string yC = text.substr(pos, endPos - pos); // get string within window i.e y + y = atof(yC.c_str()); // convert ascii to float - // extract GO z - pos = endPos + 1; - endPos = text.find(':', pos); // end of window in text - if (endPos == -1) //break if error - return false; + // extract GO z + pos = endPos + 1; + endPos = text.find(':', pos); // end of window in text + if (endPos == -1) //break if error + return false; - std::string zC = text.substr(pos, endPos - pos); // get string within window i.e z - z = atof(zC.c_str()); // convert ascii to float + std::string zC = text.substr(pos, endPos - pos); // get string within window i.e z + z = atof(zC.c_str()); // convert ascii to float - //extract GO mapid - pos = endPos + 1; - endPos = text.find(':', pos); // end of window in text - if (endPos == -1) //break if error - return false; + //extract GO mapid + pos = endPos + 1; + endPos = text.find(':', pos); // end of window in text + if (endPos == -1) //break if error + return false; - std::string mapidC = text.substr(pos, endPos - pos); // get string within window i.e mapid - mapid = atoi(mapidC.c_str()); // convert ascii to int - pos = endPos; // end - return true; + std::string mapidC = text.substr(pos, endPos - pos); // get string within window i.e mapid + mapid = atoi(mapidC.c_str()); // convert ascii to int + pos = endPos; // end + return true; } // extracts currency in #g#s#c format @@ -2735,9 +2735,9 @@ uint32 PlayerbotAI::extractMoney(const std::string& text) const // also removes found item IDs from itemIdSearchList when found void PlayerbotAI::findItemsInEquip(std::list& itemIdSearchList, std::list& foundItemList) const { - for( uint8 slot=EQUIPMENT_SLOT_START; itemIdSearchList.size()>0 && slotGetItemByPos( INVENTORY_SLOT_BAG_0, slot ); - if( !pItem ) + for (uint8 slot = EQUIPMENT_SLOT_START; itemIdSearchList.size() > 0 && slot < EQUIPMENT_SLOT_END; slot++) { + Item* const pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); + if (!pItem) continue; for (std::list::iterator it = itemIdSearchList.begin(); it != itemIdSearchList.end(); ++it) @@ -2804,13 +2804,13 @@ void PlayerbotAI::findItemsInInv(std::list& itemIdSearchList, std::list< // submits packet to use an item void PlayerbotAI::UseItem(Item& item, uint8 targetSlot) { - uint8 bagIndex = item.GetBagSlot(); - uint8 slot = item.GetSlot(); - uint8 cast_count = 1; + uint8 bagIndex = item.GetBagSlot(); + uint8 slot = item.GetSlot(); + uint8 cast_count = 1; uint32 spellid; uint64 item_guid = item.GetGUID(); uint32 glyphIndex = 0; // ?? - uint8 unk_flags = 0; // not 0x02 + uint8 unk_flags = 0; // not 0x02 uint32 targetFlag; WorldPacket* packet; @@ -2866,31 +2866,31 @@ void PlayerbotAI::EquipItem(Item& item) // 'Will not be traded' slot. bool PlayerbotAI::TradeItem(const Item& item, int8 slot) { - sLog.outDebug( "[PlayerbotAI::TradeItem]: slot=%d, hasTrader=%d, itemInTrade=%d, itemTradeable=%d", - slot, - (m_bot->GetTrader()?1:0), - (item.IsInTrade()?1:0), - (item.CanBeTraded()?1:0) - ); + sLog.outDebug("[PlayerbotAI::TradeItem]: slot=%d, hasTrader=%d, itemInTrade=%d, itemTradeable=%d", + slot, + (m_bot->GetTrader() ? 1 : 0), + (item.IsInTrade() ? 1 : 0), + (item.CanBeTraded() ? 1 : 0) + ); - if (!m_bot->GetTrader() || item.IsInTrade() || (!item.CanBeTraded() && slot!=TRADE_SLOT_NONTRADED) ) + if (!m_bot->GetTrader() || item.IsInTrade() || (!item.CanBeTraded() && slot != TRADE_SLOT_NONTRADED)) return false; int8 tradeSlot = -1; TradeData* pTrade = m_bot->GetTradeData(); - if( (slot>=0 && slotGetTraderData()->GetItem(TradeSlots(slot)) == NULL ) + if ((slot >= 0 && slot < TRADE_SLOT_COUNT) && pTrade->GetTraderData()->GetItem(TradeSlots(slot)) == NULL) tradeSlot = slot; else { - for( uint8 i=0; iGetTraderData()->GetItem(TradeSlots(i)) == NULL ) + if (pTrade->GetTraderData()->GetItem(TradeSlots(i)) == NULL) tradeSlot = i; } } - if( tradeSlot == -1 ) return false; + if (tradeSlot == -1) return false; WorldPacket* const packet = new WorldPacket(CMSG_SET_TRADE_ITEM, 3); *packet << (uint8) tradeSlot << (uint8) item.GetBagSlot() @@ -2913,14 +2913,14 @@ bool PlayerbotAI::TradeCopper(uint32 copper) } /*void PlayerbotAI::Stay() -{ + { m_IsFollowingMaster = false; m_bot->GetMotionMaster()->Clear(true); m_bot->HandleEmoteCommand(EMOTE_ONESHOT_SALUTE); -}*/ + }*/ /*bool PlayerbotAI::Follow(Player& player) -{ + { if (GetMaster()->IsBeingTeleported()) return false; @@ -2953,17 +2953,17 @@ bool PlayerbotAI::TradeCopper(uint32 copper) return true; } return false; -}*/ + }*/ -bool PlayerbotAI::FollowCheckTeleport( WorldObject &obj ) +bool PlayerbotAI::FollowCheckTeleport(WorldObject &obj) { // if bot has strayed too far from the master, teleport bot - if (!m_bot->IsWithinDistInMap( &obj, 50, true ) && GetMaster()->isAlive() && !GetMaster()->IsTaxiFlying()) + if (!m_bot->IsWithinDistInMap(&obj, 50, true) && GetMaster()->isAlive() && !GetMaster()->IsTaxiFlying()) { m_ignoreAIUpdatesUntilTime = time(0) + 6; PlayerbotChatHandler ch(GetMaster()); - if (! ch.teleport(*m_bot)) + if (!ch.teleport(*m_bot)) { ch.sysmessage(".. could not be teleported .."); //sLog.outDebug( "[PlayerbotAI]: %s failed to teleport", m_bot->GetName() ); @@ -3028,12 +3028,12 @@ void PlayerbotAI::QuestLocalization(std::string& questTitle, const uint32 questI void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) { // ignore any messages from Addons - if (text.empty() || - text.find("X-Perl") != std::wstring::npos || - text.find("HealBot") != std::wstring::npos || - text.find("LOOT_OPENED") != std::wstring::npos || - text.find("CTRA") != std::wstring::npos) - return; + if (text.empty() || + text.find("X-Perl") != std::wstring::npos || + text.find("HealBot") != std::wstring::npos || + text.find("LOOT_OPENED") != std::wstring::npos || + text.find("CTRA") != std::wstring::npos) + return; // if message is not from a player in the masters account auto reply and ignore if (!canObeyCommandFrom(fromPlayer)) @@ -3055,19 +3055,19 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) extractItemIds(text, itemIds); if (itemIds.size() == 0) SendWhisper("Show me what item you want by shift clicking the item in the chat window.", fromPlayer); - else if( !strncmp( text.c_str(), "nt ", 3 ) ) + else if (!strncmp(text.c_str(), "nt ", 3)) { - if( itemIds.size() > 1 ) - SendWhisper( "There is only one 'Will not be traded' slot. Shift-click just one item, please!", fromPlayer ); + if (itemIds.size() > 1) + SendWhisper("There is only one 'Will not be traded' slot. Shift-click just one item, please!", fromPlayer); else { std::list itemList; - findItemsInEquip( itemIds, itemList ); - findItemsInInv( itemIds, itemList ); - if( itemList.size()>0 ) - TradeItem( (**itemList.begin()), TRADE_SLOT_NONTRADED ); + findItemsInEquip(itemIds, itemList); + findItemsInInv(itemIds, itemList); + if (itemList.size() > 0) + TradeItem((**itemList.begin()), TRADE_SLOT_NONTRADED); else - SendWhisper( "I do not have this item equipped or in my bags!", fromPlayer ); + SendWhisper("I do not have this item equipped or in my bags!", fromPlayer); } } else @@ -3083,27 +3083,27 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) else if (text == "reset") { - SetState( BOTSTATE_NORMAL ); - MovementReset(); + SetState(BOTSTATE_NORMAL); + MovementReset(); SetQuestNeedItems(); - UpdateAttackerInfo(); + UpdateAttackerInfo(); m_lootCreature.clear(); m_lootCurrent = 0; - m_targetCombat = 0; - // do we want to reset all states on this command? + m_targetCombat = 0; + // do we want to reset all states on this command? // m_combatOrder = ORDERS_NONE; // m_targetCombat = 0; // m_targetAssisst = 0; // m_targetProtect = 0; } else if (text == "report") - SendQuestItemList( *GetMaster() ); + SendQuestItemList(*GetMaster()); else if (text == "orders") - SendOrders( *GetMaster() ); + SendOrders(*GetMaster()); else if (text == "follow" || text == "come") - SetMovementOrder( MOVEMENT_FOLLOW, GetMaster() ); + SetMovementOrder(MOVEMENT_FOLLOW, GetMaster()); else if (text == "stay" || text == "stop") - SetMovementOrder( MOVEMENT_STAY ); + SetMovementOrder(MOVEMENT_STAY); else if (text == "attack") { uint64 attackOnGuid = fromPlayer.GetSelection(); @@ -3111,7 +3111,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) { Unit* thingToAttack = ObjectAccessor::GetUnit(*m_bot, attackOnGuid); if (!m_bot->IsFriendlyTo(thingToAttack) && m_bot->IsWithinLOSInMap(thingToAttack)) - GetCombatTarget( thingToAttack ); + GetCombatTarget(thingToAttack); } else { @@ -3138,10 +3138,10 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) extractSpellId(text, spellId); } - if(m_bot->HasAura(spellId)) + if (m_bot->HasAura(spellId)) { - m_bot->RemoveAurasByCasterSpell(spellId,m_bot->GetGUID()); - return; + m_bot->RemoveAurasByCasterSpell(spellId, m_bot->GetGUID()); + return; } uint64 castOnGuid = fromPlayer.GetSelection(); @@ -3176,27 +3176,27 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) } // find item in world - else if (text.size() > 2 && text.substr(0, 2) == "f " || text.size() > 5 && text.substr(0, 5) == "find ") + else if (text.size() > 2 && text.substr(0, 2) == "f " || text.size() > 5 && text.substr(0, 5) == "find ") { uint32 guid; - float x,y,z; + float x, y, z; uint32 entry; int mapid; - if(extractGOinfo(text, guid, entry, mapid, x, y, z)) + if (extractGOinfo(text, guid, entry, mapid, x, y, z)) { // sLog.outDebug("find: guid : %u entry : %u x : (%f) y : (%f) z : (%f) mapid : %d",guid, entry, x, y, z, mapid); - m_bot->UpdateGroundPositionZ(x,y,z); - SetMovementOrder( MOVEMENT_STAY ); - m_bot->GetMotionMaster()->MovePoint( mapid, x, y, z ); + m_bot->UpdateGroundPositionZ(x, y, z); + SetMovementOrder(MOVEMENT_STAY); + m_bot->GetMotionMaster()->MovePoint(mapid, x, y, z); } else - SendWhisper("I have no info on that object", fromPlayer); + SendWhisper("I have no info on that object", fromPlayer); } // get project: 18:50 03/05/10 rev.3 allows bots to retrieve all lootable & quest items from gameobjects else if (text.size() > 2 && text.substr(0, 2) == "g " || text.size() > 4 && text.substr(0, 4) == "get ") { uint32 guid; - float x,y,z; + float x, y, z; uint32 entry; int mapid; bool looted = false; @@ -3204,7 +3204,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) { //sLog.outDebug("find: guid : %u entry : %u x : (%f) y : (%f) z : (%f) mapid : %d",guid, entry, x, y, z, mapid); - ObjectGuid lootCurrent = ObjectGuid(HIGHGUID_GAMEOBJECT,entry,guid); + ObjectGuid lootCurrent = ObjectGuid(HIGHGUID_GAMEOBJECT, entry, guid); GameObject *go = m_bot->GetMap()->GetGameObject(lootCurrent); if (!go) { @@ -3212,26 +3212,26 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) return; } - if ( !go->isSpawned() ) + if (!go->isSpawned()) return; - m_bot->UpdateGroundPositionZ(x,y,z); - m_bot->GetMotionMaster()->MovePoint( mapid, x, y, z ); + m_bot->UpdateGroundPositionZ(x, y, z); + m_bot->GetMotionMaster()->MovePoint(mapid, x, y, z); m_bot->SetPosition(x, y, z, m_bot->GetOrientation()); - m_bot->SendLoot( lootCurrent, LOOT_CORPSE ); + m_bot->SendLoot(lootCurrent, LOOT_CORPSE); Loot *loot = &go->loot; - uint32 lootNum = loot->GetMaxSlotInLootFor( m_bot ); + uint32 lootNum = loot->GetMaxSlotInLootFor(m_bot); // sLog.outDebug( "[PlayerbotAI]: GetGOType %u - %s looting: '%s' got %d items", go->GetGoType(), m_bot->GetName(), go->GetGOInfo()->name, loot->GetMaxSlotInLootFor( m_bot )); - if(lootNum == 0) // Handle opening gameobjects that contain no items + if (lootNum == 0) // Handle opening gameobjects that contain no items { uint32 lockId = go->GetGOInfo()->GetLockId(); LockEntry const *lockInfo = sLockStore.LookupEntry(lockId); - if(lockInfo) + if (lockInfo) { - for(int i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { uint32 skillId = SkillByLockType(LockType(lockInfo->Index[i])); - if(skillId > 0) + if (skillId > 0) { if (m_bot->HasSkill(skillId)) // Has skill { @@ -3249,54 +3249,54 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) } } } - for ( uint32 l=0; lLootItemInSlot( l, m_bot, &qitem, &ffaitem, &conditem ); - if ( !item ) + QuestItem *qitem = 0, *ffaitem = 0, *conditem = 0; + LootItem *item = loot->LootItemInSlot(l, m_bot, &qitem, &ffaitem, &conditem); + if (!item) continue; - if ( !qitem && item->is_blocked ) + if (!qitem && item->is_blocked) { - m_bot->SendLootRelease( lootCurrent ); + m_bot->SendLootRelease(lootCurrent); continue; } - if ( m_needItemList[item->itemid]>0 ) + if (m_needItemList[item->itemid] > 0) { ItemPosCountVec dest; - if ( m_bot->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, item->itemid, item->count ) == EQUIP_ERR_OK ) + if (m_bot->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item->itemid, item->count) == EQUIP_ERR_OK) { - Item * newitem = m_bot->StoreNewItem( dest, item->itemid, true, item->randomPropertyId); + Item * newitem = m_bot->StoreNewItem(dest, item->itemid, true, item->randomPropertyId); - if ( qitem ) + if (qitem) { qitem->is_looted = true; - if ( item->freeforall || loot->GetPlayerQuestItems().size() == 1 ) - m_bot->SendNotifyLootItemRemoved( l ); + if (item->freeforall || loot->GetPlayerQuestItems().size() == 1) + m_bot->SendNotifyLootItemRemoved(l); else - loot->NotifyQuestItemRemoved( qitem->index ); + loot->NotifyQuestItemRemoved(qitem->index); } else { - if ( ffaitem ) + if (ffaitem) { - ffaitem->is_looted=true; - m_bot->SendNotifyLootItemRemoved( l ); + ffaitem->is_looted = true; + m_bot->SendNotifyLootItemRemoved(l); } else { - if ( conditem ) - conditem->is_looted=true; - loot->NotifyItemRemoved( l ); + if (conditem) + conditem->is_looted = true; + loot->NotifyItemRemoved(l); } } if (!item->freeforall) item->is_looted = true; --loot->unlootedCount; - m_bot->SendNewItem( newitem, uint32(item->count), false, false, true ); - m_bot->GetAchievementMgr().UpdateAchievementCriteria( ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item->itemid, item->count ); + m_bot->SendNewItem(newitem, uint32(item->count), false, false, true); + m_bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item->itemid, item->count); looted = true; } continue; @@ -3304,14 +3304,14 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) uint32 lockId = go->GetGOInfo()->GetLockId(); LockEntry const *lockInfo = sLockStore.LookupEntry(lockId); - if(lockInfo) + if (lockInfo) { uint32 skillId = 0; uint32 reqSkillValue = 0; - for(int i = 0; i < 8; ++i) + for (int i = 0; i < 8; ++i) { skillId = SkillByLockType(LockType(lockInfo->Index[i])); - if(skillId > 0) + if (skillId > 0) { reqSkillValue = lockInfo->Skill[i]; break; @@ -3320,13 +3320,13 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) if (m_bot->HasSkill(skillId) || skillId == SKILL_NONE) // Has skill or skill not required { - if((skillId == SKILL_MINING) && !HasPick()) + if ((skillId == SKILL_MINING) && !HasPick()) continue; ItemPosCountVec dest; - if ( m_bot->CanStoreNewItem( NULL_BAG, NULL_SLOT, dest, item->itemid, item->count) == EQUIP_ERR_OK ) + if (m_bot->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item->itemid, item->count) == EQUIP_ERR_OK) { - Item* pItem = m_bot->StoreNewItem (dest,item->itemid,true,item->randomPropertyId); + Item* pItem = m_bot->StoreNewItem (dest, item->itemid, true, item->randomPropertyId); uint32 SkillValue = m_bot->GetPureSkillValue(skillId); if (SkillValue >= reqSkillValue) { @@ -3340,8 +3340,8 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) } } // release loot - if(looted) - m_bot->GetSession()->DoLootRelease( lootCurrent ); + if (looted) + m_bot->GetSession()->DoLootRelease(lootCurrent); else m_bot->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_LOOTING); // sLog.outDebug( "[PlayerbotAI]: %s looted target 0x%08X", m_bot->GetName(), lootCurrent ); @@ -3351,55 +3351,55 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) SendWhisper("I have no info on that object", fromPlayer); } - else if (text == "quests") + else if (text == "quests") + { + bool hasIncompleteQuests = false; + std::ostringstream incomout; + incomout << "my incomplete quests are:"; + bool hasCompleteQuests = false; + std::ostringstream comout; + comout << "my complete quests are:"; + for (uint16 slot = 0; slot < MAX_QUEST_LOG_SIZE; ++slot) { - bool hasIncompleteQuests = false; - std::ostringstream incomout; - incomout << "my incomplete quests are:"; - bool hasCompleteQuests = false; - std::ostringstream comout; - comout << "my complete quests are:"; - for (uint16 slot = 0; slot < MAX_QUEST_LOG_SIZE; ++slot) - { - if(uint32 questId = m_bot->GetQuestSlotQuestId(slot)) - { - Quest const* pQuest = sObjectMgr.GetQuestTemplate(questId); - - std::string questTitle = pQuest->GetTitle(); - m_bot->GetPlayerbotAI()->QuestLocalization(questTitle, questId); - - if (m_bot->GetQuestStatus(questId) == QUEST_STATUS_COMPLETE) { - hasCompleteQuests = true; - comout << " |cFFFFFF00|Hquest:" << questId << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r"; - } - else { - hasIncompleteQuests = true; - incomout << " |cFFFFFF00|Hquest:" << questId << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r"; - } - } - } - if (hasCompleteQuests) - SendWhisper(comout.str(), fromPlayer); - if (hasIncompleteQuests) - SendWhisper(incomout.str(), fromPlayer); - if (! hasCompleteQuests && ! hasIncompleteQuests) - SendWhisper("I have no quests!", fromPlayer); - } + if (uint32 questId = m_bot->GetQuestSlotQuestId(slot)) + { + Quest const* pQuest = sObjectMgr.GetQuestTemplate(questId); - // drop a quest - else if (text.size() > 5 && text.substr(0, 5) == "drop ") - { - uint64 oldSelectionGUID = 0; - if (fromPlayer.GetSelection() != m_bot->GetGUID()) { - oldSelectionGUID = m_bot->GetGUID(); - fromPlayer.SetSelection(m_bot->GetGUID()); + std::string questTitle = pQuest->GetTitle(); + m_bot->GetPlayerbotAI()->QuestLocalization(questTitle, questId); + + if (m_bot->GetQuestStatus(questId) == QUEST_STATUS_COMPLETE) { + hasCompleteQuests = true; + comout << " |cFFFFFF00|Hquest:" << questId << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r"; + } + else { + hasIncompleteQuests = true; + incomout << " |cFFFFFF00|Hquest:" << questId << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r"; + } } - PlayerbotChatHandler ch(GetMaster()); - if (! ch.dropQuest((char*)text.substr(5).c_str())) - ch.sysmessage("ERROR: could not drop quest"); - if (oldSelectionGUID) - fromPlayer.SetSelection(oldSelectionGUID); - } + } + if (hasCompleteQuests) + SendWhisper(comout.str(), fromPlayer); + if (hasIncompleteQuests) + SendWhisper(incomout.str(), fromPlayer); + if (!hasCompleteQuests && !hasIncompleteQuests) + SendWhisper("I have no quests!", fromPlayer); + } + + // drop a quest + else if (text.size() > 5 && text.substr(0, 5) == "drop ") + { + uint64 oldSelectionGUID = 0; + if (fromPlayer.GetSelection() != m_bot->GetGUID()) { + oldSelectionGUID = m_bot->GetGUID(); + fromPlayer.SetSelection(m_bot->GetGUID()); + } + PlayerbotChatHandler ch(GetMaster()); + if (!ch.dropQuest((char*) text.substr(5).c_str())) + ch.sysmessage("ERROR: could not drop quest"); + if (oldSelectionGUID) + fromPlayer.SetSelection(oldSelectionGUID); + } // Handle all pet related commands here else if (text.size() > 4 && text.substr(0, 4) == "pet ") @@ -3466,10 +3466,10 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) if (spellId != 0 && pet->HasSpell(spellId)) { - if(pet->HasAura(spellId)) + if (pet->HasAura(spellId)) { - pet->RemoveAurasByCasterSpell(spellId,pet->GetGUID()); - return; + pet->RemoveAurasByCasterSpell(spellId, pet->GetGUID()); + return; } uint64 castOnGuid = fromPlayer.GetSelection(); @@ -3497,7 +3497,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) { pet->ToggleAutocast(spellId, false); if (pet->HasAura(spellId)) - pet->RemoveAurasByCasterSpell(spellId,pet->GetGUID()); + pet->RemoveAurasByCasterSpell(spellId, pet->GetGUID()); } else { @@ -3565,7 +3565,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) uint32 ignoredSpells[] = {1843, 5019, 2479, 6603, 3365, 8386, 21651, 21652, 6233, 6246, 6247, 61437, 22810, 22027, 45927, 7266, 7267, 6477, 6478, 7355, 68398}; - uint32 ignoredSpellsCount = sizeof(ignoredSpells)/sizeof(uint32); + uint32 ignoredSpellsCount = sizeof(ignoredSpells) / sizeof(uint32); for (PlayerSpellMap::iterator itr = m_bot->GetSpellMap().begin(); itr != m_bot->GetSpellMap().end(); ++itr) { const uint32 spellId = itr->first; @@ -3609,8 +3609,8 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) posSpells[spellName] = spellId; } else { - if (negSpells.find(spellName) == negSpells.end()) - negSpells[spellName] = spellId; + if (negSpells.find(spellName) == negSpells.end()) + negSpells[spellName] = spellId; else if (negSpells[spellName] < spellId) negSpells[spellName] = spellId; @@ -3649,8 +3649,8 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) { if (initString) { - eventFilter << "OR event IN (" <<*itr; - initString =false; + eventFilter << "OR event IN (" << *itr; + initString = false; } else eventFilter << "," << *itr; @@ -3662,90 +3662,90 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) eventFilter << ")"; result = WorldDatabase.PQuery("SELECT gameobject.guid, id, position_x, position_y, position_z, map, " - "(POW(position_x - %f, 2) + POW(position_y - %f, 2) + POW(position_z - %f, 2)) AS order_ FROM gameobject " - "LEFT OUTER JOIN game_event_gameobject on gameobject.guid=game_event_gameobject.guid WHERE map = '%i' %s ORDER BY order_ ASC LIMIT 10", - m_bot->GetPositionX(), m_bot->GetPositionY(), m_bot->GetPositionZ(), m_bot->GetMapId(),eventFilter.str().c_str()); - - if (result) - { - do - { - Field *fields = result->Fetch(); - uint32 guid = fields[0].GetUInt32(); - uint32 entry = fields[1].GetUInt32(); - float x = fields[2].GetFloat(); - float y = fields[3].GetFloat(); - float z = fields[4].GetFloat(); - int mapid = fields[5].GetUInt16(); - - GameObject *go = m_bot->GetMap()->GetGameObject(ObjectGuid(HIGHGUID_GAMEOBJECT,entry,guid)); - if (!go) - continue; - - if ( !go->isSpawned() ) - continue; - - detectout << "|cFFFFFF00|Hfound:" << guid << ":" << entry << ":" << x << ":" << y << ":" << z << ":" << mapid << ":" << "|h[" << go->GetGOInfo()->name << "]|h|r"; - ++count; - } while (result->NextRow()); - - delete result; - } - SendWhisper(detectout.str().c_str(), fromPlayer); + "(POW(position_x - %f, 2) + POW(position_y - %f, 2) + POW(position_z - %f, 2)) AS order_ FROM gameobject " + "LEFT OUTER JOIN game_event_gameobject on gameobject.guid=game_event_gameobject.guid WHERE map = '%i' %s ORDER BY order_ ASC LIMIT 10", + m_bot->GetPositionX(), m_bot->GetPositionY(), m_bot->GetPositionZ(), m_bot->GetMapId(), eventFilter.str().c_str()); + + if (result) + { + do + { + Field *fields = result->Fetch(); + uint32 guid = fields[0].GetUInt32(); + uint32 entry = fields[1].GetUInt32(); + float x = fields[2].GetFloat(); + float y = fields[3].GetFloat(); + float z = fields[4].GetFloat(); + int mapid = fields[5].GetUInt16(); + + GameObject *go = m_bot->GetMap()->GetGameObject(ObjectGuid(HIGHGUID_GAMEOBJECT, entry, guid)); + if (!go) + continue; + + if (!go->isSpawned()) + continue; + + detectout << "|cFFFFFF00|Hfound:" << guid << ":" << entry << ":" << x << ":" << y << ":" << z << ":" << mapid << ":" << "|h[" << go->GetGOInfo()->name << "]|h|r"; + ++count; + } while (result->NextRow()); + + delete result; + } + SendWhisper(detectout.str().c_str(), fromPlayer); } // stats project: 10:00 19/04/10 rev.1 display bot statistics else if (text == "stats") { - std::ostringstream out; - - uint32 totalused = 0; - // list out items in main backpack - for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; slot++) - { - const Item* const pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); - if (pItem) - totalused++; - } - uint32 totalfree = 16 - totalused; - // list out items in other removable backpacks - for (uint8 bag = INVENTORY_SLOT_BAG_START; bag < INVENTORY_SLOT_BAG_END; ++bag) - { - const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); - if (pBag) - { - ItemPrototype const* pBagProto = pBag->GetProto(); - if (pBagProto->Class == ITEM_CLASS_CONTAINER && pBagProto->SubClass == ITEM_SUBCLASS_CONTAINER) - totalfree = totalfree + pBag->GetFreeSlots(); - } - - } - - // calculate how much money bot has - uint32 copper = m_bot->GetMoney(); - uint32 gold = uint32(copper / 10000); - copper -= (gold * 10000); - uint32 silver = uint32(copper / 100); - copper -= (silver * 100); - - out << "|cffffffff[|h|cff00ffff" << m_bot->GetName() << "|h|cffffffff]" << " has |r|cff00ff00" << gold - << "|r|cfffffc00g|r|cff00ff00" << silver - << "|r|cffcdcdcds|r|cff00ff00" << copper - << "|r|cffffd333c" << "|h|cffffffff bag slots |h|cff00ff00" << totalfree; - - // estimate how much item damage the bot has - copper = EstRepairAll(); - gold = uint32(copper / 10000); - copper -= (gold * 10000); - silver = uint32(copper / 100); - copper -= (silver * 100); - - out << "|h|cffffffff & item damage cost " << "|r|cff00ff00" << gold - << "|r|cfffffc00g|r|cff00ff00" << silver - << "|r|cffcdcdcds|r|cff00ff00" << copper - << "|r|cffffd333c"; - ChatHandler ch(&fromPlayer); - ch.SendSysMessage(out.str().c_str()); + std::ostringstream out; + + uint32 totalused = 0; + // list out items in main backpack + for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; slot++) + { + const Item* const pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); + if (pItem) + totalused++; + } + uint32 totalfree = 16 - totalused; + // list out items in other removable backpacks + for (uint8 bag = INVENTORY_SLOT_BAG_START; bag < INVENTORY_SLOT_BAG_END; ++bag) + { + const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); + if (pBag) + { + ItemPrototype const* pBagProto = pBag->GetProto(); + if (pBagProto->Class == ITEM_CLASS_CONTAINER && pBagProto->SubClass == ITEM_SUBCLASS_CONTAINER) + totalfree = totalfree + pBag->GetFreeSlots(); + } + + } + + // calculate how much money bot has + uint32 copper = m_bot->GetMoney(); + uint32 gold = uint32(copper / 10000); + copper -= (gold * 10000); + uint32 silver = uint32(copper / 100); + copper -= (silver * 100); + + out << "|cffffffff[|h|cff00ffff" << m_bot->GetName() << "|h|cffffffff]" << " has |r|cff00ff00" << gold + << "|r|cfffffc00g|r|cff00ff00" << silver + << "|r|cffcdcdcds|r|cff00ff00" << copper + << "|r|cffffd333c" << "|h|cffffffff bag slots |h|cff00ff00" << totalfree; + + // estimate how much item damage the bot has + copper = EstRepairAll(); + gold = uint32(copper / 10000); + copper -= (gold * 10000); + silver = uint32(copper / 100); + copper -= (silver * 100); + + out << "|h|cffffffff & item damage cost " << "|r|cff00ff00" << gold + << "|r|cfffffc00g|r|cff00ff00" << silver + << "|r|cffcdcdcds|r|cff00ff00" << copper + << "|r|cffffd333c"; + ChatHandler ch(&fromPlayer); + ch.SendSysMessage(out.str().c_str()); } else { @@ -3753,48 +3753,48 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) std::list itemIds; extractItemIds(text, itemIds); if (!itemIds.empty()) { - uint32 itemId = itemIds.front(); - bool wasRewarded = false; - uint64 questRewarderGUID = m_bot->GetSelection(); - Object* const pNpc = (WorldObject*) m_bot->GetObjectByTypeMask(questRewarderGUID, TYPEMASK_CREATURE_OR_GAMEOBJECT); - if (!pNpc) - return; + uint32 itemId = itemIds.front(); + bool wasRewarded = false; + uint64 questRewarderGUID = m_bot->GetSelection(); + Object* const pNpc = (WorldObject*) m_bot->GetObjectByTypeMask(questRewarderGUID, TYPEMASK_CREATURE_OR_GAMEOBJECT); + if (!pNpc) + return; - QuestMenu& questMenu = m_bot->PlayerTalkClass->GetQuestMenu(); - for (uint32 iI = 0; !wasRewarded && iI < questMenu.MenuItemCount(); ++iI) - { - QuestMenuItem const& qItem = questMenu.GetItem(iI); - - uint32 questID = qItem.m_qId; - Quest const* pQuest = sObjectMgr.GetQuestTemplate(questID); - QuestStatus status = m_bot->GetQuestStatus(questID); - - // if quest is complete, turn it in - if (status == QUEST_STATUS_COMPLETE && - ! m_bot->GetQuestRewardStatus(questID) && - pQuest->GetRewChoiceItemsCount() > 1 && - m_bot->CanRewardQuest(pQuest, false)) - { - for (uint8 rewardIdx=0; !wasRewarded && rewardIdx < pQuest->GetRewChoiceItemsCount(); ++rewardIdx) - { - ItemPrototype const * const pRewardItem = sObjectMgr.GetItemPrototype(pQuest->RewChoiceItemId[rewardIdx]); - if (itemId == pRewardItem->ItemId) - { - m_bot->RewardQuest(pQuest, rewardIdx, pNpc, false); + QuestMenu& questMenu = m_bot->PlayerTalkClass->GetQuestMenu(); + for (uint32 iI = 0; !wasRewarded && iI < questMenu.MenuItemCount(); ++iI) + { + QuestMenuItem const& qItem = questMenu.GetItem(iI); - std::string questTitle = pQuest->GetTitle(); - m_bot->GetPlayerbotAI()->QuestLocalization(questTitle, questID); - std::string itemName = pRewardItem->Name1; - m_bot->GetPlayerbotAI()->ItemLocalization(itemName, pRewardItem->ItemId); + uint32 questID = qItem.m_qId; + Quest const* pQuest = sObjectMgr.GetQuestTemplate(questID); + QuestStatus status = m_bot->GetQuestStatus(questID); - std::ostringstream out; - out << "|cffffffff|Hitem:" << pRewardItem->ItemId << ":0:0:0:0:0:0:0" << "|h[" << itemName << "]|h|r rewarded"; - SendWhisper(out.str(), fromPlayer); - wasRewarded = true; - } - } - } - } + // if quest is complete, turn it in + if (status == QUEST_STATUS_COMPLETE && + !m_bot->GetQuestRewardStatus(questID) && + pQuest->GetRewChoiceItemsCount() > 1 && + m_bot->CanRewardQuest(pQuest, false)) + { + for (uint8 rewardIdx = 0; !wasRewarded && rewardIdx < pQuest->GetRewChoiceItemsCount(); ++rewardIdx) + { + ItemPrototype const * const pRewardItem = sObjectMgr.GetItemPrototype(pQuest->RewChoiceItemId[rewardIdx]); + if (itemId == pRewardItem->ItemId) + { + m_bot->RewardQuest(pQuest, rewardIdx, pNpc, false); + + std::string questTitle = pQuest->GetTitle(); + m_bot->GetPlayerbotAI()->QuestLocalization(questTitle, questID); + std::string itemName = pRewardItem->Name1; + m_bot->GetPlayerbotAI()->ItemLocalization(itemName, pRewardItem->ItemId); + + std::ostringstream out; + out << "|cffffffff|Hitem:" << pRewardItem->ItemId << ":0:0:0:0:0:0:0" << "|h[" << itemName << "]|h|r rewarded"; + SendWhisper(out.str(), fromPlayer); + wasRewarded = true; + } + } + } + } } else { diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 7065a8b11..9f9592bec 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -42,280 +42,280 @@ enum RacialTraits class MANGOS_DLL_SPEC PlayerbotAI { - public: - enum ScenarioType - { - SCENARIO_PVEEASY, - SCENARIO_PVEHARD, - SCENARIO_DUEL, - SCENARIO_PVPEASY, - SCENARIO_PVPHARD - }; - - enum CombatStyle { - COMBAT_MELEE = 0x01, // class melee attacker - COMBAT_RANGED = 0x02 // class is ranged attacker - }; - - // masters orders that should be obeyed by the AI during the updteAI routine - // the master will auto set the target of the bot - enum CombatOrderType - { - ORDERS_NONE = 0x00, // no special orders given - ORDERS_TANK = 0x01, // bind attackers by gaining threat - ORDERS_ASSIST = 0x02, // assist someone (dps type) - ORDERS_HEAL = 0x04, // concentrate on healing (no attacks, only self defense) - ORDERS_PROTECT = 0x10, // combinable state: check if protectee is attacked - ORDERS_PRIMARY = 0x0F, - ORDERS_SECONDARY = 0xF0, - ORDERS_RESET = 0xFF - }; - - enum CombatTargetType - { - TARGET_NORMAL = 0x00, - TARGET_THREATEN = 0x01 - }; - - enum BotState - { - BOTSTATE_NORMAL, // normal AI routines are processed - BOTSTATE_COMBAT, // bot is in combat - BOTSTATE_DEAD, // we are dead and wait for becoming ghost - BOTSTATE_DEADRELEASED, // we released as ghost and wait to revive - BOTSTATE_LOOTING // looting mode, used just after combat - }; - - enum MovementOrderType - { - MOVEMENT_NONE = 0x00, - MOVEMENT_FOLLOW = 0x01, - MOVEMENT_STAY = 0x02 - }; - - typedef std::map BotNeedItem; - typedef std::list BotLootCreature; - - // attacker query used in PlayerbotAI::FindAttacker() - enum ATTACKERINFOTYPE - { - AIT_NONE = 0x00, - AIT_LOWESTTHREAT = 0x01, - AIT_HIGHESTTHREAT = 0x02, - AIT_VICTIMSELF = 0x04, - AIT_VICTIMNOTSELF = 0x08 // !!! must use victim param in FindAttackers - }; - struct AttackerInfo - { - Unit* attacker; // reference to the attacker - Unit* victim; // combatant's current victim - float threat; // own threat on this combatant - float threat2; // highest threat not caused by bot - uint32 count; // number of units attacking - uint32 source; // 1=bot, 2=master, 3=group - }; - typedef std::map AttackerInfoList; - - public: - PlayerbotAI(PlayerbotMgr* const mgr, Player* const bot); - virtual ~PlayerbotAI(); - - // This is called from Unit.cpp and is called every second (I think) - void UpdateAI(const uint32 p_time); - - // This is called from ChatHandler.cpp when there is an incoming message to the bot - // from a whisper or from the party channel - void HandleCommand(const std::string& text, Player& fromPlayer); - - // This is called by WorldSession.cpp - // It provides a view of packets normally sent to the client. - // Since there is no client at the other end, the packets are dropped of course. - // For a list of opcodes that can be caught see Opcodes.cpp (SMSG_* opcodes only) - void HandleBotOutgoingPacket(const WorldPacket& packet); - - // This is called by WorldSession.cpp - // when it detects that a bot is being teleported. It acknowledges to the server to complete the - // teleportation - void HandleTeleportAck(); - - // Returns what kind of situation we are in so the ai can react accordingly - ScenarioType GetScenarioType() {return m_ScenarioType;} - - PlayerbotClassAI* GetClassAI() {return m_classAI;} - PlayerbotMgr* const GetManager() {return m_mgr;} - - // finds spell ID for matching substring args - // in priority of full text match, spells not taking reagents, and highest rank - uint32 getSpellId(const char* args, bool master = false) const; - uint32 getPetSpellId(const char* args) const; - // Initialize spell using rank 1 spell id - uint32 initSpell(uint32 spellId); - - // extracts item ids from links - void extractItemIds(const std::string& text, std::list& itemIds) const; - - // extract spellid from links - bool extractSpellId(const std::string& text, uint32 &spellId) const; - - // extracts currency from a string as #g#s#c and returns the total in copper - uint32 extractMoney(const std::string& text) const; - - // extracts gameobject info from link - bool extractGOinfo(const std::string& text, uint32 &guid, uint32 &entry, int &mapid, float &x, float &y, float &z) const; - - // finds items in bots equipment and adds them to foundItemList, removes found items from itemIdSearchList - void findItemsInEquip(std::list& itemIdSearchList, std::list& foundItemList) const; - // finds items in bots inventory and adds them to foundItemList, removes found items from itemIdSearchList - void findItemsInInv(std::list& itemIdSearchList, std::list& foundItemList) const; - - // currently bots only obey commands from the master - bool canObeyCommandFrom(const Player& player) const; - - // get current casting spell (will return NULL if no spell!) - Spell* GetCurrentSpell() const; - - bool HasAura(uint32 spellId, const Unit& player) const; - bool HasAura(const char* spellName, const Unit& player) const; - bool HasAura(const char* spellName) const; - - bool HasPick(); - - uint8 GetHealthPercent(const Unit& target) const; - uint8 GetHealthPercent() const; - uint8 GetBaseManaPercent(const Unit& target) const; - uint8 GetBaseManaPercent() const; - uint8 GetManaPercent(const Unit& target) const; - uint8 GetManaPercent() const; - uint8 GetRageAmount(const Unit& target) const; - uint8 GetRageAmount() const; - uint8 GetEnergyAmount(const Unit& target) const; - uint8 GetEnergyAmount() const; - uint8 GetRunicPower(const Unit& target) const; - uint8 GetRunicPower() const; - - Item* FindFood() const; - Item* FindDrink() const; - Item* FindBandage() const; - Item* FindPoison() const; - Item* FindMount(uint32 matchingRidingSkill) const; - Item* FindItem(uint32 ItemId); - Item* FindConsumable(uint32 displayId) const; - - // ******* Actions **************************************** - // Your handlers can call these actions to make the bot do things. - void TellMaster(const std::string& text) const; - void TellMaster( const char *fmt, ... ) const; - void SendWhisper(const std::string& text, Player& player) const; - bool CastSpell(const char* args); - bool CastSpell(uint32 spellId); - bool CastSpell(uint32 spellId, Unit& target); - bool CastPetSpell(uint32 spellId, Unit* target = NULL); - void UseItem(Item& item, uint8 targetSlot = 255); - void EquipItem(Item& item); - //void Stay(); - //bool Follow(Player& player); - void SendNotEquipList(Player& player); - void Feast(); - void InterruptCurrentCastingSpell(); - void GetCombatTarget( Unit* forcedTarged = 0 ); - Unit *GetCurrentTarget() { return m_targetCombat; }; - void DoNextCombatManeuver(); - void DoCombatMovement(); - void SetIgnoreUpdateTime(uint8 t) {m_ignoreAIUpdatesUntilTime=time(0) + t; }; - - Player *GetPlayerBot() const {return m_bot;} - Player *GetPlayer() const {return m_bot;} - Player *GetMaster() const; - - BotState GetState() { return m_botState; }; - void SetState( BotState state ); - void SetQuestNeedItems(); - void SendQuestItemList( Player& player ); - void SendOrders( Player& player ); - bool FollowCheckTeleport( WorldObject &obj ); - void DoLoot(); - - uint32 EstRepairAll(); - uint32 EstRepair(uint16 pos); - - void AcceptQuest( Quest const *qInfo, Player *pGiver ); - void TurnInQuests( WorldObject *questgiver ); - - bool IsInCombat(); - void UpdateAttackerInfo(); - Unit* FindAttacker( ATTACKERINFOTYPE ait=AIT_NONE, Unit *victim=0 ); - uint32 GetAttackerCount() { return m_attackerInfo.size(); }; - void SetCombatOrderByStr( std::string str, Unit *target=0 ); - void SetCombatOrder( CombatOrderType co, Unit *target=0 ); - CombatOrderType GetCombatOrder() { return this->m_combatOrder; } - void SetMovementOrder( MovementOrderType mo, Unit *followTarget=0 ); - MovementOrderType GetMovementOrder() { return this->m_movementOrder; } - void MovementReset(); - void MovementUpdate(); - void MovementClear(); - bool IsMoving(); - - void SetInFront( const Unit* obj ); - - void ItemLocalization(std::string& itemName, const uint32 itemID) const; - void QuestLocalization(std::string& questTitle, const uint32 questID) const; - - uint8 GetFreeBagSpace() const; - - private: - // ****** Closed Actions ******************************** - // These actions may only be called at special times. - // Trade methods are only applicable when the trade window is open - // and are only called from within HandleCommand. - bool TradeItem(const Item& item, int8 slot=-1); - bool TradeCopper(uint32 copper); - - // it is safe to keep these back reference pointers because m_bot - // owns the "this" object and m_master owns m_bot. The owner always cleans up. - PlayerbotMgr* const m_mgr; - Player* const m_bot; - PlayerbotClassAI* m_classAI; - - // ignores AI updates until time specified - // no need to waste CPU cycles during casting etc - time_t m_ignoreAIUpdatesUntilTime; - - CombatStyle m_combatStyle; - CombatOrderType m_combatOrder; - MovementOrderType m_movementOrder; - - ScenarioType m_ScenarioType; - - // defines the state of behaviour of the bot - BotState m_botState; - - // list of items needed to fullfill quests - BotNeedItem m_needItemList; - - // list of creatures we recently attacked and want to loot - BotLootCreature m_lootCreature; // list of creatures - uint64 m_lootCurrent; // current remains of interest - - time_t m_TimeDoneEating; - time_t m_TimeDoneDrinking; - uint32 m_CurrentlyCastingSpellId; - //bool m_IsFollowingMaster; - - // if master commands bot to do something, store here until updateAI - // can do it - uint32 m_spellIdCommand; - uint64 m_targetGuidCommand; - - AttackerInfoList m_attackerInfo; - - bool m_targetChanged; - CombatTargetType m_targetType; - - Unit *m_targetCombat; // current combat target - Unit *m_targetAssist; // get new target by checking attacker list of assisted player - Unit *m_targetProtect; // check - - Unit *m_followTarget; // whom to follow in non combat situation? +public: + enum ScenarioType + { + SCENARIO_PVEEASY, + SCENARIO_PVEHARD, + SCENARIO_DUEL, + SCENARIO_PVPEASY, + SCENARIO_PVPHARD + }; + + enum CombatStyle { + COMBAT_MELEE = 0x01, // class melee attacker + COMBAT_RANGED = 0x02 // class is ranged attacker + }; + + // masters orders that should be obeyed by the AI during the updteAI routine + // the master will auto set the target of the bot + enum CombatOrderType + { + ORDERS_NONE = 0x00, // no special orders given + ORDERS_TANK = 0x01, // bind attackers by gaining threat + ORDERS_ASSIST = 0x02, // assist someone (dps type) + ORDERS_HEAL = 0x04, // concentrate on healing (no attacks, only self defense) + ORDERS_PROTECT = 0x10, // combinable state: check if protectee is attacked + ORDERS_PRIMARY = 0x0F, + ORDERS_SECONDARY = 0xF0, + ORDERS_RESET = 0xFF + }; + + enum CombatTargetType + { + TARGET_NORMAL = 0x00, + TARGET_THREATEN = 0x01 + }; + + enum BotState + { + BOTSTATE_NORMAL, // normal AI routines are processed + BOTSTATE_COMBAT, // bot is in combat + BOTSTATE_DEAD, // we are dead and wait for becoming ghost + BOTSTATE_DEADRELEASED, // we released as ghost and wait to revive + BOTSTATE_LOOTING // looting mode, used just after combat + }; + + enum MovementOrderType + { + MOVEMENT_NONE = 0x00, + MOVEMENT_FOLLOW = 0x01, + MOVEMENT_STAY = 0x02 + }; + + typedef std::map BotNeedItem; + typedef std::list BotLootCreature; + + // attacker query used in PlayerbotAI::FindAttacker() + enum ATTACKERINFOTYPE + { + AIT_NONE = 0x00, + AIT_LOWESTTHREAT = 0x01, + AIT_HIGHESTTHREAT = 0x02, + AIT_VICTIMSELF = 0x04, + AIT_VICTIMNOTSELF = 0x08 // !!! must use victim param in FindAttackers + }; + struct AttackerInfo + { + Unit* attacker; // reference to the attacker + Unit* victim; // combatant's current victim + float threat; // own threat on this combatant + float threat2; // highest threat not caused by bot + uint32 count; // number of units attacking + uint32 source; // 1=bot, 2=master, 3=group + }; + typedef std::map AttackerInfoList; + +public: + PlayerbotAI(PlayerbotMgr * const mgr, Player * const bot); + virtual ~PlayerbotAI(); + + // This is called from Unit.cpp and is called every second (I think) + void UpdateAI(const uint32 p_time); + + // This is called from ChatHandler.cpp when there is an incoming message to the bot + // from a whisper or from the party channel + void HandleCommand(const std::string& text, Player& fromPlayer); + + // This is called by WorldSession.cpp + // It provides a view of packets normally sent to the client. + // Since there is no client at the other end, the packets are dropped of course. + // For a list of opcodes that can be caught see Opcodes.cpp (SMSG_* opcodes only) + void HandleBotOutgoingPacket(const WorldPacket& packet); + + // This is called by WorldSession.cpp + // when it detects that a bot is being teleported. It acknowledges to the server to complete the + // teleportation + void HandleTeleportAck(); + + // Returns what kind of situation we are in so the ai can react accordingly + ScenarioType GetScenarioType() {return m_ScenarioType; } + + PlayerbotClassAI* GetClassAI() {return m_classAI; } + PlayerbotMgr* const GetManager() {return m_mgr; } + + // finds spell ID for matching substring args + // in priority of full text match, spells not taking reagents, and highest rank + uint32 getSpellId(const char* args, bool master = false) const; + uint32 getPetSpellId(const char* args) const; + // Initialize spell using rank 1 spell id + uint32 initSpell(uint32 spellId); + + // extracts item ids from links + void extractItemIds(const std::string& text, std::list& itemIds) const; + + // extract spellid from links + bool extractSpellId(const std::string& text, uint32 &spellId) const; + + // extracts currency from a string as #g#s#c and returns the total in copper + uint32 extractMoney(const std::string& text) const; + + // extracts gameobject info from link + bool extractGOinfo(const std::string& text, uint32 &guid, uint32 &entry, int &mapid, float &x, float &y, float &z) const; + + // finds items in bots equipment and adds them to foundItemList, removes found items from itemIdSearchList + void findItemsInEquip(std::list& itemIdSearchList, std::list& foundItemList) const; + // finds items in bots inventory and adds them to foundItemList, removes found items from itemIdSearchList + void findItemsInInv(std::list& itemIdSearchList, std::list& foundItemList) const; + + // currently bots only obey commands from the master + bool canObeyCommandFrom(const Player& player) const; + + // get current casting spell (will return NULL if no spell!) + Spell* GetCurrentSpell() const; + + bool HasAura(uint32 spellId, const Unit& player) const; + bool HasAura(const char* spellName, const Unit& player) const; + bool HasAura(const char* spellName) const; + + bool HasPick(); + + uint8 GetHealthPercent(const Unit& target) const; + uint8 GetHealthPercent() const; + uint8 GetBaseManaPercent(const Unit& target) const; + uint8 GetBaseManaPercent() const; + uint8 GetManaPercent(const Unit& target) const; + uint8 GetManaPercent() const; + uint8 GetRageAmount(const Unit& target) const; + uint8 GetRageAmount() const; + uint8 GetEnergyAmount(const Unit& target) const; + uint8 GetEnergyAmount() const; + uint8 GetRunicPower(const Unit& target) const; + uint8 GetRunicPower() const; + + Item* FindFood() const; + Item* FindDrink() const; + Item* FindBandage() const; + Item* FindPoison() const; + Item* FindMount(uint32 matchingRidingSkill) const; + Item* FindItem(uint32 ItemId); + Item* FindConsumable(uint32 displayId) const; + + // ******* Actions **************************************** + // Your handlers can call these actions to make the bot do things. + void TellMaster(const std::string& text) const; + void TellMaster(const char *fmt, ...) const; + void SendWhisper(const std::string& text, Player& player) const; + bool CastSpell(const char* args); + bool CastSpell(uint32 spellId); + bool CastSpell(uint32 spellId, Unit& target); + bool CastPetSpell(uint32 spellId, Unit* target = NULL); + void UseItem(Item& item, uint8 targetSlot = 255); + void EquipItem(Item& item); + //void Stay(); + //bool Follow(Player& player); + void SendNotEquipList(Player& player); + void Feast(); + void InterruptCurrentCastingSpell(); + void GetCombatTarget(Unit* forcedTarged = 0); + Unit *GetCurrentTarget() { return m_targetCombat; }; + void DoNextCombatManeuver(); + void DoCombatMovement(); + void SetIgnoreUpdateTime(uint8 t) {m_ignoreAIUpdatesUntilTime = time(0) + t; }; + + Player *GetPlayerBot() const {return m_bot; } + Player *GetPlayer() const {return m_bot; } + Player *GetMaster() const; + + BotState GetState() { return m_botState; }; + void SetState(BotState state); + void SetQuestNeedItems(); + void SendQuestItemList(Player& player); + void SendOrders(Player& player); + bool FollowCheckTeleport(WorldObject &obj); + void DoLoot(); + + uint32 EstRepairAll(); + uint32 EstRepair(uint16 pos); + + void AcceptQuest(Quest const *qInfo, Player *pGiver); + void TurnInQuests(WorldObject *questgiver); + + bool IsInCombat(); + void UpdateAttackerInfo(); + Unit* FindAttacker(ATTACKERINFOTYPE ait = AIT_NONE, Unit *victim = 0); + uint32 GetAttackerCount() { return m_attackerInfo.size(); }; + void SetCombatOrderByStr(std::string str, Unit *target = 0); + void SetCombatOrder(CombatOrderType co, Unit *target = 0); + CombatOrderType GetCombatOrder() { return this->m_combatOrder; } + void SetMovementOrder(MovementOrderType mo, Unit *followTarget = 0); + MovementOrderType GetMovementOrder() { return this->m_movementOrder; } + void MovementReset(); + void MovementUpdate(); + void MovementClear(); + bool IsMoving(); + + void SetInFront(const Unit* obj); + + void ItemLocalization(std::string& itemName, const uint32 itemID) const; + void QuestLocalization(std::string& questTitle, const uint32 questID) const; + + uint8 GetFreeBagSpace() const; + +private: + // ****** Closed Actions ******************************** + // These actions may only be called at special times. + // Trade methods are only applicable when the trade window is open + // and are only called from within HandleCommand. + bool TradeItem(const Item& item, int8 slot = -1); + bool TradeCopper(uint32 copper); + + // it is safe to keep these back reference pointers because m_bot + // owns the "this" object and m_master owns m_bot. The owner always cleans up. + PlayerbotMgr* const m_mgr; + Player* const m_bot; + PlayerbotClassAI* m_classAI; + + // ignores AI updates until time specified + // no need to waste CPU cycles during casting etc + time_t m_ignoreAIUpdatesUntilTime; + + CombatStyle m_combatStyle; + CombatOrderType m_combatOrder; + MovementOrderType m_movementOrder; + + ScenarioType m_ScenarioType; + + // defines the state of behaviour of the bot + BotState m_botState; + + // list of items needed to fullfill quests + BotNeedItem m_needItemList; + + // list of creatures we recently attacked and want to loot + BotLootCreature m_lootCreature; // list of creatures + uint64 m_lootCurrent; // current remains of interest + + time_t m_TimeDoneEating; + time_t m_TimeDoneDrinking; + uint32 m_CurrentlyCastingSpellId; + //bool m_IsFollowingMaster; + + // if master commands bot to do something, store here until updateAI + // can do it + uint32 m_spellIdCommand; + uint64 m_targetGuidCommand; + + AttackerInfoList m_attackerInfo; + + bool m_targetChanged; + CombatTargetType m_targetType; + + Unit *m_targetCombat; // current combat target + Unit *m_targetAssist; // get new target by checking attacker list of assisted player + Unit *m_targetProtect; // check + + Unit *m_followTarget; // whom to follow in non combat situation? }; #endif diff --git a/src/game/playerbot/PlayerbotClassAI.cpp b/src/game/playerbot/PlayerbotClassAI.cpp index b7e853c3d..1b7622b6b 100644 --- a/src/game/playerbot/PlayerbotClassAI.cpp +++ b/src/game/playerbot/PlayerbotClassAI.cpp @@ -1,7 +1,7 @@ #include "PlayerbotClassAI.h" #include "Common.h" -PlayerbotClassAI::PlayerbotClassAI(Player* const master, Player* const bot, PlayerbotAI* const ai): m_master(master), m_bot(bot), m_ai(ai) {} +PlayerbotClassAI::PlayerbotClassAI(Player* const master, Player* const bot, PlayerbotAI* const ai) : m_master(master), m_bot(bot), m_ai(ai) {} PlayerbotClassAI::~PlayerbotClassAI() {} bool PlayerbotClassAI::DoFirstCombatManeuver(Unit *) diff --git a/src/game/playerbot/PlayerbotClassAI.h b/src/game/playerbot/PlayerbotClassAI.h index c1f457169..129c8e4cc 100644 --- a/src/game/playerbot/PlayerbotClassAI.h +++ b/src/game/playerbot/PlayerbotClassAI.h @@ -16,30 +16,30 @@ class PlayerbotAI; class MANGOS_DLL_SPEC PlayerbotClassAI { - public: - PlayerbotClassAI(Player* const master, Player* const bot, PlayerbotAI* const ai); - virtual ~PlayerbotClassAI(); +public: + PlayerbotClassAI(Player * const master, Player * const bot, PlayerbotAI * const ai); + virtual ~PlayerbotClassAI(); - // all combat actions go here - virtual bool DoFirstCombatManeuver(Unit*); - virtual void DoNextCombatManeuver(Unit*); + // all combat actions go here + virtual bool DoFirstCombatManeuver(Unit*); + virtual void DoNextCombatManeuver(Unit*); - // all non combat actions go here, ex buffs, heals, rezzes - virtual void DoNonCombatActions(); + // all non combat actions go here, ex buffs, heals, rezzes + virtual void DoNonCombatActions(); - // buff a specific player, usually a real PC who is not in group - virtual void BuffPlayer(Player* target); + // buff a specific player, usually a real PC who is not in group + virtual void BuffPlayer(Player* target); - // Utilities - Player* GetMaster () {return m_master;} - Player* GetPlayerBot() {return m_bot;} - PlayerbotAI* GetAI (){return m_ai;}; + // Utilities + Player* GetMaster () {return m_master; } + Player* GetPlayerBot() {return m_bot; } + PlayerbotAI* GetAI (){return m_ai; }; - private: - Player* m_master; - Player* m_bot; - PlayerbotAI* m_ai; +private: + Player* m_master; + Player* m_bot; + PlayerbotAI* m_ai; }; #endif diff --git a/src/game/playerbot/PlayerbotDeathKnightAI.cpp b/src/game/playerbot/PlayerbotDeathKnightAI.cpp index 12e116d94..20303c0f8 100644 --- a/src/game/playerbot/PlayerbotDeathKnightAI.cpp +++ b/src/game/playerbot/PlayerbotDeathKnightAI.cpp @@ -4,7 +4,7 @@ #include "PlayerbotMgr.h" class PlayerbotAI; -PlayerbotDeathKnightAI::PlayerbotDeathKnightAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) +PlayerbotDeathKnightAI::PlayerbotDeathKnightAI(Player* const master, Player* const bot, PlayerbotAI* const ai) : PlayerbotClassAI(master, bot, ai) { PLAGUE_STRIKE = ai->initSpell(PLAGUE_STRIKE_1); // Unholy @@ -15,7 +15,7 @@ PlayerbotDeathKnightAI::PlayerbotDeathKnightAI(Player* const master, Player* con SCOURGE_STRIKE = ai->initSpell(SCOURGE_STRIKE_1); DEATH_AND_DECAY = ai->initSpell(DEATH_AND_DECAY_1); CORPSE_EXPLOSION = ai->initSpell(CORPSE_EXPLOSION_1); - BONE_SHIELD = ai->initSpell(BONE_SHIELD_1); // buffs + BONE_SHIELD = ai->initSpell(BONE_SHIELD_1); // buffs ANTI_MAGIC_SHELL = ai->initSpell(ANTI_MAGIC_SHELL_1); ANTI_MAGIC_ZONE = ai->initSpell(ANTI_MAGIC_ZONE_1); GHOUL_FRENZY = ai->initSpell(GHOUL_FRENZY_1); @@ -34,7 +34,7 @@ PlayerbotDeathKnightAI::PlayerbotDeathKnightAI(Player* const master, Player* con KILLING_MACHINE = 0; // Passive DEATHCHILL = ai->initSpell(DEATHCHILL_1); HORN_OF_WINTER = ai->initSpell(HORN_OF_WINTER_1); - ICEBOUND_FORTITUDE= ai->initSpell(ICEBOUND_FORTITUDE_1); + ICEBOUND_FORTITUDE = ai->initSpell(ICEBOUND_FORTITUDE_1); EMPOWER_WEAPON = ai->initSpell(EMPOWER_RUNE_WEAPON_1); UNBREAKABLE_ARMOR = ai->initSpell(UNBREAKABLE_ARMOR_1); BLOOD_STRIKE = ai->initSpell(BLOOD_STRIKE_1); // Blood @@ -45,7 +45,7 @@ PlayerbotDeathKnightAI::PlayerbotDeathKnightAI(Player* const master, Player* con DANCING_WEAPON = ai->initSpell(DANCING_RUNE_WEAPON_1); DARK_COMMAND = ai->initSpell(DARK_COMMAND_1); MARK_OF_BLOOD = ai->initSpell(MARK_OF_BLOOD_1); // buffs - RUNE_TAP = ai->initSpell(RUNE_TAP_1); + RUNE_TAP = ai->initSpell(RUNE_TAP_1); VAMPIRIC_BLOOD = ai->initSpell(VAMPIRIC_BLOOD_1); DEATH_PACT = ai->initSpell(DEATH_PACT_1); HYSTERIA = ai->initSpell(HYSTERIA_1); @@ -55,7 +55,7 @@ PlayerbotDeathKnightAI::PlayerbotDeathKnightAI(Player* const master, Player* con RECENTLY_BANDAGED = 11196; // first aid check - // racial + // racial ARCANE_TORRENT = ai->initSpell(ARCANE_TORRENT_DEATH_KNIGHT); // blood elf GIFT_OF_THE_NAARU = ai->initSpell(GIFT_OF_THE_NAARU_DEATH_KNIGHT); // draenei STONEFORM = ai->initSpell(STONEFORM_ALL); // dwarf @@ -89,379 +89,379 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) // DK Attacks: Unholy, Frost & Blood // damage spells - ai->SetInFront( pTarget );//<--- + ai->SetInFront(pTarget); //<--- Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); Pet *pet = m_bot->GetPet(); - float dist = m_bot->GetDistance( pTarget ); - std::ostringstream out; + float dist = m_bot->GetDistance(pTarget); + std::ostringstream out; switch (SpellSequence) { case SPELL_DK_UNHOLY: - if (UNHOLY_PRESENCE > 0) - (!m_bot->HasAura(UNHOLY_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(BLOOD_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(FROST_PRESENCE, EFFECT_INDEX_0) && ai->CastSpell (UNHOLY_PRESENCE, *m_bot)); + if (UNHOLY_PRESENCE > 0) + (!m_bot->HasAura(UNHOLY_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(BLOOD_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(FROST_PRESENCE, EFFECT_INDEX_0) && ai->CastSpell (UNHOLY_PRESENCE, *m_bot)); - // check for BONE_SHIELD in combat - if (BONE_SHIELD > 0) - (!m_bot->HasAura(BONE_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0) && ai->CastSpell (BONE_SHIELD, *m_bot)); + // check for BONE_SHIELD in combat + if (BONE_SHIELD > 0) + (!m_bot->HasAura(BONE_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0) && ai->CastSpell (BONE_SHIELD, *m_bot)); - if (ARMY_OF_THE_DEAD > 0 && ai->GetAttackerCount()>=5 && LastSpellUnholyDK < 1) - { - ai->CastSpell(ARMY_OF_THE_DEAD); - out << " summoning Army of the Dead!"; - if (ARMY_OF_THE_DEAD > 0 && m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0)) - ai->SetIgnoreUpdateTime(7); - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (PLAGUE_STRIKE > 0 && !pTarget->HasAura(PLAGUE_STRIKE, EFFECT_INDEX_0) && LastSpellUnholyDK < 2) - { - ai->CastSpell(PLAGUE_STRIKE, *pTarget); - out << " Plague Strike"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (DEATH_GRIP > 0 && !pTarget->HasAura(DEATH_GRIP, EFFECT_INDEX_0) && LastSpellUnholyDK < 3) - { - ai->CastSpell(DEATH_GRIP, *pTarget); - out << " Death Grip"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (DEATH_COIL > 0 && LastSpellUnholyDK < 4 && ai->GetRunicPower() >= 40) - { - ai->CastSpell(DEATH_COIL, *pTarget); - out << " Death Coil"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (DEATH_STRIKE > 0 && !pTarget->HasAura(DEATH_STRIKE, EFFECT_INDEX_0) && LastSpellUnholyDK < 5) - { - ai->CastSpell(DEATH_STRIKE, *pTarget); - out << " Death Strike"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (UNHOLY_BLIGHT > 0 && !pTarget->HasAura(UNHOLY_BLIGHT, EFFECT_INDEX_0) && LastSpellUnholyDK < 6) - { - ai->CastSpell(UNHOLY_BLIGHT); - out << " Unholy Blight"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (SCOURGE_STRIKE > 0 && LastSpellUnholyDK < 7) - { - ai->CastSpell(SCOURGE_STRIKE, *pTarget); - out << " Scourge Strike"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (DEATH_AND_DECAY > 0 && ai->GetAttackerCount()>=3 && dist <= ATTACK_DISTANCE && !pTarget->HasAura(DEATH_AND_DECAY, EFFECT_INDEX_0) && LastSpellUnholyDK < 8) - { - ai->CastSpell(DEATH_AND_DECAY); - out << " Death and Decay"; - ai->SetIgnoreUpdateTime(1); - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (SUMMON_GARGOYLE > 0 && !m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0) && !pTarget->HasAura(SUMMON_GARGOYLE, EFFECT_INDEX_0) && LastSpellUnholyDK < 9 && ai->GetRunicPower() >= 60) - { - ai->CastSpell(SUMMON_GARGOYLE, *pTarget); - out << " summoning Gargoyle"; - ai->SetIgnoreUpdateTime(2); - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (CORPSE_EXPLOSION > 0 && dist <= ATTACK_DISTANCE && LastSpellUnholyDK < 10) - { - ai->CastSpell(CORPSE_EXPLOSION, *pTarget); - out << " Corpse Explosion"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (ANTI_MAGIC_SHELL > 0 && pTarget->IsNonMeleeSpellCasted(true) && !m_bot->HasAura(ANTI_MAGIC_SHELL, EFFECT_INDEX_0) && LastSpellUnholyDK < 11 && ai->GetRunicPower() >= 20) - { - ai->CastSpell(ANTI_MAGIC_SHELL, *m_bot); - out << " Anti-Magic Shell"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (ANTI_MAGIC_ZONE > 0 && pTarget->IsNonMeleeSpellCasted(true) && !m_bot->HasAura(ANTI_MAGIC_SHELL, EFFECT_INDEX_0) && LastSpellUnholyDK < 12) - { - ai->CastSpell(ANTI_MAGIC_ZONE, *m_bot); - out << " Anti-Magic Zone"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if(( !pet ) + if (ARMY_OF_THE_DEAD > 0 && ai->GetAttackerCount() >= 5 && LastSpellUnholyDK < 1) + { + ai->CastSpell(ARMY_OF_THE_DEAD); + out << " summoning Army of the Dead!"; + if (ARMY_OF_THE_DEAD > 0 && m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0)) + ai->SetIgnoreUpdateTime(7); + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK + 1; + break; + } + else if (PLAGUE_STRIKE > 0 && !pTarget->HasAura(PLAGUE_STRIKE, EFFECT_INDEX_0) && LastSpellUnholyDK < 2) + { + ai->CastSpell(PLAGUE_STRIKE, *pTarget); + out << " Plague Strike"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK + 1; + break; + } + else if (DEATH_GRIP > 0 && !pTarget->HasAura(DEATH_GRIP, EFFECT_INDEX_0) && LastSpellUnholyDK < 3) + { + ai->CastSpell(DEATH_GRIP, *pTarget); + out << " Death Grip"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK + 1; + break; + } + else if (DEATH_COIL > 0 && LastSpellUnholyDK < 4 && ai->GetRunicPower() >= 40) + { + ai->CastSpell(DEATH_COIL, *pTarget); + out << " Death Coil"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK + 1; + break; + } + else if (DEATH_STRIKE > 0 && !pTarget->HasAura(DEATH_STRIKE, EFFECT_INDEX_0) && LastSpellUnholyDK < 5) + { + ai->CastSpell(DEATH_STRIKE, *pTarget); + out << " Death Strike"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK + 1; + break; + } + else if (UNHOLY_BLIGHT > 0 && !pTarget->HasAura(UNHOLY_BLIGHT, EFFECT_INDEX_0) && LastSpellUnholyDK < 6) + { + ai->CastSpell(UNHOLY_BLIGHT); + out << " Unholy Blight"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK + 1; + break; + } + else if (SCOURGE_STRIKE > 0 && LastSpellUnholyDK < 7) + { + ai->CastSpell(SCOURGE_STRIKE, *pTarget); + out << " Scourge Strike"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK + 1; + break; + } + else if (DEATH_AND_DECAY > 0 && ai->GetAttackerCount() >= 3 && dist <= ATTACK_DISTANCE && !pTarget->HasAura(DEATH_AND_DECAY, EFFECT_INDEX_0) && LastSpellUnholyDK < 8) + { + ai->CastSpell(DEATH_AND_DECAY); + out << " Death and Decay"; + ai->SetIgnoreUpdateTime(1); + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK + 1; + break; + } + else if (SUMMON_GARGOYLE > 0 && !m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0) && !pTarget->HasAura(SUMMON_GARGOYLE, EFFECT_INDEX_0) && LastSpellUnholyDK < 9 && ai->GetRunicPower() >= 60) + { + ai->CastSpell(SUMMON_GARGOYLE, *pTarget); + out << " summoning Gargoyle"; + ai->SetIgnoreUpdateTime(2); + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK + 1; + break; + } + else if (CORPSE_EXPLOSION > 0 && dist <= ATTACK_DISTANCE && LastSpellUnholyDK < 10) + { + ai->CastSpell(CORPSE_EXPLOSION, *pTarget); + out << " Corpse Explosion"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK + 1; + break; + } + else if (ANTI_MAGIC_SHELL > 0 && pTarget->IsNonMeleeSpellCasted(true) && !m_bot->HasAura(ANTI_MAGIC_SHELL, EFFECT_INDEX_0) && LastSpellUnholyDK < 11 && ai->GetRunicPower() >= 20) + { + ai->CastSpell(ANTI_MAGIC_SHELL, *m_bot); + out << " Anti-Magic Shell"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK + 1; + break; + } + else if (ANTI_MAGIC_ZONE > 0 && pTarget->IsNonMeleeSpellCasted(true) && !m_bot->HasAura(ANTI_MAGIC_SHELL, EFFECT_INDEX_0) && LastSpellUnholyDK < 12) + { + ai->CastSpell(ANTI_MAGIC_ZONE, *m_bot); + out << " Anti-Magic Zone"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK + 1; + break; + } + else if (( !pet ) && (RAISE_DEAD > 0 && !m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0) && LastSpellUnholyDK < 13)) - { - ai->CastSpell(RAISE_DEAD); - out << " summoning Ghoul"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if(( pet ) + { + ai->CastSpell(RAISE_DEAD); + out << " summoning Ghoul"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK + 1; + break; + } + else if (( pet ) && (GHOUL_FRENZY > 0 && pVictim == pet && !pet->HasAura(GHOUL_FRENZY, EFFECT_INDEX_0) && LastSpellUnholyDK < 14)) - { - ai->CastSpell(GHOUL_FRENZY, *pet); - out << " casting Ghoul Frenzy on pet"; - SpellSequence = SPELL_DK_FROST; - LastSpellUnholyDK = LastSpellUnholyDK +1; - break; - } - else if (LastSpellUnholyDK > 15) - { - LastSpellUnholyDK = 0; - SpellSequence = SPELL_DK_FROST; - break; - } + { + ai->CastSpell(GHOUL_FRENZY, *pet); + out << " casting Ghoul Frenzy on pet"; + SpellSequence = SPELL_DK_FROST; + LastSpellUnholyDK = LastSpellUnholyDK + 1; + break; + } + else if (LastSpellUnholyDK > 15) + { + LastSpellUnholyDK = 0; + SpellSequence = SPELL_DK_FROST; + break; + } - LastSpellUnholyDK = 0; + LastSpellUnholyDK = 0; case SPELL_DK_FROST: - if (FROST_PRESENCE > 0) - (!m_bot->HasAura(FROST_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(BLOOD_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(UNHOLY_PRESENCE, EFFECT_INDEX_0) && ai->CastSpell (FROST_PRESENCE, *m_bot)); + if (FROST_PRESENCE > 0) + (!m_bot->HasAura(FROST_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(BLOOD_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(UNHOLY_PRESENCE, EFFECT_INDEX_0) && ai->CastSpell (FROST_PRESENCE, *m_bot)); - if (DEATHCHILL > 0) - (!m_bot->HasAura(DEATHCHILL, EFFECT_INDEX_0) && !m_bot->HasAura(KILLING_MACHINE, EFFECT_INDEX_0) && ai->CastSpell (DEATHCHILL, *m_bot)); - else if (KILLING_MACHINE > 0) - (!m_bot->HasAura(KILLING_MACHINE, EFFECT_INDEX_0) && !m_bot->HasAura(DEATHCHILL, EFFECT_INDEX_0) && ai->CastSpell (KILLING_MACHINE, *m_bot)); + if (DEATHCHILL > 0) + (!m_bot->HasAura(DEATHCHILL, EFFECT_INDEX_0) && !m_bot->HasAura(KILLING_MACHINE, EFFECT_INDEX_0) && ai->CastSpell (DEATHCHILL, *m_bot)); + else if (KILLING_MACHINE > 0) + (!m_bot->HasAura(KILLING_MACHINE, EFFECT_INDEX_0) && !m_bot->HasAura(DEATHCHILL, EFFECT_INDEX_0) && ai->CastSpell (KILLING_MACHINE, *m_bot)); - if (ICY_TOUCH > 0 && !pTarget->HasAura(ICY_TOUCH, EFFECT_INDEX_0) && LastSpellFrostDK < 1) - { - ai->CastSpell(ICY_TOUCH, *pTarget); - out << " Icy Touch"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (OBLITERATE > 0 && LastSpellFrostDK < 2) - { - ai->CastSpell(OBLITERATE, *pTarget); - out << " Obliterate"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (FROST_STRIKE > 0 && LastSpellFrostDK < 3 && ai->GetRunicPower() >= 40) - { - ai->CastSpell(FROST_STRIKE, *pTarget); - out << " Frost Strike"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (HOWLING_BLAST > 0 && ai->GetAttackerCount()>=3 && LastSpellFrostDK < 4) - { - ai->CastSpell(HOWLING_BLAST, *pTarget); - out << " Howling Blast"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (CHAINS_OF_ICE > 0 && !pTarget->HasAura(CHAINS_OF_ICE, EFFECT_INDEX_0) && LastSpellFrostDK < 5) - { - ai->CastSpell(CHAINS_OF_ICE, *pTarget); - out << " Chains of Ice"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (RUNE_STRIKE > 0 && LastSpellFrostDK < 6 && ai->GetRunicPower() >= 20) - { - ai->CastSpell(RUNE_STRIKE, *pTarget); - out << " Rune Strike"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (ICY_CLUTCH > 0 && !pTarget->HasAura(ICY_CLUTCH, EFFECT_INDEX_0) && LastSpellFrostDK < 7) - { - ai->CastSpell(ICY_CLUTCH, *pTarget); - out << " Icy Clutch"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (ICEBOUND_FORTITUDE > 0 && ai->GetHealthPercent() < 50 && pVictim == m_bot && !m_bot->HasAura(ICEBOUND_FORTITUDE, EFFECT_INDEX_0) && LastSpellFrostDK < 8 && ai->GetRunicPower() >= 20) - { - ai->CastSpell(ICEBOUND_FORTITUDE, *m_bot); - out << " Icebound Fortitude"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (MIND_FREEZE > 0 && pTarget->IsNonMeleeSpellCasted(true) && dist <= ATTACK_DISTANCE && LastSpellFrostDK < 9 && ai->GetRunicPower() >= 20) - { - ai->CastSpell(MIND_FREEZE, *pTarget); - out << " Mind Freeze"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (HUNGERING_COLD > 0 && ai->GetAttackerCount()>=3 && dist <= ATTACK_DISTANCE && LastSpellFrostDK < 10 && ai->GetRunicPower() >= 40) - { - ai->CastSpell(HUNGERING_COLD, *pTarget); - out << " Hungering Cold"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (EMPOWER_WEAPON > 0 && ai->GetRunicPower() < 20 && LastSpellFrostDK < 11) - { - ai->CastSpell(EMPOWER_WEAPON, *m_bot); - out << " Empower Rune Weapon"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (UNBREAKABLE_ARMOR > 0 && !m_bot->HasAura(UNBREAKABLE_ARMOR, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70 && pVictim == m_bot && LastSpellFrostDK < 12) - { - ai->CastSpell(UNBREAKABLE_ARMOR, *m_bot); - out << " Unbreakable Armor"; - SpellSequence = SPELL_DK_BLOOD; - LastSpellFrostDK = LastSpellFrostDK +1; - break; - } - else if (LastSpellFrostDK > 13) - { - LastSpellFrostDK = 0; - SpellSequence = SPELL_DK_BLOOD; - break; - } + if (ICY_TOUCH > 0 && !pTarget->HasAura(ICY_TOUCH, EFFECT_INDEX_0) && LastSpellFrostDK < 1) + { + ai->CastSpell(ICY_TOUCH, *pTarget); + out << " Icy Touch"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK + 1; + break; + } + else if (OBLITERATE > 0 && LastSpellFrostDK < 2) + { + ai->CastSpell(OBLITERATE, *pTarget); + out << " Obliterate"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK + 1; + break; + } + else if (FROST_STRIKE > 0 && LastSpellFrostDK < 3 && ai->GetRunicPower() >= 40) + { + ai->CastSpell(FROST_STRIKE, *pTarget); + out << " Frost Strike"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK + 1; + break; + } + else if (HOWLING_BLAST > 0 && ai->GetAttackerCount() >= 3 && LastSpellFrostDK < 4) + { + ai->CastSpell(HOWLING_BLAST, *pTarget); + out << " Howling Blast"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK + 1; + break; + } + else if (CHAINS_OF_ICE > 0 && !pTarget->HasAura(CHAINS_OF_ICE, EFFECT_INDEX_0) && LastSpellFrostDK < 5) + { + ai->CastSpell(CHAINS_OF_ICE, *pTarget); + out << " Chains of Ice"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK + 1; + break; + } + else if (RUNE_STRIKE > 0 && LastSpellFrostDK < 6 && ai->GetRunicPower() >= 20) + { + ai->CastSpell(RUNE_STRIKE, *pTarget); + out << " Rune Strike"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK + 1; + break; + } + else if (ICY_CLUTCH > 0 && !pTarget->HasAura(ICY_CLUTCH, EFFECT_INDEX_0) && LastSpellFrostDK < 7) + { + ai->CastSpell(ICY_CLUTCH, *pTarget); + out << " Icy Clutch"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK + 1; + break; + } + else if (ICEBOUND_FORTITUDE > 0 && ai->GetHealthPercent() < 50 && pVictim == m_bot && !m_bot->HasAura(ICEBOUND_FORTITUDE, EFFECT_INDEX_0) && LastSpellFrostDK < 8 && ai->GetRunicPower() >= 20) + { + ai->CastSpell(ICEBOUND_FORTITUDE, *m_bot); + out << " Icebound Fortitude"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK + 1; + break; + } + else if (MIND_FREEZE > 0 && pTarget->IsNonMeleeSpellCasted(true) && dist <= ATTACK_DISTANCE && LastSpellFrostDK < 9 && ai->GetRunicPower() >= 20) + { + ai->CastSpell(MIND_FREEZE, *pTarget); + out << " Mind Freeze"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK + 1; + break; + } + else if (HUNGERING_COLD > 0 && ai->GetAttackerCount() >= 3 && dist <= ATTACK_DISTANCE && LastSpellFrostDK < 10 && ai->GetRunicPower() >= 40) + { + ai->CastSpell(HUNGERING_COLD, *pTarget); + out << " Hungering Cold"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK + 1; + break; + } + else if (EMPOWER_WEAPON > 0 && ai->GetRunicPower() < 20 && LastSpellFrostDK < 11) + { + ai->CastSpell(EMPOWER_WEAPON, *m_bot); + out << " Empower Rune Weapon"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK + 1; + break; + } + else if (UNBREAKABLE_ARMOR > 0 && !m_bot->HasAura(UNBREAKABLE_ARMOR, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70 && pVictim == m_bot && LastSpellFrostDK < 12) + { + ai->CastSpell(UNBREAKABLE_ARMOR, *m_bot); + out << " Unbreakable Armor"; + SpellSequence = SPELL_DK_BLOOD; + LastSpellFrostDK = LastSpellFrostDK + 1; + break; + } + else if (LastSpellFrostDK > 13) + { + LastSpellFrostDK = 0; + SpellSequence = SPELL_DK_BLOOD; + break; + } - LastSpellFrostDK = 0; + LastSpellFrostDK = 0; case SPELL_DK_BLOOD: - if (BLOOD_PRESENCE > 0) - (!m_bot->HasAura(BLOOD_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(UNHOLY_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(FROST_PRESENCE, EFFECT_INDEX_0) && ai->CastSpell (BLOOD_PRESENCE, *m_bot)); + if (BLOOD_PRESENCE > 0) + (!m_bot->HasAura(BLOOD_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(UNHOLY_PRESENCE, EFFECT_INDEX_0) && !m_bot->HasAura(FROST_PRESENCE, EFFECT_INDEX_0) && ai->CastSpell (BLOOD_PRESENCE, *m_bot)); - if (MARK_OF_BLOOD > 0 && !pTarget->HasAura(MARK_OF_BLOOD, EFFECT_INDEX_0) && LastSpellBloodDK < 1) - { - ai->CastSpell(MARK_OF_BLOOD, *pTarget); - out << " Mark of Blood"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (BLOOD_STRIKE > 0 && LastSpellBloodDK < 2) - { - ai->CastSpell(BLOOD_STRIKE, *pTarget); - out << " Blood Strike"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (PESTILENCE > 0 && dist <= ATTACK_DISTANCE && ai->GetAttackerCount()>=3 && LastSpellBloodDK < 3) - { - ai->CastSpell(PESTILENCE, *pTarget); - out << " Pestilence"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (STRANGULATE > 0 && !pTarget->HasAura(STRANGULATE, EFFECT_INDEX_0) && LastSpellBloodDK < 4) - { - ai->CastSpell(STRANGULATE, *pTarget); - out << " Strangulate"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (BLOOD_BOIL > 0 && ai->GetAttackerCount()>=5 && dist <= ATTACK_DISTANCE && LastSpellBloodDK < 5) - { - ai->CastSpell(BLOOD_BOIL, *pTarget); - out << " Blood Boil"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (HEART_STRIKE > 0 && LastSpellBloodDK < 6) - { - ai->CastSpell(HEART_STRIKE, *pTarget); - out << " Heart Strike"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (VAMPIRIC_BLOOD > 0 && ai->GetHealthPercent() < 70 && !m_bot->HasAura(VAMPIRIC_BLOOD, EFFECT_INDEX_0) && LastSpellBloodDK < 7) - { - ai->CastSpell(VAMPIRIC_BLOOD, *m_bot); - out << " Vampiric Blood"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (RUNE_TAP > 0 && ai->GetHealthPercent() < 70 && !m_bot->HasAura(VAMPIRIC_BLOOD, EFFECT_INDEX_0) && LastSpellBloodDK < 8) - { - ai->CastSpell(RUNE_TAP, *m_bot); - out << " Rune Tap"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (HYSTERIA > 0 && ai->GetHealthPercent() > 25 && !m_bot->HasAura(HYSTERIA, EFFECT_INDEX_0) && LastSpellBloodDK < 9) - { - ai->CastSpell(HYSTERIA, *m_bot); - out << " Hysteria"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (DANCING_WEAPON > 0 && !m_bot->HasAura(DANCING_WEAPON, EFFECT_INDEX_0) && ai->GetRunicPower() >= 60 && LastSpellBloodDK < 10) - { - ai->CastSpell(DANCING_WEAPON, *pTarget); - out << " summoning Dancing Rune Weapon"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (DARK_COMMAND > 0 && ai->GetHealthPercent() > 50 && pVictim != m_bot && !pTarget->HasAura(DARK_COMMAND, EFFECT_INDEX_0) && dist <= ATTACK_DISTANCE && LastSpellBloodDK < 11) - { - ai->CastSpell(DARK_COMMAND, *pTarget); - out << " Dark Command"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if(( pet ) + if (MARK_OF_BLOOD > 0 && !pTarget->HasAura(MARK_OF_BLOOD, EFFECT_INDEX_0) && LastSpellBloodDK < 1) + { + ai->CastSpell(MARK_OF_BLOOD, *pTarget); + out << " Mark of Blood"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK + 1; + break; + } + else if (BLOOD_STRIKE > 0 && LastSpellBloodDK < 2) + { + ai->CastSpell(BLOOD_STRIKE, *pTarget); + out << " Blood Strike"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK + 1; + break; + } + else if (PESTILENCE > 0 && dist <= ATTACK_DISTANCE && ai->GetAttackerCount() >= 3 && LastSpellBloodDK < 3) + { + ai->CastSpell(PESTILENCE, *pTarget); + out << " Pestilence"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK + 1; + break; + } + else if (STRANGULATE > 0 && !pTarget->HasAura(STRANGULATE, EFFECT_INDEX_0) && LastSpellBloodDK < 4) + { + ai->CastSpell(STRANGULATE, *pTarget); + out << " Strangulate"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK + 1; + break; + } + else if (BLOOD_BOIL > 0 && ai->GetAttackerCount() >= 5 && dist <= ATTACK_DISTANCE && LastSpellBloodDK < 5) + { + ai->CastSpell(BLOOD_BOIL, *pTarget); + out << " Blood Boil"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK + 1; + break; + } + else if (HEART_STRIKE > 0 && LastSpellBloodDK < 6) + { + ai->CastSpell(HEART_STRIKE, *pTarget); + out << " Heart Strike"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK + 1; + break; + } + else if (VAMPIRIC_BLOOD > 0 && ai->GetHealthPercent() < 70 && !m_bot->HasAura(VAMPIRIC_BLOOD, EFFECT_INDEX_0) && LastSpellBloodDK < 7) + { + ai->CastSpell(VAMPIRIC_BLOOD, *m_bot); + out << " Vampiric Blood"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK + 1; + break; + } + else if (RUNE_TAP > 0 && ai->GetHealthPercent() < 70 && !m_bot->HasAura(VAMPIRIC_BLOOD, EFFECT_INDEX_0) && LastSpellBloodDK < 8) + { + ai->CastSpell(RUNE_TAP, *m_bot); + out << " Rune Tap"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK + 1; + break; + } + else if (HYSTERIA > 0 && ai->GetHealthPercent() > 25 && !m_bot->HasAura(HYSTERIA, EFFECT_INDEX_0) && LastSpellBloodDK < 9) + { + ai->CastSpell(HYSTERIA, *m_bot); + out << " Hysteria"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK + 1; + break; + } + else if (DANCING_WEAPON > 0 && !m_bot->HasAura(DANCING_WEAPON, EFFECT_INDEX_0) && ai->GetRunicPower() >= 60 && LastSpellBloodDK < 10) + { + ai->CastSpell(DANCING_WEAPON, *pTarget); + out << " summoning Dancing Rune Weapon"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK + 1; + break; + } + else if (DARK_COMMAND > 0 && ai->GetHealthPercent() > 50 && pVictim != m_bot && !pTarget->HasAura(DARK_COMMAND, EFFECT_INDEX_0) && dist <= ATTACK_DISTANCE && LastSpellBloodDK < 11) + { + ai->CastSpell(DARK_COMMAND, *pTarget); + out << " Dark Command"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK + 1; + break; + } + else if (( pet ) && (DEATH_PACT > 0 && ai->GetHealthPercent() < 50 && LastSpellBloodDK < 12 && ai->GetRunicPower() >= 40)) - { - ai->CastSpell(DEATH_PACT, *pet); - out << " Death Pact (sacrifice pet)"; - SpellSequence = SPELL_DK_UNHOLY; - LastSpellBloodDK = LastSpellBloodDK +1; - break; - } - else if (LastSpellBloodDK > 13) - { - LastSpellBloodDK = 0; - SpellSequence = SPELL_DK_UNHOLY; - break; - } - else - { - LastSpellBloodDK = 0; - SpellSequence = SPELL_DK_UNHOLY; - } + { + ai->CastSpell(DEATH_PACT, *pet); + out << " Death Pact (sacrifice pet)"; + SpellSequence = SPELL_DK_UNHOLY; + LastSpellBloodDK = LastSpellBloodDK + 1; + break; + } + else if (LastSpellBloodDK > 13) + { + LastSpellBloodDK = 0; + SpellSequence = SPELL_DK_UNHOLY; + break; + } + else + { + LastSpellBloodDK = 0; + SpellSequence = SPELL_DK_UNHOLY; + } } - if( ai->GetManager()->m_confDebugWhisper ) - ai->TellMaster( out.str().c_str() ); + if (ai->GetManager()->m_confDebugWhisper) + ai->TellMaster(out.str().c_str()); } // end DoNextCombatManeuver @@ -475,7 +475,7 @@ void PlayerbotDeathKnightAI::DoNonCombatActions() SpellSequence = SPELL_DK_UNHOLY; // buff master with HORN_OF_WINTER - if (HORN_OF_WINTER> 0) + if (HORN_OF_WINTER > 0) (!GetMaster()->HasAura(HORN_OF_WINTER, EFFECT_INDEX_0) && ai->CastSpell (HORN_OF_WINTER, *GetMaster())); // hp check diff --git a/src/game/playerbot/PlayerbotDeathKnightAI.h b/src/game/playerbot/PlayerbotDeathKnightAI.h index 16627dcf4..33645df16 100644 --- a/src/game/playerbot/PlayerbotDeathKnightAI.h +++ b/src/game/playerbot/PlayerbotDeathKnightAI.h @@ -63,37 +63,37 @@ enum DeathKnightSpells class MANGOS_DLL_SPEC PlayerbotDeathKnightAI : PlayerbotClassAI { - public: - PlayerbotDeathKnightAI(Player* const master, Player* const bot, PlayerbotAI* const ai); - virtual ~PlayerbotDeathKnightAI(); +public: + PlayerbotDeathKnightAI(Player * const master, Player * const bot, PlayerbotAI * const ai); + virtual ~PlayerbotDeathKnightAI(); - // all combat actions go here - void DoNextCombatManeuver(Unit*); + // all combat actions go here + void DoNextCombatManeuver(Unit*); - // all non combat actions go here, ex buffs, heals, rezzes - void DoNonCombatActions(); + // all non combat actions go here, ex buffs, heals, rezzes + void DoNonCombatActions(); - // buff a specific player, usually a real PC who is not in group - //void BuffPlayer(Player *target); + // buff a specific player, usually a real PC who is not in group + //void BuffPlayer(Player *target); - private: +private: - // Unholy - uint32 BONE_SHIELD, PLAGUE_STRIKE, DEATH_GRIP, DEATH_COIL, DEATH_STRIKE, UNHOLY_BLIGHT, SCOURGE_STRIKE, DEATH_AND_DECAY, UNHOLY_PRESENCE, RAISE_DEAD, ARMY_OF_THE_DEAD, SUMMON_GARGOYLE, ANTI_MAGIC_SHELL, ANTI_MAGIC_ZONE, GHOUL_FRENZY, CORPSE_EXPLOSION; + // Unholy + uint32 BONE_SHIELD, PLAGUE_STRIKE, DEATH_GRIP, DEATH_COIL, DEATH_STRIKE, UNHOLY_BLIGHT, SCOURGE_STRIKE, DEATH_AND_DECAY, UNHOLY_PRESENCE, RAISE_DEAD, ARMY_OF_THE_DEAD, SUMMON_GARGOYLE, ANTI_MAGIC_SHELL, ANTI_MAGIC_ZONE, GHOUL_FRENZY, CORPSE_EXPLOSION; - // Frost - uint32 ICY_TOUCH, OBLITERATE, HOWLING_BLAST, FROST_STRIKE, CHAINS_OF_ICE, RUNE_STRIKE, ICY_CLUTCH, HORN_OF_WINTER, KILLING_MACHINE, FROST_PRESENCE, DEATHCHILL, ICEBOUND_FORTITUDE, MIND_FREEZE, EMPOWER_WEAPON, HUNGERING_COLD, UNBREAKABLE_ARMOR; + // Frost + uint32 ICY_TOUCH, OBLITERATE, HOWLING_BLAST, FROST_STRIKE, CHAINS_OF_ICE, RUNE_STRIKE, ICY_CLUTCH, HORN_OF_WINTER, KILLING_MACHINE, FROST_PRESENCE, DEATHCHILL, ICEBOUND_FORTITUDE, MIND_FREEZE, EMPOWER_WEAPON, HUNGERING_COLD, UNBREAKABLE_ARMOR; - // Blood - uint32 BLOOD_STRIKE, PESTILENCE, STRANGULATE, BLOOD_BOIL, HEART_STRIKE, MARK_OF_BLOOD, BLOOD_PRESENCE, RUNE_TAP, VAMPIRIC_BLOOD, DEATH_PACT, DEATH_RUNE_MASTERY, HYSTERIA, DANCING_WEAPON, DARK_COMMAND; + // Blood + uint32 BLOOD_STRIKE, PESTILENCE, STRANGULATE, BLOOD_BOIL, HEART_STRIKE, MARK_OF_BLOOD, BLOOD_PRESENCE, RUNE_TAP, VAMPIRIC_BLOOD, DEATH_PACT, DEATH_RUNE_MASTERY, HYSTERIA, DANCING_WEAPON, DARK_COMMAND; - // first aid - uint32 RECENTLY_BANDAGED; + // first aid + uint32 RECENTLY_BANDAGED; - // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + // racial + uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; - uint32 SpellSequence, LastSpellUnholyDK, LastSpellFrostDK, LastSpellBloodDK; + uint32 SpellSequence, LastSpellUnholyDK, LastSpellFrostDK, LastSpellBloodDK; }; #endif diff --git a/src/game/playerbot/PlayerbotDruidAI.cpp b/src/game/playerbot/PlayerbotDruidAI.cpp index f8fb7d4a4..556a6d122 100644 --- a/src/game/playerbot/PlayerbotDruidAI.cpp +++ b/src/game/playerbot/PlayerbotDruidAI.cpp @@ -3,12 +3,12 @@ Complete: maybe around 33% Authors : rrtn, Natsukawa Version : 0.42 -*/ + */ #include "PlayerbotDruidAI.h" class PlayerbotAI; -PlayerbotDruidAI::PlayerbotDruidAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) +PlayerbotDruidAI::PlayerbotDruidAI(Player* const master, Player* const bot, PlayerbotAI* const ai) : PlayerbotClassAI(master, bot, ai) { MOONFIRE = ai->initSpell(MOONFIRE_1); // attacks STARFIRE = ai->initSpell(STARFIRE_1); @@ -71,25 +71,25 @@ void PlayerbotDruidAI::HealTarget(Unit &target, uint8 hp) PlayerbotAI* ai = GetAI(); Player *m_bot = GetPlayerBot(); - if (hp < 70 && REJUVENATION > 0 && !target.HasAura(REJUVENATION, EFFECT_INDEX_0) && !target.HasAura(REGROWTH, EFFECT_INDEX_0) && ai->GetManaPercent() >=21) + if (hp < 70 && REJUVENATION > 0 && !target.HasAura(REJUVENATION, EFFECT_INDEX_0) && !target.HasAura(REGROWTH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 21) ai->CastSpell(REJUVENATION, target); - if (hp < 60 && LIFEBLOOM > 0 && !target.HasAura(LIFEBLOOM, EFFECT_INDEX_0) && ai->GetManaPercent() >= 28) + if (hp < 60 && LIFEBLOOM > 0 && !target.HasAura(LIFEBLOOM, EFFECT_INDEX_0) && ai->GetManaPercent() >= 28) ai->CastSpell(LIFEBLOOM, target); if (hp < 55 && REGROWTH > 0 && !target.HasAura(REGROWTH, EFFECT_INDEX_0) && !target.HasAura(REJUVENATION, EFFECT_INDEX_0) && ai->GetManaPercent() >= 33) ai->CastSpell(REGROWTH, target); - if (hp < 50 && SWIFTMEND > 0 && target.HasAura(REJUVENATION, EFFECT_INDEX_0) || target.HasAura(REGROWTH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 16) + if (hp < 50 && SWIFTMEND > 0 && target.HasAura(REJUVENATION, EFFECT_INDEX_0) || target.HasAura(REGROWTH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 16) ai->CastSpell(SWIFTMEND, target); if (hp < 45 && WILD_GROWTH > 0 && !target.HasAura(WILD_GROWTH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 26) ai->CastSpell(WILD_GROWTH, target); - if (hp < 30 && NOURISH > 0 && ai->GetManaPercent() >= 18) + if (hp < 30 && NOURISH > 0 && ai->GetManaPercent() >= 18) ai->CastSpell(NOURISH, target); - if (hp < 25 && HEALING_TOUCH > 0 && ai->GetManaPercent() >= 38) + if (hp < 25 && HEALING_TOUCH > 0 && ai->GetManaPercent() >= 38) ai->CastSpell(HEALING_TOUCH, target); } // end HealTarget @@ -106,23 +106,23 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) return; } - uint32 masterHP = GetMaster()->GetHealth()*100 / GetMaster()->GetMaxHealth(); + uint32 masterHP = GetMaster()->GetHealth() * 100 / GetMaster()->GetMaxHealth(); - ai->SetInFront( pTarget ); + ai->SetInFront(pTarget); Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); - if (pVictim && ai->GetHealthPercent() >= 40 && GetMaster()->GetHealth() >= GetMaster()->GetMaxHealth()*0.4) + if (pVictim && ai->GetHealthPercent() >= 40 && GetMaster()->GetHealth() >= GetMaster()->GetMaxHealth() * 0.4) { if (pVictim == m_bot) SpellSequence = DruidTank; } - else if (pTarget->GetHealth() > pTarget->GetMaxHealth()*0.8 && pVictim) + else if (pTarget->GetHealth() > pTarget->GetMaxHealth() * 0.8 && pVictim) { if (pVictim != m_bot) SpellSequence = DruidSpell; } - else if (ai->GetHealthPercent() <= 40 || GetMaster()->GetHealth() <= GetMaster()->GetMaxHealth()*0.4) + else if (ai->GetHealthPercent() <= 40 || GetMaster()->GetHealth() <= GetMaster()->GetMaxHealth() * 0.4) SpellSequence = DruidHeal; else SpellSequence = DruidCombat; @@ -132,18 +132,18 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) case DruidTank: // Its now a tank druid! //ai->TellMaster("DruidTank"); - if( !m_bot->HasInArc(M_PI_F, pTarget)) + if (!m_bot->HasInArc(M_PI_F, pTarget)) { m_bot->SetInFront(pTarget); if (pVictim) pVictim->Attack(pTarget, true); } - if(m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) + if (m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(768); //ai->TellMaster("FormClearCat"); } - if (MOONKIN_FORM > 0 && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) + if (MOONKIN_FORM > 0 && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) { ai->CastSpell (MOONKIN_FORM); } @@ -151,37 +151,37 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) { ai->CastSpell (DIRE_BEAR_FORM); } - else if (BEAR_FORM > 0 && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && !m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) && !m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) + else if (BEAR_FORM > 0 && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && !m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) && !m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) { ai->CastSpell (BEAR_FORM); } - else if (DEMORALIZING_ROAR > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && !pTarget->HasAura(DEMORALIZING_ROAR, EFFECT_INDEX_0) && ai->GetRageAmount() >= 10) + else if (DEMORALIZING_ROAR > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && !pTarget->HasAura(DEMORALIZING_ROAR, EFFECT_INDEX_0) && ai->GetRageAmount() >= 10) { ai->CastSpell(DEMORALIZING_ROAR, *pTarget); } - if (FAERIE_FIRE > 0 && DruidSpellCombat < 1 && !pTarget->HasAura(FAERIE_FIRE, EFFECT_INDEX_0)) + if (FAERIE_FIRE > 0 && DruidSpellCombat < 1 && !pTarget->HasAura(FAERIE_FIRE, EFFECT_INDEX_0)) { ai->CastSpell(FAERIE_FIRE, *pTarget); DruidSpellCombat++; break; } - else if (MOONFIRE > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 2 && !pTarget->HasAura(MOONFIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 24) + else if (MOONFIRE > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 2 && !pTarget->HasAura(MOONFIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 24) { ai->CastSpell(MOONFIRE, *pTarget); DruidSpellCombat++; break; } - else if (ROOTS > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 3 && !pTarget->HasAura(ROOTS, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) + else if (ROOTS > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 3 && !pTarget->HasAura(ROOTS, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) { ai->CastSpell(ROOTS, *pTarget); DruidSpellCombat++; break; } - else if (HURRICANE > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && ai->GetAttackerCount()>=5 && DruidSpellCombat < 4 && ai->GetManaPercent() >= 91) + else if (HURRICANE > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && ai->GetAttackerCount() >= 5 && DruidSpellCombat < 4 && ai->GetManaPercent() >= 91) { - //ai->TellMaster("casting hurricane!"); + //ai->TellMaster("casting hurricane!"); ai->CastSpell(HURRICANE, *pTarget); - ai->SetIgnoreUpdateTime(10); + ai->SetIgnoreUpdateTime(10); DruidSpellCombat++; break; } @@ -193,7 +193,7 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) } else if (INSECT_SWARM > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 6 && !pTarget->HasAura(INSECT_SWARM, EFFECT_INDEX_0) && ai->GetManaPercent() >= 9) { - ai->CastSpell(INSECT_SWARM , *pTarget); + ai->CastSpell(INSECT_SWARM, *pTarget); DruidSpellCombat++; break; } @@ -203,74 +203,74 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) DruidSpellCombat++; break; } - else if (FORCE_OF_NATURE > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 8 && ai->GetManaPercent() >= 12) + else if (FORCE_OF_NATURE > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && DruidSpellCombat < 8 && ai->GetManaPercent() >= 12) { - //ai->TellMaster("summoning treants."); + //ai->TellMaster("summoning treants."); ai->CastSpell(FORCE_OF_NATURE); DruidSpellCombat++; break; } - else if (STARFALL > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && !m_bot->HasAura(STARFALL, EFFECT_INDEX_0) && ai->GetAttackerCount()>=3 && DruidSpellCombat < 9 && ai->GetManaPercent() >= 39) + else if (STARFALL > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && !m_bot->HasAura(STARFALL, EFFECT_INDEX_0) && ai->GetAttackerCount() >= 3 && DruidSpellCombat < 9 && ai->GetManaPercent() >= 39) { ai->CastSpell(STARFALL, *pTarget); DruidSpellCombat++; break; } - else if (BARKSKIN > 0 && pVictim == m_bot && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && ai->GetHealthPercent() < 75 && DruidSpellCombat < 10 && !m_bot->HasAura(BARKSKIN, EFFECT_INDEX_0)) + else if (BARKSKIN > 0 && pVictim == m_bot && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && ai->GetHealthPercent() < 75 && DruidSpellCombat < 10 && !m_bot->HasAura(BARKSKIN, EFFECT_INDEX_0)) { ai->CastSpell(BARKSKIN, *m_bot); DruidSpellCombat++; break; } - else if (INNERVATE > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && ai->GetManaPercent() < 50 && DruidSpellCombat < 11 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0)) + else if (INNERVATE > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && ai->GetManaPercent() < 50 && DruidSpellCombat < 11 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0)) { ai->CastSpell(INNERVATE, *m_bot); DruidSpellCombat++; break; } - else if (MANA_REJUVENATION > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && ai->GetManaPercent() < 50 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0) && DruidSpellCombat < 12 && !m_bot->HasAura(MANA_REJUVENATION, EFFECT_INDEX_0)) + else if (MANA_REJUVENATION > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && ai->GetManaPercent() < 50 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0) && DruidSpellCombat < 12 && !m_bot->HasAura(MANA_REJUVENATION, EFFECT_INDEX_0)) { ai->CastSpell(MANA_REJUVENATION, *m_bot); DruidSpellCombat++; break; } - else if (ENRAGE > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && DruidSpellCombat < 2 && !m_bot->HasAura(ENRAGE, EFFECT_INDEX_0)) + else if (ENRAGE > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && DruidSpellCombat < 2 && !m_bot->HasAura(ENRAGE, EFFECT_INDEX_0)) { ai->CastSpell(ENRAGE, *m_bot); - DruidSpellCombat = DruidSpellCombat +2; + DruidSpellCombat = DruidSpellCombat + 2; break; } - else if (SWIPE > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && DruidSpellCombat < 4 && ai->GetRageAmount()>=20) + else if (SWIPE > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && DruidSpellCombat < 4 && ai->GetRageAmount() >= 20) { ai->CastSpell(SWIPE, *pTarget); - DruidSpellCombat = DruidSpellCombat +2; + DruidSpellCombat = DruidSpellCombat + 2; break; } - else if (MAUL > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && DruidSpellCombat < 6 && ai->GetRageAmount()>=15) + else if (MAUL > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && DruidSpellCombat < 6 && ai->GetRageAmount() >= 15) { ai->CastSpell(MAUL, *pTarget); - DruidSpellCombat = DruidSpellCombat +2; + DruidSpellCombat = DruidSpellCombat + 2; break; } - else if (BASH > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && !pTarget->HasAura(BASH, EFFECT_INDEX_0) && DruidSpellCombat < 8 && ai->GetRageAmount()>=10) + else if (BASH > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && !pTarget->HasAura(BASH, EFFECT_INDEX_0) && DruidSpellCombat < 8 && ai->GetRageAmount() >= 10) { ai->CastSpell(BASH, *pTarget); - DruidSpellCombat = DruidSpellCombat +2; + DruidSpellCombat = DruidSpellCombat + 2; break; } - else if (CHALLENGING_ROAR > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && pVictim != m_bot && DruidSpellCombat < 10 && !pTarget->HasAura(CHALLENGING_ROAR, EFFECT_INDEX_0) && !pTarget->HasAura(GROWL, EFFECT_INDEX_0) && ai->GetRageAmount()>=15) + else if (CHALLENGING_ROAR > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && pVictim != m_bot && DruidSpellCombat < 10 && !pTarget->HasAura(CHALLENGING_ROAR, EFFECT_INDEX_0) && !pTarget->HasAura(GROWL, EFFECT_INDEX_0) && ai->GetRageAmount() >= 15) { ai->CastSpell(CHALLENGING_ROAR, *pTarget); - DruidSpellCombat = DruidSpellCombat +2; + DruidSpellCombat = DruidSpellCombat + 2; break; } - else if (GROWL > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && pVictim != m_bot && DruidSpellCombat < 12 && !pTarget->HasAura(CHALLENGING_ROAR, EFFECT_INDEX_0) && !pTarget->HasAura(GROWL, EFFECT_INDEX_0)) + else if (GROWL > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && pVictim != m_bot && DruidSpellCombat < 12 && !pTarget->HasAura(CHALLENGING_ROAR, EFFECT_INDEX_0) && !pTarget->HasAura(GROWL, EFFECT_INDEX_0)) { ai->CastSpell(GROWL, *pTarget); - DruidSpellCombat = DruidSpellCombat +2; + DruidSpellCombat = DruidSpellCombat + 2; break; } - else if (DruidSpellCombat > 13) + else if (DruidSpellCombat > 13) { DruidSpellCombat = 0; break; @@ -284,25 +284,25 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) case DruidSpell: //ai->TellMaster("DruidSpell"); - if(m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) + if (m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(768); //ai->TellMaster("FormClearCat"); break; } - if(m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) + if (m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(5487); //ai->TellMaster("FormClearBear"); break; } - if(m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) + if (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(9634); //ai->TellMaster("FormClearDireBear"); break; } - if(m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) + if (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(24858); //ai->TellMaster("FormClearMoonkin"); @@ -320,21 +320,21 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) DruidSpellCombat++; break; } - else if (ROOTS > 0 && DruidSpellCombat < 3 && !pTarget->HasAura(ROOTS, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) + else if (ROOTS > 0 && DruidSpellCombat < 3 && !pTarget->HasAura(ROOTS, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) { ai->CastSpell(ROOTS, *pTarget); DruidSpellCombat++; break; } - else if (HURRICANE > 0 && ai->GetAttackerCount()>=5 && DruidSpellCombat < 4 && ai->GetManaPercent() >= 91) + else if (HURRICANE > 0 && ai->GetAttackerCount() >= 5 && DruidSpellCombat < 4 && ai->GetManaPercent() >= 91) { - //ai->TellMaster("casting hurricane!"); + //ai->TellMaster("casting hurricane!"); ai->CastSpell(HURRICANE, *pTarget); - ai->SetIgnoreUpdateTime(10); + ai->SetIgnoreUpdateTime(10); DruidSpellCombat++; break; } - else if (WRATH > 0 && DruidSpellCombat < 5 && ai->GetManaPercent() >= 13) + else if (WRATH > 0 && DruidSpellCombat < 5 && ai->GetManaPercent() >= 13) { ai->CastSpell(WRATH, *pTarget); DruidSpellCombat++; @@ -342,7 +342,7 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) } else if (INSECT_SWARM > 0 && DruidSpellCombat < 6 && !pTarget->HasAura(INSECT_SWARM, EFFECT_INDEX_0) && ai->GetManaPercent() >= 9) { - ai->CastSpell(INSECT_SWARM , *pTarget); + ai->CastSpell(INSECT_SWARM, *pTarget); DruidSpellCombat++; break; } @@ -352,38 +352,38 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) DruidSpellCombat++; break; } - else if (FORCE_OF_NATURE > 0 && DruidSpellCombat < 8 && ai->GetManaPercent() >= 12) + else if (FORCE_OF_NATURE > 0 && DruidSpellCombat < 8 && ai->GetManaPercent() >= 12) { - //ai->TellMaster("summoning treants."); + //ai->TellMaster("summoning treants."); ai->CastSpell(FORCE_OF_NATURE); DruidSpellCombat++; break; } - else if (STARFALL > 0 && !m_bot->HasAura(STARFALL, EFFECT_INDEX_0) && ai->GetAttackerCount()>=3 && DruidSpellCombat < 9 && ai->GetManaPercent() >= 39) + else if (STARFALL > 0 && !m_bot->HasAura(STARFALL, EFFECT_INDEX_0) && ai->GetAttackerCount() >= 3 && DruidSpellCombat < 9 && ai->GetManaPercent() >= 39) { ai->CastSpell(STARFALL, *pTarget); DruidSpellCombat++; break; } - else if (BARKSKIN > 0 && pVictim == m_bot && ai->GetHealthPercent() < 75 && DruidSpellCombat < 10 && !m_bot->HasAura(BARKSKIN, EFFECT_INDEX_0)) + else if (BARKSKIN > 0 && pVictim == m_bot && ai->GetHealthPercent() < 75 && DruidSpellCombat < 10 && !m_bot->HasAura(BARKSKIN, EFFECT_INDEX_0)) { ai->CastSpell(BARKSKIN, *m_bot); DruidSpellCombat++; break; } - else if (INNERVATE > 0 && ai->GetManaPercent() < 50 && DruidSpellCombat < 11 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0)) + else if (INNERVATE > 0 && ai->GetManaPercent() < 50 && DruidSpellCombat < 11 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0)) { ai->CastSpell(INNERVATE, *m_bot); DruidSpellCombat++; break; } - else if (MANA_REJUVENATION > 0 && ai->GetManaPercent() < 50 && DruidSpellCombat < 12 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0) && !m_bot->HasAura(MANA_REJUVENATION, EFFECT_INDEX_0)) + else if (MANA_REJUVENATION > 0 && ai->GetManaPercent() < 50 && DruidSpellCombat < 12 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0) && !m_bot->HasAura(MANA_REJUVENATION, EFFECT_INDEX_0)) { ai->CastSpell(MANA_REJUVENATION, *m_bot); DruidSpellCombat++; break; } - else if (DruidSpellCombat > 13) + else if (DruidSpellCombat > 13) { DruidSpellCombat = 0; break; @@ -397,25 +397,25 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) case DruidHeal: //ai->TellMaster("DruidHeal"); - if(m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) + if (m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(768); //ai->TellMaster("FormClearCat"); break; } - if(m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) + if (m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(5487); //ai->TellMaster("FormClearBear"); break; } - if(m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) + if (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(9634); //ai->TellMaster("FormClearDireBear"); break; } - if(m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) + if (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(24858); //ai->TellMaster("FormClearMoonkin"); @@ -440,25 +440,25 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) case DruidCombat: //ai->TellMaster("DruidCombat"); - if( !m_bot->HasInArc(M_PI_F, pTarget)) + if (!m_bot->HasInArc(M_PI_F, pTarget)) { m_bot->SetInFront(pTarget); if (pVictim) pVictim->Attack(pTarget, true); } - if(m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) + if (m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(5487); //ai->TellMaster("FormClearBear"); break; } - if(m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) + if (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(9634); //ai->TellMaster("FormClearDireBear"); break; } - if(m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) + if (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(24858); //ai->TellMaster("FormClearMoonkin"); @@ -562,11 +562,11 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) //ai->TellMaster("Else Maim"); } break; - } + } else { - DruidSpellCombat = 0; - break; + DruidSpellCombat = 0; + break; } break; } @@ -578,24 +578,24 @@ void PlayerbotDruidAI::DoNonCombatActions() if (!m_bot) return; - PlayerbotAI* ai = GetAI(); + PlayerbotAI* ai = GetAI(); - if(m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) + if (m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(768); //ai->TellMaster("FormClearCat"); } - if(m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) + if (m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(5487); //ai->TellMaster("FormClearBear"); } - if(m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) + if (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(9634); //ai->TellMaster("FormClearDireBear"); } - if(m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) + if (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) { m_bot->RemoveAurasDueToSpell(24858); //ai->TellMaster("FormClearMoonkin"); @@ -613,7 +613,7 @@ void PlayerbotDruidAI::DoNonCombatActions() m_bot->SetStandState(UNIT_STAND_STATE_STAND); Item* pItem = ai->FindDrink(); - Item* fItem = ai->FindBandage(); + Item* fItem = ai->FindBandage(); if (pItem != NULL && ai->GetManaPercent() < 30) { @@ -622,16 +622,16 @@ void PlayerbotDruidAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(30); return; } - else if(pItem == NULL && INNERVATE>0 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0) && ai->GetManaPercent() <= 70) + else if (pItem == NULL && INNERVATE > 0 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0) && ai->GetManaPercent() <= 70) { - ai->CastSpell(INNERVATE, *m_bot); - //ai->TellMaster("casting innervate."); + ai->CastSpell(INNERVATE, *m_bot); + //ai->TellMaster("casting innervate."); return; } - else if(pItem == NULL && MANA_REJUVENATION>0 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0) && !m_bot->HasAura(MANA_REJUVENATION, EFFECT_INDEX_0) && ai->GetManaPercent() <= 70) + else if (pItem == NULL && MANA_REJUVENATION > 0 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0) && !m_bot->HasAura(MANA_REJUVENATION, EFFECT_INDEX_0) && ai->GetManaPercent() <= 70) { - ai->CastSpell(MANA_REJUVENATION, *m_bot); - //ai->TellMaster("casting mana rejuvenation."); + ai->CastSpell(MANA_REJUVENATION, *m_bot); + //ai->TellMaster("casting mana rejuvenation."); return; } @@ -663,13 +663,13 @@ void PlayerbotDruidAI::DoNonCombatActions() for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { Player *tPlayer = sObjectMgr.GetPlayer(itr->guid); - if( !tPlayer || !tPlayer->isAlive() ) + if (!tPlayer || !tPlayer->isAlive()) continue; - // buff and heal - (!tPlayer->HasAura(MARK_OF_THE_WILD, EFFECT_INDEX_0) && ai->CastSpell (MARK_OF_THE_WILD, *tPlayer)); - //(!tPlayer->HasAura(THORNS, EFFECT_INDEX_0) && ai->CastSpell (THORNS, *tPlayer)); - (HealTarget(*tPlayer, tPlayer->GetHealth()*100 / tPlayer->GetMaxHealth())); + // buff and heal + (!tPlayer->HasAura(MARK_OF_THE_WILD, EFFECT_INDEX_0) && ai->CastSpell (MARK_OF_THE_WILD, *tPlayer)); + //(!tPlayer->HasAura(THORNS, EFFECT_INDEX_0) && ai->CastSpell (THORNS, *tPlayer)); + (HealTarget(*tPlayer, tPlayer->GetHealth() * 100 / tPlayer->GetMaxHealth())); } } } // end DoNonCombatActions diff --git a/src/game/playerbot/PlayerbotDruidAI.h b/src/game/playerbot/PlayerbotDruidAI.h index de357697a..9bb166ebc 100644 --- a/src/game/playerbot/PlayerbotDruidAI.h +++ b/src/game/playerbot/PlayerbotDruidAI.h @@ -93,48 +93,48 @@ enum DruidSpells class MANGOS_DLL_SPEC PlayerbotDruidAI : PlayerbotClassAI { - public: - PlayerbotDruidAI(Player* const master, Player* const bot, PlayerbotAI* const ai); - virtual ~PlayerbotDruidAI(); +public: + PlayerbotDruidAI(Player * const master, Player * const bot, PlayerbotAI * const ai); + virtual ~PlayerbotDruidAI(); - // all combat actions go here - void DoNextCombatManeuver(Unit*); + // all combat actions go here + void DoNextCombatManeuver(Unit*); - // all non combat actions go here, ex buffs, heals, rezzes - void DoNonCombatActions(); + // all non combat actions go here, ex buffs, heals, rezzes + void DoNonCombatActions(); - // buff a specific player, usually a real PC who is not in group - void BuffPlayer(Player *target); + // buff a specific player, usually a real PC who is not in group + void BuffPlayer(Player *target); - private: - // Heals the target based off its hps - void HealTarget (Unit& target, uint8 hp); +private: + // Heals the target based off its hps + void HealTarget (Unit& target, uint8 hp); - // druid cat/bear/dire bear/moonkin/tree of life forms - uint32 CAT_FORM, BEAR_FORM, DIRE_BEAR_FORM, MOONKIN_FORM, TREE_OF_LIFE; + // druid cat/bear/dire bear/moonkin/tree of life forms + uint32 CAT_FORM, BEAR_FORM, DIRE_BEAR_FORM, MOONKIN_FORM, TREE_OF_LIFE; - // druid cat attacks - uint32 CLAW, COWER, TIGERS_FURY, RAKE, RIP, FEROCIOUS_BITE, MAIM, MANGLE; + // druid cat attacks + uint32 CLAW, COWER, TIGERS_FURY, RAKE, RIP, FEROCIOUS_BITE, MAIM, MANGLE; - // druid bear/dire bear attacks & buffs - uint32 BASH, MAUL, SWIPE, DEMORALIZING_ROAR, CHALLENGING_ROAR, GROWL, ENRAGE; + // druid bear/dire bear attacks & buffs + uint32 BASH, MAUL, SWIPE, DEMORALIZING_ROAR, CHALLENGING_ROAR, GROWL, ENRAGE; - // druid attacks & debuffs - uint32 MOONFIRE, ROOTS, WRATH, STARFALL, STARFIRE, INSECT_SWARM, FAERIE_FIRE, FORCE_OF_NATURE, HURRICANE; + // druid attacks & debuffs + uint32 MOONFIRE, ROOTS, WRATH, STARFALL, STARFIRE, INSECT_SWARM, FAERIE_FIRE, FORCE_OF_NATURE, HURRICANE; - // druid buffs - uint32 MARK_OF_THE_WILD, THORNS, MANA_REJUVENATION, INNERVATE, BARKSKIN; + // druid buffs + uint32 MARK_OF_THE_WILD, THORNS, MANA_REJUVENATION, INNERVATE, BARKSKIN; - // druid heals - uint32 LIFEBLOOM, REJUVENATION, REGROWTH, NOURISH, HEALING_TOUCH, WILD_GROWTH, SWIFTMEND, TRANQUILITY; + // druid heals + uint32 LIFEBLOOM, REJUVENATION, REGROWTH, NOURISH, HEALING_TOUCH, WILD_GROWTH, SWIFTMEND, TRANQUILITY; - // first aid - uint32 RECENTLY_BANDAGED; + // first aid + uint32 RECENTLY_BANDAGED; - // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + // racial + uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; - uint32 SpellSequence, DruidSpellCombat; + uint32 SpellSequence, DruidSpellCombat; }; #endif diff --git a/src/game/playerbot/PlayerbotHunterAI.cpp b/src/game/playerbot/PlayerbotHunterAI.cpp index 42911bc19..6726692bc 100644 --- a/src/game/playerbot/PlayerbotHunterAI.cpp +++ b/src/game/playerbot/PlayerbotHunterAI.cpp @@ -5,7 +5,7 @@ class PlayerbotAI; -PlayerbotHunterAI::PlayerbotHunterAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) +PlayerbotHunterAI::PlayerbotHunterAI(Player* const master, Player* const bot, PlayerbotAI* const ai) : PlayerbotClassAI(master, bot, ai) { // PET CTRL PET_SUMMON = ai->initSpell(CALL_PET_1); @@ -83,13 +83,13 @@ PlayerbotHunterAI::~PlayerbotHunterAI() {} bool PlayerbotHunterAI::HasPet(Player* bot) { - QueryResult* result = CharacterDatabase.PQuery("SELECT * FROM character_pet WHERE owner = '%u' AND (slot = '%u' OR slot = '%u')",bot->GetGUIDLow(),PET_SAVE_AS_CURRENT,PET_SAVE_NOT_IN_SLOT); + QueryResult* result = CharacterDatabase.PQuery("SELECT * FROM character_pet WHERE owner = '%u' AND (slot = '%u' OR slot = '%u')", bot->GetGUIDLow(), PET_SAVE_AS_CURRENT, PET_SAVE_NOT_IN_SLOT); - if(result) - return true; //hunter has current pet - else - return false; //hunter either has no pet or stabled -}// end HasPet + if (result) + return true; //hunter has current pet + else + return false; //hunter either has no pet or stabled +} // end HasPet void PlayerbotHunterAI::DoNextCombatManeuver(Unit *pTarget) { @@ -107,166 +107,166 @@ void PlayerbotHunterAI::DoNextCombatManeuver(Unit *pTarget) // ------- Non Duel combat ---------- // Hunter - ai->SetInFront( pTarget ); + ai->SetInFront(pTarget); Player *m_bot = GetPlayerBot(); - Unit* pVictim = pTarget->getVictim(); + Unit* pVictim = pTarget->getVictim(); // check for pet and heal if neccessary Pet *pet = m_bot->GetPet(); - if(( pet ) - && ( ((float)pet->GetHealth()/(float)pet->GetMaxHealth()) < 0.5f ) - && ( PET_MEND>0 && !pet->getDeathState() != ALIVE && pVictim != m_bot && !pet->HasAura(PET_MEND, EFFECT_INDEX_0) && ai->GetManaPercent()>=13 && ai->CastSpell(PET_MEND,*m_bot) )) - { - ai->TellMaster( "healing pet." ); - return; - } - else if(( pet ) - && ( INTIMIDATION>0 && pVictim == pet && !pet->HasAura(INTIMIDATION, EFFECT_INDEX_0) && ai->CastSpell(INTIMIDATION,*m_bot) )) - { - //ai->TellMaster( "casting intimidation." ); // if pet has aggro :) - return; - } - - // racial traits - if( m_bot->getRace() == RACE_ORC && !m_bot->HasAura(BLOOD_FURY, EFFECT_INDEX_0)) - { - ai->CastSpell( BLOOD_FURY,*m_bot ); - //ai->TellMaster( "Blood Fury." ); - } - else if( m_bot->getRace() == RACE_TROLL && !m_bot->HasAura(BERSERKING, EFFECT_INDEX_0)) - { - ai->CastSpell( BERSERKING,*m_bot ); - //ai->TellMaster( "Berserking." ); - } + if (( pet ) + && (((float) pet->GetHealth() / (float) pet->GetMaxHealth()) < 0.5f ) + && ( PET_MEND > 0 && !pet->getDeathState() != ALIVE && pVictim != m_bot && !pet->HasAura(PET_MEND, EFFECT_INDEX_0) && ai->GetManaPercent() >= 13 && ai->CastSpell(PET_MEND, *m_bot))) + { + ai->TellMaster("healing pet."); + return; + } + else if (( pet ) + && ( INTIMIDATION > 0 && pVictim == pet && !pet->HasAura(INTIMIDATION, EFFECT_INDEX_0) && ai->CastSpell(INTIMIDATION, *m_bot))) + { + //ai->TellMaster( "casting intimidation." ); // if pet has aggro :) + return; + } + + // racial traits + if (m_bot->getRace() == RACE_ORC && !m_bot->HasAura(BLOOD_FURY, EFFECT_INDEX_0)) + { + ai->CastSpell(BLOOD_FURY, *m_bot); + //ai->TellMaster( "Blood Fury." ); + } + else if (m_bot->getRace() == RACE_TROLL && !m_bot->HasAura(BERSERKING, EFFECT_INDEX_0)) + { + ai->CastSpell(BERSERKING, *m_bot); + //ai->TellMaster( "Berserking." ); + } // check if ranged combat is possible (set m_rangedCombat and switch auras - float dist = m_bot->GetDistance( pTarget ); - if( (dist<=ATTACK_DISTANCE || !m_bot->GetUInt32Value(PLAYER_AMMO_ID)) && m_rangedCombat ) + float dist = m_bot->GetDistance(pTarget); + if ((dist <= ATTACK_DISTANCE || !m_bot->GetUInt32Value(PLAYER_AMMO_ID)) && m_rangedCombat) { // switch to melee combat (target in melee range, out of ammo) m_rangedCombat = false; - if( !m_bot->GetUInt32Value(PLAYER_AMMO_ID) ) - ai->TellMaster( "Out of ammo!" ); + if (!m_bot->GetUInt32Value(PLAYER_AMMO_ID)) + ai->TellMaster("Out of ammo!"); // become monkey (increases dodge chance)... - ( ASPECT_OF_THE_MONKEY>0 && !m_bot->HasAura(ASPECT_OF_THE_MONKEY, EFFECT_INDEX_0) && ai->CastSpell(ASPECT_OF_THE_MONKEY,*m_bot) ); + ( ASPECT_OF_THE_MONKEY > 0 && !m_bot->HasAura(ASPECT_OF_THE_MONKEY, EFFECT_INDEX_0) && ai->CastSpell(ASPECT_OF_THE_MONKEY, *m_bot)); } - else if( dist>ATTACK_DISTANCE && !m_rangedCombat ) + else if (dist > ATTACK_DISTANCE && !m_rangedCombat) { // switch to ranged combat m_rangedCombat = true; // increase ranged attack power... - ( ASPECT_OF_THE_HAWK>0 && !m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0) && ai->CastSpell(ASPECT_OF_THE_HAWK,*m_bot) ); + ( ASPECT_OF_THE_HAWK > 0 && !m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0) && ai->CastSpell(ASPECT_OF_THE_HAWK, *m_bot)); } - else if( m_rangedCombat && !m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0)) + else if (m_rangedCombat && !m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0)) { // check if we have hawk aspect in ranged combat - ( ASPECT_OF_THE_HAWK>0 && ai->CastSpell(ASPECT_OF_THE_HAWK,*m_bot) ); + ( ASPECT_OF_THE_HAWK > 0 && ai->CastSpell(ASPECT_OF_THE_HAWK, *m_bot)); } - else if( !m_rangedCombat && !m_bot->HasAura(ASPECT_OF_THE_MONKEY, EFFECT_INDEX_0)) + else if (!m_rangedCombat && !m_bot->HasAura(ASPECT_OF_THE_MONKEY, EFFECT_INDEX_0)) { // check if we have monkey aspect in melee combat - ( ASPECT_OF_THE_MONKEY>0 && ai->CastSpell(ASPECT_OF_THE_MONKEY,*m_bot)); + ( ASPECT_OF_THE_MONKEY > 0 && ai->CastSpell(ASPECT_OF_THE_MONKEY, *m_bot)); } // activate auto shot - if( AUTO_SHOT>0 && m_rangedCombat && !m_bot->FindCurrentSpellBySpellId(AUTO_SHOT) ) + if (AUTO_SHOT > 0 && m_rangedCombat && !m_bot->FindCurrentSpellBySpellId(AUTO_SHOT)) { - ai->CastSpell(AUTO_SHOT,*pTarget); + ai->CastSpell(AUTO_SHOT, *pTarget); //ai->TellMaster( "started auto shot." ); } - else if( AUTO_SHOT>0 && m_bot->FindCurrentSpellBySpellId(AUTO_SHOT) ) + else if (AUTO_SHOT > 0 && m_bot->FindCurrentSpellBySpellId(AUTO_SHOT)) { - m_bot->InterruptNonMeleeSpells( true, AUTO_SHOT ); + m_bot->InterruptNonMeleeSpells(true, AUTO_SHOT); //ai->TellMaster( "stopped auto shot." ); } // damage spells std::ostringstream out; - if( m_rangedCombat ) + if (m_rangedCombat) { out << "Case Ranged"; - if( HUNTERS_MARK>0 && ai->GetManaPercent()>=3 && !pTarget->HasAura(HUNTERS_MARK, EFFECT_INDEX_0) && ai->CastSpell(HUNTERS_MARK,*pTarget) ) + if (HUNTERS_MARK > 0 && ai->GetManaPercent() >= 3 && !pTarget->HasAura(HUNTERS_MARK, EFFECT_INDEX_0) && ai->CastSpell(HUNTERS_MARK, *pTarget)) out << " > Hunter's Mark"; - else if( RAPID_FIRE>0 && ai->GetManaPercent()>=3 && !m_bot->HasAura(RAPID_FIRE, EFFECT_INDEX_0) && ai->CastSpell(RAPID_FIRE,*m_bot) ) + else if (RAPID_FIRE > 0 && ai->GetManaPercent() >= 3 && !m_bot->HasAura(RAPID_FIRE, EFFECT_INDEX_0) && ai->CastSpell(RAPID_FIRE, *m_bot)) out << " > Rapid Fire"; - else if( MULTI_SHOT>0 && ai->GetManaPercent()>=13 && ai->GetAttackerCount()>=3 && ai->CastSpell(MULTI_SHOT,*pTarget) ) + else if (MULTI_SHOT > 0 && ai->GetManaPercent() >= 13 && ai->GetAttackerCount() >= 3 && ai->CastSpell(MULTI_SHOT, *pTarget)) out << " > Multi-Shot"; - else if( ARCANE_SHOT>0 && ai->GetManaPercent()>=7 && ai->CastSpell(ARCANE_SHOT,*pTarget) ) + else if (ARCANE_SHOT > 0 && ai->GetManaPercent() >= 7 && ai->CastSpell(ARCANE_SHOT, *pTarget)) out << " > Arcane Shot"; - else if( CONCUSSIVE_SHOT>0 && ai->GetManaPercent()>=6 && !pTarget->HasAura(CONCUSSIVE_SHOT, EFFECT_INDEX_0) && ai->CastSpell(CONCUSSIVE_SHOT,*pTarget) ) + else if (CONCUSSIVE_SHOT > 0 && ai->GetManaPercent() >= 6 && !pTarget->HasAura(CONCUSSIVE_SHOT, EFFECT_INDEX_0) && ai->CastSpell(CONCUSSIVE_SHOT, *pTarget)) out << " > Concussive Shot"; - else if( EXPLOSIVE_SHOT>0 && ai->GetManaPercent()>=10 && !pTarget->HasAura(EXPLOSIVE_SHOT, EFFECT_INDEX_0) && ai->CastSpell(EXPLOSIVE_SHOT,*pTarget) ) + else if (EXPLOSIVE_SHOT > 0 && ai->GetManaPercent() >= 10 && !pTarget->HasAura(EXPLOSIVE_SHOT, EFFECT_INDEX_0) && ai->CastSpell(EXPLOSIVE_SHOT, *pTarget)) out << " > Explosive Shot"; - else if( VIPER_STING>0 && ai->GetManaPercent()>=8 && pTarget->GetPower(POWER_MANA) > 0 && ai->GetManaPercent()<70 && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && ai->CastSpell(VIPER_STING,*pTarget) ) + else if (VIPER_STING > 0 && ai->GetManaPercent() >= 8 && pTarget->GetPower(POWER_MANA) > 0 && ai->GetManaPercent() < 70 && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && ai->CastSpell(VIPER_STING, *pTarget)) out << " > Viper Sting"; - else if( SERPENT_STING>0 && ai->GetManaPercent()>=13 && !pTarget->HasAura(SERPENT_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SCORPID_STING, EFFECT_INDEX_0) && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && ai->CastSpell(SERPENT_STING,*pTarget) ) + else if (SERPENT_STING > 0 && ai->GetManaPercent() >= 13 && !pTarget->HasAura(SERPENT_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SCORPID_STING, EFFECT_INDEX_0) && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && ai->CastSpell(SERPENT_STING, *pTarget)) out << " > Serpent Sting"; - else if( SCORPID_STING>0 && ai->GetManaPercent()>=11 && !pTarget->HasAura(WYVERN_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SCORPID_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SERPENT_STING, EFFECT_INDEX_0) && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && ai->CastSpell(SCORPID_STING,*pTarget) ) + else if (SCORPID_STING > 0 && ai->GetManaPercent() >= 11 && !pTarget->HasAura(WYVERN_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SCORPID_STING, EFFECT_INDEX_0) && !pTarget->HasAura(SERPENT_STING, EFFECT_INDEX_0) && !pTarget->HasAura(VIPER_STING, EFFECT_INDEX_0) && ai->CastSpell(SCORPID_STING, *pTarget)) out << " > Scorpid Sting"; - else if( CHIMERA_SHOT>0 && ai->GetManaPercent()>=12 && ai->CastSpell(CHIMERA_SHOT,*pTarget) ) + else if (CHIMERA_SHOT > 0 && ai->GetManaPercent() >= 12 && ai->CastSpell(CHIMERA_SHOT, *pTarget)) out << " > Chimera Shot"; - else if( VOLLEY>0 && ai->GetManaPercent()>=24 && ai->GetAttackerCount()>=3 && ai->CastSpell(VOLLEY,*pTarget) ) + else if (VOLLEY > 0 && ai->GetManaPercent() >= 24 && ai->GetAttackerCount() >= 3 && ai->CastSpell(VOLLEY, *pTarget)) out << " > Volley"; - else if( BLACK_ARROW>0 && ai->GetManaPercent()>=6 && !pTarget->HasAura(BLACK_ARROW, EFFECT_INDEX_0) && ai->CastSpell(BLACK_ARROW,*pTarget) ) + else if (BLACK_ARROW > 0 && ai->GetManaPercent() >= 6 && !pTarget->HasAura(BLACK_ARROW, EFFECT_INDEX_0) && ai->CastSpell(BLACK_ARROW, *pTarget)) out << " > Black Arrow"; - else if( AIMED_SHOT>0 && ai->GetManaPercent()>=12 && ai->CastSpell(AIMED_SHOT,*pTarget) ) + else if (AIMED_SHOT > 0 && ai->GetManaPercent() >= 12 && ai->CastSpell(AIMED_SHOT, *pTarget)) out << " > Aimed Shot"; - else if( STEADY_SHOT>0 && ai->GetManaPercent()>=5 && ai->CastSpell(STEADY_SHOT,*pTarget) ) + else if (STEADY_SHOT > 0 && ai->GetManaPercent() >= 5 && ai->CastSpell(STEADY_SHOT, *pTarget)) out << " > Steady Shot"; - else if( KILL_SHOT>0 && ai->GetManaPercent()>=7 && pTarget->GetHealth() < pTarget->GetMaxHealth()*0.2 && ai->CastSpell(KILL_SHOT,*pTarget) ) + else if (KILL_SHOT > 0 && ai->GetManaPercent() >= 7 && pTarget->GetHealth() < pTarget->GetMaxHealth() * 0.2 && ai->CastSpell(KILL_SHOT, *pTarget)) out << " > Kill Shot!"; - else + else out << " NONE!"; } else { out << "Case Melee"; - if( RAPTOR_STRIKE>0 && ai->GetManaPercent()>=6 && ai->CastSpell(RAPTOR_STRIKE,*pTarget) ) + if (RAPTOR_STRIKE > 0 && ai->GetManaPercent() >= 6 && ai->CastSpell(RAPTOR_STRIKE, *pTarget)) out << " > Raptor Strike"; - else if( EXPLOSIVE_TRAP>0 && ai->GetManaPercent()>=27 && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && ai->CastSpell(EXPLOSIVE_TRAP,*pTarget) ) + else if (EXPLOSIVE_TRAP > 0 && ai->GetManaPercent() >= 27 && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && ai->CastSpell(EXPLOSIVE_TRAP, *pTarget)) out << " > Explosive Trap"; - else if( WING_CLIP>0 && ai->GetManaPercent()>=6 && !pTarget->HasAura(WING_CLIP, EFFECT_INDEX_0) && ai->CastSpell(WING_CLIP,*pTarget) ) + else if (WING_CLIP > 0 && ai->GetManaPercent() >= 6 && !pTarget->HasAura(WING_CLIP, EFFECT_INDEX_0) && ai->CastSpell(WING_CLIP, *pTarget)) out << " > Wing Clip"; - else if( IMMOLATION_TRAP>0 && ai->GetManaPercent()>=13 && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && ai->CastSpell(IMMOLATION_TRAP,*pTarget) ) + else if (IMMOLATION_TRAP > 0 && ai->GetManaPercent() >= 13 && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && ai->CastSpell(IMMOLATION_TRAP, *pTarget)) out << " > Immolation Trap"; - else if( MONGOOSE_BITE>0 && ai->GetManaPercent()>=4 && ai->CastSpell(MONGOOSE_BITE,*pTarget) ) + else if (MONGOOSE_BITE > 0 && ai->GetManaPercent() >= 4 && ai->CastSpell(MONGOOSE_BITE, *pTarget)) out << " > Mongoose Bite"; - else if( FROST_TRAP>0 && ai->GetManaPercent()>=2 && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && ai->CastSpell(FROST_TRAP,*pTarget)) + else if (FROST_TRAP > 0 && ai->GetManaPercent() >= 2 && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && ai->CastSpell(FROST_TRAP, *pTarget)) out << " > Frost Trap"; - else if( ARCANE_TRAP>0 && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && ai->CastSpell(ARCANE_TRAP,*pTarget) ) + else if (ARCANE_TRAP > 0 && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && ai->CastSpell(ARCANE_TRAP, *pTarget)) out << " > Arcane Trap"; - else if( DETERRENCE>0 && pVictim == m_bot && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.5 && !m_bot->HasAura(DETERRENCE, EFFECT_INDEX_0) && ai->CastSpell(DETERRENCE,*m_bot) ) + else if (DETERRENCE > 0 && pVictim == m_bot && m_bot->GetHealth() < m_bot->GetMaxHealth() * 0.5 && !m_bot->HasAura(DETERRENCE, EFFECT_INDEX_0) && ai->CastSpell(DETERRENCE, *m_bot)) out << " > Deterrence"; - else if( m_bot->getRace() == RACE_TAUREN && !pTarget->HasAura( WAR_STOMP, EFFECT_INDEX_0) && ai->CastSpell(WAR_STOMP,*pTarget) ) + else if (m_bot->getRace() == RACE_TAUREN && !pTarget->HasAura(WAR_STOMP, EFFECT_INDEX_0) && ai->CastSpell(WAR_STOMP, *pTarget)) out << " > War Stomp"; - else if( m_bot->getRace() == RACE_BLOODELF && !pTarget->HasAura( ARCANE_TORRENT, EFFECT_INDEX_0) && ai->CastSpell( ARCANE_TORRENT,*pTarget ) ) + else if (m_bot->getRace() == RACE_BLOODELF && !pTarget->HasAura(ARCANE_TORRENT, EFFECT_INDEX_0) && ai->CastSpell(ARCANE_TORRENT, *pTarget)) out << " > Arcane Torrent"; - else if( m_bot->getRace() == RACE_DWARF && m_bot->HasAuraState( AURA_STATE_DEADLY_POISON ) && ai->CastSpell( STONEFORM,*m_bot ) ) + else if (m_bot->getRace() == RACE_DWARF && m_bot->HasAuraState(AURA_STATE_DEADLY_POISON) && ai->CastSpell(STONEFORM, *m_bot)) out << " > Stoneform"; - else if( m_bot->getRace() == RACE_NIGHTELF && pVictim == m_bot && ai->GetHealthPercent() < 25 && !m_bot->HasAura( SHADOWMELD, EFFECT_INDEX_0) && ai->CastSpell( SHADOWMELD,*m_bot ) ) + else if (m_bot->getRace() == RACE_NIGHTELF && pVictim == m_bot && ai->GetHealthPercent() < 25 && !m_bot->HasAura(SHADOWMELD, EFFECT_INDEX_0) && ai->CastSpell(SHADOWMELD, *m_bot)) out << " > Shadowmeld"; - else if( m_bot->getRace() == RACE_DRAENEI && ai->GetHealthPercent() < 25 && !m_bot->HasAura(GIFT_OF_THE_NAARU, EFFECT_INDEX_0) && ai->CastSpell(GIFT_OF_THE_NAARU,*m_bot) ) + else if (m_bot->getRace() == RACE_DRAENEI && ai->GetHealthPercent() < 25 && !m_bot->HasAura(GIFT_OF_THE_NAARU, EFFECT_INDEX_0) && ai->CastSpell(GIFT_OF_THE_NAARU, *m_bot)) out << " > Gift of the Naaru"; - else if(( pet && !pet->getDeathState() != ALIVE) - && ( MISDIRECTION>0 && pVictim == m_bot && !m_bot->HasAura(MISDIRECTION, EFFECT_INDEX_0) && ai->GetManaPercent()>=9 && ai->CastSpell(MISDIRECTION,*pet)) ) - out << " > Misdirection"; // give threat to pet + else if (( pet && !pet->getDeathState() != ALIVE) + && ( MISDIRECTION > 0 && pVictim == m_bot && !m_bot->HasAura(MISDIRECTION, EFFECT_INDEX_0) && ai->GetManaPercent() >= 9 && ai->CastSpell(MISDIRECTION, *pet))) + out << " > Misdirection"; // give threat to pet /*else if( FREEZING_TRAP>0 && ai->GetManaPercent()>=5 && !pTarget->HasAura(FREEZING_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && ai->CastSpell(FREEZING_TRAP,*pTarget) ) out << " > Freezing Trap"; // this can trap your bots too - else if( BEAR_TRAP>0 && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && ai->CastSpell(BEAR_TRAP,*pTarget) ) + else if( BEAR_TRAP>0 && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && ai->CastSpell(BEAR_TRAP,*pTarget) ) out << " > Bear Trap"; // this was just too annoying :) - else if( DISENGAGE>0 && pVictim && ai->GetManaPercent()>=5 && ai->CastSpell(DISENGAGE,*pTarget) ) + else if( DISENGAGE>0 && pVictim && ai->GetManaPercent()>=5 && ai->CastSpell(DISENGAGE,*pTarget) ) out << " > Disengage!"; // attempt to return to ranged combat*/ else out << " NONE!"; } - if( ai->GetManager()->m_confDebugWhisper ) - ai->TellMaster( out.str().c_str() ); + if (ai->GetManager()->m_confDebugWhisper) + ai->TellMaster(out.str().c_str()); } // end DoNextCombatManeuver void PlayerbotHunterAI::DoNonCombatActions() { PlayerbotAI *ai = GetAI(); - if( !ai ) + if (!ai) return; Player * m_bot = GetPlayerBot(); @@ -274,23 +274,23 @@ void PlayerbotHunterAI::DoNonCombatActions() return; // reset ranged combat state - if( !m_rangedCombat ) + if (!m_rangedCombat) m_rangedCombat = true; // buff group - if (TRUESHOT_AURA > 0) - (!m_bot->HasAura(TRUESHOT_AURA, EFFECT_INDEX_0) && ai->CastSpell (TRUESHOT_AURA, *m_bot)); + if (TRUESHOT_AURA > 0) + (!m_bot->HasAura(TRUESHOT_AURA, EFFECT_INDEX_0) && ai->CastSpell (TRUESHOT_AURA, *m_bot)); - // buff myself - if (ASPECT_OF_THE_HAWK > 0) - (!m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0) && ai->CastSpell (ASPECT_OF_THE_HAWK, *m_bot)); + // buff myself + if (ASPECT_OF_THE_HAWK > 0) + (!m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0) && ai->CastSpell (ASPECT_OF_THE_HAWK, *m_bot)); // mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); Item* pItem = ai->FindDrink(); - Item* fItem = ai->FindBandage(); + Item* fItem = ai->FindBandage(); if (pItem != NULL && ai->GetManaPercent() < 30) { @@ -313,7 +313,7 @@ void PlayerbotHunterAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(30); return; } - else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) + else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(*fItem); @@ -328,36 +328,36 @@ void PlayerbotHunterAI::DoNonCombatActions() } // check for pet - if( PET_SUMMON>0 && !m_petSummonFailed && HasPet(m_bot) ) + if (PET_SUMMON > 0 && !m_petSummonFailed && HasPet(m_bot)) { // we can summon pet, and no critical summon errors before Pet *pet = m_bot->GetPet(); - if( !pet ) + if (!pet) { // summon pet - if( PET_SUMMON>0 && ai->CastSpell(PET_SUMMON,*m_bot) ) - ai->TellMaster( "summoning pet." ); + if (PET_SUMMON > 0 && ai->CastSpell(PET_SUMMON, *m_bot)) + ai->TellMaster("summoning pet."); else { m_petSummonFailed = true; - ai->TellMaster( "summon pet failed!" ); + ai->TellMaster("summon pet failed!"); } } - else if( pet->getDeathState() != ALIVE ) + else if (pet->getDeathState() != ALIVE) { // revive pet - if( PET_REVIVE>0 && ai->GetManaPercent()>=80 && ai->CastSpell(PET_REVIVE,*m_bot) ) - ai->TellMaster( "reviving pet." ); + if (PET_REVIVE > 0 && ai->GetManaPercent() >= 80 && ai->CastSpell(PET_REVIVE, *m_bot)) + ai->TellMaster("reviving pet."); } - else if( ((float)pet->GetHealth()/(float)pet->GetMaxHealth()) < 0.5f ) + else if (((float) pet->GetHealth() / (float) pet->GetMaxHealth()) < 0.5f) { // heal pet when health lower 50% - if( PET_MEND>0 && !pet->getDeathState() != ALIVE && !pet->HasAura(PET_MEND, EFFECT_INDEX_0) && ai->GetManaPercent()>=13 && ai->CastSpell(PET_MEND,*m_bot) ) - ai->TellMaster( "healing pet." ); + if (PET_MEND > 0 && !pet->getDeathState() != ALIVE && !pet->HasAura(PET_MEND, EFFECT_INDEX_0) && ai->GetManaPercent() >= 13 && ai->CastSpell(PET_MEND, *m_bot)) + ai->TellMaster("healing pet."); } - else if(pet->GetHappinessState() != HAPPY) // if pet is hungry + else if (pet->GetHappinessState() != HAPPY) // if pet is hungry { - Unit *caster = (Unit*)m_bot; + Unit *caster = (Unit*) m_bot; // list out items in main backpack for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; slot++) { @@ -365,18 +365,18 @@ void PlayerbotHunterAI::DoNonCombatActions() if (pItem) { const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto ) + if (!pItemProto) continue; - if(pet->HaveInDiet(pItemProto)) // is pItem in pets diet + if (pet->HaveInDiet(pItemProto)) // is pItem in pets diet { //sLog.outDebug("Food for pet: %s",pItemProto->Name1); - caster->CastSpell(caster,51284,true); // pet feed visual + caster->CastSpell(caster, 51284, true); // pet feed visual uint32 count = 1; // number of items used int32 benefit = pet->GetCurrentFoodBenefitLevel(pItemProto->ItemLevel); // nutritional value of food - m_bot->DestroyItemCount(pItem,count,true); // remove item from inventory - m_bot->CastCustomSpell(m_bot,PET_FEED,&benefit,NULL,NULL,true); // feed pet - ai->TellMaster( "feeding pet." ); + m_bot->DestroyItemCount(pItem, count, true); // remove item from inventory + m_bot->CastCustomSpell(m_bot, PET_FEED, &benefit, NULL, NULL, true); // feed pet + ai->TellMaster("feeding pet."); ai->SetIgnoreUpdateTime(10); return; } @@ -394,18 +394,18 @@ void PlayerbotHunterAI::DoNonCombatActions() if (pItem) { const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto ) + if (!pItemProto) continue; - if(pet->HaveInDiet(pItemProto)) // is pItem in pets diet + if (pet->HaveInDiet(pItemProto)) // is pItem in pets diet { //sLog.outDebug("Food for pet: %s",pItemProto->Name1); - caster->CastSpell(caster,51284,true); // pet feed visual - uint32 count = 1; // number of items used + caster->CastSpell(caster, 51284, true); // pet feed visual + uint32 count = 1; // number of items used int32 benefit = pet->GetCurrentFoodBenefitLevel(pItemProto->ItemLevel); // nutritional value of food - m_bot->DestroyItemCount(pItem,count,true); // remove item from inventory - m_bot->CastCustomSpell(m_bot,PET_FEED,&benefit,NULL,NULL,true); // feed pet - ai->TellMaster( "feeding pet." ); + m_bot->DestroyItemCount(pItem, count, true); // remove item from inventory + m_bot->CastCustomSpell(m_bot, PET_FEED, &benefit, NULL, NULL, true); // feed pet + ai->TellMaster("feeding pet."); ai->SetIgnoreUpdateTime(10); return; } @@ -413,8 +413,8 @@ void PlayerbotHunterAI::DoNonCombatActions() } } } - if( pet->HasAura(PET_MEND, EFFECT_INDEX_0) && !pet->HasAura(PET_FEED, EFFECT_INDEX_0)) - ai->TellMaster( "..no pet food!" ); + if (pet->HasAura(PET_MEND, EFFECT_INDEX_0) && !pet->HasAura(PET_FEED, EFFECT_INDEX_0)) + ai->TellMaster("..no pet food!"); ai->SetIgnoreUpdateTime(7); } } diff --git a/src/game/playerbot/PlayerbotHunterAI.h b/src/game/playerbot/PlayerbotHunterAI.h index 85c41c9c0..02eaac84b 100644 --- a/src/game/playerbot/PlayerbotHunterAI.h +++ b/src/game/playerbot/PlayerbotHunterAI.h @@ -85,36 +85,36 @@ enum HunterSpells class MANGOS_DLL_SPEC PlayerbotHunterAI : PlayerbotClassAI { - public: - PlayerbotHunterAI(Player* const master, Player* const bot, PlayerbotAI* const ai); - virtual ~PlayerbotHunterAI(); - bool HasPet(Player* bot); +public: + PlayerbotHunterAI(Player * const master, Player * const bot, PlayerbotAI * const ai); + virtual ~PlayerbotHunterAI(); + bool HasPet(Player* bot); - // all combat actions go here - void DoNextCombatManeuver(Unit*); + // all combat actions go here + void DoNextCombatManeuver(Unit*); - // all non combat actions go here, ex buffs, heals, rezzes - void DoNonCombatActions(); + // all non combat actions go here, ex buffs, heals, rezzes + void DoNonCombatActions(); - // buff a specific player, usually a real PC who is not in group - //void BuffPlayer(Player *target); + // buff a specific player, usually a real PC who is not in group + //void BuffPlayer(Player *target); - private: - // Hunter - bool m_petSummonFailed; - bool m_rangedCombat; +private: + // Hunter + bool m_petSummonFailed; + bool m_rangedCombat; - uint32 PET_SUMMON, PET_DISMISS, PET_REVIVE, PET_MEND, PET_FEED, BAD_ATTITUDE, SONIC_BLAST, NETHER_SHOCK, DEMORALIZING_SCREECH, INTIMIDATION; - uint32 AUTO_SHOT, HUNTERS_MARK, ARCANE_SHOT, CONCUSSIVE_SHOT, DISTRACTING_SHOT, MULTI_SHOT, EXPLOSIVE_SHOT, SERPENT_STING, SCORPID_STING, VIPER_STING, WYVERN_STING, AIMED_SHOT, STEADY_SHOT, CHIMERA_SHOT, VOLLEY, BLACK_ARROW, KILL_SHOT; - uint32 RAPTOR_STRIKE, WING_CLIP, MONGOOSE_BITE, DISENGAGE, DETERRENCE; - uint32 BEAR_TRAP, FREEZING_TRAP, IMMOLATION_TRAP, FROST_TRAP, EXPLOSIVE_TRAP, ARCANE_TRAP, SNAKE_TRAP; - uint32 ASPECT_OF_THE_HAWK, ASPECT_OF_THE_MONKEY, RAPID_FIRE, TRUESHOT_AURA, MISDIRECTION; + uint32 PET_SUMMON, PET_DISMISS, PET_REVIVE, PET_MEND, PET_FEED, BAD_ATTITUDE, SONIC_BLAST, NETHER_SHOCK, DEMORALIZING_SCREECH, INTIMIDATION; + uint32 AUTO_SHOT, HUNTERS_MARK, ARCANE_SHOT, CONCUSSIVE_SHOT, DISTRACTING_SHOT, MULTI_SHOT, EXPLOSIVE_SHOT, SERPENT_STING, SCORPID_STING, VIPER_STING, WYVERN_STING, AIMED_SHOT, STEADY_SHOT, CHIMERA_SHOT, VOLLEY, BLACK_ARROW, KILL_SHOT; + uint32 RAPTOR_STRIKE, WING_CLIP, MONGOOSE_BITE, DISENGAGE, DETERRENCE; + uint32 BEAR_TRAP, FREEZING_TRAP, IMMOLATION_TRAP, FROST_TRAP, EXPLOSIVE_TRAP, ARCANE_TRAP, SNAKE_TRAP; + uint32 ASPECT_OF_THE_HAWK, ASPECT_OF_THE_MONKEY, RAPID_FIRE, TRUESHOT_AURA, MISDIRECTION; - // first aid - uint32 RECENTLY_BANDAGED; + // first aid + uint32 RECENTLY_BANDAGED; - // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + // racial + uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; }; #endif diff --git a/src/game/playerbot/PlayerbotMageAI.cpp b/src/game/playerbot/PlayerbotMageAI.cpp index e9437f08c..5f19b521b 100644 --- a/src/game/playerbot/PlayerbotMageAI.cpp +++ b/src/game/playerbot/PlayerbotMageAI.cpp @@ -3,7 +3,7 @@ class PlayerbotAI; -PlayerbotMageAI::PlayerbotMageAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) +PlayerbotMageAI::PlayerbotMageAI(Player* const master, Player* const bot, PlayerbotAI* const ai) : PlayerbotClassAI(master, bot, ai) { ARCANE_MISSILES = ai->initSpell(ARCANE_MISSILES_1); ARCANE_EXPLOSION = ai->initSpell(ARCANE_EXPLOSION_1); @@ -79,13 +79,13 @@ void PlayerbotMageAI::DoNextCombatManeuver(Unit *pTarget) // ------- Non Duel combat ---------- - //ai->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, GetMaster() ); // dont want to melee mob + //ai->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, GetMaster() ); // dont want to melee mob // Damage Spells (primitive example) - ai->SetInFront( pTarget ); + ai->SetInFront(pTarget); Player *m_bot = GetPlayerBot(); - Unit* pVictim = pTarget->getVictim(); - float dist = m_bot->GetDistance( pTarget ); + Unit* pVictim = pTarget->getVictim(); + float dist = m_bot->GetDistance(pTarget); switch (SpellSequence) { @@ -94,236 +94,236 @@ void PlayerbotMageAI::DoNextCombatManeuver(Unit *pTarget) { ai->CastSpell(ICY_VEINS, *m_bot); SpellSequence = SPELL_FIRE; - LastSpellFrost = LastSpellFrost +1; + LastSpellFrost = LastSpellFrost + 1; break; } else if (FROSTBOLT > 0 && LastSpellFrost < 2 && !pTarget->HasAura(FROSTBOLT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 16) { ai->CastSpell(FROSTBOLT, *pTarget); SpellSequence = SPELL_FIRE; - LastSpellFrost = LastSpellFrost +1; + LastSpellFrost = LastSpellFrost + 1; break; } - else if (FROST_WARD > 0 && LastSpellFrost < 3 && !m_bot->HasAura(FROST_WARD, EFFECT_INDEX_0) && ai->GetManaPercent() >= 19) + else if (FROST_WARD > 0 && LastSpellFrost < 3 && !m_bot->HasAura(FROST_WARD, EFFECT_INDEX_0) && ai->GetManaPercent() >= 19) { ai->CastSpell(FROST_WARD, *m_bot); SpellSequence = SPELL_FIRE; - LastSpellFrost = LastSpellFrost +1; + LastSpellFrost = LastSpellFrost + 1; break; } else if (FROST_NOVA > 0 && LastSpellFrost < 4 && dist <= ATTACK_DISTANCE && !pTarget->HasAura(FROST_NOVA, EFFECT_INDEX_0) && ai->GetManaPercent() >= 10) { ai->CastSpell(FROST_NOVA, *pTarget); SpellSequence = SPELL_FIRE; - LastSpellFrost = LastSpellFrost +1; + LastSpellFrost = LastSpellFrost + 1; break; } - else if (ICE_LANCE > 0 && LastSpellFrost < 5 && ai->GetManaPercent() >= 7) + else if (ICE_LANCE > 0 && LastSpellFrost < 5 && ai->GetManaPercent() >= 7) { ai->CastSpell(ICE_LANCE, *pTarget); SpellSequence = SPELL_FIRE; - LastSpellFrost = LastSpellFrost +1; + LastSpellFrost = LastSpellFrost + 1; break; } - else if (BLIZZARD > 0 && LastSpellFrost < 6 && ai->GetAttackerCount()>=5 && ai->GetManaPercent() >= 89) + else if (BLIZZARD > 0 && LastSpellFrost < 6 && ai->GetAttackerCount() >= 5 && ai->GetManaPercent() >= 89) { ai->CastSpell(BLIZZARD, *pTarget); - ai->SetIgnoreUpdateTime(8); + ai->SetIgnoreUpdateTime(8); SpellSequence = SPELL_FIRE; - LastSpellFrost = LastSpellFrost +1; + LastSpellFrost = LastSpellFrost + 1; break; } else if (CONE_OF_COLD > 0 && LastSpellFrost < 7 && dist <= ATTACK_DISTANCE && !pTarget->HasAura(CONE_OF_COLD, EFFECT_INDEX_0) && ai->GetManaPercent() >= 35) { ai->CastSpell(CONE_OF_COLD, *pTarget); SpellSequence = SPELL_FIRE; - LastSpellFrost = LastSpellFrost +1; + LastSpellFrost = LastSpellFrost + 1; break; } - else if (DEEP_FREEZE > 0 && LastSpellFrost < 8 && pTarget->HasAura(AURA_STATE_FROZEN, EFFECT_INDEX_0) && !pTarget->HasAura(DEEP_FREEZE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 9) + else if (DEEP_FREEZE > 0 && LastSpellFrost < 8 && pTarget->HasAura(AURA_STATE_FROZEN, EFFECT_INDEX_0) && !pTarget->HasAura(DEEP_FREEZE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 9) { ai->CastSpell(DEEP_FREEZE, *pTarget); SpellSequence = SPELL_FIRE; - LastSpellFrost = LastSpellFrost +1; + LastSpellFrost = LastSpellFrost + 1; break; } else if (ICE_BARRIER > 0 && LastSpellFrost < 9 && pVictim == m_bot && !m_bot->HasAura(ICE_BARRIER, EFFECT_INDEX_0) && ai->GetHealthPercent() < 50 && ai->GetManaPercent() >= 30) { ai->CastSpell(ICE_BARRIER, *m_bot); SpellSequence = SPELL_FIRE; - LastSpellFrost = LastSpellFrost +1; + LastSpellFrost = LastSpellFrost + 1; break; } else if (SUMMON_WATER_ELEMENTAL > 0 && LastSpellFrost < 10 && ai->GetManaPercent() >= 16) { ai->CastSpell(SUMMON_WATER_ELEMENTAL); SpellSequence = SPELL_FIRE; - LastSpellFrost = LastSpellFrost +1; + LastSpellFrost = LastSpellFrost + 1; break; } - else if (ICE_BLOCK > 0 && LastSpellFrost < 11 && pVictim == m_bot && !m_bot->HasAura(ICE_BLOCK, EFFECT_INDEX_0) && ai->GetHealthPercent() < 30) + else if (ICE_BLOCK > 0 && LastSpellFrost < 11 && pVictim == m_bot && !m_bot->HasAura(ICE_BLOCK, EFFECT_INDEX_0) && ai->GetHealthPercent() < 30) { ai->CastSpell(ICE_BLOCK, *m_bot); SpellSequence = SPELL_FIRE; - LastSpellFrost = LastSpellFrost +1; + LastSpellFrost = LastSpellFrost + 1; break; } - else if (COLD_SNAP > 0 && LastSpellFrost < 12) + else if (COLD_SNAP > 0 && LastSpellFrost < 12) { ai->CastSpell(COLD_SNAP, *m_bot); SpellSequence = SPELL_FIRE; - LastSpellFrost = LastSpellFrost +1; + LastSpellFrost = LastSpellFrost + 1; break; } LastSpellFrost = 0; - //SpellSequence = SPELL_FIRE; - //break; + //SpellSequence = SPELL_FIRE; + //break; case SPELL_FIRE: - if (FIRE_WARD > 0 && !m_bot->HasAura(FIRE_WARD, EFFECT_INDEX_0) && LastSpellFire < 1 && ai->GetManaPercent() >= 3) + if (FIRE_WARD > 0 && !m_bot->HasAura(FIRE_WARD, EFFECT_INDEX_0) && LastSpellFire < 1 && ai->GetManaPercent() >= 3) { ai->CastSpell(FIRE_WARD, *m_bot); SpellSequence = SPELL_ARCANE; - LastSpellFire = LastSpellFire +1; + LastSpellFire = LastSpellFire + 1; break; } - else if (COMBUSTION > 0 && !m_bot->HasAura(COMBUSTION, EFFECT_INDEX_0) && LastSpellFire < 2) + else if (COMBUSTION > 0 && !m_bot->HasAura(COMBUSTION, EFFECT_INDEX_0) && LastSpellFire < 2) { ai->CastSpell(COMBUSTION, *m_bot); SpellSequence = SPELL_ARCANE; - LastSpellFire = LastSpellFire +1; + LastSpellFire = LastSpellFire + 1; break; } else if (FIREBALL > 0 && LastSpellFire < 3 && ai->GetManaPercent() >= 23) { ai->CastSpell(FIREBALL, *pTarget); SpellSequence = SPELL_ARCANE; - LastSpellFire = LastSpellFire +1; + LastSpellFire = LastSpellFire + 1; break; } else if (FIRE_BLAST > 0 && LastSpellFire < 4 && ai->GetManaPercent() >= 25) { ai->CastSpell(FIRE_BLAST, *pTarget); SpellSequence = SPELL_ARCANE; - LastSpellFire = LastSpellFire +1; + LastSpellFire = LastSpellFire + 1; break; } else if (FLAMESTRIKE > 0 && LastSpellFire < 5 && ai->GetManaPercent() >= 35) { ai->CastSpell(FLAMESTRIKE, *pTarget); SpellSequence = SPELL_ARCANE; - LastSpellFire = LastSpellFire +1; + LastSpellFire = LastSpellFire + 1; break; } else if (SCORCH > 0 && LastSpellFire < 6 && ai->GetManaPercent() >= 10) { ai->CastSpell(SCORCH, *pTarget); SpellSequence = SPELL_ARCANE; - LastSpellFire = LastSpellFire +1; + LastSpellFire = LastSpellFire + 1; break; } else if (PYROBLAST > 0 && LastSpellFire < 7 && !pTarget->HasAura(PYROBLAST, EFFECT_INDEX_0) && ai->GetManaPercent() >= 27) { ai->CastSpell(PYROBLAST, *pTarget); SpellSequence = SPELL_ARCANE; - LastSpellFire = LastSpellFire +1; + LastSpellFire = LastSpellFire + 1; break; } - else if (BLAST_WAVE > 0 && LastSpellFire < 8 && ai->GetAttackerCount()>=3 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >= 34) + else if (BLAST_WAVE > 0 && LastSpellFire < 8 && ai->GetAttackerCount() >= 3 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >= 34) { ai->CastSpell(BLAST_WAVE, *pTarget); SpellSequence = SPELL_ARCANE; - LastSpellFire = LastSpellFire +1; + LastSpellFire = LastSpellFire + 1; break; } else if (DRAGONS_BREATH > 0 && LastSpellFire < 9 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >= 37) { ai->CastSpell(DRAGONS_BREATH, *pTarget); SpellSequence = SPELL_ARCANE; - LastSpellFire = LastSpellFire +1; + LastSpellFire = LastSpellFire + 1; break; } else if (LIVING_BOMB > 0 && LastSpellFire < 10 && !pTarget->HasAura(LIVING_BOMB, EFFECT_INDEX_0) && ai->GetManaPercent() >= 27) { ai->CastSpell(LIVING_BOMB, *pTarget); SpellSequence = SPELL_ARCANE; - LastSpellFire = LastSpellFire +1; + LastSpellFire = LastSpellFire + 1; break; } else if (FROSTFIRE_BOLT > 0 && LastSpellFire < 11 && !pTarget->HasAura(FROSTFIRE_BOLT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 14) { ai->CastSpell(FROSTFIRE_BOLT, *pTarget); SpellSequence = SPELL_ARCANE; - LastSpellFire = LastSpellFire +1; + LastSpellFire = LastSpellFire + 1; break; } LastSpellFire = 0; - //SpellSequence = SPELL_ARCANE; - //break; + //SpellSequence = SPELL_ARCANE; + //break; case SPELL_ARCANE: if (ARCANE_POWER > 0 && LastSpellArcane < 1 && ai->GetManaPercent() >= 37) { ai->CastSpell(ARCANE_POWER, *pTarget); SpellSequence = SPELL_FROST; - LastSpellArcane = LastSpellArcane +1; + LastSpellArcane = LastSpellArcane + 1; break; } - else if (ARCANE_MISSILES > 0 && LastSpellArcane < 2 && ai->GetManaPercent() >= 37) + else if (ARCANE_MISSILES > 0 && LastSpellArcane < 2 && ai->GetManaPercent() >= 37) { ai->CastSpell(ARCANE_MISSILES, *pTarget); - ai->SetIgnoreUpdateTime(3); + ai->SetIgnoreUpdateTime(3); SpellSequence = SPELL_FROST; - LastSpellArcane = LastSpellArcane +1; + LastSpellArcane = LastSpellArcane + 1; break; } - else if (ARCANE_EXPLOSION > 0 && LastSpellArcane < 3 && ai->GetAttackerCount()>=3 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >= 27) + else if (ARCANE_EXPLOSION > 0 && LastSpellArcane < 3 && ai->GetAttackerCount() >= 3 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >= 27) { ai->CastSpell(ARCANE_EXPLOSION, *pTarget); SpellSequence = SPELL_FROST; - LastSpellArcane = LastSpellArcane +1; + LastSpellArcane = LastSpellArcane + 1; break; } else if (COUNTERSPELL > 0 && pTarget->IsNonMeleeSpellCasted(true) && LastSpellArcane < 4 && ai->GetManaPercent() >= 9) { ai->CastSpell(COUNTERSPELL, *pTarget); SpellSequence = SPELL_FROST; - LastSpellArcane = LastSpellArcane +1; + LastSpellArcane = LastSpellArcane + 1; break; } else if (SLOW > 0 && LastSpellArcane < 5 && !pTarget->HasAura(SLOW, EFFECT_INDEX_0) && ai->GetManaPercent() >= 12) { ai->CastSpell(SLOW, *pTarget); SpellSequence = SPELL_FROST; - LastSpellArcane = LastSpellArcane +1; + LastSpellArcane = LastSpellArcane + 1; break; } else if (ARCANE_BARRAGE > 0 && LastSpellArcane < 6 && ai->GetManaPercent() >= 27) { ai->CastSpell(ARCANE_BARRAGE, *pTarget); SpellSequence = SPELL_FROST; - LastSpellArcane = LastSpellArcane +1; + LastSpellArcane = LastSpellArcane + 1; break; } else if (ARCANE_BLAST > 0 && LastSpellArcane < 7 && ai->GetManaPercent() >= 8) { ai->CastSpell(ARCANE_BLAST, *pTarget); SpellSequence = SPELL_FROST; - LastSpellArcane = LastSpellArcane +1; + LastSpellArcane = LastSpellArcane + 1; break; } else if (MIRROR_IMAGE > 0 && LastSpellArcane < 8 && ai->GetManaPercent() >= 10) { ai->CastSpell(MIRROR_IMAGE); SpellSequence = SPELL_FROST; - LastSpellArcane = LastSpellArcane +1; + LastSpellArcane = LastSpellArcane + 1; break; } - else if (MANA_SHIELD > 0 && LastSpellArcane < 9 && ai->GetHealthPercent() < 70 && pVictim == m_bot && !m_bot->HasAura(MANA_SHIELD, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) + else if (MANA_SHIELD > 0 && LastSpellArcane < 9 && ai->GetHealthPercent() < 70 && pVictim == m_bot && !m_bot->HasAura(MANA_SHIELD, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) { ai->CastSpell(MANA_SHIELD, *m_bot); SpellSequence = SPELL_FROST; - LastSpellArcane = LastSpellArcane +1; + LastSpellArcane = LastSpellArcane + 1; break; } else @@ -341,12 +341,12 @@ void PlayerbotMageAI::DoNonCombatActions() return; SpellSequence = SPELL_FROST; - PlayerbotAI* ai = GetAI(); + PlayerbotAI* ai = GetAI(); // buff master - if (DALARAN_BRILLIANCE > 0) + if (DALARAN_BRILLIANCE > 0) (!GetMaster()->HasAura(DALARAN_BRILLIANCE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 81 && ai->CastSpell (DALARAN_BRILLIANCE, *GetMaster())); - else if (ARCANE_BRILLIANCE > 0) + else if (ARCANE_BRILLIANCE > 0) (!GetMaster()->HasAura(ARCANE_BRILLIANCE, EFFECT_INDEX_0) && !GetMaster()->HasAura(DALARAN_BRILLIANCE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 97 && ai->CastSpell (ARCANE_BRILLIANCE, *GetMaster())); // buff myself @@ -357,27 +357,27 @@ void PlayerbotMageAI::DoNonCombatActions() if (MOLTEN_ARMOR > 0) (!m_bot->HasAura(MOLTEN_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(MAGE_ARMOR, EFFECT_INDEX_0) && ai->GetManaPercent() >= 31 && ai->CastSpell (MOLTEN_ARMOR, *m_bot)); - else if (MAGE_ARMOR > 0) + else if (MAGE_ARMOR > 0) (!m_bot->HasAura(MAGE_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(MOLTEN_ARMOR, EFFECT_INDEX_0) && ai->GetManaPercent() >= 31 && ai->CastSpell (MAGE_ARMOR, *m_bot)); - else if (ICE_ARMOR > 0) + else if (ICE_ARMOR > 0) (!m_bot->HasAura(ICE_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(MOLTEN_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(MAGE_ARMOR, EFFECT_INDEX_0) && ai->GetManaPercent() >= 34 && ai->CastSpell (ICE_ARMOR, *m_bot)); else if (FROST_ARMOR > 0) (!m_bot->HasAura(FROST_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(MOLTEN_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(MAGE_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(ICE_ARMOR, EFFECT_INDEX_0) && ai->GetManaPercent() >= 34 && ai->CastSpell (FROST_ARMOR, *m_bot)); - // buff master's group + // buff master's group if (GetMaster()->GetGroup()) { Group::MemberSlotList const& groupSlot = GetMaster()->GetGroup()->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { Player *tPlayer = sObjectMgr.GetPlayer(itr->guid); - if( !tPlayer || !tPlayer->isAlive() ) + if (!tPlayer || !tPlayer->isAlive()) continue; - // buff - (!tPlayer->HasAura(ARCANE_INTELLECT, EFFECT_INDEX_0) && !tPlayer->HasAura(DALARAN_BRILLIANCE, EFFECT_INDEX_0) && !tPlayer->HasAura(ARCANE_BRILLIANCE, EFFECT_INDEX_0) && !tPlayer->HasAura(DALARAN_INTELLECT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 37 && ai->CastSpell (ARCANE_INTELLECT, *tPlayer)); - (!tPlayer->HasAura(DALARAN_INTELLECT, EFFECT_INDEX_0) && !tPlayer->HasAura(DALARAN_BRILLIANCE, EFFECT_INDEX_0) && !tPlayer->HasAura(ARCANE_BRILLIANCE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 31 && ai->CastSpell (DALARAN_INTELLECT, *tPlayer)); - (!tPlayer->HasAura(DAMPEN_MAGIC, EFFECT_INDEX_0) && !tPlayer->HasAura(AMPLIFY_MAGIC, EFFECT_INDEX_0) && ai->GetManaPercent() >= 32 && ai->CastSpell (DAMPEN_MAGIC, *tPlayer)); - (!tPlayer->HasAura(AMPLIFY_MAGIC, EFFECT_INDEX_0) && !tPlayer->HasAura(DAMPEN_MAGIC, EFFECT_INDEX_0) && ai->GetManaPercent() >= 32 && ai->CastSpell (AMPLIFY_MAGIC, *tPlayer)); + // buff + (!tPlayer->HasAura(ARCANE_INTELLECT, EFFECT_INDEX_0) && !tPlayer->HasAura(DALARAN_BRILLIANCE, EFFECT_INDEX_0) && !tPlayer->HasAura(ARCANE_BRILLIANCE, EFFECT_INDEX_0) && !tPlayer->HasAura(DALARAN_INTELLECT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 37 && ai->CastSpell (ARCANE_INTELLECT, *tPlayer)); + (!tPlayer->HasAura(DALARAN_INTELLECT, EFFECT_INDEX_0) && !tPlayer->HasAura(DALARAN_BRILLIANCE, EFFECT_INDEX_0) && !tPlayer->HasAura(ARCANE_BRILLIANCE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 31 && ai->CastSpell (DALARAN_INTELLECT, *tPlayer)); + (!tPlayer->HasAura(DAMPEN_MAGIC, EFFECT_INDEX_0) && !tPlayer->HasAura(AMPLIFY_MAGIC, EFFECT_INDEX_0) && ai->GetManaPercent() >= 32 && ai->CastSpell (DAMPEN_MAGIC, *tPlayer)); + (!tPlayer->HasAura(AMPLIFY_MAGIC, EFFECT_INDEX_0) && !tPlayer->HasAura(DAMPEN_MAGIC, EFFECT_INDEX_0) && ai->GetManaPercent() >= 32 && ai->CastSpell (AMPLIFY_MAGIC, *tPlayer)); } } @@ -386,13 +386,13 @@ void PlayerbotMageAI::DoNonCombatActions() m_bot->SetStandState(UNIT_STAND_STATE_STAND); Item* pItem = ai->FindDrink(); - Item* fItem = ai->FindBandage(); + Item* fItem = ai->FindBandage(); if (pItem == NULL && CONJURE_WATER && ai->GetBaseManaPercent() >= 48) { ai->TellMaster("I'm conjuring some water."); ai->CastSpell(CONJURE_WATER, *m_bot); - ai->SetIgnoreUpdateTime(3); + ai->SetIgnoreUpdateTime(3); return; } else if (pItem != NULL && ai->GetManaPercent() < 30) @@ -409,7 +409,7 @@ void PlayerbotMageAI::DoNonCombatActions() { ai->TellMaster("I'm conjuring some food."); ai->CastSpell(CONJURE_FOOD, *m_bot); - ai->SetIgnoreUpdateTime(3); + ai->SetIgnoreUpdateTime(3); } // hp check @@ -425,7 +425,7 @@ void PlayerbotMageAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(30); return; } - else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) + else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(*fItem); diff --git a/src/game/playerbot/PlayerbotMageAI.h b/src/game/playerbot/PlayerbotMageAI.h index 509e3a35b..2dfe09c94 100644 --- a/src/game/playerbot/PlayerbotMageAI.h +++ b/src/game/playerbot/PlayerbotMageAI.h @@ -72,39 +72,39 @@ enum MageSpells class MANGOS_DLL_SPEC PlayerbotMageAI : PlayerbotClassAI { - public: - PlayerbotMageAI(Player* const master, Player* const bot, PlayerbotAI* const ai); - virtual ~PlayerbotMageAI(); +public: + PlayerbotMageAI(Player * const master, Player * const bot, PlayerbotAI * const ai); + virtual ~PlayerbotMageAI(); - // all combat actions go here - void DoNextCombatManeuver(Unit*); + // all combat actions go here + void DoNextCombatManeuver(Unit*); - // all non combat actions go here, ex buffs, heals, rezzes - void DoNonCombatActions(); + // all non combat actions go here, ex buffs, heals, rezzes + void DoNonCombatActions(); - // buff a specific player, usually a real PC who is not in group - void BuffPlayer(Player *target); + // buff a specific player, usually a real PC who is not in group + void BuffPlayer(Player *target); - private: - // ARCANE - uint32 ARCANE_MISSILES, ARCANE_EXPLOSION, COUNTERSPELL, SLOW, ARCANE_BARRAGE, ARCANE_BLAST, MIRROR_IMAGE, ARCANE_POWER; +private: + // ARCANE + uint32 ARCANE_MISSILES, ARCANE_EXPLOSION, COUNTERSPELL, SLOW, ARCANE_BARRAGE, ARCANE_BLAST, MIRROR_IMAGE, ARCANE_POWER; - // FIRE - uint32 FIREBALL, FIRE_BLAST, FLAMESTRIKE, SCORCH, PYROBLAST, BLAST_WAVE, COMBUSTION, DRAGONS_BREATH, LIVING_BOMB, FROSTFIRE_BOLT, FIRE_WARD; + // FIRE + uint32 FIREBALL, FIRE_BLAST, FLAMESTRIKE, SCORCH, PYROBLAST, BLAST_WAVE, COMBUSTION, DRAGONS_BREATH, LIVING_BOMB, FROSTFIRE_BOLT, FIRE_WARD; - // FROST - uint32 DEEP_FREEZE, FROSTBOLT, FROST_NOVA, BLIZZARD, ICY_VEINS, CONE_OF_COLD, ICE_BARRIER, SUMMON_WATER_ELEMENTAL, ICE_LANCE, FROST_WARD, ICE_BLOCK, COLD_SNAP; + // FROST + uint32 DEEP_FREEZE, FROSTBOLT, FROST_NOVA, BLIZZARD, ICY_VEINS, CONE_OF_COLD, ICE_BARRIER, SUMMON_WATER_ELEMENTAL, ICE_LANCE, FROST_WARD, ICE_BLOCK, COLD_SNAP; - // buffs - uint32 FROST_ARMOR, ICE_ARMOR, MAGE_ARMOR, MOLTEN_ARMOR, ARCANE_INTELLECT, ARCANE_BRILLIANCE, DALARAN_INTELLECT, DALARAN_BRILLIANCE, MANA_SHIELD, DAMPEN_MAGIC, AMPLIFY_MAGIC; + // buffs + uint32 FROST_ARMOR, ICE_ARMOR, MAGE_ARMOR, MOLTEN_ARMOR, ARCANE_INTELLECT, ARCANE_BRILLIANCE, DALARAN_INTELLECT, DALARAN_BRILLIANCE, MANA_SHIELD, DAMPEN_MAGIC, AMPLIFY_MAGIC; - // first aid - uint32 RECENTLY_BANDAGED; + // first aid + uint32 RECENTLY_BANDAGED; - // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + // racial + uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; - uint32 SpellSequence, LastSpellArcane, LastSpellFire, LastSpellFrost, CONJURE_WATER, CONJURE_FOOD; + uint32 SpellSequence, LastSpellArcane, LastSpellFire, LastSpellFrost, CONJURE_WATER, CONJURE_FOOD; }; #endif diff --git a/src/game/playerbot/PlayerbotMgr.cpp b/src/game/playerbot/PlayerbotMgr.cpp index 217cc0d34..e5dc44814 100644 --- a/src/game/playerbot/PlayerbotMgr.cpp +++ b/src/game/playerbot/PlayerbotMgr.cpp @@ -18,15 +18,15 @@ Config botConfig; PlayerbotMgr::PlayerbotMgr(Player* const master) : m_master(master) { // load config variables - m_confMaxNumBots = botConfig.GetIntDefault( "PlayerbotAI.MaxNumBots", 9 ); - m_confDebugWhisper = botConfig.GetBoolDefault( "PlayerbotAI.DebugWhisper", false ); - m_confFollowDistance[0] = botConfig.GetFloatDefault( "PlayerbotAI.FollowDistanceMin", 0.5f ); - m_confFollowDistance[1] = botConfig.GetFloatDefault( "PlayerbotAI.FollowDistanceMin", 1.0f ); + m_confMaxNumBots = botConfig.GetIntDefault("PlayerbotAI.MaxNumBots", 9); + m_confDebugWhisper = botConfig.GetBoolDefault("PlayerbotAI.DebugWhisper", false); + m_confFollowDistance[0] = botConfig.GetFloatDefault("PlayerbotAI.FollowDistanceMin", 0.5f); + m_confFollowDistance[1] = botConfig.GetFloatDefault("PlayerbotAI.FollowDistanceMin", 1.0f); } PlayerbotMgr::~PlayerbotMgr() { - LogoutAllBots(); + LogoutAllBots(); } void PlayerbotMgr::UpdateAI(const uint32 p_time) {} @@ -65,9 +65,9 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) p >> emoteNum; /* std::ostringstream out; - out << "emote is: " << emoteNum; - ChatHandler ch(m_master); - ch.SendSysMessage(out.str().c_str()); */ + out << "emote is: " << emoteNum; + ChatHandler ch(m_master); + ch.SendSysMessage(out.str().c_str()); */ switch (emoteNum) { @@ -81,8 +81,8 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) return; } /* - case TEXTEMOTE_BONK: - { + case TEXTEMOTE_BONK: + { Player* const pPlayer = GetPlayerBot(m_master->GetSelection()); if (!pPlayer || !pPlayer->GetPlayerbotAI()) return; @@ -123,8 +123,8 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) ch.SendSysMessage(out.str().c_str()); } return; - } - */ + } + */ case TEXTEMOTE_EAT: case TEXTEMOTE_DRINK: @@ -141,17 +141,17 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) case TEXTEMOTE_POINT: { uint64 attackOnGuid = m_master->GetSelection(); - if( !attackOnGuid ) return; + if (!attackOnGuid) return; Unit* thingToAttack = ObjectAccessor::GetUnit(*m_master, attackOnGuid); - if( !thingToAttack ) return; + if (!thingToAttack) return; Player *bot = 0; - for( PlayerBotMap::iterator itr=m_playerBots.begin(); itr!=m_playerBots.end(); ++itr ) + for (PlayerBotMap::iterator itr = m_playerBots.begin(); itr != m_playerBots.end(); ++itr) { bot = itr->second; if (!bot->IsFriendlyTo(thingToAttack) && bot->IsWithinLOSInMap(thingToAttack)) - bot->GetPlayerbotAI()->GetCombatTarget( thingToAttack ); + bot->GetPlayerbotAI()->GetCombatTarget(thingToAttack); } return; } @@ -161,13 +161,13 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) { Player* const bot = GetPlayerBot(m_master->GetSelection()); if (bot) - bot->GetPlayerbotAI()->SetMovementOrder( PlayerbotAI::MOVEMENT_STAY ); + bot->GetPlayerbotAI()->SetMovementOrder(PlayerbotAI::MOVEMENT_STAY); else { for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) { Player* const bot = it->second; - bot->GetPlayerbotAI()->SetMovementOrder( PlayerbotAI::MOVEMENT_STAY ); + bot->GetPlayerbotAI()->SetMovementOrder(PlayerbotAI::MOVEMENT_STAY); } } return; @@ -180,13 +180,13 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) { Player* const bot = GetPlayerBot(m_master->GetSelection()); if (bot) - bot->GetPlayerbotAI()->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, m_master ); + bot->GetPlayerbotAI()->SetMovementOrder(PlayerbotAI::MOVEMENT_FOLLOW, m_master); else { for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) { Player* const bot = it->second; - bot->GetPlayerbotAI()->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, m_master); + bot->GetPlayerbotAI()->SetMovementOrder(PlayerbotAI::MOVEMENT_FOLLOW, m_master); } } return; @@ -196,248 +196,248 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) } /* EMOTE ends here */ case CMSG_GAMEOBJ_USE: - { - WorldPacket p(packet); - p.rpos(0); // reset reader - uint64 objGUID; - p >> objGUID; + { + WorldPacket p(packet); + p.rpos(0); // reset reader + uint64 objGUID; + p >> objGUID; - GameObject *obj = m_master->GetMap()->GetGameObject( objGUID ); - if( !obj ) - return; + GameObject *obj = m_master->GetMap()->GetGameObject(objGUID); + if (!obj) + return; - for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) - { - Player* const bot = it->second; + for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) + { + Player* const bot = it->second; - if( obj->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER ) - { - bot->GetPlayerbotAI()->TurnInQuests( obj ); - } - // add other go types here, i.e.: - // GAMEOBJECT_TYPE_CHEST - loot quest items of chest + if (obj->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) + { + bot->GetPlayerbotAI()->TurnInQuests(obj); } + // add other go types here, i.e.: + // GAMEOBJECT_TYPE_CHEST - loot quest items of chest } - break; + } + break; // if master talks to an NPC case CMSG_GOSSIP_HELLO: case CMSG_QUESTGIVER_HELLO: { - WorldPacket p(packet); - p.rpos(0); // reset reader - uint64 npcGUID; - p >> npcGUID; + WorldPacket p(packet); + p.rpos(0); // reset reader + uint64 npcGUID; + p >> npcGUID; - WorldObject* pNpc = m_master->GetMap()->GetWorldObject( npcGUID ); - if (!pNpc) - return; + WorldObject* pNpc = m_master->GetMap()->GetWorldObject(npcGUID); + if (!pNpc) + return; - // for all master's bots - for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) - { - Player* const bot = it->second; - bot->GetPlayerbotAI()->TurnInQuests( pNpc ); - } + // for all master's bots + for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) + { + Player* const bot = it->second; + bot->GetPlayerbotAI()->TurnInQuests(pNpc); + } - return; + return; } // if master accepts a quest, bots should also try to accept quest case CMSG_QUESTGIVER_ACCEPT_QUEST: { - WorldPacket p(packet); - p.rpos(0); // reset reader - uint64 guid; - uint32 quest; - p >> guid >> quest; - Quest const* qInfo = sObjectMgr.GetQuestTemplate(quest); - if (qInfo) - { - for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) + WorldPacket p(packet); + p.rpos(0); // reset reader + uint64 guid; + uint32 quest; + p >> guid >> quest; + Quest const* qInfo = sObjectMgr.GetQuestTemplate(quest); + if (qInfo) + { + for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) + { + Player* const bot = it->second; + + if (bot->GetQuestStatus(quest) == QUEST_STATUS_COMPLETE) + bot->GetPlayerbotAI()->TellMaster("I already completed that quest."); + else if (!bot->CanTakeQuest(qInfo, false)) { - Player* const bot = it->second; - - if (bot->GetQuestStatus(quest) == QUEST_STATUS_COMPLETE) - bot->GetPlayerbotAI()->TellMaster("I already completed that quest."); - else if (! bot->CanTakeQuest(qInfo, false)) - { - if (! bot->SatisfyQuestStatus(qInfo, false)) - bot->GetPlayerbotAI()->TellMaster("I already have that quest."); - else - bot->GetPlayerbotAI()->TellMaster("I can't take that quest."); - } - else if (! bot->SatisfyQuestLog(false)) - bot->GetPlayerbotAI()->TellMaster("My quest log is full."); - else if (! bot->CanAddQuest(qInfo, false)) - bot->GetPlayerbotAI()->TellMaster("I can't take that quest because it requires that I take items, but my bags are full!"); - - else - { - p.rpos(0); // reset reader - bot->GetSession()->HandleQuestgiverAcceptQuestOpcode(p); - bot->GetPlayerbotAI()->TellMaster("Got the quest."); - } + if (!bot->SatisfyQuestStatus(qInfo, false)) + bot->GetPlayerbotAI()->TellMaster("I already have that quest."); + else + bot->GetPlayerbotAI()->TellMaster("I can't take that quest."); } - } - return; + else if (!bot->SatisfyQuestLog(false)) + bot->GetPlayerbotAI()->TellMaster("My quest log is full."); + else if (!bot->CanAddQuest(qInfo, false)) + bot->GetPlayerbotAI()->TellMaster("I can't take that quest because it requires that I take items, but my bags are full!"); + + else + { + p.rpos(0); // reset reader + bot->GetSession()->HandleQuestgiverAcceptQuestOpcode(p); + bot->GetPlayerbotAI()->TellMaster("Got the quest."); + } + } + } + return; } case CMSG_LOOT_ROLL: { - WorldPacket p(packet); //WorldPacket packet for CMSG_LOOT_ROLL, (8+4+1) - uint64 Guid; - uint32 NumberOfPlayers; - uint8 rollType; - p.rpos(0); //reset packet pointer - p >> Guid; //guid of the item rolled - p >> NumberOfPlayers; //number of players invited to roll - p >> rollType; //need,greed or pass on roll + WorldPacket p(packet); //WorldPacket packet for CMSG_LOOT_ROLL, (8+4+1) + uint64 Guid; + uint32 NumberOfPlayers; + uint8 rollType; + p.rpos(0); //reset packet pointer + p >> Guid; //guid of the item rolled + p >> NumberOfPlayers; //number of players invited to roll + p >> rollType; //need,greed or pass on roll - for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) - { + for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) + { - uint32 choice = urand(0,3); //returns 0,1,2 or 3 + uint32 choice = urand(0, 3); //returns 0,1,2 or 3 - Player* const bot = it->second; - if(!bot) - return; + Player* const bot = it->second; + if (!bot) + return; - Group* group = bot->GetGroup(); - if(!group) - return; + Group* group = bot->GetGroup(); + if (!group) + return; - group->CountRollVote(bot, Guid, NumberOfPlayers, RollVote(choice)); + group->CountRollVote(bot, Guid, NumberOfPlayers, RollVote(choice)); - switch (choice) - { - case ROLL_NEED: - bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED, 1); - break; - case ROLL_GREED: - bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED, 1); - break; - } - } - return; + switch (choice) + { + case ROLL_NEED: + bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED, 1); + break; + case ROLL_GREED: + bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED, 1); + break; + } + } + return; } case CMSG_REPAIR_ITEM: { - WorldPacket p(packet); // WorldPacket packet for CMSG_REPAIR_ITEM, (8+8+1) + WorldPacket p(packet); // WorldPacket packet for CMSG_REPAIR_ITEM, (8+8+1) - sLog.outDebug("PlayerbotMgr: CMSG_REPAIR_ITEM"); + sLog.outDebug("PlayerbotMgr: CMSG_REPAIR_ITEM"); - uint64 npcGUID, itemGUID; - uint8 guildBank; + uint64 npcGUID, itemGUID; + uint8 guildBank; - p.rpos(0); //reset packet pointer - p >> npcGUID; - p >> itemGUID; // Not used for bot but necessary opcode data retrieval - p >> guildBank; // Flagged if guild repair selected + p.rpos(0); //reset packet pointer + p >> npcGUID; + p >> itemGUID; // Not used for bot but necessary opcode data retrieval + p >> guildBank; // Flagged if guild repair selected - for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) - { + for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) + { - Player* const bot = it->second; - if(!bot) - return; + Player* const bot = it->second; + if (!bot) + return; - Group* group = bot->GetGroup(); // check if bot is a member of group - if(!group) - return; + Group* group = bot->GetGroup(); // check if bot is a member of group + if (!group) + return; - Creature *unit = bot->GetNPCIfCanInteractWith(npcGUID, UNIT_NPC_FLAG_REPAIR); - if (!unit) // Check if NPC can repair bot or not - { - sLog.outDebug("PlayerbotMgr: HandleRepairItemOpcode - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(npcGUID))); - return; - } + Creature *unit = bot->GetNPCIfCanInteractWith(npcGUID, UNIT_NPC_FLAG_REPAIR); + if (!unit) // Check if NPC can repair bot or not + { + sLog.outDebug("PlayerbotMgr: HandleRepairItemOpcode - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(npcGUID))); + return; + } - // remove fake death - if(bot->hasUnitState(UNIT_STAT_DIED)) - bot->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); + // remove fake death + if (bot->hasUnitState(UNIT_STAT_DIED)) + bot->RemoveSpellsCausingAura(SPELL_AURA_FEIGN_DEATH); - // reputation discount - float discountMod = bot->GetReputationPriceDiscount(unit); + // reputation discount + float discountMod = bot->GetReputationPriceDiscount(unit); - uint32 TotalCost = 0; - if (itemGUID) // Handle redundant feature (repair individual item) for bot - { - sLog.outDebug("ITEM: Repair single item is not applicable for %s",bot->GetName()); - continue; - } - else // Handle feature (repair all items) for bot - { - sLog.outDebug("ITEM: Repair all items, npcGUID = %u", GUID_LOPART(npcGUID)); + uint32 TotalCost = 0; + if (itemGUID) // Handle redundant feature (repair individual item) for bot + { + sLog.outDebug("ITEM: Repair single item is not applicable for %s", bot->GetName()); + continue; + } + else // Handle feature (repair all items) for bot + { + sLog.outDebug("ITEM: Repair all items, npcGUID = %u", GUID_LOPART(npcGUID)); - TotalCost = bot->DurabilityRepairAll(true,discountMod,guildBank>0?true:false); - } - if (guildBank) // Handle guild repair - { - uint32 GuildId = bot->GetGuildId(); - if (!GuildId) - return; - Guild *pGuild = sObjectMgr.GetGuildById(GuildId); - if (!pGuild) - return; - pGuild->LogBankEvent(GUILD_BANK_LOG_REPAIR_MONEY, 0, bot->GetGUIDLow(), TotalCost); - pGuild->SendMoneyInfo(bot->GetSession(), bot->GetGUIDLow()); - } + TotalCost = bot->DurabilityRepairAll(true, discountMod, guildBank > 0 ? true : false); + } + if (guildBank) // Handle guild repair + { + uint32 GuildId = bot->GetGuildId(); + if (!GuildId) + return; + Guild *pGuild = sObjectMgr.GetGuildById(GuildId); + if (!pGuild) + return; + pGuild->LogBankEvent(GUILD_BANK_LOG_REPAIR_MONEY, 0, bot->GetGUIDLow(), TotalCost); + pGuild->SendMoneyInfo(bot->GetSession(), bot->GetGUIDLow()); + } - } - return; + } + return; } case CMSG_SPIRIT_HEALER_ACTIVATE: { - // sLog.outDebug("SpiritHealer is resurrecting the Player %s",m_master->GetName()); - for( PlayerBotMap::iterator itr=m_playerBots.begin(); itr!=m_playerBots.end(); ++itr ) - { - Player* const bot = itr->second; - Group *grp = bot->GetGroup(); - if(grp) - grp->RemoveMember(bot->GetGUID(),1); - } - return; - } - - /* - case CMSG_NAME_QUERY: - case MSG_MOVE_START_FORWARD: - case MSG_MOVE_STOP: - case MSG_MOVE_SET_FACING: - case MSG_MOVE_START_STRAFE_LEFT: - case MSG_MOVE_START_STRAFE_RIGHT: - case MSG_MOVE_STOP_STRAFE: - case MSG_MOVE_START_BACKWARD: - case MSG_MOVE_HEARTBEAT: - case CMSG_STANDSTATECHANGE: - case CMSG_QUERY_TIME: - case CMSG_CREATURE_QUERY: - case CMSG_GAMEOBJECT_QUERY: - case MSG_MOVE_JUMP: - case MSG_MOVE_FALL_LAND: + // sLog.outDebug("SpiritHealer is resurrecting the Player %s",m_master->GetName()); + for (PlayerBotMap::iterator itr = m_playerBots.begin(); itr != m_playerBots.end(); ++itr) + { + Player* const bot = itr->second; + Group *grp = bot->GetGroup(); + if (grp) + grp->RemoveMember(bot->GetGUID(), 1); + } return; + } - default: - { - const char* oc = LookupOpcodeName(packet.GetOpcode()); - // ChatHandler ch(m_master); - // ch.SendSysMessage(oc); + /* + case CMSG_NAME_QUERY: + case MSG_MOVE_START_FORWARD: + case MSG_MOVE_STOP: + case MSG_MOVE_SET_FACING: + case MSG_MOVE_START_STRAFE_LEFT: + case MSG_MOVE_START_STRAFE_RIGHT: + case MSG_MOVE_STOP_STRAFE: + case MSG_MOVE_START_BACKWARD: + case MSG_MOVE_HEARTBEAT: + case CMSG_STANDSTATECHANGE: + case CMSG_QUERY_TIME: + case CMSG_CREATURE_QUERY: + case CMSG_GAMEOBJECT_QUERY: + case MSG_MOVE_JUMP: + case MSG_MOVE_FALL_LAND: + return; + + default: + { + const char* oc = LookupOpcodeName(packet.GetOpcode()); + // ChatHandler ch(m_master); + // ch.SendSysMessage(oc); - std::ostringstream out; - out << "masterin: " << oc; - sLog.outError(out.str().c_str()); - } - */ + std::ostringstream out; + out << "masterin: " << oc; + sLog.outError(out.str().c_str()); + } + */ } } void PlayerbotMgr::HandleMasterOutgoingPacket(const WorldPacket& packet) { - /* - switch (packet.GetOpcode()) - { + /* + switch (packet.GetOpcode()) + { // maybe our bots should only start looting after the master loots? //case SMSG_LOOT_RELEASE_RESPONSE: {} case SMSG_NAME_QUERY_RESPONSE: @@ -460,8 +460,8 @@ void PlayerbotMgr::HandleMasterOutgoingPacket(const WorldPacket& packet) out << "masterout: " << oc; sLog.outError(out.str().c_str()); } - } - */ + } + */ } void PlayerbotMgr::LogoutAllBots() @@ -470,7 +470,7 @@ void PlayerbotMgr::LogoutAllBots() { PlayerBotMap::const_iterator itr = GetPlayerBotsBegin(); if (itr == GetPlayerBotsEnd()) break; - Player* bot= itr->second; + Player* bot = itr->second; LogoutPlayerBot(bot->GetGUID()); } } @@ -481,7 +481,7 @@ void PlayerbotMgr::Stay() { for (PlayerBotMap::const_iterator itr = GetPlayerBotsBegin(); itr != GetPlayerBotsEnd(); ++itr) { - Player* bot= itr->second; + Player* bot = itr->second; bot->GetMotionMaster()->Clear(); } } @@ -490,7 +490,7 @@ void PlayerbotMgr::Stay() // Playerbot mod: logs out a Playerbot. void PlayerbotMgr::LogoutPlayerBot(uint64 guid) { - Player* bot= GetPlayerBot(guid); + Player* bot = GetPlayerBot(guid); if (bot) { WorldSession * botWorldSessionPtr = bot->GetSession(); @@ -521,12 +521,12 @@ void PlayerbotMgr::OnBotLogin(Player * const bot) if (bot->GetGroup() && (m_master->GetGroup() == NULL || m_master->GetGroup()->IsMember(bot->GetGUID()) == false)) - bot->RemoveFromGroup(); + bot->RemoveFromGroup(); // sometimes master can lose leadership, pass leadership to master check const uint64 masterGuid = m_master->GetGUID(); if (m_master->GetGroup() && - ! m_master->GetGroup()->IsLeader(masterGuid)) + !m_master->GetGroup()->IsLeader(masterGuid)) m_master->GetGroup()->ChangeLeader(masterGuid); } @@ -546,7 +546,7 @@ void Creature::LoadBotMenu(Player *pPlayer) if (pPlayer->GetPlayerbotAI()) return; uint64 guid = pPlayer->GetGUID(); uint32 accountId = sObjectMgr.GetPlayerAccountIdByGUID(guid); - QueryResult *result = CharacterDatabase.PQuery("SELECT guid, name FROM characters WHERE account='%d'",accountId); + QueryResult *result = CharacterDatabase.PQuery("SELECT guid, name FROM characters WHERE account='%d'", accountId); do { Field *fields = result->Fetch(); @@ -554,7 +554,7 @@ void Creature::LoadBotMenu(Player *pPlayer) std::string name = fields[1].GetString(); std::string word = ""; - if( (guid == 0) || (guid == guidlo) ) + if ((guid == 0) || (guid == guidlo)) { //not found or himself } @@ -562,21 +562,21 @@ void Creature::LoadBotMenu(Player *pPlayer) { // if(sConfig.GetBoolDefault("PlayerbotAI.DisableBots", false)) return; // create the manager if it doesn't already exist - if (! pPlayer->GetPlayerbotMgr()) + if (!pPlayer->GetPlayerbotMgr()) pPlayer->SetPlayerbotMgr(new PlayerbotMgr(pPlayer)); - if(pPlayer->GetPlayerbotMgr()->GetPlayerBot(guidlo) == NULL) // add (if not already in game) + if (pPlayer->GetPlayerbotMgr()->GetPlayerBot(guidlo) == NULL) // add (if not already in game) { word += "Recruit "; word += name; word += " as a Bot."; - pPlayer->PlayerTalkClass->GetGossipMenu().AddMenuItem((uint8)9, word, guidlo, GOSSIP_OPTION_BOT, word, false); + pPlayer->PlayerTalkClass->GetGossipMenu().AddMenuItem((uint8) 9, word, guidlo, GOSSIP_OPTION_BOT, word, false); } - else if(pPlayer->GetPlayerbotMgr()->GetPlayerBot(guidlo) != NULL) // remove (if in game) + else if (pPlayer->GetPlayerbotMgr()->GetPlayerBot(guidlo) != NULL) // remove (if in game) { word += "Dismiss "; word += name; word += " from duty."; - pPlayer->PlayerTalkClass->GetGossipMenu().AddMenuItem((uint8)0, word, guidlo, GOSSIP_OPTION_BOT, word, false); + pPlayer->PlayerTalkClass->GetGossipMenu().AddMenuItem((uint8) 0, word, guidlo, GOSSIP_OPTION_BOT, word, false); } } } @@ -586,18 +586,18 @@ void Creature::LoadBotMenu(Player *pPlayer) void Player::chompAndTrim(std::string& str) { - while(str.length() >0) + while (str.length() > 0) { - char lc = str[str.length()-1]; - if(lc == '\r' || lc == '\n' || lc == ' ' || lc == '"' || lc == '\'') - str = str.substr(0,str.length()-1); + char lc = str[str.length() - 1]; + if (lc == '\r' || lc == '\n' || lc == ' ' || lc == '"' || lc == '\'') + str = str.substr(0, str.length() - 1); else break; - while(str.length() >0) + while (str.length() > 0) { char lc = str[0]; - if(lc == ' ' || lc == '"' || lc == '\'') - str = str.substr(1,str.length()-1); + if (lc == ' ' || lc == '"' || lc == '\'') + str = str.substr(1, str.length() - 1); else break; } @@ -608,15 +608,15 @@ bool Player::getNextQuestId(const std::string& pString, unsigned int& pStartPos, { bool result = false; unsigned int i; - for(i=pStartPos;ipStartPos) + if (i > pStartPos) { - std::string idString = pString.substr(pStartPos, i-pStartPos); - pStartPos = i+1; + std::string idString = pString.substr(pStartPos, i - pStartPos); + pStartPos = i + 1; chompAndTrim(idString); pId = atoi(idString.c_str()); result = true; @@ -626,16 +626,16 @@ bool Player::getNextQuestId(const std::string& pString, unsigned int& pStartPos, bool Player::requiredQuests(const char* pQuestIdString) { - if(pQuestIdString != NULL) + if (pQuestIdString != NULL) { unsigned int pos = 0; unsigned int id; std::string confString(pQuestIdString); chompAndTrim(confString); - while(getNextQuestId(confString, pos, id)) + while (getNextQuestId(confString, pos, id)) { - QuestStatus status = GetQuestStatus( id ); - if ( status == QUEST_STATUS_COMPLETE ) + QuestStatus status = GetQuestStatus(id); + if (status == QUEST_STATUS_COMPLETE) return true; } } @@ -644,15 +644,15 @@ bool Player::requiredQuests(const char* pQuestIdString) bool ChatHandler::HandlePlayerbotCommand(char* args) { - if(!(m_session->GetSecurity() > SEC_PLAYER)) - if(botConfig.GetBoolDefault("PlayerbotAI.DisableBots", false)) + if (!(m_session->GetSecurity() > SEC_PLAYER)) + if (botConfig.GetBoolDefault("PlayerbotAI.DisableBots", false)) { PSendSysMessage("|cffff0000Playerbot system is currently disabled!"); SetSentErrorMessage(true); return false; } - if (! m_session) + if (!m_session) { PSendSysMessage("|cffff0000You may only add bots from an active session"); SetSentErrorMessage(true); @@ -666,7 +666,7 @@ bool ChatHandler::HandlePlayerbotCommand(char* args) return false; } - char *cmd = strtok ((char*)args, " "); + char *cmd = strtok ((char*) args, " "); char *charname = strtok (NULL, " "); if (!cmd || !charname) { @@ -678,7 +678,7 @@ bool ChatHandler::HandlePlayerbotCommand(char* args) std::string cmdStr = cmd; std::string charnameStr = charname; - if(!normalizePlayerName(charnameStr)) + if (!normalizePlayerName(charnameStr)) return false; uint64 guid = sObjectMgr.GetPlayerGUIDByName(charnameStr.c_str()); @@ -706,15 +706,15 @@ bool ChatHandler::HandlePlayerbotCommand(char* args) } QueryResult *resultchar = CharacterDatabase.PQuery("SELECT COUNT(*) FROM characters WHERE online = '1' AND account = '%u'", m_session->GetAccountId()); - if(resultchar) + if (resultchar) { - Field *fields=resultchar->Fetch(); + Field *fields = resultchar->Fetch(); int acctcharcount = fields[0].GetUInt32(); int maxnum = botConfig.GetIntDefault("PlayerbotAI.MaxNumBots", 9); - if(!(m_session->GetSecurity() > SEC_PLAYER)) - if(acctcharcount > maxnum && (cmdStr == "add" || cmdStr == "login")) + if (!(m_session->GetSecurity() > SEC_PLAYER)) + if (acctcharcount > maxnum && (cmdStr == "add" || cmdStr == "login")) { - PSendSysMessage("|cffff0000You cannot summon anymore bots.(Current Max: |cffffffff%u)",maxnum); + PSendSysMessage("|cffff0000You cannot summon anymore bots.(Current Max: |cffffffff%u)", maxnum); SetSentErrorMessage(true); delete resultchar; return false; @@ -723,15 +723,15 @@ bool ChatHandler::HandlePlayerbotCommand(char* args) delete resultchar; QueryResult *resultlvl = CharacterDatabase.PQuery("SELECT level,name FROM characters WHERE guid = '%lu'", guid); - if(resultlvl) + if (resultlvl) { - Field *fields=resultlvl->Fetch(); + Field *fields = resultlvl->Fetch(); int charlvl = fields[0].GetUInt32(); int maxlvl = botConfig.GetIntDefault("PlayerbotAI.RestrictBotLevel", 80); - if(!(m_session->GetSecurity() > SEC_PLAYER)) - if(charlvl > maxlvl) + if (!(m_session->GetSecurity() > SEC_PLAYER)) + if (charlvl > maxlvl) { - PSendSysMessage("|cffff0000You cannot summon |cffffffff[%s]|cffff0000, it's level is too high.(Current Max:lvl |cffffffff%u)",fields[1].GetString(),maxlvl); + PSendSysMessage("|cffff0000You cannot summon |cffffffff[%s]|cffff0000, it's level is too high.(Current Max:lvl |cffffffff%u)", fields[1].GetString(), maxlvl); SetSentErrorMessage(true); delete resultlvl; return false; @@ -753,7 +753,7 @@ bool ChatHandler::HandlePlayerbotCommand(char* args) } else if (cmdStr == "remove" || cmdStr == "logout") { - if (! mgr->GetPlayerBot(guid)) + if (!mgr->GetPlayerBot(guid)) { PSendSysMessage("|cffff0000Bot can not be removed because bot does not exist in world."); SetSentErrorMessage(true); @@ -766,31 +766,31 @@ bool ChatHandler::HandlePlayerbotCommand(char* args) else if (cmdStr == "co" || cmdStr == "combatorder") { Unit *target = NULL; - char *orderChar = strtok( NULL, " " ); - if(!orderChar) + char *orderChar = strtok(NULL, " "); + if (!orderChar) { PSendSysMessage("|cffff0000Syntax error:|cffffffff .bot co [targetPlayer]"); SetSentErrorMessage(true); return false; } std::string orderStr = orderChar; - if(orderStr == "protect" || orderStr == "assist") + if (orderStr == "protect" || orderStr == "assist") { - char *targetChar = strtok( NULL, " " ); + char *targetChar = strtok(NULL, " "); uint64 targetGUID = m_session->GetPlayer()->GetSelection(); - if(!targetChar && !targetGUID) + if (!targetChar && !targetGUID) { PSendSysMessage("|cffff0000Combat orders protect and assist expect a target either by selection or by giving target player in command string!"); SetSentErrorMessage(true); return false; } - if(targetChar) + if (targetChar) { std::string targetStr = targetChar; - targetGUID = sObjectMgr.GetPlayerGUIDByName( targetStr.c_str() ); + targetGUID = sObjectMgr.GetPlayerGUIDByName(targetStr.c_str()); } - target = ObjectAccessor::GetUnit( *m_session->GetPlayer(), targetGUID ); - if(!target) + target = ObjectAccessor::GetUnit(*m_session->GetPlayer(), targetGUID); + if (!target) { PSendSysMessage("|cffff0000Invalid target for combat order protect or assist!"); SetSentErrorMessage(true); @@ -803,7 +803,7 @@ bool ChatHandler::HandlePlayerbotCommand(char* args) SetSentErrorMessage(true); return false; } - mgr->GetPlayerBot( guid )->GetPlayerbotAI()->SetCombatOrderByStr( orderStr, target ); + mgr->GetPlayerBot(guid)->GetPlayerbotAI()->SetCombatOrderByStr(orderStr, target); } return true; } diff --git a/src/game/playerbot/PlayerbotMgr.h b/src/game/playerbot/PlayerbotMgr.h index b1690239b..1b67b674b 100644 --- a/src/game/playerbot/PlayerbotMgr.h +++ b/src/game/playerbot/PlayerbotMgr.h @@ -14,45 +14,45 @@ typedef UNORDERED_MAP PlayerBotMap; class MANGOS_DLL_SPEC PlayerbotMgr { - public: - PlayerbotMgr(Player* const master); - virtual ~PlayerbotMgr(); - - // This is called from Unit.cpp and is called every second (I think) - void UpdateAI(const uint32 p_time); - - // This is called whenever the master sends a packet to the server. - // These packets can be viewed, but not edited. - // It allows bot creators to craft AI in response to a master's actions. - // For a list of opcodes that can be caught see Opcodes.cpp (CMSG_* opcodes only) - // Notice: that this is static which means it is called once for all bots of the master. - void HandleMasterIncomingPacket(const WorldPacket& packet); - void HandleMasterOutgoingPacket(const WorldPacket& packet); - - void AddPlayerBot(uint64 guid); - void LogoutPlayerBot(uint64 guid); - Player* GetPlayerBot (uint64 guid) const; - Player* GetMaster() const { return m_master; }; - PlayerBotMap::const_iterator GetPlayerBotsBegin() const { return m_playerBots.begin(); } - PlayerBotMap::const_iterator GetPlayerBotsEnd() const { return m_playerBots.end(); } - - void LogoutAllBots(); - void RemoveAllBotsFromGroup(); - void OnBotLogin(Player * const bot); - void Stay(); - - public: - // config variables - uint32 m_confRestrictBotLevel; - uint32 m_confDisableBotsInRealm; - uint32 m_confMaxNumBots; - bool m_confDisableBots; - bool m_confDebugWhisper; - float m_confFollowDistance[2]; - - private: - Player* const m_master; - PlayerBotMap m_playerBots; +public: + PlayerbotMgr(Player * const master); + virtual ~PlayerbotMgr(); + + // This is called from Unit.cpp and is called every second (I think) + void UpdateAI(const uint32 p_time); + + // This is called whenever the master sends a packet to the server. + // These packets can be viewed, but not edited. + // It allows bot creators to craft AI in response to a master's actions. + // For a list of opcodes that can be caught see Opcodes.cpp (CMSG_* opcodes only) + // Notice: that this is static which means it is called once for all bots of the master. + void HandleMasterIncomingPacket(const WorldPacket& packet); + void HandleMasterOutgoingPacket(const WorldPacket& packet); + + void AddPlayerBot(uint64 guid); + void LogoutPlayerBot(uint64 guid); + Player* GetPlayerBot (uint64 guid) const; + Player* GetMaster() const { return m_master; }; + PlayerBotMap::const_iterator GetPlayerBotsBegin() const { return m_playerBots.begin(); } + PlayerBotMap::const_iterator GetPlayerBotsEnd() const { return m_playerBots.end(); } + + void LogoutAllBots(); + void RemoveAllBotsFromGroup(); + void OnBotLogin(Player * const bot); + void Stay(); + +public: + // config variables + uint32 m_confRestrictBotLevel; + uint32 m_confDisableBotsInRealm; + uint32 m_confMaxNumBots; + bool m_confDisableBots; + bool m_confDebugWhisper; + float m_confFollowDistance[2]; + +private: + Player* const m_master; + PlayerBotMap m_playerBots; }; #endif diff --git a/src/game/playerbot/PlayerbotPaladinAI.cpp b/src/game/playerbot/PlayerbotPaladinAI.cpp index 377b69c08..4e3869659 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.cpp +++ b/src/game/playerbot/PlayerbotPaladinAI.cpp @@ -1,16 +1,16 @@ - /* - Name : PlayerbotPaladinAI.cpp - Complete: maybe around 27% :D - Author : Natsukawa - Version : 0.35 - */ +/* + Name : PlayerbotPaladinAI.cpp + Complete: maybe around 27% :D + Author : Natsukawa + Version : 0.35 + */ #include "PlayerbotPaladinAI.h" #include "PlayerbotMgr.h" class PlayerbotAI; -PlayerbotPaladinAI::PlayerbotPaladinAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) +PlayerbotPaladinAI::PlayerbotPaladinAI(Player* const master, Player* const bot, PlayerbotAI* const ai) : PlayerbotClassAI(master, bot, ai) { RETRIBUTION_AURA = ai->initSpell(RETRIBUTION_AURA_1); CRUSADER_AURA = ai->initSpell(CRUSADER_AURA_1); @@ -78,23 +78,23 @@ void PlayerbotPaladinAI::HealTarget(Unit &target, uint8 hp) { PlayerbotAI* ai = GetAI(); - if (hp < 40 && HOLY_LIGHT > 0 && ai->GetManaPercent() >= 34) + if (hp < 40 && HOLY_LIGHT > 0 && ai->GetManaPercent() >= 34) ai->CastSpell(HOLY_LIGHT, target); - if (hp < 35 && HOLY_SHOCK > 0 && ai->GetManaPercent() >= 21) + if (hp < 35 && HOLY_SHOCK > 0 && ai->GetManaPercent() >= 21) ai->CastSpell(HOLY_SHOCK, target); - if (hp < 30 && FLASH_OF_LIGHT > 0 && ai->GetManaPercent() >= 8) + if (hp < 30 && FLASH_OF_LIGHT > 0 && ai->GetManaPercent() >= 8) ai->CastSpell(FLASH_OF_LIGHT, target); - if (hp < 25 && LAY_ON_HANDS > 0 && ai->GetHealthPercent() > 30 && ai->GetManaPercent() >= 8) + if (hp < 25 && LAY_ON_HANDS > 0 && ai->GetHealthPercent() > 30 && ai->GetManaPercent() >= 8) ai->CastSpell(LAY_ON_HANDS, target); } // end HealTarget void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) { - Unit* pVictim = pTarget->getVictim(); + Unit* pVictim = pTarget->getVictim(); PlayerbotAI* ai = GetAI(); if (!ai) return; @@ -108,36 +108,36 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) } // damage spells - ai->SetInFront( pTarget ); + ai->SetInFront(pTarget); Player *m_bot = GetPlayerBot(); Group *m_group = m_bot->GetGroup(); - float dist = m_bot->GetDistance( pTarget ); + float dist = m_bot->GetDistance(pTarget); std::ostringstream out; //Shield master if low hp. - uint32 masterHP = GetMaster()->GetHealth()*100 / GetMaster()->GetMaxHealth(); + uint32 masterHP = GetMaster()->GetHealth() * 100 / GetMaster()->GetMaxHealth(); if (GetMaster()->isAlive()) if (masterHP < 25 && HAND_OF_PROTECTION > 0 && !GetMaster()->HasAura(FORBEARANCE, EFFECT_INDEX_0) && !GetMaster()->HasAura(HAND_OF_PROTECTION, EFFECT_INDEX_0) && !GetMaster()->HasAura(DIVINE_PROTECTION, EFFECT_INDEX_0) && !GetMaster()->HasAura(DIVINE_SHIELD, EFFECT_INDEX_0)) - ai->CastSpell(HAND_OF_PROTECTION, *GetMaster()); + ai->CastSpell(HAND_OF_PROTECTION, *GetMaster()); - // heal group inside combat, but do not heal if tank - if( m_group && pVictim != m_bot ) // possible tank + // heal group inside combat, but do not heal if tank + if (m_group && pVictim != m_bot) // possible tank { Group::MemberSlotList const& groupSlot = m_group->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { - Player *m_groupMember = sObjectMgr.GetPlayer( itr->guid ); - if( !m_groupMember || !m_groupMember->isAlive() ) + Player *m_groupMember = sObjectMgr.GetPlayer(itr->guid); + if (!m_groupMember || !m_groupMember->isAlive()) continue; - uint32 memberHP = m_groupMember->GetHealth()*100 / m_groupMember->GetMaxHealth(); - if( memberHP < 40 && ai->GetManaPercent() >= 40 ) // do not heal bots without plenty of mana for master & self - HealTarget( *m_groupMember, memberHP ); + uint32 memberHP = m_groupMember->GetHealth() * 100 / m_groupMember->GetMaxHealth(); + if (memberHP < 40 && ai->GetManaPercent() >= 40) // do not heal bots without plenty of mana for master & self + HealTarget(*m_groupMember, memberHP); } } - if (RIGHTEOUS_FURY > 0 && !m_bot->HasAura(RIGHTEOUS_FURY, EFFECT_INDEX_0)) + if (RIGHTEOUS_FURY > 0 && !m_bot->HasAura(RIGHTEOUS_FURY, EFFECT_INDEX_0)) ai->CastSpell (RIGHTEOUS_FURY, *m_bot); if (SHADOW_RESISTANCE_AURA > 0 && !m_bot->HasAura(SHADOW_RESISTANCE_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_WARLOCK) @@ -161,7 +161,7 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) if (DEVOTION_AURA > 0 && !m_bot->HasAura(DEVOTION_AURA, EFFECT_INDEX_0) && pTarget->getClass() == CLASS_PALADIN) ai->CastSpell (DEVOTION_AURA, *m_bot); - if (ai->GetHealthPercent() <= 40 || GetMaster()->GetHealth() <= GetMaster()->GetMaxHealth()*0.4) + if (ai->GetHealthPercent() <= 40 || GetMaster()->GetHealth() <= GetMaster()->GetMaxHealth() * 0.4) SpellSequence = Healing; else SpellSequence = Combat; @@ -169,7 +169,7 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) switch (SpellSequence) { case Combat: - if (JUDGEMENT_OF_LIGHT > 0 && !pTarget->HasAura(JUDGEMENT_OF_LIGHT, EFFECT_INDEX_0) && CombatCounter < 1 && ai->GetManaPercent() >=5) + if (JUDGEMENT_OF_LIGHT > 0 && !pTarget->HasAura(JUDGEMENT_OF_LIGHT, EFFECT_INDEX_0) && CombatCounter < 1 && ai->GetManaPercent() >= 5) { ai->CastSpell (JUDGEMENT_OF_LIGHT, *pTarget); out << " Judgement of Light"; @@ -183,63 +183,63 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) CombatCounter++; break; } - else if (HAMMER_OF_JUSTICE > 0 && !pTarget->HasAura(HAMMER_OF_JUSTICE, EFFECT_INDEX_0) && CombatCounter < 3 && ai->GetManaPercent() >=3) + else if (HAMMER_OF_JUSTICE > 0 && !pTarget->HasAura(HAMMER_OF_JUSTICE, EFFECT_INDEX_0) && CombatCounter < 3 && ai->GetManaPercent() >= 3) { ai->CastSpell (HAMMER_OF_JUSTICE, *pTarget); out << " Hammer of Justice"; CombatCounter++; break; } - else if (CRUSADER_STRIKE > 0 && CombatCounter < 4 && ai->GetManaPercent() >=5) + else if (CRUSADER_STRIKE > 0 && CombatCounter < 4 && ai->GetManaPercent() >= 5) { ai->CastSpell (CRUSADER_STRIKE, *pTarget); out << " Crusader Strike"; CombatCounter++; break; } - else if (AVENGING_WRATH > 0 && CombatCounter < 5 && !m_bot->HasAura(AVENGING_WRATH, EFFECT_INDEX_0) && ai->GetManaPercent() >=8) + else if (AVENGING_WRATH > 0 && CombatCounter < 5 && !m_bot->HasAura(AVENGING_WRATH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) { ai->CastSpell (AVENGING_WRATH, *m_bot); out << " Avenging Wrath"; CombatCounter++; break; } - else if (SACRED_SHIELD > 0 && CombatCounter < 6 && pVictim == m_bot && ai->GetHealthPercent() < 70 && !m_bot->HasAura(SACRED_SHIELD, EFFECT_INDEX_0) && ai->GetManaPercent() >=12) + else if (SACRED_SHIELD > 0 && CombatCounter < 6 && pVictim == m_bot && ai->GetHealthPercent() < 70 && !m_bot->HasAura(SACRED_SHIELD, EFFECT_INDEX_0) && ai->GetManaPercent() >= 12) { ai->CastSpell (SACRED_SHIELD, *m_bot); out << " Sacred Shield"; CombatCounter++; break; } - else if (DIVINE_STORM > 0 && CombatCounter < 7 && ai->GetAttackerCount()>=3 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >=12) + else if (DIVINE_STORM > 0 && CombatCounter < 7 && ai->GetAttackerCount() >= 3 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >= 12) { ai->CastSpell (DIVINE_STORM, *pTarget); out << " Divine Storm"; CombatCounter++; break; } - else if (HAMMER_OF_WRATH > 0 && CombatCounter < 8 && pTarget->GetHealth() < pTarget->GetMaxHealth()*0.20 && ai->GetManaPercent() >=14) + else if (HAMMER_OF_WRATH > 0 && CombatCounter < 8 && pTarget->GetHealth() < pTarget->GetMaxHealth() * 0.20 && ai->GetManaPercent() >= 14) { ai->CastSpell (HAMMER_OF_WRATH, *pTarget); out << " Hammer of Wrath"; CombatCounter++; break; } - else if (HOLY_WRATH > 0 && CombatCounter < 9 && ai->GetAttackerCount()>=3 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >=24) + else if (HOLY_WRATH > 0 && CombatCounter < 9 && ai->GetAttackerCount() >= 3 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >= 24) { ai->CastSpell (HOLY_WRATH, *pTarget); out << " Holy Wrath"; CombatCounter++; break; } - else if (HAND_OF_SACRIFICE > 0 && pVictim == GetMaster() && !GetMaster()->HasAura(HAND_OF_SACRIFICE, EFFECT_INDEX_0) && CombatCounter < 10 && ai->GetManaPercent() >=6) + else if (HAND_OF_SACRIFICE > 0 && pVictim == GetMaster() && !GetMaster()->HasAura(HAND_OF_SACRIFICE, EFFECT_INDEX_0) && CombatCounter < 10 && ai->GetManaPercent() >= 6) { ai->CastSpell (HAND_OF_SACRIFICE, *GetMaster()); out << " Hand of Sacrifice"; CombatCounter++; break; } - else if (DIVINE_PROTECTION > 0 && pVictim == m_bot && !m_bot->HasAura(FORBEARANCE, EFFECT_INDEX_0) && ai->GetHealthPercent() < 30 && CombatCounter < 11 && ai->GetManaPercent() >=3) + else if (DIVINE_PROTECTION > 0 && pVictim == m_bot && !m_bot->HasAura(FORBEARANCE, EFFECT_INDEX_0) && ai->GetHealthPercent() < 30 && CombatCounter < 11 && ai->GetManaPercent() >= 3) { ai->CastSpell (DIVINE_PROTECTION, *m_bot); out << " Divine Protection"; @@ -300,8 +300,8 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) break; } } - if( ai->GetManager()->m_confDebugWhisper ) - ai->TellMaster( out.str().c_str() ); + if (ai->GetManager()->m_confDebugWhisper) + ai->TellMaster(out.str().c_str()); if (AVENGING_WRATH > 0 && !m_bot->HasAura(AVENGING_WRATH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 8) ai->CastSpell(AVENGING_WRATH, *m_bot); @@ -321,17 +321,17 @@ void PlayerbotPaladinAI::DoNonCombatActions() return; // buff myself - if (GREATER_BLESSING_OF_MIGHT > 0 && !m_bot->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0)) + if (GREATER_BLESSING_OF_MIGHT > 0 && !m_bot->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0)) ai->CastSpell (GREATER_BLESSING_OF_MIGHT, *m_bot); else if (BLESSING_OF_MIGHT > 0 && !m_bot->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0) && !m_bot->HasAura(BLESSING_OF_MIGHT, EFFECT_INDEX_0)) ai->CastSpell (BLESSING_OF_MIGHT, *m_bot); if (DIVINE_FAVOR > 0 && !m_bot->HasAura(DIVINE_FAVOR, EFFECT_INDEX_0) && ai->GetManaPercent() >= 3) - ai->CastSpell(DIVINE_FAVOR , *m_bot); + ai->CastSpell(DIVINE_FAVOR, *m_bot); /* if (SEAL_OF_COMMAND > 0) ai->CastSpell (SEAL_OF_COMMAND, *m_bot); // interferes with drinking/eating -*/ + */ //Select Class buff seq. ///Process Who is my master --> get the player class --> aura already present if not then proced --> cast the spell //Priest @@ -394,7 +394,7 @@ void PlayerbotPaladinAI::DoNonCombatActions() m_bot->SetStandState(UNIT_STAND_STATE_STAND); Item* pItem = ai->FindDrink(); - Item* fItem = ai->FindBandage(); + Item* fItem = ai->FindBandage(); if (pItem != NULL && ai->GetManaPercent() < 40) { @@ -432,11 +432,11 @@ void PlayerbotPaladinAI::DoNonCombatActions() for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { Player *tPlayer = sObjectMgr.GetPlayer(itr->guid); - if( !tPlayer || !tPlayer->isAlive() ) + if (!tPlayer || !tPlayer->isAlive()) continue; - // heal player - (HealTarget(*tPlayer, tPlayer->GetHealth()*100 / tPlayer->GetMaxHealth())); + // heal player + (HealTarget(*tPlayer, tPlayer->GetHealth() * 100 / tPlayer->GetMaxHealth())); } } } diff --git a/src/game/playerbot/PlayerbotPaladinAI.h b/src/game/playerbot/PlayerbotPaladinAI.h index 3931d21d9..a658eeb31 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.h +++ b/src/game/playerbot/PlayerbotPaladinAI.h @@ -80,42 +80,42 @@ enum PaladinSpells class MANGOS_DLL_SPEC PlayerbotPaladinAI : PlayerbotClassAI { - public: - PlayerbotPaladinAI(Player* const master, Player* const bot, PlayerbotAI* const ai); - virtual ~PlayerbotPaladinAI(); +public: + PlayerbotPaladinAI(Player * const master, Player * const bot, PlayerbotAI * const ai); + virtual ~PlayerbotPaladinAI(); - // all combat actions go here - void DoNextCombatManeuver(Unit*); + // all combat actions go here + void DoNextCombatManeuver(Unit*); - // all non combat actions go here, ex buffs, heals, rezzes - void DoNonCombatActions(); + // all non combat actions go here, ex buffs, heals, rezzes + void DoNonCombatActions(); - // buff a specific player, usually a real PC who is not in group - void BuffPlayer(Player *target); + // buff a specific player, usually a real PC who is not in group + void BuffPlayer(Player *target); - private: - // Heals the target based off its hps - void HealTarget (Unit& target, uint8 hp); +private: + // Heals the target based off its hps + void HealTarget (Unit& target, uint8 hp); - // Retribution - uint32 RETRIBUTION_AURA, SEAL_OF_COMMAND, JUDGEMENT_OF_LIGHT, JUDGEMENT_OF_WISDOM, GREATER_BLESSING_OF_WISDOM, GREATER_BLESSING_OF_MIGHT, BLESSING_OF_WISDOM, BLESSING_OF_MIGHT, HAMMER_OF_JUSTICE, RIGHTEOUS_FURY, CRUSADER_AURA, CRUSADER_STRIKE, AVENGING_WRATH, DIVINE_STORM, JUDGEMENT_OF_JUSTICE; + // Retribution + uint32 RETRIBUTION_AURA, SEAL_OF_COMMAND, JUDGEMENT_OF_LIGHT, JUDGEMENT_OF_WISDOM, GREATER_BLESSING_OF_WISDOM, GREATER_BLESSING_OF_MIGHT, BLESSING_OF_WISDOM, BLESSING_OF_MIGHT, HAMMER_OF_JUSTICE, RIGHTEOUS_FURY, CRUSADER_AURA, CRUSADER_STRIKE, AVENGING_WRATH, DIVINE_STORM, JUDGEMENT_OF_JUSTICE; - // Holy - uint32 FLASH_OF_LIGHT, HOLY_LIGHT, DIVINE_SHIELD, HAMMER_OF_WRATH, CONSECRATION, CONCENTRATION_AURA, DIVINE_FAVOR, SACRED_SHIELD, HOLY_SHOCK, HOLY_WRATH, LAY_ON_HANDS, EXORCISM, DIVINE_PLEA; + // Holy + uint32 FLASH_OF_LIGHT, HOLY_LIGHT, DIVINE_SHIELD, HAMMER_OF_WRATH, CONSECRATION, CONCENTRATION_AURA, DIVINE_FAVOR, SACRED_SHIELD, HOLY_SHOCK, HOLY_WRATH, LAY_ON_HANDS, EXORCISM, DIVINE_PLEA; - // Protection - uint32 GREATER_BLESSING_OF_KINGS, BLESSING_OF_KINGS, HAND_OF_PROTECTION, SHADOW_RESISTANCE_AURA, DEVOTION_AURA, FIRE_RESISTANCE_AURA, FROST_RESISTANCE_AURA, DEFENSIVE_STANCE, BERSERKER_STANCE, BATTLE_STANCE, DIVINE_SACRIFICE, DIVINE_PROTECTION, DIVINE_INTERVENTION, HOLY_SHIELD, AVENGERS_SHIELD, RIGHTEOUS_DEFENSE, GREATER_BLESSING_OF_SANCTUARY, HAND_OF_SACRIFICE, SHIELD_OF_RIGHTEOUSNESS; + // Protection + uint32 GREATER_BLESSING_OF_KINGS, BLESSING_OF_KINGS, HAND_OF_PROTECTION, SHADOW_RESISTANCE_AURA, DEVOTION_AURA, FIRE_RESISTANCE_AURA, FROST_RESISTANCE_AURA, DEFENSIVE_STANCE, BERSERKER_STANCE, BATTLE_STANCE, DIVINE_SACRIFICE, DIVINE_PROTECTION, DIVINE_INTERVENTION, HOLY_SHIELD, AVENGERS_SHIELD, RIGHTEOUS_DEFENSE, GREATER_BLESSING_OF_SANCTUARY, HAND_OF_SACRIFICE, SHIELD_OF_RIGHTEOUSNESS; - // cannot be protected - uint32 FORBEARANCE; + // cannot be protected + uint32 FORBEARANCE; - // first aid - uint32 RECENTLY_BANDAGED; + // first aid + uint32 RECENTLY_BANDAGED; - // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + // racial + uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; - uint32 SpellSequence, CombatCounter, HealCounter; + uint32 SpellSequence, CombatCounter, HealCounter; }; #endif diff --git a/src/game/playerbot/PlayerbotPriestAI.cpp b/src/game/playerbot/PlayerbotPriestAI.cpp index a966e788c..f95c09668 100644 --- a/src/game/playerbot/PlayerbotPriestAI.cpp +++ b/src/game/playerbot/PlayerbotPriestAI.cpp @@ -3,7 +3,7 @@ class PlayerbotAI; -PlayerbotPriestAI::PlayerbotPriestAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) +PlayerbotPriestAI::PlayerbotPriestAI(Player* const master, Player* const bot, PlayerbotAI* const ai) : PlayerbotClassAI(master, bot, ai) { RENEW = ai->initSpell(RENEW_1); HEAL = ai->initSpell(HEAL_1); @@ -117,19 +117,19 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) switch (ai->GetScenarioType()) { case PlayerbotAI::SCENARIO_DUEL: - (ai->HasAura(SCREAM,*pTarget) && ai->GetHealthPercent() < 60 && ai->CastSpell(HEAL)) || - ai->CastSpell(SHADOW_WORD_PAIN) || - (ai->GetHealthPercent() < 80 && ai->CastSpell(RENEW)) || - (ai->GetPlayerBot()->GetDistance(pTarget) <= 5 && ai->CastSpell(SCREAM)) || - ai->CastSpell(MIND_BLAST) || - (ai->GetHealthPercent() < 20 && ai->CastSpell(GREATER_HEAL)) || - ai->CastSpell(SMITE); + (ai->HasAura(SCREAM, *pTarget) && ai->GetHealthPercent() < 60 && ai->CastSpell(HEAL)) || + ai->CastSpell(SHADOW_WORD_PAIN) || + (ai->GetHealthPercent() < 80 && ai->CastSpell(RENEW)) || + (ai->GetPlayerBot()->GetDistance(pTarget) <= 5 && ai->CastSpell(SCREAM)) || + ai->CastSpell(MIND_BLAST) || + (ai->GetHealthPercent() < 20 && ai->CastSpell(GREATER_HEAL)) || + ai->CastSpell(SMITE); return; } // ------- Non Duel combat ---------- - ai->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, GetMaster() ); // dont want to melee mob + ai->SetMovementOrder(PlayerbotAI::MOVEMENT_FOLLOW, GetMaster()); // dont want to melee mob Player *m_bot = GetPlayerBot(); Group *m_group = m_bot->GetGroup(); @@ -154,157 +154,157 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) HealTarget (*m_bot, ai->GetHealthPercent()); // Heal master - uint32 masterHP = GetMaster()->GetHealth()*100 / GetMaster()->GetMaxHealth(); + uint32 masterHP = GetMaster()->GetHealth() * 100 / GetMaster()->GetMaxHealth(); if (GetMaster()->isAlive()) { if (masterHP < 25 && POWER_WORD_SHIELD > 0 && !GetMaster()->HasAura(POWER_WORD_SHIELD, EFFECT_INDEX_0)) - ai->CastSpell(POWER_WORD_SHIELD, *(GetMaster())); + ai->CastSpell(POWER_WORD_SHIELD, *(GetMaster())); else if (masterHP < 80) HealTarget (*GetMaster(), masterHP); } // Heal group - if( m_group ) + if (m_group) { Group::MemberSlotList const& groupSlot = m_group->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { - Player *m_groupMember = sObjectMgr.GetPlayer( itr->guid ); - if( !m_groupMember || !m_groupMember->isAlive() ) + Player *m_groupMember = sObjectMgr.GetPlayer(itr->guid); + if (!m_groupMember || !m_groupMember->isAlive()) continue; - uint32 memberHP = m_groupMember->GetHealth()*100 / m_groupMember->GetMaxHealth(); - if( memberHP < 25 ) - HealTarget( *m_groupMember, memberHP ); + uint32 memberHP = m_groupMember->GetHealth() * 100 / m_groupMember->GetMaxHealth(); + if (memberHP < 25) + HealTarget(*m_groupMember, memberHP); } } // Damage Spells - ai->SetInFront( pTarget ); - float dist = m_bot->GetDistance( pTarget ); + ai->SetInFront(pTarget); + float dist = m_bot->GetDistance(pTarget); switch (SpellSequence) { case SPELL_HOLY: - if (SMITE > 0 && LastSpellHoly <1 && !pTarget->HasAura(SMITE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 17) + if (SMITE > 0 && LastSpellHoly < 1 && !pTarget->HasAura(SMITE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 17) { ai->CastSpell(SMITE, *pTarget); SpellSequence = SPELL_SHADOWMAGIC; - LastSpellHoly = LastSpellHoly +1; + LastSpellHoly = LastSpellHoly + 1; break; } - else if (MANA_BURN > 0 && LastSpellHoly <2 && pTarget->GetPower(POWER_MANA) > 0 && ai->GetManaPercent() < 70 && ai->GetManaPercent() >= 14) + else if (MANA_BURN > 0 && LastSpellHoly < 2 && pTarget->GetPower(POWER_MANA) > 0 && ai->GetManaPercent() < 70 && ai->GetManaPercent() >= 14) { //ai->TellMaster("I'm casting mana burn."); ai->CastSpell(MANA_BURN, *pTarget); ai->SetIgnoreUpdateTime(3); SpellSequence = SPELL_SHADOWMAGIC; - LastSpellHoly = LastSpellHoly +1; + LastSpellHoly = LastSpellHoly + 1; break; } - else if (HOLY_NOVA > 0 && LastSpellHoly <3 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >= 22) + else if (HOLY_NOVA > 0 && LastSpellHoly < 3 && dist <= ATTACK_DISTANCE && ai->GetManaPercent() >= 22) { //ai->TellMaster("I'm casting holy nova."); ai->CastSpell(HOLY_NOVA); SpellSequence = SPELL_SHADOWMAGIC; - LastSpellHoly = LastSpellHoly +1; + LastSpellHoly = LastSpellHoly + 1; break; - } - else if (HOLY_FIRE > 0 && LastSpellHoly <4 && !pTarget->HasAura(HOLY_FIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 13) - { - //ai->TellMaster("I'm casting holy fire."); - ai->CastSpell(HOLY_FIRE, *pTarget); - SpellSequence = SPELL_SHADOWMAGIC; - LastSpellHoly = LastSpellHoly +1; - break; - } - else if (PRAYER_OF_MENDING > 0 && LastSpellHoly <5 && pVictim == GetMaster() && GetMaster()->GetHealth() <= GetMaster()->GetMaxHealth()*0.7 && !GetMaster()->HasAura(PRAYER_OF_MENDING, EFFECT_INDEX_0) && ai->GetManaPercent() >= 15) - { - //ai->TellMaster("I'm casting prayer of mending on master."); - ai->CastSpell(PRAYER_OF_MENDING, *GetMaster()); - SpellSequence = SPELL_SHADOWMAGIC; - LastSpellHoly = LastSpellHoly +1; - break; - } - else if (LastSpellHoly > 6) - { - LastSpellHoly = 0; - SpellSequence = SPELL_SHADOWMAGIC; - break; - } - LastSpellHoly = LastSpellHoly + 1; - //SpellSequence = SPELL_SHADOWMAGIC; - //break; + } + else if (HOLY_FIRE > 0 && LastSpellHoly < 4 && !pTarget->HasAura(HOLY_FIRE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 13) + { + //ai->TellMaster("I'm casting holy fire."); + ai->CastSpell(HOLY_FIRE, *pTarget); + SpellSequence = SPELL_SHADOWMAGIC; + LastSpellHoly = LastSpellHoly + 1; + break; + } + else if (PRAYER_OF_MENDING > 0 && LastSpellHoly < 5 && pVictim == GetMaster() && GetMaster()->GetHealth() <= GetMaster()->GetMaxHealth() * 0.7 && !GetMaster()->HasAura(PRAYER_OF_MENDING, EFFECT_INDEX_0) && ai->GetManaPercent() >= 15) + { + //ai->TellMaster("I'm casting prayer of mending on master."); + ai->CastSpell(PRAYER_OF_MENDING, *GetMaster()); + SpellSequence = SPELL_SHADOWMAGIC; + LastSpellHoly = LastSpellHoly + 1; + break; + } + else if (LastSpellHoly > 6) + { + LastSpellHoly = 0; + SpellSequence = SPELL_SHADOWMAGIC; + break; + } + LastSpellHoly = LastSpellHoly + 1; + //SpellSequence = SPELL_SHADOWMAGIC; + //break; case SPELL_SHADOWMAGIC: - if (SHADOW_WORD_PAIN > 0 && LastSpellShadowMagic <1 && !pTarget->HasAura(SHADOW_WORD_PAIN, EFFECT_INDEX_0) && ai->GetManaPercent() >= 25) + if (SHADOW_WORD_PAIN > 0 && LastSpellShadowMagic < 1 && !pTarget->HasAura(SHADOW_WORD_PAIN, EFFECT_INDEX_0) && ai->GetManaPercent() >= 25) { //ai->TellMaster("I'm casting pain."); ai->CastSpell(SHADOW_WORD_PAIN, *pTarget); SpellSequence = SPELL_DISCIPLINE; - LastSpellShadowMagic = LastSpellShadowMagic +1; + LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } - else if (MIND_BLAST > 0 && LastSpellShadowMagic <2 && ai->GetManaPercent() >= 19) + else if (MIND_BLAST > 0 && LastSpellShadowMagic < 2 && ai->GetManaPercent() >= 19) { //ai->TellMaster("I'm casting mind blast."); ai->CastSpell(MIND_BLAST, *pTarget); SpellSequence = SPELL_DISCIPLINE; - LastSpellShadowMagic = LastSpellShadowMagic +1; + LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } - else if (SCREAM > 0 && LastSpellShadowMagic <3 && ai->GetAttackerCount()>=3 && ai->GetManaPercent() >= 15) + else if (SCREAM > 0 && LastSpellShadowMagic < 3 && ai->GetAttackerCount() >= 3 && ai->GetManaPercent() >= 15) { ai->TellMaster("I'm casting scream."); ai->CastSpell(SCREAM); SpellSequence = SPELL_DISCIPLINE; - (LastSpellShadowMagic = LastSpellShadowMagic +1); + (LastSpellShadowMagic = LastSpellShadowMagic + 1); break; } - else if (MIND_FLAY > 0 && LastSpellShadowMagic <4 && !pTarget->HasAura(MIND_FLAY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 10) + else if (MIND_FLAY > 0 && LastSpellShadowMagic < 4 && !pTarget->HasAura(MIND_FLAY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 10) { //ai->TellMaster("I'm casting mind flay."); ai->CastSpell(MIND_FLAY, *pTarget); ai->SetIgnoreUpdateTime(3); SpellSequence = SPELL_DISCIPLINE; - LastSpellShadowMagic = LastSpellShadowMagic +1; + LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } - else if (DEVOURING_PLAGUE > 0 && LastSpellShadowMagic <5 && !pTarget->HasAura(DEVOURING_PLAGUE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 28) + else if (DEVOURING_PLAGUE > 0 && LastSpellShadowMagic < 5 && !pTarget->HasAura(DEVOURING_PLAGUE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 28) { ai->CastSpell(DEVOURING_PLAGUE, *pTarget); SpellSequence = SPELL_DISCIPLINE; - LastSpellShadowMagic = LastSpellShadowMagic +1; + LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } - else if (SHADOW_PROTECTION > 0 && LastSpellShadowMagic <6 && ai->GetManaPercent() >= 60) + else if (SHADOW_PROTECTION > 0 && LastSpellShadowMagic < 6 && ai->GetManaPercent() >= 60) { ai->CastSpell(SHADOW_PROTECTION, *pTarget); SpellSequence = SPELL_DISCIPLINE; - LastSpellShadowMagic = LastSpellShadowMagic +1; + LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } - else if (VAMPIRIC_TOUCH > 0 && LastSpellShadowMagic <7 && !pTarget->HasAura(VAMPIRIC_TOUCH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 18) + else if (VAMPIRIC_TOUCH > 0 && LastSpellShadowMagic < 7 && !pTarget->HasAura(VAMPIRIC_TOUCH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 18) { ai->CastSpell(VAMPIRIC_TOUCH, *pTarget); SpellSequence = SPELL_DISCIPLINE; - LastSpellShadowMagic = LastSpellShadowMagic +1; + LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } - else if (SHADOWFIEND > 0 && LastSpellShadowMagic <8) + else if (SHADOWFIEND > 0 && LastSpellShadowMagic < 8) { ai->CastSpell(SHADOWFIEND); SpellSequence = SPELL_DISCIPLINE; - LastSpellShadowMagic = LastSpellShadowMagic +1; + LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } - else if (MIND_SEAR > 0 && LastSpellShadowMagic <9 && ai->GetAttackerCount()>=3 && ai->GetManaPercent() >= 28) + else if (MIND_SEAR > 0 && LastSpellShadowMagic < 9 && ai->GetAttackerCount() >= 3 && ai->GetManaPercent() >= 28) { ai->CastSpell(MIND_SEAR, *pTarget); ai->SetIgnoreUpdateTime(5); SpellSequence = SPELL_DISCIPLINE; - LastSpellShadowMagic = LastSpellShadowMagic +1; + LastSpellShadowMagic = LastSpellShadowMagic + 1; break; } else if (LastSpellShadowMagic > 10) @@ -313,12 +313,12 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) SpellSequence = SPELL_DISCIPLINE; break; } - LastSpellShadowMagic = LastSpellShadowMagic +1; - //SpellSequence = SPELL_DISCIPLINE; - //break; + LastSpellShadowMagic = LastSpellShadowMagic + 1; + //SpellSequence = SPELL_DISCIPLINE; + //break; case SPELL_DISCIPLINE: - if (FEAR_WARD > 0 && LastSpellDiscipline <1 && ai->GetManaPercent() >= 3) + if (FEAR_WARD > 0 && LastSpellDiscipline < 1 && ai->GetManaPercent() >= 3) { //ai->TellMaster("I'm casting fear ward"); ai->CastSpell(FEAR_WARD, *(GetMaster())); @@ -326,7 +326,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) LastSpellDiscipline = LastSpellDiscipline + 1; break; } - else if (POWER_INFUSION > 0 && LastSpellDiscipline <2 && ai->GetManaPercent() >= 16) + else if (POWER_INFUSION > 0 && LastSpellDiscipline < 2 && ai->GetManaPercent() >= 16) { //ai->TellMaster("I'm casting power infusion"); ai->CastSpell(POWER_INFUSION, *(GetMaster())); @@ -334,7 +334,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) LastSpellDiscipline = LastSpellDiscipline + 1; break; } - else if (MASS_DISPEL > 0 && LastSpellDiscipline <3 && ai->GetManaPercent() >= 33) + else if (MASS_DISPEL > 0 && LastSpellDiscipline < 3 && ai->GetManaPercent() >= 33) { //ai->TellMaster("I'm casting mass dispel"); ai->CastSpell(MASS_DISPEL); @@ -342,7 +342,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) LastSpellDiscipline = LastSpellDiscipline + 1; break; } - else if (INNER_FOCUS > 0 && !m_bot->HasAura(INNER_FOCUS, EFFECT_INDEX_0) && LastSpellDiscipline <4) + else if (INNER_FOCUS > 0 && !m_bot->HasAura(INNER_FOCUS, EFFECT_INDEX_0) && LastSpellDiscipline < 4) { //ai->TellMaster("I'm casting inner focus"); ai->CastSpell(INNER_FOCUS, *m_bot); @@ -350,7 +350,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) LastSpellDiscipline = LastSpellDiscipline + 1; break; } - else if (PENANCE > 0 && LastSpellDiscipline <5 && ai->GetManaPercent() >= 16) + else if (PENANCE > 0 && LastSpellDiscipline < 5 && ai->GetManaPercent() >= 16) { //ai->TellMaster("I'm casting PENANCE"); ai->CastSpell(PENANCE); @@ -390,7 +390,7 @@ void PlayerbotPriestAI::DoNonCombatActions() // buff master if (POWER_WORD_FORTITUDE > 0) - (!GetMaster()->HasAura(POWER_WORD_FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell(POWER_WORD_FORTITUDE,*(GetMaster())) ); + (!GetMaster()->HasAura(POWER_WORD_FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell(POWER_WORD_FORTITUDE, *(GetMaster()))); // mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) @@ -435,11 +435,11 @@ void PlayerbotPriestAI::DoNonCombatActions() for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { Player *tPlayer = sObjectMgr.GetPlayer(itr->guid); - if( !tPlayer ) + if (!tPlayer) continue; // first rezz em - if ( !tPlayer->isAlive() && !tPlayer->GetPlayerbotAI() ) + if (!tPlayer->isAlive() && !tPlayer->GetPlayerbotAI()) { std::string msg = "Resurrecting "; msg += tPlayer->GetName(); @@ -448,11 +448,11 @@ void PlayerbotPriestAI::DoNonCombatActions() // rez is only 10 sec, but give time for lag ai->SetIgnoreUpdateTime(17); } - else if( tPlayer->isAlive() ) + else if (tPlayer->isAlive()) { // buff and heal (!tPlayer->HasAura(POWER_WORD_FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell (POWER_WORD_FORTITUDE, *tPlayer)); - (HealTarget(*tPlayer, tPlayer->GetHealth()*100 / tPlayer->GetMaxHealth())); + (HealTarget(*tPlayer, tPlayer->GetHealth() * 100 / tPlayer->GetMaxHealth())); } } } diff --git a/src/game/playerbot/PlayerbotPriestAI.h b/src/game/playerbot/PlayerbotPriestAI.h index 51aad2b11..4d75281bf 100644 --- a/src/game/playerbot/PlayerbotPriestAI.h +++ b/src/game/playerbot/PlayerbotPriestAI.h @@ -74,82 +74,82 @@ enum PriestSpells class MANGOS_DLL_SPEC PlayerbotPriestAI : PlayerbotClassAI { - public: - PlayerbotPriestAI(Player* const master, Player* const bot, PlayerbotAI* const ai); - virtual ~PlayerbotPriestAI(); +public: + PlayerbotPriestAI(Player * const master, Player * const bot, PlayerbotAI * const ai); + virtual ~PlayerbotPriestAI(); - // all combat actions go here - void DoNextCombatManeuver(Unit*); + // all combat actions go here + void DoNextCombatManeuver(Unit*); - // all non combat actions go here, ex buffs, heals, rezzes - void DoNonCombatActions(); + // all non combat actions go here, ex buffs, heals, rezzes + void DoNonCombatActions(); - // buff a specific player, usually a real PC who is not in group - void BuffPlayer(Player *target); + // buff a specific player, usually a real PC who is not in group + void BuffPlayer(Player *target); - private: - // Heals the target based off its hps - void HealTarget (Unit& target, uint8 hp); +private: + // Heals the target based off its hps + void HealTarget (Unit& target, uint8 hp); - // holy - uint32 BINDING_HEAL, - CIRCLE_OF_HEALING, - CLEARCASTING, - DESPERATE_PRAYER, - FLASH_HEAL, - GREATER_HEAL, - HEAL, - HOLY_FIRE, - HOLY_NOVA, - LESSER_HEAL, - MANA_BURN, - PRAYER_OF_HEALING, - PRAYER_OF_MENDING, - RENEW, - RESURRECTION, - SMITE; + // holy + uint32 BINDING_HEAL, + CIRCLE_OF_HEALING, + CLEARCASTING, + DESPERATE_PRAYER, + FLASH_HEAL, + GREATER_HEAL, + HEAL, + HOLY_FIRE, + HOLY_NOVA, + LESSER_HEAL, + MANA_BURN, + PRAYER_OF_HEALING, + PRAYER_OF_MENDING, + RENEW, + RESURRECTION, + SMITE; - // shadowmagic - uint32 FADE, - SHADOW_WORD_PAIN, - MIND_BLAST, - SCREAM, - MIND_FLAY, - DEVOURING_PLAGUE, - SHADOW_PROTECTION, - VAMPIRIC_TOUCH, - PRAYER_OF_SHADOW_PROTECTION, - SHADOWFIEND, - MIND_SEAR; + // shadowmagic + uint32 FADE, + SHADOW_WORD_PAIN, + MIND_BLAST, + SCREAM, + MIND_FLAY, + DEVOURING_PLAGUE, + SHADOW_PROTECTION, + VAMPIRIC_TOUCH, + PRAYER_OF_SHADOW_PROTECTION, + SHADOWFIEND, + MIND_SEAR; - // discipline - uint32 POWER_WORD_SHIELD, - INNER_FIRE, - POWER_WORD_FORTITUDE, - PRAYER_OF_FORTITUDE, - FEAR_WARD, - POWER_INFUSION, - MASS_DISPEL, - PENANCE, - DIVINE_SPIRIT, - PRAYER_OF_SPIRIT, - INNER_FOCUS; + // discipline + uint32 POWER_WORD_SHIELD, + INNER_FIRE, + POWER_WORD_FORTITUDE, + PRAYER_OF_FORTITUDE, + FEAR_WARD, + POWER_INFUSION, + MASS_DISPEL, + PENANCE, + DIVINE_SPIRIT, + PRAYER_OF_SPIRIT, + INNER_FOCUS; - // first aid - uint32 RECENTLY_BANDAGED; + // first aid + uint32 RECENTLY_BANDAGED; - // racial - uint32 ARCANE_TORRENT, - GIFT_OF_THE_NAARU, - STONEFORM, - ESCAPE_ARTIST, - EVERY_MAN_FOR_HIMSELF, - SHADOWMELD, - WAR_STOMP, - BERSERKING, - WILL_OF_THE_FORSAKEN; + // racial + uint32 ARCANE_TORRENT, + GIFT_OF_THE_NAARU, + STONEFORM, + ESCAPE_ARTIST, + EVERY_MAN_FOR_HIMSELF, + SHADOWMELD, + WAR_STOMP, + BERSERKING, + WILL_OF_THE_FORSAKEN; - uint32 SpellSequence, LastSpellHoly, LastSpellShadowMagic, LastSpellDiscipline; + uint32 SpellSequence, LastSpellHoly, LastSpellShadowMagic, LastSpellDiscipline; }; #endif diff --git a/src/game/playerbot/PlayerbotRogueAI.cpp b/src/game/playerbot/PlayerbotRogueAI.cpp index 935aebea2..c99b756d3 100644 --- a/src/game/playerbot/PlayerbotRogueAI.cpp +++ b/src/game/playerbot/PlayerbotRogueAI.cpp @@ -1,14 +1,14 @@ - /* - Name : PlayerbotRogueAI.cpp - Complete: maybe around 28% - Author : Natsukawa - Version : 0.37 - */ +/* + Name : PlayerbotRogueAI.cpp + Complete: maybe around 28% + Author : Natsukawa + Version : 0.37 + */ #include "PlayerbotRogueAI.h" #include "PlayerbotMgr.h" class PlayerbotAI; -PlayerbotRogueAI::PlayerbotRogueAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) +PlayerbotRogueAI::PlayerbotRogueAI(Player* const master, Player* const bot, PlayerbotAI* const ai) : PlayerbotClassAI(master, bot, ai) { SINISTER_STRIKE = ai->initSpell(SINISTER_STRIKE_1); BACKSTAB = ai->initSpell(BACKSTAB_1); @@ -61,10 +61,10 @@ bool PlayerbotRogueAI::DoFirstCombatManeuver(Unit *pTarget) PlayerbotAI* ai = GetAI(); Player * m_bot = GetPlayerBot(); - if( STEALTH>0 && !m_bot->HasAura( STEALTH ) && ai->CastSpell(STEALTH, *m_bot) ) + if (STEALTH > 0 && !m_bot->HasAura(STEALTH) && ai->CastSpell(STEALTH, *m_bot)) { - if( ai->GetManager()->m_confDebugWhisper ) - ai->TellMaster( "First > Stealth (%d)", STEALTH ); + if (ai->GetManager()->m_confDebugWhisper) + ai->TellMaster("First > Stealth (%d)", STEALTH); return false; } @@ -73,7 +73,7 @@ bool PlayerbotRogueAI::DoFirstCombatManeuver(Unit *pTarget) void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) { - if( !pTarget ) + if (!pTarget) return; PlayerbotAI* ai = GetAI(); @@ -88,14 +88,14 @@ void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) return; } - ai->SetInFront( pTarget ); + ai->SetInFront(pTarget); Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); - float fTargetDist = m_bot->GetDistance( pTarget ); + float fTargetDist = m_bot->GetDistance(pTarget); // TODO: make this work better... /*if (pVictim) - { + { if( pVictim!=m_bot && !m_bot->hasUnitState(UNIT_STAT_FOLLOW) && !pTarget->isInBackInMap(m_bot,10) ) { GetAI()->TellMaster( "getting behind target" ); m_bot->GetMotionMaster()->Clear( true ); @@ -107,35 +107,35 @@ void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) m_bot->GetMotionMaster()->Clear( true ); m_bot->GetMotionMaster()->MoveChase( pTarget ); } - }*/ + }*/ //Rouge like behaviour. ^^ /* if (VANISH > 0 && GetMaster()->isDead()) { //Causes the server to crash :( removed for now. m_bot->AttackStop(); m_bot->RemoveAllAttackers(); ai->CastSpell(VANISH); -// m_bot->RemoveAllSpellCooldown(); + // m_bot->RemoveAllSpellCooldown(); GetAI()->TellMaster("AttackStop, CombatStop, Vanish"); }*/ // decide what to do: - if( pVictim==m_bot && CLOAK_OF_SHADOWS>0 && pVictim->HasAura(SPELL_AURA_PERIODIC_DAMAGE) && !m_bot->HasAura(CLOAK_OF_SHADOWS, EFFECT_INDEX_0) && ai->CastSpell(CLOAK_OF_SHADOWS)) + if (pVictim == m_bot && CLOAK_OF_SHADOWS > 0 && pVictim->HasAura(SPELL_AURA_PERIODIC_DAMAGE) && !m_bot->HasAura(CLOAK_OF_SHADOWS, EFFECT_INDEX_0) && ai->CastSpell(CLOAK_OF_SHADOWS)) { - if( ai->GetManager()->m_confDebugWhisper ) - ai->TellMaster( "CoS!" ); + if (ai->GetManager()->m_confDebugWhisper) + ai->TellMaster("CoS!"); return; } - else if( m_bot->HasAura( STEALTH ) ) + else if (m_bot->HasAura(STEALTH)) SpellSequence = RogueStealth; - else if( pTarget->IsNonMeleeSpellCasted(true) ) + else if (pTarget->IsNonMeleeSpellCasted(true)) SpellSequence = RogueSpellPreventing; - else if( pVictim==m_bot && ai->GetHealthPercent()<40 ) + else if (pVictim == m_bot && ai->GetHealthPercent() < 40) SpellSequence = RogueThreat; else SpellSequence = RogueCombat; // we fight in melee, target is not in range, skip the next part! - if( fTargetDist > ATTACK_DISTANCE ) + if (fTargetDist > ATTACK_DISTANCE) return; std::ostringstream out; @@ -143,41 +143,41 @@ void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) { case RogueStealth: out << "Case Stealth"; - if( PREMEDITATION>0 && ai->CastSpell(PREMEDITATION,*pTarget) ) + if (PREMEDITATION > 0 && ai->CastSpell(PREMEDITATION, *pTarget)) out << " > Premeditation"; - else if( AMBUSH>0 && ai->GetEnergyAmount()>=60 && ai->CastSpell(AMBUSH,*pTarget) ) + else if (AMBUSH > 0 && ai->GetEnergyAmount() >= 60 && ai->CastSpell(AMBUSH, *pTarget)) out << " > Ambush"; - else if( CHEAP_SHOT>0 && !pTarget->HasAura(CHEAP_SHOT, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=60 && ai->CastSpell(CHEAP_SHOT,*pTarget) ) + else if (CHEAP_SHOT > 0 && !pTarget->HasAura(CHEAP_SHOT, EFFECT_INDEX_0) && ai->GetEnergyAmount() >= 60 && ai->CastSpell(CHEAP_SHOT, *pTarget)) out << " > Cheap Shot"; - else if( GARROTE>0 && ai->GetEnergyAmount()>=50 && ai->CastSpell(GARROTE,*pTarget) ) + else if (GARROTE > 0 && ai->GetEnergyAmount() >= 50 && ai->CastSpell(GARROTE, *pTarget)) out << " > Garrote"; else out << " NONE!"; break; case RogueThreat: out << "Case Threat"; - if( GOUGE>0 && ai->GetEnergyAmount()>=45 && !pTarget->HasAura(GOUGE, EFFECT_INDEX_0) && ai->CastSpell(GOUGE,*pTarget) ) - out << " > Gouge"; - else if( EVASION>0 && ai->GetHealthPercent()<=35 && !m_bot->HasAura(EVASION, EFFECT_INDEX_0) && ai->CastSpell(EVASION) ) + if (GOUGE > 0 && ai->GetEnergyAmount() >= 45 && !pTarget->HasAura(GOUGE, EFFECT_INDEX_0) && ai->CastSpell(GOUGE, *pTarget)) + out << " > Gouge"; + else if (EVASION > 0 && ai->GetHealthPercent() <= 35 && !m_bot->HasAura(EVASION, EFFECT_INDEX_0) && ai->CastSpell(EVASION)) out << " > Evasion"; - else if( BLIND>0 && ai->GetHealthPercent()<=30 && !pTarget->HasAura(BLIND, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=30 && ai->CastSpell(BLIND,*pTarget) ) + else if (BLIND > 0 && ai->GetHealthPercent() <= 30 && !pTarget->HasAura(BLIND, EFFECT_INDEX_0) && ai->GetEnergyAmount() >= 30 && ai->CastSpell(BLIND, *pTarget)) out << " > Blind"; - else if( FEINT>0 && ai->GetHealthPercent()<=25 && ai->GetEnergyAmount()>=20 && ai->CastSpell(FEINT) ) + else if (FEINT > 0 && ai->GetHealthPercent() <= 25 && ai->GetEnergyAmount() >= 20 && ai->CastSpell(FEINT)) out << " > Feint"; - else if( VANISH>0 && ai->GetHealthPercent()<=20 && !m_bot->HasAura(FEINT, EFFECT_INDEX_0) && ai->CastSpell(VANISH) ) + else if (VANISH > 0 && ai->GetHealthPercent() <= 20 && !m_bot->HasAura(FEINT, EFFECT_INDEX_0) && ai->CastSpell(VANISH)) out << " > Vanish"; - else if( PREPARATION>0 && ai->CastSpell(PREPARATION) ) + else if (PREPARATION > 0 && ai->CastSpell(PREPARATION)) out << " > Preparation"; - else if( m_bot->getRace() == RACE_NIGHTELF && ai->GetHealthPercent()<=15 && !m_bot->HasAura( SHADOWMELD, EFFECT_INDEX_0) && ai->CastSpell( SHADOWMELD, *m_bot ) ) + else if (m_bot->getRace() == RACE_NIGHTELF && ai->GetHealthPercent() <= 15 && !m_bot->HasAura(SHADOWMELD, EFFECT_INDEX_0) && ai->CastSpell(SHADOWMELD, *m_bot)) out << " > Shadowmeld"; else out << " NONE!"; break; case RogueSpellPreventing: out << "Case Prevent"; - if( KIDNEY_SHOT>0 && ai->GetEnergyAmount()>=25 && m_bot->GetComboPoints()>=2 && ai->CastSpell(KIDNEY_SHOT,*pTarget) ) + if (KIDNEY_SHOT > 0 && ai->GetEnergyAmount() >= 25 && m_bot->GetComboPoints() >= 2 && ai->CastSpell(KIDNEY_SHOT, *pTarget)) out << " > Kidney Shot"; - else if( KICK>0 && ai->GetEnergyAmount()>=25 && ai->CastSpell(KICK,*pTarget) ) + else if (KICK > 0 && ai->GetEnergyAmount() >= 25 && ai->CastSpell(KICK, *pTarget)) out << " > Kick"; else out << " NONE!"; @@ -185,78 +185,78 @@ void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) case RogueCombat: default: out << "Case Combat"; - if( m_bot->GetComboPoints()<=4 ) + if (m_bot->GetComboPoints() <= 4) { - if( SHADOW_DANCE>0 && !m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && ai->CastSpell(SHADOW_DANCE,*m_bot) ) + if (SHADOW_DANCE > 0 && !m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && ai->CastSpell(SHADOW_DANCE, *m_bot)) out << " > Shadow Dance"; - else if( CHEAP_SHOT>0 && m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && !pTarget->HasAura(CHEAP_SHOT, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=60 && ai->CastSpell(CHEAP_SHOT,*pTarget) ) + else if (CHEAP_SHOT > 0 && m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && !pTarget->HasAura(CHEAP_SHOT, EFFECT_INDEX_0) && ai->GetEnergyAmount() >= 60 && ai->CastSpell(CHEAP_SHOT, *pTarget)) out << " > Cheap Shot"; - else if( AMBUSH>0 && m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=60 && ai->CastSpell(AMBUSH,*pTarget) ) + else if (AMBUSH > 0 && m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && ai->GetEnergyAmount() >= 60 && ai->CastSpell(AMBUSH, *pTarget)) out << " > Ambush"; - else if( GARROTE>0 && m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=50 && ai->CastSpell(GARROTE,*pTarget) ) + else if (GARROTE > 0 && m_bot->HasAura(SHADOW_DANCE, EFFECT_INDEX_0) && ai->GetEnergyAmount() >= 50 && ai->CastSpell(GARROTE, *pTarget)) out << " > Garrote"; - else if( BACKSTAB>0 && pTarget->isInBackInMap(m_bot,1) && ai->GetEnergyAmount()>=60 && ai->CastSpell(BACKSTAB,*pTarget) ) + else if (BACKSTAB > 0 && pTarget->isInBackInMap(m_bot, 1) && ai->GetEnergyAmount() >= 60 && ai->CastSpell(BACKSTAB, *pTarget)) out << " > Backstab"; - else if( MUTILATE>0 && ai->GetEnergyAmount()>=60 && ai->CastSpell(MUTILATE,*pTarget) ) + else if (MUTILATE > 0 && ai->GetEnergyAmount() >= 60 && ai->CastSpell(MUTILATE, *pTarget)) out << " > Mutilate"; - else if( SINISTER_STRIKE>0 && ai->GetEnergyAmount()>=45 && ai->CastSpell(SINISTER_STRIKE,*pTarget) ) + else if (SINISTER_STRIKE > 0 && ai->GetEnergyAmount() >= 45 && ai->CastSpell(SINISTER_STRIKE, *pTarget)) out << " > Sinister Strike"; - else if( GHOSTLY_STRIKE>0 && ai->GetEnergyAmount()>=40 && ai->CastSpell(GHOSTLY_STRIKE,*pTarget) ) + else if (GHOSTLY_STRIKE > 0 && ai->GetEnergyAmount() >= 40 && ai->CastSpell(GHOSTLY_STRIKE, *pTarget)) out << " > Ghostly Strike"; - else if( HEMORRHAGE>0 && ai->GetEnergyAmount()>=35 && ai->CastSpell(HEMORRHAGE,*pTarget) ) + else if (HEMORRHAGE > 0 && ai->GetEnergyAmount() >= 35 && ai->CastSpell(HEMORRHAGE, *pTarget)) out << " > Hemorrhage"; - else if( DISMANTLE>0 && !pTarget->HasFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISARMED) && ai->GetEnergyAmount()>=25 && ai->CastSpell(DISMANTLE,*pTarget) ) + else if (DISMANTLE > 0 && !pTarget->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISARMED) && ai->GetEnergyAmount() >= 25 && ai->CastSpell(DISMANTLE, *pTarget)) out << " > Dismantle"; - else if( SHADOWSTEP>0 && ai->GetEnergyAmount()>=10 && ai->CastSpell(SHADOWSTEP,*pTarget) ) + else if (SHADOWSTEP > 0 && ai->GetEnergyAmount() >= 10 && ai->CastSpell(SHADOWSTEP, *pTarget)) out << " > Shadowstep"; - else if( m_bot->getRace() == RACE_BLOODELF && !pTarget->HasAura( ARCANE_TORRENT, EFFECT_INDEX_0) && ai->CastSpell( ARCANE_TORRENT,*pTarget ) ) + else if (m_bot->getRace() == RACE_BLOODELF && !pTarget->HasAura(ARCANE_TORRENT, EFFECT_INDEX_0) && ai->CastSpell(ARCANE_TORRENT, *pTarget)) out << " > Arcane Torrent"; - else if( m_bot->getRace() == RACE_HUMAN && m_bot->hasUnitState( UNIT_STAT_STUNNED ) || m_bot->HasAuraType( SPELL_AURA_MOD_FEAR ) || m_bot->HasAuraType( SPELL_AURA_MOD_DECREASE_SPEED ) || m_bot->HasAuraType( SPELL_AURA_MOD_CHARM ) && ai->CastSpell( EVERY_MAN_FOR_HIMSELF, *m_bot ) ) + else if (m_bot->getRace() == RACE_HUMAN && m_bot->hasUnitState(UNIT_STAT_STUNNED) || m_bot->HasAuraType(SPELL_AURA_MOD_FEAR) || m_bot->HasAuraType(SPELL_AURA_MOD_DECREASE_SPEED) || m_bot->HasAuraType(SPELL_AURA_MOD_CHARM) && ai->CastSpell(EVERY_MAN_FOR_HIMSELF, *m_bot)) out << " > Every Man for Himself"; - else if( m_bot->getRace() == RACE_UNDEAD_PLAYER && m_bot->HasAuraType( SPELL_AURA_MOD_FEAR ) || m_bot->HasAuraType( SPELL_AURA_MOD_CHARM ) && ai->CastSpell( WILL_OF_THE_FORSAKEN, *m_bot ) ) + else if (m_bot->getRace() == RACE_UNDEAD_PLAYER && m_bot->HasAuraType(SPELL_AURA_MOD_FEAR) || m_bot->HasAuraType(SPELL_AURA_MOD_CHARM) && ai->CastSpell(WILL_OF_THE_FORSAKEN, *m_bot)) out << " > Will of the Forsaken"; - else if( m_bot->getRace() == RACE_DWARF && m_bot->HasAuraState( AURA_STATE_DEADLY_POISON ) && ai->CastSpell( STONEFORM, *m_bot ) ) + else if (m_bot->getRace() == RACE_DWARF && m_bot->HasAuraState(AURA_STATE_DEADLY_POISON) && ai->CastSpell(STONEFORM, *m_bot)) out << " > Stoneform"; - else if( m_bot->getRace() == RACE_GNOME && m_bot->hasUnitState( UNIT_STAT_STUNNED ) || m_bot->HasAuraType( SPELL_AURA_MOD_DECREASE_SPEED ) && ai->CastSpell( ESCAPE_ARTIST, *m_bot ) ) + else if (m_bot->getRace() == RACE_GNOME && m_bot->hasUnitState(UNIT_STAT_STUNNED) || m_bot->HasAuraType(SPELL_AURA_MOD_DECREASE_SPEED) && ai->CastSpell(ESCAPE_ARTIST, *m_bot)) out << " > Escape Artist"; - else if( m_bot->getRace() == RACE_ORC && !m_bot->HasAura( BLOOD_FURY, EFFECT_INDEX_0) && ai->CastSpell( BLOOD_FURY, *m_bot ) ) + else if (m_bot->getRace() == RACE_ORC && !m_bot->HasAura(BLOOD_FURY, EFFECT_INDEX_0) && ai->CastSpell(BLOOD_FURY, *m_bot)) out << " > Blood Fury"; - else if( m_bot->getRace() == RACE_TROLL && !m_bot->HasAura( BERSERKING, EFFECT_INDEX_0) && ai->CastSpell( BERSERKING, *m_bot ) ) + else if (m_bot->getRace() == RACE_TROLL && !m_bot->HasAura(BERSERKING, EFFECT_INDEX_0) && ai->CastSpell(BERSERKING, *m_bot)) out << " > Berserking"; - else + else out << " NONE!"; } else { - if( EVISCERATE>0 && pTarget->getClass()==CLASS_ROGUE && ai->GetEnergyAmount()>=35 && ai->CastSpell(EVISCERATE,*pTarget) ) + if (EVISCERATE > 0 && pTarget->getClass() == CLASS_ROGUE && ai->GetEnergyAmount() >= 35 && ai->CastSpell(EVISCERATE, *pTarget)) out << " > Rogue Eviscerate"; - else if( EVISCERATE>0 && pTarget->getClass()==CLASS_DRUID && ai->GetEnergyAmount()>=35 && ai->CastSpell(EVISCERATE,*pTarget) ) + else if (EVISCERATE > 0 && pTarget->getClass() == CLASS_DRUID && ai->GetEnergyAmount() >= 35 && ai->CastSpell(EVISCERATE, *pTarget)) out << " > Druid Eviscerate"; - else if( KIDNEY_SHOT>0 && pTarget->getClass()==CLASS_SHAMAN && ai->GetEnergyAmount()>=25 && ai->CastSpell(KIDNEY_SHOT,*pTarget) ) + else if (KIDNEY_SHOT > 0 && pTarget->getClass() == CLASS_SHAMAN && ai->GetEnergyAmount() >= 25 && ai->CastSpell(KIDNEY_SHOT, *pTarget)) out << " > Shaman Kidney"; - else if (SLICE_DICE>0 && pTarget->getClass()==CLASS_WARLOCK && ai->GetEnergyAmount()>=25 && ai->CastSpell(SLICE_DICE, *pTarget) ) + else if (SLICE_DICE > 0 && pTarget->getClass() == CLASS_WARLOCK && ai->GetEnergyAmount() >= 25 && ai->CastSpell(SLICE_DICE, *pTarget)) out << " > Warlock Slice & Dice"; - else if (SLICE_DICE>0 && pTarget->getClass()==CLASS_HUNTER && ai->GetEnergyAmount()>=25 && ai->CastSpell(SLICE_DICE, *pTarget) ) + else if (SLICE_DICE > 0 && pTarget->getClass() == CLASS_HUNTER && ai->GetEnergyAmount() >= 25 && ai->CastSpell(SLICE_DICE, *pTarget)) out << " > Hunter Slice & Dice"; - else if (EXPOSE_ARMOR>0 && pTarget->getClass()==CLASS_WARRIOR && !pTarget->HasAura(EXPOSE_ARMOR, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=25 && ai->CastSpell(EXPOSE_ARMOR, *pTarget) ) + else if (EXPOSE_ARMOR > 0 && pTarget->getClass() == CLASS_WARRIOR && !pTarget->HasAura(EXPOSE_ARMOR, EFFECT_INDEX_0) && ai->GetEnergyAmount() >= 25 && ai->CastSpell(EXPOSE_ARMOR, *pTarget)) out << " > Warrior Expose Armor"; - else if (EXPOSE_ARMOR>0 && pTarget->getClass()==CLASS_PALADIN && !pTarget->HasAura(EXPOSE_ARMOR, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=25 && ai->CastSpell(EXPOSE_ARMOR, *pTarget) ) + else if (EXPOSE_ARMOR > 0 && pTarget->getClass() == CLASS_PALADIN && !pTarget->HasAura(EXPOSE_ARMOR, EFFECT_INDEX_0) && ai->GetEnergyAmount() >= 25 && ai->CastSpell(EXPOSE_ARMOR, *pTarget)) out << " > Paladin Expose Armor"; - else if (EXPOSE_ARMOR>0 && pTarget->getClass()==CLASS_DEATH_KNIGHT && !pTarget->HasAura(EXPOSE_ARMOR, EFFECT_INDEX_0) && ai->GetEnergyAmount()>=25 && ai->CastSpell(EXPOSE_ARMOR, *pTarget) ) + else if (EXPOSE_ARMOR > 0 && pTarget->getClass() == CLASS_DEATH_KNIGHT && !pTarget->HasAura(EXPOSE_ARMOR, EFFECT_INDEX_0) && ai->GetEnergyAmount() >= 25 && ai->CastSpell(EXPOSE_ARMOR, *pTarget)) out << " > DK Expose Armor"; - else if (RUPTURE>0 && pTarget->getClass()==CLASS_MAGE && ai->GetEnergyAmount()>=25 && ai->CastSpell(RUPTURE, *pTarget) ) + else if (RUPTURE > 0 && pTarget->getClass() == CLASS_MAGE && ai->GetEnergyAmount() >= 25 && ai->CastSpell(RUPTURE, *pTarget)) out << " > Mage Rupture"; - else if (RUPTURE>0 && pTarget->getClass()==CLASS_PRIEST && ai->GetEnergyAmount()>=25 && ai->CastSpell(RUPTURE, *pTarget) ) + else if (RUPTURE > 0 && pTarget->getClass() == CLASS_PRIEST && ai->GetEnergyAmount() >= 25 && ai->CastSpell(RUPTURE, *pTarget)) out << " > Priest Rupture"; - else if( EVISCERATE>0 && ai->GetEnergyAmount()>=35 && ai->CastSpell(EVISCERATE, *pTarget) ) + else if (EVISCERATE > 0 && ai->GetEnergyAmount() >= 35 && ai->CastSpell(EVISCERATE, *pTarget)) out << " > Eviscerate"; else out << " NONE!"; } break; } - if( ai->GetManager()->m_confDebugWhisper ) - ai->TellMaster( out.str().c_str() ); + if (ai->GetManager()->m_confDebugWhisper) + ai->TellMaster(out.str().c_str()); } // end DoNextCombatManeuver @@ -272,8 +272,8 @@ void PlayerbotRogueAI::DoNonCombatActions() return; // remove stealth - if( m_bot->HasAura( STEALTH ) ) - m_bot->RemoveSpellsCausingAura( SPELL_AURA_MOD_STEALTH ); + if (m_bot->HasAura(STEALTH)) + m_bot->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH); // hp check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) @@ -332,5 +332,4 @@ void PlayerbotRogueAI::DoNonCombatActions() } // end DoNonCombatActions -void PlayerbotRogueAI::BuffPlayer(Player* target) { -} +void PlayerbotRogueAI::BuffPlayer(Player* target) {} diff --git a/src/game/playerbot/PlayerbotRogueAI.h b/src/game/playerbot/PlayerbotRogueAI.h index 6ce1132ff..b15cc67d2 100644 --- a/src/game/playerbot/PlayerbotRogueAI.h +++ b/src/game/playerbot/PlayerbotRogueAI.h @@ -69,37 +69,37 @@ enum RogueSpells class MANGOS_DLL_SPEC PlayerbotRogueAI : PlayerbotClassAI { - public: - PlayerbotRogueAI(Player* const master, Player* const bot, PlayerbotAI* const ai); - virtual ~PlayerbotRogueAI(); +public: + PlayerbotRogueAI(Player * const master, Player * const bot, PlayerbotAI * const ai); + virtual ~PlayerbotRogueAI(); - // all combat actions go here - bool DoFirstCombatManeuver(Unit*); - void DoNextCombatManeuver(Unit*); + // all combat actions go here + bool DoFirstCombatManeuver(Unit*); + void DoNextCombatManeuver(Unit*); - // all non combat actions go here, ex buffs, heals, rezzes - void DoNonCombatActions(); + // all non combat actions go here, ex buffs, heals, rezzes + void DoNonCombatActions(); - // buff a specific player, usually a real PC who is not in group - void BuffPlayer(Player *target); + // buff a specific player, usually a real PC who is not in group + void BuffPlayer(Player *target); - private: - // COMBAT - uint32 SINISTER_STRIKE, BACKSTAB, GOUGE, EVASION, SPRINT, KICK, FEINT, SHIV, FAN_OF_KNIVES; +private: + // COMBAT + uint32 SINISTER_STRIKE, BACKSTAB, GOUGE, EVASION, SPRINT, KICK, FEINT, SHIV, FAN_OF_KNIVES; - // SUBTLETY - uint32 SHADOWSTEP, STEALTH, VANISH, HEMORRHAGE, BLIND, SHADOW_DANCE, CLOAK_OF_SHADOWS, TRICK_TRADE, CRIPPLING_POISON, DEADLY_POISON, MIND_NUMBING_POISON, GHOSTLY_STRIKE, DISTRACT, PREPARATION, PREMEDITATION; + // SUBTLETY + uint32 SHADOWSTEP, STEALTH, VANISH, HEMORRHAGE, BLIND, SHADOW_DANCE, CLOAK_OF_SHADOWS, TRICK_TRADE, CRIPPLING_POISON, DEADLY_POISON, MIND_NUMBING_POISON, GHOSTLY_STRIKE, DISTRACT, PREPARATION, PREMEDITATION; - // ASSASSINATION - uint32 EVISCERATE, SLICE_DICE, GARROTE, EXPOSE_ARMOR, AMBUSH, RUPTURE, DISMANTLE, CHEAP_SHOT, KIDNEY_SHOT, MUTILATE, ENVENOM, DEADLY_THROW; + // ASSASSINATION + uint32 EVISCERATE, SLICE_DICE, GARROTE, EXPOSE_ARMOR, AMBUSH, RUPTURE, DISMANTLE, CHEAP_SHOT, KIDNEY_SHOT, MUTILATE, ENVENOM, DEADLY_THROW; - // first aid - uint32 RECENTLY_BANDAGED; + // first aid + uint32 RECENTLY_BANDAGED; - // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + // racial + uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; - uint32 SpellSequence, LastSpellCombat, LastSpellSubtlety, LastSpellAssassination, Aura; + uint32 SpellSequence, LastSpellCombat, LastSpellSubtlety, LastSpellAssassination, Aura; }; #endif diff --git a/src/game/playerbot/PlayerbotShamanAI.cpp b/src/game/playerbot/PlayerbotShamanAI.cpp index 3cbff6daf..da60fd5c5 100644 --- a/src/game/playerbot/PlayerbotShamanAI.cpp +++ b/src/game/playerbot/PlayerbotShamanAI.cpp @@ -2,7 +2,7 @@ #include "PlayerbotShamanAI.h" class PlayerbotAI; -PlayerbotShamanAI::PlayerbotShamanAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) +PlayerbotShamanAI::PlayerbotShamanAI(Player* const master, Player* const bot, PlayerbotAI* const ai) : PlayerbotClassAI(master, bot, ai) { // restoration CHAIN_HEAL = ai->initSpell(CHAIN_HEAL_1); @@ -101,7 +101,7 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) // ------- Non Duel combat ---------- - ai->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, GetMaster() ); // dont want to melee mob <----changed + ai->SetMovementOrder(PlayerbotAI::MOVEMENT_FOLLOW, GetMaster()); // dont want to melee mob <----changed Player *m_bot = GetPlayerBot(); Group *m_group = m_bot->GetGroup(); @@ -119,154 +119,154 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) HealTarget (*m_bot, ai->GetHealthPercent()); // Heal master - uint32 masterHP = GetMaster()->GetHealth()*100 / GetMaster()->GetMaxHealth(); + uint32 masterHP = GetMaster()->GetHealth() * 100 / GetMaster()->GetMaxHealth(); if (GetMaster()->isAlive()) { if (masterHP < 30 && ai->GetManaPercent() >= 32) - ai->CastSpell(HEALING_WAVE, *(GetMaster())); + ai->CastSpell(HEALING_WAVE, *(GetMaster())); else if (masterHP < 70) HealTarget (*GetMaster(), masterHP); } // Heal group - if( m_group ) + if (m_group) { Group::MemberSlotList const& groupSlot = m_group->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { - Player *m_groupMember = sObjectMgr.GetPlayer( itr->guid ); - if( !m_groupMember || !m_groupMember->isAlive() ) + Player *m_groupMember = sObjectMgr.GetPlayer(itr->guid); + if (!m_groupMember || !m_groupMember->isAlive()) continue; - uint32 memberHP = m_groupMember->GetHealth()*100 / m_groupMember->GetMaxHealth(); - if( memberHP < 30 ) - HealTarget( *m_groupMember, memberHP ); + uint32 memberHP = m_groupMember->GetHealth() * 100 / m_groupMember->GetMaxHealth(); + if (memberHP < 30) + HealTarget(*m_groupMember, memberHP); } } // Damage Spells - ai->SetInFront( pTarget ); + ai->SetInFront(pTarget); switch (SpellSequence) { case SPELL_ENHANCEMENT: - if (STRENGTH_OF_EARTH_TOTEM > 0 && LastSpellEnhancement == 1 && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 13) + if (STRENGTH_OF_EARTH_TOTEM > 0 && LastSpellEnhancement == 1 && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 13) { ai->CastSpell(STRENGTH_OF_EARTH_TOTEM); SpellSequence = SPELL_RESTORATION; - LastSpellEnhancement = LastSpellEnhancement +1; + LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (STONESKIN_TOTEM > 0 && LastSpellEnhancement == 5 && (!m_bot->HasAura(STONESKIN_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 13) { ai->CastSpell(STONESKIN_TOTEM); SpellSequence = SPELL_RESTORATION; - LastSpellEnhancement = LastSpellEnhancement +1; + LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (FOCUSED > 0 && LastSpellEnhancement == 2) { ai->CastSpell(FOCUSED, *pTarget); SpellSequence = SPELL_RESTORATION; - LastSpellEnhancement = LastSpellEnhancement +1; + LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (FROST_RESISTANCE_TOTEM > 0 && LastSpellEnhancement == 10 && (!m_bot->HasAura(FROST_RESISTANCE_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(TOTEM_OF_WRATH, EFFECT_INDEX_0)) && (!m_bot->HasAura(FLAMETONGUE_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 10) { ai->CastSpell(FROST_RESISTANCE_TOTEM); SpellSequence = SPELL_RESTORATION; - LastSpellEnhancement = LastSpellEnhancement +1; + LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (FLAMETONGUE_TOTEM > 0 && LastSpellEnhancement == 15 && (!m_bot->HasAura(FLAMETONGUE_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(TOTEM_OF_WRATH, EFFECT_INDEX_0)) && (!m_bot->HasAura(FROST_RESISTANCE_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 14) { ai->CastSpell(FLAMETONGUE_TOTEM); SpellSequence = SPELL_RESTORATION; - LastSpellEnhancement = LastSpellEnhancement +1; + LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (FIRE_RESISTANCE_TOTEM > 0 && LastSpellEnhancement == 20 && (!m_bot->HasAura(FIRE_RESISTANCE_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(HEALING_STREAM_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(MANA_SPRING_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 10) { ai->CastSpell(FIRE_RESISTANCE_TOTEM); SpellSequence = SPELL_RESTORATION; - LastSpellEnhancement = LastSpellEnhancement +1; + LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (GROUNDING_TOTEM > 0 && LastSpellEnhancement == 25 && (!m_bot->HasAura(GROUNDING_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(WRATH_OF_AIR_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(WIND_FURY_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 5) { ai->CastSpell(GROUNDING_TOTEM); SpellSequence = SPELL_RESTORATION; - LastSpellEnhancement = LastSpellEnhancement +1; + LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (NATURE_RESISTANCE_TOTEM > 0 && LastSpellEnhancement == 30 && (!m_bot->HasAura(NATURE_RESISTANCE_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(WRATH_OF_AIR_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(GROUNDING_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(WIND_FURY_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 10) { ai->CastSpell(NATURE_RESISTANCE_TOTEM); SpellSequence = SPELL_RESTORATION; - LastSpellEnhancement = LastSpellEnhancement +1; + LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (WIND_FURY_TOTEM > 0 && LastSpellEnhancement == 35 && (!m_bot->HasAura(WIND_FURY_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(WRATH_OF_AIR_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(GROUNDING_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 11) { ai->CastSpell(WIND_FURY_TOTEM); SpellSequence = SPELL_RESTORATION; - LastSpellEnhancement = LastSpellEnhancement +1; + LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (STORMSTRIKE > 0 && LastSpellEnhancement == 4 && (!pTarget->HasAura(STORMSTRIKE, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 8) { ai->CastSpell(STORMSTRIKE, *pTarget); SpellSequence = SPELL_RESTORATION; - LastSpellEnhancement = LastSpellEnhancement +1; + LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (LAVA_LASH > 0 && LastSpellEnhancement == 6 && ai->GetManaPercent() >= 4) { ai->CastSpell(LAVA_LASH, *pTarget); SpellSequence = SPELL_RESTORATION; - LastSpellEnhancement = LastSpellEnhancement +1; + LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (FERAL_SPIRIT > 0 && LastSpellEnhancement == 7 && ai->GetManaPercent() >= 12) { ai->CastSpell(FERAL_SPIRIT); SpellSequence = SPELL_RESTORATION; - LastSpellEnhancement = LastSpellEnhancement +1; + LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (WRATH_OF_AIR_TOTEM > 0 && (!m_bot->HasAura(WRATH_OF_AIR_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(GROUNDING_TOTEM, EFFECT_INDEX_0)) && LastSpellEnhancement == 40) { ai->CastSpell(WRATH_OF_AIR_TOTEM); SpellSequence = SPELL_RESTORATION; - LastSpellEnhancement = LastSpellEnhancement +1; + LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (EARTH_ELEMENTAL_TOTEM > 0 && LastSpellEnhancement == 45 && ai->GetManaPercent() >= 24) { ai->CastSpell(EARTH_ELEMENTAL_TOTEM); SpellSequence = SPELL_RESTORATION; - LastSpellEnhancement = LastSpellEnhancement +1; + LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (BLOODLUST > 0 && LastSpellEnhancement == 8 && (!GetMaster()->HasAura(BLOODLUST, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 26) { ai->CastSpell(BLOODLUST); SpellSequence = SPELL_RESTORATION; - LastSpellEnhancement = LastSpellEnhancement +1; + LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (HEROISM > 0 && LastSpellEnhancement == 10 && (!GetMaster()->HasAura(HEROISM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 26) { ai->CastSpell(HEROISM); SpellSequence = SPELL_RESTORATION; - LastSpellEnhancement = LastSpellEnhancement +1; + LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (SHAMANISTIC_RAGE > 0 && (!m_bot->HasAura(SHAMANISTIC_RAGE, EFFECT_INDEX_0)) && LastSpellEnhancement == 11) { ai->CastSpell(SHAMANISTIC_RAGE, *m_bot); SpellSequence = SPELL_RESTORATION; - LastSpellEnhancement = LastSpellEnhancement +1; + LastSpellEnhancement = LastSpellEnhancement + 1; break; } else if (LastSpellEnhancement > 50) @@ -276,47 +276,47 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) break; } LastSpellEnhancement = LastSpellEnhancement + 1; - //SpellSequence = SPELL_RESTORATION; - //break; + //SpellSequence = SPELL_RESTORATION; + //break; case SPELL_RESTORATION: if (HEALING_STREAM_TOTEM > 0 && LastSpellRestoration < 3 && ai->GetHealthPercent() < 50 && (!m_bot->HasAura(HEALING_STREAM_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(MANA_SPRING_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 4) { ai->CastSpell(HEALING_STREAM_TOTEM); SpellSequence = SPELL_ELEMENTAL; - LastSpellRestoration = LastSpellRestoration +1; + LastSpellRestoration = LastSpellRestoration + 1; break; } else if (MANA_SPRING_TOTEM > 0 && LastSpellRestoration < 4 && (!m_bot->HasAura(MANA_SPRING_TOTEM, EFFECT_INDEX_0)) && (!m_bot->HasAura(HEALING_STREAM_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 5) { ai->CastSpell(MANA_SPRING_TOTEM); SpellSequence = SPELL_ELEMENTAL; - LastSpellRestoration = LastSpellRestoration +1; + LastSpellRestoration = LastSpellRestoration + 1; break; } else if (MANA_TIDE_TOTEM > 0 && LastSpellRestoration < 5 && ai->GetManaPercent() < 50 && ai->GetManaPercent() >= 3) { ai->CastSpell(MANA_TIDE_TOTEM); SpellSequence = SPELL_ELEMENTAL; - LastSpellRestoration = LastSpellRestoration +1; + LastSpellRestoration = LastSpellRestoration + 1; break; } /*else if (TREMOR_TOTEM > 0 && LastSpellRestoration < 6 && (!m_bot->HasAura(STRENGTH_OF_EARTH_TOTEM, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 2) - { + { ai->CastSpell(TREMOR_TOTEM); SpellSequence = SPELL_ELEMENTAL; LastSpellRestoration = LastSpellRestoration +1; break; - }*/ + }*/ else if (LastSpellRestoration > 6) { LastSpellRestoration = 0; SpellSequence = SPELL_ELEMENTAL; break; } - LastSpellRestoration = LastSpellRestoration +1; - //SpellSequence = SPELL_ELEMENTAL; - //break; + LastSpellRestoration = LastSpellRestoration + 1; + //SpellSequence = SPELL_ELEMENTAL; + //break; case SPELL_ELEMENTAL: if (LIGHTNING_BOLT > 0 && LastSpellElemental == 1 && ai->GetManaPercent() >= 13) @@ -425,12 +425,12 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) break; } /*else if (HEX > 0 && LastSpellElemental == 16 && (!pTarget->HasAura(HEX, EFFECT_INDEX_0)) && ai->GetManaPercent() >= 3) - { + { ai->CastSpell(HEX); SpellSequence = SPELL_ENHANCEMENT; LastSpellElemental = LastSpellElemental + 1; break; - }*/ + }*/ else if (LastSpellElemental > 16) { LastSpellElemental = 1; @@ -447,7 +447,7 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) void PlayerbotShamanAI::DoNonCombatActions() { - PlayerbotAI* ai = GetAI(); + PlayerbotAI* ai = GetAI(); Player * m_bot = GetPlayerBot(); if (!m_bot) return; @@ -456,13 +456,13 @@ void PlayerbotShamanAI::DoNonCombatActions() // buff master with EARTH_SHIELD if (EARTH_SHIELD > 0) - (!GetMaster()->HasAura(EARTH_SHIELD, EFFECT_INDEX_0) && ai->CastSpell(EARTH_SHIELD,*(GetMaster())) ); + (!GetMaster()->HasAura(EARTH_SHIELD, EFFECT_INDEX_0) && ai->CastSpell(EARTH_SHIELD, *(GetMaster()))); // buff myself with WATER_SHIELD, LIGHTNING_SHIELD if (WATER_SHIELD > 0) - (!m_bot->HasAura(WATER_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(LIGHTNING_SHIELD, EFFECT_INDEX_0) && ai->CastSpell(WATER_SHIELD,*m_bot) ); + (!m_bot->HasAura(WATER_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(LIGHTNING_SHIELD, EFFECT_INDEX_0) && ai->CastSpell(WATER_SHIELD, *m_bot)); else if (LIGHTNING_SHIELD > 0) - (!m_bot->HasAura(LIGHTNING_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(WATER_SHIELD, EFFECT_INDEX_0) && ai->CastSpell(LIGHTNING_SHIELD,*m_bot) ); + (!m_bot->HasAura(LIGHTNING_SHIELD, EFFECT_INDEX_0) && !m_bot->HasAura(WATER_SHIELD, EFFECT_INDEX_0) && ai->CastSpell(LIGHTNING_SHIELD, *m_bot)); /* // buff myself weapon if (ROCKBITER_WEAPON > 0) @@ -475,7 +475,7 @@ void PlayerbotShamanAI::DoNonCombatActions() (!m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && ai->CastSpell(FLAMETONGUE_WEAPON,*m_bot) ); else if (FROSTBRAND_WEAPON > 0) (!m_bot->HasAura(FROSTBRAND_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(EARTHLIVING_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(WINDFURY_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(FLAMETONGUE_WEAPON, EFFECT_INDEX_0) && !m_bot->HasAura(ROCKBITER_WEAPON, EFFECT_INDEX_0) && ai->CastSpell(FROSTBRAND_WEAPON,*m_bot) ); -*/ + */ // mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); @@ -519,14 +519,13 @@ void PlayerbotShamanAI::DoNonCombatActions() for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { Player *tPlayer = sObjectMgr.GetPlayer(itr->guid); - if( !tPlayer || !tPlayer->isAlive() ) + if (!tPlayer || !tPlayer->isAlive()) continue; - // heal - (HealTarget(*tPlayer, tPlayer->GetHealth()*100 / tPlayer->GetMaxHealth())); + // heal + (HealTarget(*tPlayer, tPlayer->GetHealth() * 100 / tPlayer->GetMaxHealth())); } } } // end DoNonCombatActions -void PlayerbotShamanAI::BuffPlayer(Player* target) { -} +void PlayerbotShamanAI::BuffPlayer(Player* target) {} diff --git a/src/game/playerbot/PlayerbotShamanAI.h b/src/game/playerbot/PlayerbotShamanAI.h index a25078443..2b31d64a2 100644 --- a/src/game/playerbot/PlayerbotShamanAI.h +++ b/src/game/playerbot/PlayerbotShamanAI.h @@ -83,39 +83,39 @@ enum class MANGOS_DLL_SPEC PlayerbotShamanAI : PlayerbotClassAI { - public: - PlayerbotShamanAI(Player* const master, Player* const bot, PlayerbotAI* const ai); - virtual ~PlayerbotShamanAI(); +public: + PlayerbotShamanAI(Player * const master, Player * const bot, PlayerbotAI * const ai); + virtual ~PlayerbotShamanAI(); - // all combat actions go here - void DoNextCombatManeuver(Unit*); + // all combat actions go here + void DoNextCombatManeuver(Unit*); - // all non combat actions go here, ex buffs, heals, rezzes - void DoNonCombatActions(); + // all non combat actions go here, ex buffs, heals, rezzes + void DoNonCombatActions(); - // buff a specific player, usually a real PC who is not in group - void BuffPlayer(Player *target); + // buff a specific player, usually a real PC who is not in group + void BuffPlayer(Player *target); - private: - // Heals the target based off its hps - void HealTarget (Unit& target, uint8 hp); +private: + // Heals the target based off its hps + void HealTarget (Unit& target, uint8 hp); - // ENHANCEMENT - uint32 ROCKBITER_WEAPON, STONESKIN_TOTEM, LIGHTNING_SHIELD, FLAMETONGUE_WEAPON, STRENGTH_OF_EARTH_TOTEM, FOCUSED, FROSTBRAND_WEAPON, FROST_RESISTANCE_TOTEM, FLAMETONGUE_TOTEM, FIRE_RESISTANCE_TOTEM, WINDFURY_WEAPON, GROUNDING_TOTEM, NATURE_RESISTANCE_TOTEM, WIND_FURY_TOTEM, STORMSTRIKE, LAVA_LASH, SHAMANISTIC_RAGE, WRATH_OF_AIR_TOTEM, EARTH_ELEMENTAL_TOTEM, BLOODLUST, HEROISM, FERAL_SPIRIT; + // ENHANCEMENT + uint32 ROCKBITER_WEAPON, STONESKIN_TOTEM, LIGHTNING_SHIELD, FLAMETONGUE_WEAPON, STRENGTH_OF_EARTH_TOTEM, FOCUSED, FROSTBRAND_WEAPON, FROST_RESISTANCE_TOTEM, FLAMETONGUE_TOTEM, FIRE_RESISTANCE_TOTEM, WINDFURY_WEAPON, GROUNDING_TOTEM, NATURE_RESISTANCE_TOTEM, WIND_FURY_TOTEM, STORMSTRIKE, LAVA_LASH, SHAMANISTIC_RAGE, WRATH_OF_AIR_TOTEM, EARTH_ELEMENTAL_TOTEM, BLOODLUST, HEROISM, FERAL_SPIRIT; - // RESTORATION - uint32 HEALING_WAVE, LESSER_HEALING_WAVE, ANCESTRAL_SPIRIT, TREMOR_TOTEM, HEALING_STREAM_TOTEM, MANA_SPRING_TOTEM, CHAIN_HEAL, MANA_TIDE_TOTEM, EARTH_SHIELD, WATER_SHIELD, EARTHLIVING_WEAPON, RIPTIDE; + // RESTORATION + uint32 HEALING_WAVE, LESSER_HEALING_WAVE, ANCESTRAL_SPIRIT, TREMOR_TOTEM, HEALING_STREAM_TOTEM, MANA_SPRING_TOTEM, CHAIN_HEAL, MANA_TIDE_TOTEM, EARTH_SHIELD, WATER_SHIELD, EARTHLIVING_WEAPON, RIPTIDE; - // ELEMENTAL - uint32 LIGHTNING_BOLT, EARTH_SHOCK, STONECLAW_TOTEM, FLAME_SHOCK, SEARING_TOTEM, PURGE, FIRE_NOVA_TOTEM, WIND_SHOCK, FROST_SHOCK, MAGMA_TOTEM, CHAIN_LIGHTNING, TOTEM_OF_WRATH, FIRE_ELEMENTAL_TOTEM, LAVA_BURST, EARTHBIND_TOTEM, HEX; + // ELEMENTAL + uint32 LIGHTNING_BOLT, EARTH_SHOCK, STONECLAW_TOTEM, FLAME_SHOCK, SEARING_TOTEM, PURGE, FIRE_NOVA_TOTEM, WIND_SHOCK, FROST_SHOCK, MAGMA_TOTEM, CHAIN_LIGHTNING, TOTEM_OF_WRATH, FIRE_ELEMENTAL_TOTEM, LAVA_BURST, EARTHBIND_TOTEM, HEX; - // first aid - uint32 RECENTLY_BANDAGED; + // first aid + uint32 RECENTLY_BANDAGED; - // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + // racial + uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; - uint32 SpellSequence, LastSpellEnhancement, LastSpellRestoration, LastSpellElemental; + uint32 SpellSequence, LastSpellEnhancement, LastSpellRestoration, LastSpellElemental; }; #endif diff --git a/src/game/playerbot/PlayerbotWarlockAI.cpp b/src/game/playerbot/PlayerbotWarlockAI.cpp index b8ede2099..af3dd8b41 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.cpp +++ b/src/game/playerbot/PlayerbotWarlockAI.cpp @@ -2,7 +2,7 @@ #include "PlayerbotWarlockAI.h" class PlayerbotAI; -PlayerbotWarlockAI::PlayerbotWarlockAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) +PlayerbotWarlockAI::PlayerbotWarlockAI(Player* const master, Player* const bot, PlayerbotAI* const ai) : PlayerbotClassAI(master, bot, ai) { // DESTRUCTION SHADOW_BOLT = ai->initSpell(SHADOW_BOLT_1); @@ -88,249 +88,249 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) // ------- Non Duel combat ---------- - //ai->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, GetMaster() ); // dont want to melee mob + //ai->SetMovementOrder( PlayerbotAI::MOVEMENT_FOLLOW, GetMaster() ); // dont want to melee mob - ai->SetInFront( pTarget ); + ai->SetInFront(pTarget); Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); Pet *pet = m_bot->GetPet(); // Damage Spells - ai->SetInFront( pTarget ); + ai->SetInFront(pTarget); switch (SpellSequence) { case SPELL_CURSES: - if (CURSE_OF_AGONY > 0 && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && LastSpellCurse < 1 && ai->GetManaPercent() >= 14) - { - ai->CastSpell(CURSE_OF_AGONY, *pTarget); - SpellSequence = SPELL_AFFLICTION; - LastSpellCurse = LastSpellCurse +1; - break; - } - else if (CURSE_OF_THE_ELEMENTS > 0 && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && LastSpellCurse < 2 && ai->GetManaPercent() >= 10) - { - ai->CastSpell(CURSE_OF_THE_ELEMENTS, *pTarget); - SpellSequence = SPELL_AFFLICTION; - LastSpellCurse = LastSpellCurse +1; - break; - } - else if (CURSE_OF_EXHAUSTION > 0 && !pTarget->HasAura(CURSE_OF_EXHAUSTION, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && LastSpellCurse < 3 && ai->GetManaPercent() >= 6) - { - ai->CastSpell(CURSE_OF_EXHAUSTION, *pTarget); - SpellSequence = SPELL_AFFLICTION; - LastSpellCurse = LastSpellCurse +1; - break; - } - else if (CURSE_OF_WEAKNESS > 0 && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_EXHAUSTION, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && LastSpellCurse < 4 && ai->GetManaPercent() >= 14) - { - ai->CastSpell(CURSE_OF_WEAKNESS, *pTarget); - SpellSequence = SPELL_AFFLICTION; - LastSpellCurse = LastSpellCurse +1; - break; - } - else if (CURSE_OF_TONGUES > 0 && !pTarget->HasAura(CURSE_OF_TONGUES, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_EXHAUSTION, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && LastSpellCurse < 5 && ai->GetManaPercent() >= 4) - { - ai->CastSpell(CURSE_OF_TONGUES, *pTarget); - SpellSequence = SPELL_AFFLICTION; - LastSpellCurse = LastSpellCurse +1; - break; - } - LastSpellCurse = 0; - //SpellSequence = SPELL_AFFLICTION; - //break; + if (CURSE_OF_AGONY > 0 && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && LastSpellCurse < 1 && ai->GetManaPercent() >= 14) + { + ai->CastSpell(CURSE_OF_AGONY, *pTarget); + SpellSequence = SPELL_AFFLICTION; + LastSpellCurse = LastSpellCurse + 1; + break; + } + else if (CURSE_OF_THE_ELEMENTS > 0 && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && LastSpellCurse < 2 && ai->GetManaPercent() >= 10) + { + ai->CastSpell(CURSE_OF_THE_ELEMENTS, *pTarget); + SpellSequence = SPELL_AFFLICTION; + LastSpellCurse = LastSpellCurse + 1; + break; + } + else if (CURSE_OF_EXHAUSTION > 0 && !pTarget->HasAura(CURSE_OF_EXHAUSTION, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && LastSpellCurse < 3 && ai->GetManaPercent() >= 6) + { + ai->CastSpell(CURSE_OF_EXHAUSTION, *pTarget); + SpellSequence = SPELL_AFFLICTION; + LastSpellCurse = LastSpellCurse + 1; + break; + } + else if (CURSE_OF_WEAKNESS > 0 && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_EXHAUSTION, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && LastSpellCurse < 4 && ai->GetManaPercent() >= 14) + { + ai->CastSpell(CURSE_OF_WEAKNESS, *pTarget); + SpellSequence = SPELL_AFFLICTION; + LastSpellCurse = LastSpellCurse + 1; + break; + } + else if (CURSE_OF_TONGUES > 0 && !pTarget->HasAura(CURSE_OF_TONGUES, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_EXHAUSTION, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && LastSpellCurse < 5 && ai->GetManaPercent() >= 4) + { + ai->CastSpell(CURSE_OF_TONGUES, *pTarget); + SpellSequence = SPELL_AFFLICTION; + LastSpellCurse = LastSpellCurse + 1; + break; + } + LastSpellCurse = 0; + //SpellSequence = SPELL_AFFLICTION; + //break; case SPELL_AFFLICTION: - if (LIFE_TAP > 0 && LastSpellAffliction < 1 && ai->GetManaPercent() <= 50) - { - ai->CastSpell(LIFE_TAP, *m_bot); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (CORRUPTION > 0 && !pTarget->HasAura(CORRUPTION, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && LastSpellAffliction < 2 && ai->GetManaPercent() >= 19) - { - ai->CastSpell(CORRUPTION, *pTarget); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (DRAIN_SOUL > 0 && pTarget->GetHealth() < pTarget->GetMaxHealth()*0.40 && !pTarget->HasAura(DRAIN_SOUL, EFFECT_INDEX_0) && LastSpellAffliction < 3 && ai->GetManaPercent() >= 19) - { - ai->CastSpell(DRAIN_SOUL, *pTarget); - ai->SetIgnoreUpdateTime(15); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (DRAIN_LIFE > 0 && LastSpellAffliction < 4 && !pTarget->HasAura(DRAIN_SOUL, EFFECT_INDEX_0) && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_LIFE, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_MANA, EFFECT_INDEX_0) && ai->GetHealthPercent() <= 70 && ai->GetManaPercent() >= 23) - { - ai->CastSpell(DRAIN_LIFE, *pTarget); - ai->SetIgnoreUpdateTime(5); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (DRAIN_MANA > 0 && pTarget->GetPower(POWER_MANA) > 0 && !pTarget->HasAura(DRAIN_SOUL, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_MANA, EFFECT_INDEX_0) && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_LIFE, EFFECT_INDEX_0) && LastSpellAffliction < 5 && ai->GetManaPercent() < 70 && ai->GetManaPercent() >= 17) - { - ai->CastSpell(DRAIN_MANA, *pTarget); - ai->SetIgnoreUpdateTime(5); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (UNSTABLE_AFFLICTION > 0 && LastSpellAffliction < 6 && !pTarget->HasAura(UNSTABLE_AFFLICTION, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && ai->GetManaPercent() >= 20) - { - ai->CastSpell(UNSTABLE_AFFLICTION, *pTarget); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (HAUNT > 0 && LastSpellAffliction < 7 && !pTarget->HasAura(HAUNT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 12) - { - ai->CastSpell(HAUNT, *pTarget); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (SEED_OF_CORRUPTION > 0 && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && LastSpellAffliction < 9 && ai->GetManaPercent() >= 34) - { - ai->CastSpell(SEED_OF_CORRUPTION, *pTarget); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (HOWL_OF_TERROR > 0 && !pTarget->HasAura(HOWL_OF_TERROR, EFFECT_INDEX_0) && ai->GetAttackerCount()>3 && LastSpellAffliction < 10 && ai->GetManaPercent() >= 11) - { - ai->CastSpell(HOWL_OF_TERROR, *pTarget); - ai->TellMaster("casting howl of terror!"); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if (FEAR > 0 && !pTarget->HasAura(FEAR, EFFECT_INDEX_0) && pVictim==m_bot && ai->GetAttackerCount()>=2 && LastSpellAffliction < 11 && ai->GetManaPercent() >= 12) - { - ai->CastSpell(FEAR, *pTarget); - //ai->TellMaster("casting fear!"); - ai->SetIgnoreUpdateTime(1.5); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - else if(( pet ) - && (DARK_PACT > 0 && ai->GetManaPercent() <= 50 && LastSpellAffliction < 12 && pet->GetPower(POWER_MANA) > 0)) - { - ai->CastSpell(DARK_PACT, *m_bot); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction +1; - break; - } - LastSpellAffliction = 0; - //SpellSequence = SPELL_DESTRUCTION; - //break; + if (LIFE_TAP > 0 && LastSpellAffliction < 1 && ai->GetManaPercent() <= 50) + { + ai->CastSpell(LIFE_TAP, *m_bot); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction + 1; + break; + } + else if (CORRUPTION > 0 && !pTarget->HasAura(CORRUPTION, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && LastSpellAffliction < 2 && ai->GetManaPercent() >= 19) + { + ai->CastSpell(CORRUPTION, *pTarget); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction + 1; + break; + } + else if (DRAIN_SOUL > 0 && pTarget->GetHealth() < pTarget->GetMaxHealth() * 0.40 && !pTarget->HasAura(DRAIN_SOUL, EFFECT_INDEX_0) && LastSpellAffliction < 3 && ai->GetManaPercent() >= 19) + { + ai->CastSpell(DRAIN_SOUL, *pTarget); + ai->SetIgnoreUpdateTime(15); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction + 1; + break; + } + else if (DRAIN_LIFE > 0 && LastSpellAffliction < 4 && !pTarget->HasAura(DRAIN_SOUL, EFFECT_INDEX_0) && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_LIFE, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_MANA, EFFECT_INDEX_0) && ai->GetHealthPercent() <= 70 && ai->GetManaPercent() >= 23) + { + ai->CastSpell(DRAIN_LIFE, *pTarget); + ai->SetIgnoreUpdateTime(5); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction + 1; + break; + } + else if (DRAIN_MANA > 0 && pTarget->GetPower(POWER_MANA) > 0 && !pTarget->HasAura(DRAIN_SOUL, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_MANA, EFFECT_INDEX_0) && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_LIFE, EFFECT_INDEX_0) && LastSpellAffliction < 5 && ai->GetManaPercent() < 70 && ai->GetManaPercent() >= 17) + { + ai->CastSpell(DRAIN_MANA, *pTarget); + ai->SetIgnoreUpdateTime(5); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction + 1; + break; + } + else if (UNSTABLE_AFFLICTION > 0 && LastSpellAffliction < 6 && !pTarget->HasAura(UNSTABLE_AFFLICTION, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && ai->GetManaPercent() >= 20) + { + ai->CastSpell(UNSTABLE_AFFLICTION, *pTarget); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction + 1; + break; + } + else if (HAUNT > 0 && LastSpellAffliction < 7 && !pTarget->HasAura(HAUNT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 12) + { + ai->CastSpell(HAUNT, *pTarget); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction + 1; + break; + } + else if (SEED_OF_CORRUPTION > 0 && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && LastSpellAffliction < 9 && ai->GetManaPercent() >= 34) + { + ai->CastSpell(SEED_OF_CORRUPTION, *pTarget); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction + 1; + break; + } + else if (HOWL_OF_TERROR > 0 && !pTarget->HasAura(HOWL_OF_TERROR, EFFECT_INDEX_0) && ai->GetAttackerCount() > 3 && LastSpellAffliction < 10 && ai->GetManaPercent() >= 11) + { + ai->CastSpell(HOWL_OF_TERROR, *pTarget); + ai->TellMaster("casting howl of terror!"); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction + 1; + break; + } + else if (FEAR > 0 && !pTarget->HasAura(FEAR, EFFECT_INDEX_0) && pVictim == m_bot && ai->GetAttackerCount() >= 2 && LastSpellAffliction < 11 && ai->GetManaPercent() >= 12) + { + ai->CastSpell(FEAR, *pTarget); + //ai->TellMaster("casting fear!"); + ai->SetIgnoreUpdateTime(1.5); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction + 1; + break; + } + else if (( pet ) + && (DARK_PACT > 0 && ai->GetManaPercent() <= 50 && LastSpellAffliction < 12 && pet->GetPower(POWER_MANA) > 0)) + { + ai->CastSpell(DARK_PACT, *m_bot); + SpellSequence = SPELL_DESTRUCTION; + LastSpellAffliction = LastSpellAffliction + 1; + break; + } + LastSpellAffliction = 0; + //SpellSequence = SPELL_DESTRUCTION; + //break; case SPELL_DESTRUCTION: - if (SHADOWFURY > 0 && LastSpellDestruction < 1 && !pTarget->HasAura(SHADOWFURY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 37) - { - ai->CastSpell(SHADOWFURY, *pTarget); - SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; - break; - } - else if (SHADOW_BOLT > 0 && LastSpellDestruction < 2 && ai->GetManaPercent() >= 23) - { - ai->CastSpell(SHADOW_BOLT, *pTarget); - SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; - break; - } - else if (RAIN_OF_FIRE > 0 && LastSpellDestruction < 3 && ai->GetAttackerCount()>=3 && ai->GetManaPercent() >= 77) - { - ai->CastSpell(RAIN_OF_FIRE, *pTarget); - //ai->TellMaster("casting rain of fire!"); - ai->SetIgnoreUpdateTime(8); - SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; - break; - } - else if (SHADOWFLAME > 0 && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && LastSpellDestruction < 4 && ai->GetManaPercent() >= 25) - { - ai->CastSpell(SHADOWFLAME, *pTarget); - SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; - break; - } - else if (IMMOLATE > 0 && !pTarget->HasAura(IMMOLATE, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && LastSpellDestruction < 5 && ai->GetManaPercent() >= 23) - { - ai->CastSpell(IMMOLATE, *pTarget); - SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; - break; - } - else if (CONFLAGRATE > 0 && LastSpellDestruction < 6 && ai->GetManaPercent() >= 16) - { - ai->CastSpell(CONFLAGRATE, *pTarget); - SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; - break; - } - else if (INCINERATE > 0 && LastSpellDestruction < 7 && ai->GetManaPercent() >= 19) - { - ai->CastSpell(INCINERATE, *pTarget); - SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; - break; - } - else if (SEARING_PAIN > 0 && LastSpellDestruction < 8 && ai->GetManaPercent() >= 11) - { - ai->CastSpell(SEARING_PAIN, *pTarget); - SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; - break; - } - else if (SOUL_FIRE > 0 && LastSpellDestruction < 9 && ai->GetManaPercent() >= 13) - { - ai->CastSpell(SOUL_FIRE, *pTarget); - ai->SetIgnoreUpdateTime(6); - SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; - break; - } - else if (CHAOS_BOLT > 0 && LastSpellDestruction < 10 && ai->GetManaPercent() >= 9) - { - ai->CastSpell(CHAOS_BOLT, *pTarget); - SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; - break; - } - else if (SHADOWBURN > 0 && LastSpellDestruction < 11 && pTarget->GetHealth() < pTarget->GetMaxHealth()*0.20 && !pTarget->HasAura(SHADOWBURN, EFFECT_INDEX_0) && ai->GetManaPercent() >= 27) - { - ai->CastSpell(SHADOWBURN, *pTarget); - SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; - break; - } - else if (HELLFIRE > 0 && LastSpellDestruction < 12 && !m_bot->HasAura(HELLFIRE, EFFECT_INDEX_0) && ai->GetAttackerCount()>=5 && ai->GetHealthPercent() >= 10 && ai->GetManaPercent() >= 87) - { - ai->CastSpell(HELLFIRE); - ai->TellMaster("casting hellfire!"); - ai->SetIgnoreUpdateTime(15); - SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; - break; - } - else - { - LastSpellDestruction = 0; - SpellSequence = SPELL_CURSES; - } + if (SHADOWFURY > 0 && LastSpellDestruction < 1 && !pTarget->HasAura(SHADOWFURY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 37) + { + ai->CastSpell(SHADOWFURY, *pTarget); + SpellSequence = SPELL_CURSES; + LastSpellDestruction = LastSpellDestruction + 1; + break; + } + else if (SHADOW_BOLT > 0 && LastSpellDestruction < 2 && ai->GetManaPercent() >= 23) + { + ai->CastSpell(SHADOW_BOLT, *pTarget); + SpellSequence = SPELL_CURSES; + LastSpellDestruction = LastSpellDestruction + 1; + break; + } + else if (RAIN_OF_FIRE > 0 && LastSpellDestruction < 3 && ai->GetAttackerCount() >= 3 && ai->GetManaPercent() >= 77) + { + ai->CastSpell(RAIN_OF_FIRE, *pTarget); + //ai->TellMaster("casting rain of fire!"); + ai->SetIgnoreUpdateTime(8); + SpellSequence = SPELL_CURSES; + LastSpellDestruction = LastSpellDestruction + 1; + break; + } + else if (SHADOWFLAME > 0 && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && LastSpellDestruction < 4 && ai->GetManaPercent() >= 25) + { + ai->CastSpell(SHADOWFLAME, *pTarget); + SpellSequence = SPELL_CURSES; + LastSpellDestruction = LastSpellDestruction + 1; + break; + } + else if (IMMOLATE > 0 && !pTarget->HasAura(IMMOLATE, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && LastSpellDestruction < 5 && ai->GetManaPercent() >= 23) + { + ai->CastSpell(IMMOLATE, *pTarget); + SpellSequence = SPELL_CURSES; + LastSpellDestruction = LastSpellDestruction + 1; + break; + } + else if (CONFLAGRATE > 0 && LastSpellDestruction < 6 && ai->GetManaPercent() >= 16) + { + ai->CastSpell(CONFLAGRATE, *pTarget); + SpellSequence = SPELL_CURSES; + LastSpellDestruction = LastSpellDestruction + 1; + break; + } + else if (INCINERATE > 0 && LastSpellDestruction < 7 && ai->GetManaPercent() >= 19) + { + ai->CastSpell(INCINERATE, *pTarget); + SpellSequence = SPELL_CURSES; + LastSpellDestruction = LastSpellDestruction + 1; + break; + } + else if (SEARING_PAIN > 0 && LastSpellDestruction < 8 && ai->GetManaPercent() >= 11) + { + ai->CastSpell(SEARING_PAIN, *pTarget); + SpellSequence = SPELL_CURSES; + LastSpellDestruction = LastSpellDestruction + 1; + break; + } + else if (SOUL_FIRE > 0 && LastSpellDestruction < 9 && ai->GetManaPercent() >= 13) + { + ai->CastSpell(SOUL_FIRE, *pTarget); + ai->SetIgnoreUpdateTime(6); + SpellSequence = SPELL_CURSES; + LastSpellDestruction = LastSpellDestruction + 1; + break; + } + else if (CHAOS_BOLT > 0 && LastSpellDestruction < 10 && ai->GetManaPercent() >= 9) + { + ai->CastSpell(CHAOS_BOLT, *pTarget); + SpellSequence = SPELL_CURSES; + LastSpellDestruction = LastSpellDestruction + 1; + break; + } + else if (SHADOWBURN > 0 && LastSpellDestruction < 11 && pTarget->GetHealth() < pTarget->GetMaxHealth() * 0.20 && !pTarget->HasAura(SHADOWBURN, EFFECT_INDEX_0) && ai->GetManaPercent() >= 27) + { + ai->CastSpell(SHADOWBURN, *pTarget); + SpellSequence = SPELL_CURSES; + LastSpellDestruction = LastSpellDestruction + 1; + break; + } + else if (HELLFIRE > 0 && LastSpellDestruction < 12 && !m_bot->HasAura(HELLFIRE, EFFECT_INDEX_0) && ai->GetAttackerCount() >= 5 && ai->GetHealthPercent() >= 10 && ai->GetManaPercent() >= 87) + { + ai->CastSpell(HELLFIRE); + ai->TellMaster("casting hellfire!"); + ai->SetIgnoreUpdateTime(15); + SpellSequence = SPELL_CURSES; + LastSpellDestruction = LastSpellDestruction + 1; + break; + } + else + { + LastSpellDestruction = 0; + SpellSequence = SPELL_CURSES; + } } } // end DoNextCombatManeuver void PlayerbotWarlockAI::DoNonCombatActions() { PlayerbotAI *ai = GetAI(); - if( !ai ) + if (!ai) return; Player * m_bot = GetPlayerBot(); @@ -386,7 +386,7 @@ void PlayerbotWarlockAI::DoNonCombatActions() m_bot->SetStandState(UNIT_STAND_STATE_STAND); Item* pItem = ai->FindDrink(); - Item* fItem = ai->FindBandage(); + Item* fItem = ai->FindBandage(); if (pItem != NULL && ai->GetManaPercent() < 25) { @@ -395,15 +395,15 @@ void PlayerbotWarlockAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(30); return; } - else if(( pet ) - && (pItem == NULL && DARK_PACT>0 && ai->GetManaPercent() <= 50 && pet->GetPower(POWER_MANA) > 0) ) + else if (( pet ) + && (pItem == NULL && DARK_PACT > 0 && ai->GetManaPercent() <= 50 && pet->GetPower(POWER_MANA) > 0)) { ai->CastSpell(DARK_PACT, *m_bot); //ai->TellMaster("casting dark pact."); return; } - else if(( !pet ) - && (pItem == NULL && LIFE_TAP>0 && ai->GetManaPercent() <= 50 && ai->GetHealthPercent() > 25) ) + else if (( !pet ) + && (pItem == NULL && LIFE_TAP > 0 && ai->GetManaPercent() <= 50 && ai->GetHealthPercent() > 25)) { ai->CastSpell(LIFE_TAP, *m_bot); //ai->TellMaster("casting life tap."); @@ -430,8 +430,8 @@ void PlayerbotWarlockAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(8); return; } - else if(( pet ) - && (pItem == NULL && fItem == NULL && CONSUME_SHADOWS>0 && !m_bot->HasAura(CONSUME_SHADOWS, EFFECT_INDEX_0) && ai->GetHealthPercent() < 75) ) + else if (( pet ) + && (pItem == NULL && fItem == NULL && CONSUME_SHADOWS > 0 && !m_bot->HasAura(CONSUME_SHADOWS, EFFECT_INDEX_0) && ai->GetHealthPercent() < 75)) { ai->CastSpell(CONSUME_SHADOWS, *m_bot); //ai->TellMaster("casting consume shadows."); @@ -439,21 +439,21 @@ void PlayerbotWarlockAI::DoNonCombatActions() } // check for demon - if( SUMMON_FELGUARD>0 || SUMMON_FELHUNTER>0 || SUMMON_SUCCUBUS>0 || SUMMON_VOIDWALKER>0 || SUMMON_IMP>0 && !m_demonSummonFailed ) + if (SUMMON_FELGUARD > 0 || SUMMON_FELHUNTER > 0 || SUMMON_SUCCUBUS > 0 || SUMMON_VOIDWALKER > 0 || SUMMON_IMP > 0 && !m_demonSummonFailed) { - if( !pet ) + if (!pet) { // summon demon - if( SUMMON_FELGUARD>0 && ai->CastSpell(SUMMON_FELGUARD,*m_bot) ) - ai->TellMaster( "summoning felguard." ); - else if( SUMMON_FELHUNTER>0 && ai->CastSpell(SUMMON_FELHUNTER,*m_bot) ) - ai->TellMaster( "summoning felhunter." ); - else if( SUMMON_SUCCUBUS>0 && ai->CastSpell(SUMMON_SUCCUBUS,*m_bot) ) - ai->TellMaster( "summoning succubus." ); - else if( SUMMON_VOIDWALKER>0 && ai->CastSpell(SUMMON_VOIDWALKER,*m_bot) ) - ai->TellMaster( "summoning voidwalker." ); - else if( SUMMON_IMP>0 && ai->GetManaPercent() >= 64 && ai->CastSpell(SUMMON_IMP,*m_bot) ) - ai->TellMaster( "summoning imp." ); + if (SUMMON_FELGUARD > 0 && ai->CastSpell(SUMMON_FELGUARD, *m_bot)) + ai->TellMaster("summoning felguard."); + else if (SUMMON_FELHUNTER > 0 && ai->CastSpell(SUMMON_FELHUNTER, *m_bot)) + ai->TellMaster("summoning felhunter."); + else if (SUMMON_SUCCUBUS > 0 && ai->CastSpell(SUMMON_SUCCUBUS, *m_bot)) + ai->TellMaster("summoning succubus."); + else if (SUMMON_VOIDWALKER > 0 && ai->CastSpell(SUMMON_VOIDWALKER, *m_bot)) + ai->TellMaster("summoning voidwalker."); + else if (SUMMON_IMP > 0 && ai->GetManaPercent() >= 64 && ai->CastSpell(SUMMON_IMP, *m_bot)) + ai->TellMaster("summoning imp."); else { m_demonSummonFailed = true; @@ -463,20 +463,20 @@ void PlayerbotWarlockAI::DoNonCombatActions() } // check for buffs with demon - if(( pet ) - && ( SOUL_LINK>0 && !m_bot->HasAura(SOUL_LINK_AURA, EFFECT_INDEX_0) && ai->GetBaseManaPercent() >= 16 && ai->CastSpell(SOUL_LINK,*m_bot) )) + if (( pet ) + && ( SOUL_LINK > 0 && !m_bot->HasAura(SOUL_LINK_AURA, EFFECT_INDEX_0) && ai->GetBaseManaPercent() >= 16 && ai->CastSpell(SOUL_LINK, *m_bot))) { //ai->TellMaster( "casting soul link." ); return; } - else if(( pet ) - && ( BLOOD_PACT>0 && !m_bot->HasAura(BLOOD_PACT, EFFECT_INDEX_0) && ai->CastSpell(BLOOD_PACT,*m_bot) )) + else if (( pet ) + && ( BLOOD_PACT > 0 && !m_bot->HasAura(BLOOD_PACT, EFFECT_INDEX_0) && ai->CastSpell(BLOOD_PACT, *m_bot))) { //ai->TellMaster( "casting blood pact." ); return; } - else if(( pet ) - && ( FEL_INTELLIGENCE>0 && !m_bot->HasAura(FEL_INTELLIGENCE, EFFECT_INDEX_0) && ai->CastSpell(FEL_INTELLIGENCE,*m_bot) )) + else if (( pet ) + && ( FEL_INTELLIGENCE > 0 && !m_bot->HasAura(FEL_INTELLIGENCE, EFFECT_INDEX_0) && ai->CastSpell(FEL_INTELLIGENCE, *m_bot))) { //ai->TellMaster( "casting fel intelligence." ); return; diff --git a/src/game/playerbot/PlayerbotWarlockAI.h b/src/game/playerbot/PlayerbotWarlockAI.h index a8b18e17c..273a800a8 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.h +++ b/src/game/playerbot/PlayerbotWarlockAI.h @@ -94,98 +94,98 @@ enum WarlockSpells //class Player; class MANGOS_DLL_SPEC PlayerbotWarlockAI : PlayerbotClassAI { - public: - PlayerbotWarlockAI(Player* const master, Player* const bot, PlayerbotAI* const ai); - virtual ~PlayerbotWarlockAI(); - - // all combat actions go here - void DoNextCombatManeuver(Unit*); - - // all non combat actions go here, ex buffs, heals, rezzes - void DoNonCombatActions(); - - // buff a specific player, usually a real PC who is not in group - //void BuffPlayer(Player *target); - - private: - - bool m_demonSummonFailed; - - // CURSES - uint32 CURSE_OF_WEAKNESS, - CURSE_OF_AGONY, - CURSE_OF_EXHAUSTION, - CURSE_OF_TONGUES, - CURSE_OF_THE_ELEMENTS, - CURSE_OF_DOOM; - - // AFFLICTION - uint32 CORRUPTION, - DRAIN_SOUL, - DRAIN_LIFE, - DRAIN_MANA, - LIFE_TAP, - UNSTABLE_AFFLICTION, - HAUNT, - SEED_OF_CORRUPTION, - DARK_PACT, - HOWL_OF_TERROR, - FEAR; - - // DESTRUCTION - uint32 SHADOW_BOLT, - IMMOLATE, - INCINERATE, - SEARING_PAIN, - CONFLAGRATE, - SOUL_FIRE, - SHADOWFURY, - CHAOS_BOLT, - SHADOWFLAME, - HELLFIRE, - RAIN_OF_FIRE, - SHADOWBURN; - - // DEMONOLOGY - uint32 DEMON_SKIN, - DEMON_ARMOR, - SHADOW_WARD, - FEL_ARMOR, - SOULSHATTER, - SOUL_LINK, - SOUL_LINK_AURA, - HEALTH_FUNNEL, - DETECT_INVISIBILITY, - CREATE_FIRESTONE; - - // DEMON SUMMON - uint32 SUMMON_IMP, - SUMMON_VOIDWALKER, - SUMMON_SUCCUBUS, - SUMMON_FELHUNTER, - SUMMON_FELGUARD; - - // DEMON SKILLS - uint32 BLOOD_PACT, - CONSUME_SHADOWS, - FEL_INTELLIGENCE; - - // first aid - uint32 RECENTLY_BANDAGED; - - // racial - uint32 ARCANE_TORRENT, - GIFT_OF_THE_NAARU, - STONEFORM, - ESCAPE_ARTIST, - EVERY_MAN_FOR_HIMSELF, - SHADOWMELD, - BLOOD_FURY, - WAR_STOMP, - BERSERKING, - WILL_OF_THE_FORSAKEN; - - uint32 SpellSequence, LastSpellCurse, LastSpellAffliction, LastSpellDestruction; +public: + PlayerbotWarlockAI(Player * const master, Player * const bot, PlayerbotAI * const ai); + virtual ~PlayerbotWarlockAI(); + + // all combat actions go here + void DoNextCombatManeuver(Unit*); + + // all non combat actions go here, ex buffs, heals, rezzes + void DoNonCombatActions(); + + // buff a specific player, usually a real PC who is not in group + //void BuffPlayer(Player *target); + +private: + + bool m_demonSummonFailed; + + // CURSES + uint32 CURSE_OF_WEAKNESS, + CURSE_OF_AGONY, + CURSE_OF_EXHAUSTION, + CURSE_OF_TONGUES, + CURSE_OF_THE_ELEMENTS, + CURSE_OF_DOOM; + + // AFFLICTION + uint32 CORRUPTION, + DRAIN_SOUL, + DRAIN_LIFE, + DRAIN_MANA, + LIFE_TAP, + UNSTABLE_AFFLICTION, + HAUNT, + SEED_OF_CORRUPTION, + DARK_PACT, + HOWL_OF_TERROR, + FEAR; + + // DESTRUCTION + uint32 SHADOW_BOLT, + IMMOLATE, + INCINERATE, + SEARING_PAIN, + CONFLAGRATE, + SOUL_FIRE, + SHADOWFURY, + CHAOS_BOLT, + SHADOWFLAME, + HELLFIRE, + RAIN_OF_FIRE, + SHADOWBURN; + + // DEMONOLOGY + uint32 DEMON_SKIN, + DEMON_ARMOR, + SHADOW_WARD, + FEL_ARMOR, + SOULSHATTER, + SOUL_LINK, + SOUL_LINK_AURA, + HEALTH_FUNNEL, + DETECT_INVISIBILITY, + CREATE_FIRESTONE; + + // DEMON SUMMON + uint32 SUMMON_IMP, + SUMMON_VOIDWALKER, + SUMMON_SUCCUBUS, + SUMMON_FELHUNTER, + SUMMON_FELGUARD; + + // DEMON SKILLS + uint32 BLOOD_PACT, + CONSUME_SHADOWS, + FEL_INTELLIGENCE; + + // first aid + uint32 RECENTLY_BANDAGED; + + // racial + uint32 ARCANE_TORRENT, + GIFT_OF_THE_NAARU, + STONEFORM, + ESCAPE_ARTIST, + EVERY_MAN_FOR_HIMSELF, + SHADOWMELD, + BLOOD_FURY, + WAR_STOMP, + BERSERKING, + WILL_OF_THE_FORSAKEN; + + uint32 SpellSequence, LastSpellCurse, LastSpellAffliction, LastSpellDestruction; }; #endif diff --git a/src/game/playerbot/PlayerbotWarriorAI.cpp b/src/game/playerbot/PlayerbotWarriorAI.cpp index ff5be130f..81ed23c16 100644 --- a/src/game/playerbot/PlayerbotWarriorAI.cpp +++ b/src/game/playerbot/PlayerbotWarriorAI.cpp @@ -1,14 +1,14 @@ - /* - Name : PlayerbotWarriorAI.cpp - Complete: maybe around 37% - Author : Natsukawa - Version : 0.39 - */ +/* + Name : PlayerbotWarriorAI.cpp + Complete: maybe around 37% + Author : Natsukawa + Version : 0.39 + */ #include "PlayerbotWarriorAI.h" #include "PlayerbotMgr.h" class PlayerbotAI; -PlayerbotWarriorAI::PlayerbotWarriorAI(Player* const master, Player* const bot, PlayerbotAI* const ai): PlayerbotClassAI(master, bot, ai) +PlayerbotWarriorAI::PlayerbotWarriorAI(Player* const master, Player* const bot, PlayerbotAI* const ai) : PlayerbotClassAI(master, bot, ai) { BATTLE_STANCE = ai->initSpell(BATTLE_STANCE_1); //ARMS CHARGE = ai->initSpell(CHARGE_1); //ARMS @@ -50,9 +50,9 @@ PlayerbotWarriorAI::PlayerbotWarriorAI(Player* const master, Player* const bot, SLAM = ai->initSpell(SLAM_1); //FURY BERSERKER_STANCE = ai->initSpell(BERSERKER_STANCE_1); //FURY INTERCEPT = ai->initSpell(INTERCEPT_1); //FURY - DEATH_WISH = ai->initSpell(DEATH_WISH_1);//FURY - BERSERKER_RAGE = ai->initSpell(BERSERKER_RAGE_1);//FURY - WHIRLWIND = ai->initSpell(WHIRLWIND_1);//FURY + DEATH_WISH = ai->initSpell(DEATH_WISH_1); //FURY + BERSERKER_RAGE = ai->initSpell(BERSERKER_RAGE_1); //FURY + WHIRLWIND = ai->initSpell(WHIRLWIND_1); //FURY PUMMEL = ai->initSpell(PUMMEL_1); //FURY BLOODTHIRST = ai->initSpell(BLOODTHIRST_1); //FURY RECKLESSNESS = ai->initSpell(RECKLESSNESS_1); //FURY @@ -82,40 +82,40 @@ bool PlayerbotWarriorAI::DoFirstCombatManeuver(Unit *pTarget) Player *m_bot = GetPlayerBot(); PlayerbotAI *ai = GetAI(); PlayerbotAI::CombatOrderType co = ai->GetCombatOrder(); - float fTargetDist = m_bot->GetDistance( pTarget ); + float fTargetDist = m_bot->GetDistance(pTarget); - if( (co&PlayerbotAI::ORDERS_TANK) && DEFENSIVE_STANCE>0 && !m_bot->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0) && ai->CastSpell(DEFENSIVE_STANCE) ) + if ((co & PlayerbotAI::ORDERS_TANK) && DEFENSIVE_STANCE > 0 && !m_bot->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0) && ai->CastSpell(DEFENSIVE_STANCE)) { - if( ai->GetManager()->m_confDebugWhisper ) - ai->TellMaster( "First > Defensive Stance (%d)", DEFENSIVE_STANCE ); + if (ai->GetManager()->m_confDebugWhisper) + ai->TellMaster("First > Defensive Stance (%d)", DEFENSIVE_STANCE); return true; } - else if( (co&PlayerbotAI::ORDERS_TANK) && TAUNT>0 && m_bot->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0) && ai->CastSpell(TAUNT,*pTarget) ) + else if ((co & PlayerbotAI::ORDERS_TANK) && TAUNT > 0 && m_bot->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0) && ai->CastSpell(TAUNT, *pTarget)) { - if( ai->GetManager()->m_confDebugWhisper ) - ai->TellMaster( "First > Taunt (%d)", TAUNT ); + if (ai->GetManager()->m_confDebugWhisper) + ai->TellMaster("First > Taunt (%d)", TAUNT); return false; } - else if( BATTLE_STANCE>0 && !m_bot->HasAura(BATTLE_STANCE, EFFECT_INDEX_0) && ai->CastSpell(BATTLE_STANCE) ) + else if (BATTLE_STANCE > 0 && !m_bot->HasAura(BATTLE_STANCE, EFFECT_INDEX_0) && ai->CastSpell(BATTLE_STANCE)) { - if( ai->GetManager()->m_confDebugWhisper ) - ai->TellMaster( "First > Battle Stance (%d)", BATTLE_STANCE ); + if (ai->GetManager()->m_confDebugWhisper) + ai->TellMaster("First > Battle Stance (%d)", BATTLE_STANCE); return true; } - else if( BATTLE_STANCE>0 && CHARGE>0 && m_bot->HasAura(BATTLE_STANCE, EFFECT_INDEX_0) ) + else if (BATTLE_STANCE > 0 && CHARGE > 0 && m_bot->HasAura(BATTLE_STANCE, EFFECT_INDEX_0)) { - if( fTargetDist<8.0f ) + if (fTargetDist < 8.0f) return false; - else if( fTargetDist>25.0f ) + else if (fTargetDist > 25.0f) return true; - else if( CHARGE>0 && ai->CastSpell(CHARGE,*pTarget) ) + else if (CHARGE > 0 && ai->CastSpell(CHARGE, *pTarget)) { float x, y, z; - pTarget->GetContactPoint( m_bot, x, y, z, 3.666666f ); - m_bot->Relocate( x, y, z ); + pTarget->GetContactPoint(m_bot, x, y, z, 3.666666f); + m_bot->Relocate(x, y, z); - if( ai->GetManager()->m_confDebugWhisper ) - ai->TellMaster( "First > Charge (%d)", CHARGE ); + if (ai->GetManager()->m_confDebugWhisper) + ai->TellMaster("First > Charge (%d)", CHARGE); return false; } } @@ -142,129 +142,129 @@ void PlayerbotWarriorAI::DoNextCombatManeuver(Unit *pTarget) // Damage Attacks - ai->SetInFront( pTarget ); + ai->SetInFront(pTarget); Player *m_bot = GetPlayerBot(); Unit* pVictim = pTarget->getVictim(); - float fTargetDist = m_bot->GetDistance( pTarget ); + float fTargetDist = m_bot->GetDistance(pTarget); PlayerbotAI::CombatOrderType co = ai->GetCombatOrder(); // decide what stance to use - if( (co&PlayerbotAI::ORDERS_TANK) && !m_bot->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0) && ai->CastSpell(DEFENSIVE_STANCE) ) - if( ai->GetManager()->m_confDebugWhisper ) - ai->TellMaster( "Stance > Defensive" ); - else if( !(co&PlayerbotAI::ORDERS_TANK) && !m_bot->HasAura(BATTLE_STANCE, EFFECT_INDEX_0) && ai->CastSpell(BATTLE_STANCE) ) - if( ai->GetManager()->m_confDebugWhisper ) - ai->TellMaster( "Stance > Battle" ); + if ((co & PlayerbotAI::ORDERS_TANK) && !m_bot->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0) && ai->CastSpell(DEFENSIVE_STANCE)) + if (ai->GetManager()->m_confDebugWhisper) + ai->TellMaster("Stance > Defensive"); + else if (!(co & PlayerbotAI::ORDERS_TANK) && !m_bot->HasAura(BATTLE_STANCE, EFFECT_INDEX_0) && ai->CastSpell(BATTLE_STANCE)) + if (ai->GetManager()->m_confDebugWhisper) + ai->TellMaster("Stance > Battle"); // get spell sequence - if( pTarget->IsNonMeleeSpellCasted(true) ) + if (pTarget->IsNonMeleeSpellCasted(true)) SpellSequence = WarriorSpellPreventing; - else if( m_bot->HasAura( BATTLE_STANCE, EFFECT_INDEX_0) ) + else if (m_bot->HasAura(BATTLE_STANCE, EFFECT_INDEX_0)) SpellSequence = WarriorBattle; - else if( m_bot->HasAura( DEFENSIVE_STANCE, EFFECT_INDEX_0) ) + else if (m_bot->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0)) SpellSequence = WarriorDefensive; - else if( m_bot->HasAura( BERSERKER_STANCE, EFFECT_INDEX_0) ) + else if (m_bot->HasAura(BERSERKER_STANCE, EFFECT_INDEX_0)) SpellSequence = WarriorBerserker; // do shouts, berserker rage, etc... - if( BERSERKER_RAGE>0 && !m_bot->HasAura( BERSERKER_RAGE, EFFECT_INDEX_0) && ai->CastSpell( BERSERKER_RAGE ) ) - if( ai->GetManager()->m_confDebugWhisper ) - ai->TellMaster( "Pre > Berseker Rage" ); - else if( DEMORALIZING_SHOUT>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( DEMORALIZING_SHOUT, EFFECT_INDEX_0) && ai->CastSpell( DEMORALIZING_SHOUT ) ) - if( ai->GetManager()->m_confDebugWhisper ) - ai->TellMaster( "Pre > Demoralizing Shout" ); - else if( BATTLE_SHOUT>0 && ai->GetRageAmount()>=10 && !m_bot->HasAura( BATTLE_SHOUT, EFFECT_INDEX_0) && ai->CastSpell( BATTLE_SHOUT ) ) - if( ai->GetManager()->m_confDebugWhisper ) - ai->TellMaster( "Pre > Battle Shout" ); + if (BERSERKER_RAGE > 0 && !m_bot->HasAura(BERSERKER_RAGE, EFFECT_INDEX_0) && ai->CastSpell(BERSERKER_RAGE)) + if (ai->GetManager()->m_confDebugWhisper) + ai->TellMaster("Pre > Berseker Rage"); + else if (DEMORALIZING_SHOUT > 0 && ai->GetRageAmount() >= 10 && !pTarget->HasAura(DEMORALIZING_SHOUT, EFFECT_INDEX_0) && ai->CastSpell(DEMORALIZING_SHOUT)) + if (ai->GetManager()->m_confDebugWhisper) + ai->TellMaster("Pre > Demoralizing Shout"); + else if (BATTLE_SHOUT > 0 && ai->GetRageAmount() >= 10 && !m_bot->HasAura(BATTLE_SHOUT, EFFECT_INDEX_0) && ai->CastSpell(BATTLE_SHOUT)) + if (ai->GetManager()->m_confDebugWhisper) + ai->TellMaster("Pre > Battle Shout"); std::ostringstream out; switch (SpellSequence) { case WarriorSpellPreventing: out << "Case Prevent"; - if( SHIELD_BASH>0 && ai->GetRageAmount()>=10 && ai->CastSpell( SHIELD_BASH, *pTarget ) ) + if (SHIELD_BASH > 0 && ai->GetRageAmount() >= 10 && ai->CastSpell(SHIELD_BASH, *pTarget)) out << " > Shield Bash"; - else if( PUMMEL>0 && ai->GetRageAmount()>=10 && ai->CastSpell( PUMMEL, *pTarget ) ) + else if (PUMMEL > 0 && ai->GetRageAmount() >= 10 && ai->CastSpell(PUMMEL, *pTarget)) out << " > Pummel"; - else if( SPELL_REFLECTION>0 && ai->GetRageAmount()>=15 && !m_bot->HasAura( SPELL_REFLECTION, EFFECT_INDEX_0) && ai->CastSpell( SPELL_REFLECTION, *m_bot ) ) + else if (SPELL_REFLECTION > 0 && ai->GetRageAmount() >= 15 && !m_bot->HasAura(SPELL_REFLECTION, EFFECT_INDEX_0) && ai->CastSpell(SPELL_REFLECTION, *m_bot)) out << " > Spell Reflection"; else out << " > NONE"; break; case WarriorBattle: - out << "Case Battle"; - if( EXECUTE>0 && ai->GetRageAmount()>=15 && pTarget->GetHealth() < pTarget->GetMaxHealth()*0.2 && ai->CastSpell( EXECUTE, *pTarget ) ) + out << "Case Battle"; + if (EXECUTE > 0 && ai->GetRageAmount() >= 15 && pTarget->GetHealth() < pTarget->GetMaxHealth() * 0.2 && ai->CastSpell(EXECUTE, *pTarget)) out << " > Execute!"; - else if( LAST_STAND>0 && !m_bot->HasAura( LAST_STAND, EFFECT_INDEX_0) && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.5 && ai->CastSpell( LAST_STAND, *m_bot ) ) + else if (LAST_STAND > 0 && !m_bot->HasAura(LAST_STAND, EFFECT_INDEX_0) && m_bot->GetHealth() < m_bot->GetMaxHealth() * 0.5 && ai->CastSpell(LAST_STAND, *m_bot)) out << " > Last Stand!"; - else if( BLOODRAGE>0 && ai->GetRageAmount()<50 && !m_bot->HasAura( BLOODRAGE, EFFECT_INDEX_0) && ai->CastSpell( BLOODRAGE, *m_bot ) ) + else if (BLOODRAGE > 0 && ai->GetRageAmount() < 50 && !m_bot->HasAura(BLOODRAGE, EFFECT_INDEX_0) && ai->CastSpell(BLOODRAGE, *m_bot)) out << " > Bloodrage"; - else if( DEATH_WISH>0 && ai->GetRageAmount()>=10 && !m_bot->HasAura( DEATH_WISH, EFFECT_INDEX_0) && ai->CastSpell( DEATH_WISH, *m_bot ) ) + else if (DEATH_WISH > 0 && ai->GetRageAmount() >= 10 && !m_bot->HasAura(DEATH_WISH, EFFECT_INDEX_0) && ai->CastSpell(DEATH_WISH, *m_bot)) out << " > Death Wish"; - else if( RETALIATION>0 && pVictim == m_bot && ai->GetAttackerCount()>=2 && !m_bot->HasAura( RETALIATION, EFFECT_INDEX_0) && ai->CastSpell( RETALIATION, *m_bot ) ) + else if (RETALIATION > 0 && pVictim == m_bot && ai->GetAttackerCount() >= 2 && !m_bot->HasAura(RETALIATION, EFFECT_INDEX_0) && ai->CastSpell(RETALIATION, *m_bot)) out << " > Retaliation"; - else if( DEMORALIZING_SHOUT>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( DEMORALIZING_SHOUT, EFFECT_INDEX_0) && ai->CastSpell( DEMORALIZING_SHOUT, *pTarget ) ) + else if (DEMORALIZING_SHOUT > 0 && ai->GetRageAmount() >= 10 && !pTarget->HasAura(DEMORALIZING_SHOUT, EFFECT_INDEX_0) && ai->CastSpell(DEMORALIZING_SHOUT, *pTarget)) out << " > Demoralizing Shout"; - else if( SWEEPING_STRIKES>0 && ai->GetRageAmount()>=30 && ai->GetAttackerCount()>=2 && !m_bot->HasAura( SWEEPING_STRIKES, EFFECT_INDEX_0) && ai->CastSpell( SWEEPING_STRIKES, *m_bot ) ) + else if (SWEEPING_STRIKES > 0 && ai->GetRageAmount() >= 30 && ai->GetAttackerCount() >= 2 && !m_bot->HasAura(SWEEPING_STRIKES, EFFECT_INDEX_0) && ai->CastSpell(SWEEPING_STRIKES, *m_bot)) out << " > Sweeping Strikes!"; - else if( BLADESTORM>0 && ai->GetRageAmount()>=25 && pVictim == m_bot && !m_bot->HasAura( BLADESTORM, EFFECT_INDEX_0) && ai->GetAttackerCount()>=3 && ai->CastSpell( BLADESTORM, *pTarget ) ) + else if (BLADESTORM > 0 && ai->GetRageAmount() >= 25 && pVictim == m_bot && !m_bot->HasAura(BLADESTORM, EFFECT_INDEX_0) && ai->GetAttackerCount() >= 3 && ai->CastSpell(BLADESTORM, *pTarget)) out << " > Bladestorm!"; - else if( MORTAL_STRIKE>0 && ai->GetRageAmount()>=30 && !pTarget->HasAura( MORTAL_STRIKE, EFFECT_INDEX_0) && ai->CastSpell( MORTAL_STRIKE, *pTarget ) ) + else if (MORTAL_STRIKE > 0 && ai->GetRageAmount() >= 30 && !pTarget->HasAura(MORTAL_STRIKE, EFFECT_INDEX_0) && ai->CastSpell(MORTAL_STRIKE, *pTarget)) out << " > Mortal Strike"; - else if( INTIMIDATING_SHOUT>0 && ai->GetRageAmount()>=25 && ai->GetAttackerCount()>5 && ai->CastSpell( INTIMIDATING_SHOUT, *pTarget ) ) + else if (INTIMIDATING_SHOUT > 0 && ai->GetRageAmount() >= 25 && ai->GetAttackerCount() > 5 && ai->CastSpell(INTIMIDATING_SHOUT, *pTarget)) out << " > Intimidating Shout"; - else if( THUNDER_CLAP>0 && ai->GetRageAmount()>=20 && pVictim == m_bot && !pTarget->HasAura( THUNDER_CLAP, EFFECT_INDEX_0) && ai->CastSpell( THUNDER_CLAP, *pTarget ) ) + else if (THUNDER_CLAP > 0 && ai->GetRageAmount() >= 20 && pVictim == m_bot && !pTarget->HasAura(THUNDER_CLAP, EFFECT_INDEX_0) && ai->CastSpell(THUNDER_CLAP, *pTarget)) out << " > Thunder Clap"; - else if( ENRAGED_REGENERATION>0 && ai->GetRageAmount()>=15 && !m_bot->HasAura( BERSERKER_RAGE, EFFECT_INDEX_0) && !m_bot->HasAura( ENRAGED_REGENERATION, EFFECT_INDEX_0) && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.5 && ai->CastSpell( ENRAGED_REGENERATION, *m_bot ) ) + else if (ENRAGED_REGENERATION > 0 && ai->GetRageAmount() >= 15 && !m_bot->HasAura(BERSERKER_RAGE, EFFECT_INDEX_0) && !m_bot->HasAura(ENRAGED_REGENERATION, EFFECT_INDEX_0) && m_bot->GetHealth() < m_bot->GetMaxHealth() * 0.5 && ai->CastSpell(ENRAGED_REGENERATION, *m_bot)) out << " > Enraged Regeneration"; - else if( SHOCKWAVE>0 && ai->GetRageAmount()>=15 && pVictim == m_bot && !pTarget->HasAura( WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura( PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura( SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura( CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell( SHOCKWAVE, *pTarget ) ) + else if (SHOCKWAVE > 0 && ai->GetRageAmount() >= 15 && pVictim == m_bot && !pTarget->HasAura(WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura(PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura(SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura(CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell(SHOCKWAVE, *pTarget)) out << " > Shockwave"; - else if( REND>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( REND, EFFECT_INDEX_0) && ai->CastSpell( REND, *pTarget ) ) + else if (REND > 0 && ai->GetRageAmount() >= 10 && !pTarget->HasAura(REND, EFFECT_INDEX_0) && ai->CastSpell(REND, *pTarget)) out << " > Rend"; - else if( HAMSTRING>0 && ai->GetRageAmount()>=10 && !pTarget->HasAura( HAMSTRING, EFFECT_INDEX_0) && ai->CastSpell( HAMSTRING, *pTarget ) ) + else if (HAMSTRING > 0 && ai->GetRageAmount() >= 10 && !pTarget->HasAura(HAMSTRING, EFFECT_INDEX_0) && ai->CastSpell(HAMSTRING, *pTarget)) out << " > Hamstring"; - else if( CHALLENGING_SHOUT>0 && ai->GetRageAmount()>=5 && pVictim != m_bot && ai->GetHealthPercent() > 25 && !pTarget->HasAura( MOCKING_BLOW, EFFECT_INDEX_0) && !pTarget->HasAura( CHALLENGING_SHOUT, EFFECT_INDEX_0) && ai->CastSpell( CHALLENGING_SHOUT, *pTarget ) ) + else if (CHALLENGING_SHOUT > 0 && ai->GetRageAmount() >= 5 && pVictim != m_bot && ai->GetHealthPercent() > 25 && !pTarget->HasAura(MOCKING_BLOW, EFFECT_INDEX_0) && !pTarget->HasAura(CHALLENGING_SHOUT, EFFECT_INDEX_0) && ai->CastSpell(CHALLENGING_SHOUT, *pTarget)) out << " > Challenging Shout"; - else if( BLOODTHIRST>0 && ai->GetRageAmount()>=20 && !m_bot->HasAura( BLOODTHIRST, EFFECT_INDEX_0) && m_bot->GetHealth() < m_bot->GetMaxHealth()*0.7 && ai->CastSpell( BLOODTHIRST, *pTarget ) ) + else if (BLOODTHIRST > 0 && ai->GetRageAmount() >= 20 && !m_bot->HasAura(BLOODTHIRST, EFFECT_INDEX_0) && m_bot->GetHealth() < m_bot->GetMaxHealth() * 0.7 && ai->CastSpell(BLOODTHIRST, *pTarget)) out << " > Bloodthrist"; - else if( CLEAVE>0 && ai->GetRageAmount()>=20 && ai->CastSpell( CLEAVE, *pTarget ) ) + else if (CLEAVE > 0 && ai->GetRageAmount() >= 20 && ai->CastSpell(CLEAVE, *pTarget)) out << " > Cleave"; - else if( HEROIC_STRIKE>0 && ai->GetRageAmount()>=15 && ai->CastSpell( HEROIC_STRIKE, *pTarget ) ) + else if (HEROIC_STRIKE > 0 && ai->GetRageAmount() >= 15 && ai->CastSpell(HEROIC_STRIKE, *pTarget)) out << " > Heroic Strike"; - else if( CONCUSSION_BLOW>0 && ai->GetRageAmount()>=15 && !pTarget->HasAura( WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura( PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura( SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura( CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell( CONCUSSION_BLOW, *pTarget ) ) + else if (CONCUSSION_BLOW > 0 && ai->GetRageAmount() >= 15 && !pTarget->HasAura(WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura(PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura(SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura(CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell(CONCUSSION_BLOW, *pTarget)) out << " > Concussion Blow"; - else if( SLAM>0 && ai->GetRageAmount()>=15 && ai->CastSpell( SLAM, *pTarget ) ) + else if (SLAM > 0 && ai->GetRageAmount() >= 15 && ai->CastSpell(SLAM, *pTarget)) out << " > Slam"; - else if( PIERCING_HOWL>0 && ai->GetRageAmount()>=10 && ai->GetAttackerCount()>=3 && !pTarget->HasAura( WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura( PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura( SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura( CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell( PIERCING_HOWL, *pTarget ) ) + else if (PIERCING_HOWL > 0 && ai->GetRageAmount() >= 10 && ai->GetAttackerCount() >= 3 && !pTarget->HasAura(WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura(PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura(SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura(CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell(PIERCING_HOWL, *pTarget)) out << " > Piercing Howl"; - else if( MOCKING_BLOW>0 && ai->GetRageAmount()>=10 && pVictim != m_bot && ai->GetHealthPercent() > 25 && !pTarget->HasAura( MOCKING_BLOW, EFFECT_INDEX_0) && !pTarget->HasAura( CHALLENGING_SHOUT, EFFECT_INDEX_0) && ai->CastSpell( MOCKING_BLOW, *pTarget ) ) + else if (MOCKING_BLOW > 0 && ai->GetRageAmount() >= 10 && pVictim != m_bot && ai->GetHealthPercent() > 25 && !pTarget->HasAura(MOCKING_BLOW, EFFECT_INDEX_0) && !pTarget->HasAura(CHALLENGING_SHOUT, EFFECT_INDEX_0) && ai->CastSpell(MOCKING_BLOW, *pTarget)) out << " > Mocking Blow"; - else if( OVERPOWER>0 && ai->GetRageAmount()>=5 && ai->CastSpell( OVERPOWER, *pTarget ) ) + else if (OVERPOWER > 0 && ai->GetRageAmount() >= 5 && ai->CastSpell(OVERPOWER, *pTarget)) out << " > Overpower"; - else if( SUNDER_ARMOR>0 && ai->CastSpell( SUNDER_ARMOR, *pTarget ) ) + else if (SUNDER_ARMOR > 0 && ai->CastSpell(SUNDER_ARMOR, *pTarget)) out << " > Sunder Armor"; - else if( SHATTERING_THROW>0 && !pTarget->HasAura( SHATTERING_THROW, EFFECT_INDEX_0) && ai->CastSpell( SHATTERING_THROW, *pTarget ) ) + else if (SHATTERING_THROW > 0 && !pTarget->HasAura(SHATTERING_THROW, EFFECT_INDEX_0) && ai->CastSpell(SHATTERING_THROW, *pTarget)) out << " > Shattering Throw"; - else if( HEROIC_THROW>0 && ai->CastSpell( HEROIC_THROW, *pTarget ) ) + else if (HEROIC_THROW > 0 && ai->CastSpell(HEROIC_THROW, *pTarget)) out << " > Heroic Throw"; - else if( m_bot->getRace() == RACE_TAUREN && !pTarget->HasAura( WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura( PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura( SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura( CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell( WAR_STOMP, *pTarget ) ) + else if (m_bot->getRace() == RACE_TAUREN && !pTarget->HasAura(WAR_STOMP, EFFECT_INDEX_0) && !pTarget->HasAura(PIERCING_HOWL, EFFECT_INDEX_0) && !pTarget->HasAura(SHOCKWAVE, EFFECT_INDEX_0) && !pTarget->HasAura(CONCUSSION_BLOW, EFFECT_INDEX_0) && ai->CastSpell(WAR_STOMP, *pTarget)) out << " > War Stomp"; - else if( m_bot->getRace() == RACE_HUMAN && m_bot->hasUnitState( UNIT_STAT_STUNNED ) || m_bot->HasAuraType( SPELL_AURA_MOD_FEAR ) || m_bot->HasAuraType( SPELL_AURA_MOD_DECREASE_SPEED ) || m_bot->HasAuraType( SPELL_AURA_MOD_CHARM ) && ai->CastSpell( EVERY_MAN_FOR_HIMSELF, *m_bot ) ) + else if (m_bot->getRace() == RACE_HUMAN && m_bot->hasUnitState(UNIT_STAT_STUNNED) || m_bot->HasAuraType(SPELL_AURA_MOD_FEAR) || m_bot->HasAuraType(SPELL_AURA_MOD_DECREASE_SPEED) || m_bot->HasAuraType(SPELL_AURA_MOD_CHARM) && ai->CastSpell(EVERY_MAN_FOR_HIMSELF, *m_bot)) out << " > Every Man for Himself"; - else if( m_bot->getRace() == RACE_UNDEAD_PLAYER && m_bot->HasAuraType( SPELL_AURA_MOD_FEAR ) || m_bot->HasAuraType( SPELL_AURA_MOD_CHARM ) && ai->CastSpell( WILL_OF_THE_FORSAKEN, *m_bot ) ) + else if (m_bot->getRace() == RACE_UNDEAD_PLAYER && m_bot->HasAuraType(SPELL_AURA_MOD_FEAR) || m_bot->HasAuraType(SPELL_AURA_MOD_CHARM) && ai->CastSpell(WILL_OF_THE_FORSAKEN, *m_bot)) out << " > Will of the Forsaken"; - else if( m_bot->getRace() == RACE_DWARF && m_bot->HasAuraState( AURA_STATE_DEADLY_POISON ) && ai->CastSpell( STONEFORM, *m_bot ) ) + else if (m_bot->getRace() == RACE_DWARF && m_bot->HasAuraState(AURA_STATE_DEADLY_POISON) && ai->CastSpell(STONEFORM, *m_bot)) out << " > Stoneform"; - else if( m_bot->getRace() == RACE_GNOME && m_bot->hasUnitState( UNIT_STAT_STUNNED ) || m_bot->HasAuraType( SPELL_AURA_MOD_DECREASE_SPEED ) && ai->CastSpell( ESCAPE_ARTIST, *m_bot ) ) + else if (m_bot->getRace() == RACE_GNOME && m_bot->hasUnitState(UNIT_STAT_STUNNED) || m_bot->HasAuraType(SPELL_AURA_MOD_DECREASE_SPEED) && ai->CastSpell(ESCAPE_ARTIST, *m_bot)) out << " > Escape Artist"; - else if( m_bot->getRace() == RACE_NIGHTELF && pVictim == m_bot && ai->GetHealthPercent() < 25 && !m_bot->HasAura( SHADOWMELD, EFFECT_INDEX_0) && ai->CastSpell( SHADOWMELD, *m_bot ) ) + else if (m_bot->getRace() == RACE_NIGHTELF && pVictim == m_bot && ai->GetHealthPercent() < 25 && !m_bot->HasAura(SHADOWMELD, EFFECT_INDEX_0) && ai->CastSpell(SHADOWMELD, *m_bot)) out << " > Shadowmeld"; - else if( m_bot->getRace() == RACE_ORC && !m_bot->HasAura( BLOOD_FURY, EFFECT_INDEX_0) && ai->CastSpell( BLOOD_FURY, *m_bot ) ) + else if (m_bot->getRace() == RACE_ORC && !m_bot->HasAura(BLOOD_FURY, EFFECT_INDEX_0) && ai->CastSpell(BLOOD_FURY, *m_bot)) out << " > Blood Fury"; - else if( m_bot->getRace() == RACE_TROLL && !m_bot->HasAura( BERSERKING, EFFECT_INDEX_0) && ai->CastSpell( BERSERKING, *m_bot ) ) + else if (m_bot->getRace() == RACE_TROLL && !m_bot->HasAura(BERSERKING, EFFECT_INDEX_0) && ai->CastSpell(BERSERKING, *m_bot)) out << " > Berserking"; - else if( m_bot->getRace() == RACE_DRAENEI && ai->GetHealthPercent() < 25 && !m_bot->HasAura(GIFT_OF_THE_NAARU, EFFECT_INDEX_0) && ai->CastSpell(GIFT_OF_THE_NAARU, *m_bot) ) + else if (m_bot->getRace() == RACE_DRAENEI && ai->GetHealthPercent() < 25 && !m_bot->HasAura(GIFT_OF_THE_NAARU, EFFECT_INDEX_0) && ai->CastSpell(GIFT_OF_THE_NAARU, *m_bot)) out << " > Gift of the Naaru"; else out << " > NONE"; @@ -272,34 +272,34 @@ void PlayerbotWarriorAI::DoNextCombatManeuver(Unit *pTarget) case WarriorDefensive: out << "Case Defensive"; - if( DISARM>0 && ai->GetRageAmount()>=15 && !pTarget->HasAura( DISARM, EFFECT_INDEX_0) && ai->CastSpell( DISARM, *pTarget ) ) + if (DISARM > 0 && ai->GetRageAmount() >= 15 && !pTarget->HasAura(DISARM, EFFECT_INDEX_0) && ai->CastSpell(DISARM, *pTarget)) out << " > Disarm"; - else if( SUNDER_ARMOR>0 && ai->GetRageAmount()>=15 && ai->CastSpell( SUNDER_ARMOR, *pTarget ) ) + else if (SUNDER_ARMOR > 0 && ai->GetRageAmount() >= 15 && ai->CastSpell(SUNDER_ARMOR, *pTarget)) out << " > Sunder Armor"; - else if( REVENGE>0 && ai->GetRageAmount()>=5 && ai->CastSpell( REVENGE, *pTarget ) ) + else if (REVENGE > 0 && ai->GetRageAmount() >= 5 && ai->CastSpell(REVENGE, *pTarget)) out << " > Revenge"; - else if( SHIELD_BLOCK>0 && !m_bot->HasAura( SHIELD_BLOCK, EFFECT_INDEX_0) && ai->CastSpell( SHIELD_BLOCK, *m_bot ) ) + else if (SHIELD_BLOCK > 0 && !m_bot->HasAura(SHIELD_BLOCK, EFFECT_INDEX_0) && ai->CastSpell(SHIELD_BLOCK, *m_bot)) out << " > Shield Block"; - else if( SHIELD_WALL>0 && !m_bot->HasAura( SHIELD_WALL, EFFECT_INDEX_0) && ai->CastSpell( SHIELD_WALL, *m_bot ) ) + else if (SHIELD_WALL > 0 && !m_bot->HasAura(SHIELD_WALL, EFFECT_INDEX_0) && ai->CastSpell(SHIELD_WALL, *m_bot)) out << " > Shield Wall"; else out << " > NONE"; break; case WarriorBerserker: - out << "Case Berserker"; - if( WHIRLWIND>0 && ai->GetRageAmount()>=25 && ai->CastSpell( WHIRLWIND, *pTarget ) ) + out << "Case Berserker"; + if (WHIRLWIND > 0 && ai->GetRageAmount() >= 25 && ai->CastSpell(WHIRLWIND, *pTarget)) out << " > Whirlwind"; out << " > NONE"; break; } - if( ai->GetManager()->m_confDebugWhisper ) - ai->TellMaster( out.str().c_str() ); + if (ai->GetManager()->m_confDebugWhisper) + ai->TellMaster(out.str().c_str()); } void PlayerbotWarriorAI::DoNonCombatActions() { - PlayerbotAI *ai = GetAI(); + PlayerbotAI *ai = GetAI(); Player * m_bot = GetPlayerBot(); if (!m_bot) return; @@ -310,27 +310,27 @@ void PlayerbotWarriorAI::DoNonCombatActions() // With stance change can the shout change to. // Inserted line to battle shout m_bot->HasAura( COMMANDING_SHOUT, EFFECT_INDEX_0) // Natsukawa - if( ( (COMMANDING_SHOUT>0 && !m_bot->HasAura( COMMANDING_SHOUT, EFFECT_INDEX_0)) || - (BATTLE_SHOUT>0 && !m_bot->HasAura( BATTLE_SHOUT, EFFECT_INDEX_0)) ) && - ai->GetRageAmount()<10 && BLOODRAGE>0 && !m_bot->HasAura( BLOODRAGE, EFFECT_INDEX_0) ) + if (((COMMANDING_SHOUT > 0 && !m_bot->HasAura(COMMANDING_SHOUT, EFFECT_INDEX_0)) || + (BATTLE_SHOUT > 0 && !m_bot->HasAura(BATTLE_SHOUT, EFFECT_INDEX_0))) && + ai->GetRageAmount() < 10 && BLOODRAGE > 0 && !m_bot->HasAura(BLOODRAGE, EFFECT_INDEX_0)) { // we do have a useful shout, no rage coming but can cast bloodrage... do it - ai->CastSpell( BLOODRAGE, *m_bot ); + ai->CastSpell(BLOODRAGE, *m_bot); } - else if( COMMANDING_SHOUT>0 && !m_bot->HasAura( COMMANDING_SHOUT, EFFECT_INDEX_0) ) + else if (COMMANDING_SHOUT > 0 && !m_bot->HasAura(COMMANDING_SHOUT, EFFECT_INDEX_0)) { // use commanding shout now - ai->CastSpell( COMMANDING_SHOUT, *m_bot ); + ai->CastSpell(COMMANDING_SHOUT, *m_bot); } - else if( BATTLE_SHOUT>0 && !m_bot->HasAura( BATTLE_SHOUT, EFFECT_INDEX_0) && !m_bot->HasAura( COMMANDING_SHOUT, EFFECT_INDEX_0) ) + else if (BATTLE_SHOUT > 0 && !m_bot->HasAura(BATTLE_SHOUT, EFFECT_INDEX_0) && !m_bot->HasAura(COMMANDING_SHOUT, EFFECT_INDEX_0)) { // use battle shout - ai->CastSpell( BATTLE_SHOUT, *m_bot ); + ai->CastSpell(BATTLE_SHOUT, *m_bot); } // buff master with VIGILANCE if (VIGILANCE > 0) - (!GetMaster()->HasAura( VIGILANCE, EFFECT_INDEX_0) && ai->CastSpell( VIGILANCE, *GetMaster() ) ); + (!GetMaster()->HasAura(VIGILANCE, EFFECT_INDEX_0) && ai->CastSpell(VIGILANCE, *GetMaster())); // hp check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) @@ -361,5 +361,4 @@ void PlayerbotWarriorAI::DoNonCombatActions() } } // end DoNonCombatActions -void PlayerbotWarriorAI::BuffPlayer(Player* target) { -} +void PlayerbotWarriorAI::BuffPlayer(Player* target) {} diff --git a/src/game/playerbot/PlayerbotWarriorAI.h b/src/game/playerbot/PlayerbotWarriorAI.h index 52bfbd3e8..53ea8b9b9 100644 --- a/src/game/playerbot/PlayerbotWarriorAI.h +++ b/src/game/playerbot/PlayerbotWarriorAI.h @@ -70,37 +70,37 @@ enum WarriorSpells class MANGOS_DLL_SPEC PlayerbotWarriorAI : PlayerbotClassAI { - public: - PlayerbotWarriorAI(Player* const master, Player* const bot, PlayerbotAI* const ai); - virtual ~PlayerbotWarriorAI(); +public: + PlayerbotWarriorAI(Player * const master, Player * const bot, PlayerbotAI * const ai); + virtual ~PlayerbotWarriorAI(); - // all combat actions go here - bool DoFirstCombatManeuver(Unit*); - void DoNextCombatManeuver(Unit*); + // all combat actions go here + bool DoFirstCombatManeuver(Unit*); + void DoNextCombatManeuver(Unit*); - // all non combat actions go here, ex buffs, heals, rezzes - void DoNonCombatActions(); + // all non combat actions go here, ex buffs, heals, rezzes + void DoNonCombatActions(); - // buff a specific player, usually a real PC who is not in group - void BuffPlayer(Player *target); + // buff a specific player, usually a real PC who is not in group + void BuffPlayer(Player *target); - private: - // ARMS - uint32 BATTLE_STANCE, CHARGE, HEROIC_STRIKE, REND, THUNDER_CLAP, HAMSTRING, MOCKING_BLOW, RETALIATION, SWEEPING_STRIKES, MORTAL_STRIKE, BLADESTORM, HEROIC_THROW, SHATTERING_THROW; +private: + // ARMS + uint32 BATTLE_STANCE, CHARGE, HEROIC_STRIKE, REND, THUNDER_CLAP, HAMSTRING, MOCKING_BLOW, RETALIATION, SWEEPING_STRIKES, MORTAL_STRIKE, BLADESTORM, HEROIC_THROW, SHATTERING_THROW; - // PROTECTION - uint32 DEFENSIVE_STANCE, BLOODRAGE, SUNDER_ARMOR, TAUNT, SHIELD_BASH, REVENGE, SHIELD_BLOCK, DISARM, SHIELD_WALL, SHIELD_SLAM, VIGILANCE, DEVASTATE, SHOCKWAVE, CONCUSSION_BLOW, SPELL_REFLECTION, LAST_STAND; + // PROTECTION + uint32 DEFENSIVE_STANCE, BLOODRAGE, SUNDER_ARMOR, TAUNT, SHIELD_BASH, REVENGE, SHIELD_BLOCK, DISARM, SHIELD_WALL, SHIELD_SLAM, VIGILANCE, DEVASTATE, SHOCKWAVE, CONCUSSION_BLOW, SPELL_REFLECTION, LAST_STAND; - // FURY - uint32 BERSERKER_STANCE, BATTLE_SHOUT, DEMORALIZING_SHOUT, OVERPOWER, CLEAVE, INTIMIDATING_SHOUT, EXECUTE, CHALLENGING_SHOUT, SLAM, INTERCEPT, DEATH_WISH, BERSERKER_RAGE, WHIRLWIND, PUMMEL, BLOODTHIRST, RECKLESSNESS, RAMPAGE, HEROIC_FURY, COMMANDING_SHOUT, ENRAGED_REGENERATION, PIERCING_HOWL; + // FURY + uint32 BERSERKER_STANCE, BATTLE_SHOUT, DEMORALIZING_SHOUT, OVERPOWER, CLEAVE, INTIMIDATING_SHOUT, EXECUTE, CHALLENGING_SHOUT, SLAM, INTERCEPT, DEATH_WISH, BERSERKER_RAGE, WHIRLWIND, PUMMEL, BLOODTHIRST, RECKLESSNESS, RAMPAGE, HEROIC_FURY, COMMANDING_SHOUT, ENRAGED_REGENERATION, PIERCING_HOWL; - // first aid - uint32 RECENTLY_BANDAGED; + // first aid + uint32 RECENTLY_BANDAGED; - // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + // racial + uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; - uint32 SpellSequence; + uint32 SpellSequence; }; #endif diff --git a/src/game/playerbot/config.h b/src/game/playerbot/config.h index c26ca2d91..ef68fc704 100644 --- a/src/game/playerbot/config.h +++ b/src/game/playerbot/config.h @@ -28,7 +28,7 @@ #if PLATFORM == PLATFORM_WINDOWS #define _PLAYERBOT_CONFIG "playerbot.conf" #else - #define _PLAYERBOT_CONFIG SYSCONFDIR"playerbot.conf" + #define _PLAYERBOT_CONFIG SYSCONFDIR "playerbot.conf" #endif #endif From bb59278ecaa51b4ce4a5836f99b837bf52673d37 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Mon, 6 Sep 2010 16:16:47 +0400 Subject: [PATCH 119/187] Remove spaces inside braces --- src/game/playerbot/PlayerbotAI.cpp | 6 ++--- src/game/playerbot/PlayerbotDeathKnightAI.cpp | 6 ++--- src/game/playerbot/PlayerbotHunterAI.cpp | 22 +++++++++---------- src/game/playerbot/PlayerbotWarlockAI.cpp | 20 ++++++++--------- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index c87acfd88..f99a90e2a 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -1906,14 +1906,14 @@ uint32 PlayerbotAI::EstRepairAll() uint32 TotalCost = 0; // equipped, backpack, bags itself for (int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; ++i) - TotalCost += EstRepair(((INVENTORY_SLOT_BAG_0 << 8) | i )); + TotalCost += EstRepair(((INVENTORY_SLOT_BAG_0 << 8) | i)); // bank, buyback and keys not repaired // items in inventory bags for (int j = INVENTORY_SLOT_BAG_START; j < INVENTORY_SLOT_BAG_END; ++j) for (int i = 0; i < MAX_BAG_SIZE; ++i) - TotalCost += EstRepair(((j << 8) | i )); + TotalCost += EstRepair(((j << 8) | i)); return TotalCost; } @@ -1972,7 +1972,7 @@ Unit *PlayerbotAI::FindAttacker(ATTACKERINFOTYPE ait, Unit *victim) if (!ait) return (m_attackerInfo.begin())->second.attacker; - float t = ((ait & AIT_HIGHESTTHREAT) ? 0.00 : 9999.00 ); + float t = ((ait & AIT_HIGHESTTHREAT) ? 0.00 : 9999.00); Unit *a = 0; AttackerInfoList::iterator itr = m_attackerInfo.begin(); for (; itr != m_attackerInfo.end(); ++itr) diff --git a/src/game/playerbot/PlayerbotDeathKnightAI.cpp b/src/game/playerbot/PlayerbotDeathKnightAI.cpp index 20303c0f8..68a69032e 100644 --- a/src/game/playerbot/PlayerbotDeathKnightAI.cpp +++ b/src/game/playerbot/PlayerbotDeathKnightAI.cpp @@ -206,7 +206,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellUnholyDK = LastSpellUnholyDK + 1; break; } - else if (( !pet ) + else if ((!pet) && (RAISE_DEAD > 0 && !m_bot->HasAura(ARMY_OF_THE_DEAD, EFFECT_INDEX_0) && LastSpellUnholyDK < 13)) { ai->CastSpell(RAISE_DEAD); @@ -215,7 +215,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellUnholyDK = LastSpellUnholyDK + 1; break; } - else if (( pet ) + else if ((pet) && (GHOUL_FRENZY > 0 && pVictim == pet && !pet->HasAura(GHOUL_FRENZY, EFFECT_INDEX_0) && LastSpellUnholyDK < 14)) { ai->CastSpell(GHOUL_FRENZY, *pet); @@ -439,7 +439,7 @@ void PlayerbotDeathKnightAI::DoNextCombatManeuver(Unit *pTarget) LastSpellBloodDK = LastSpellBloodDK + 1; break; } - else if (( pet ) + else if ((pet) && (DEATH_PACT > 0 && ai->GetHealthPercent() < 50 && LastSpellBloodDK < 12 && ai->GetRunicPower() >= 40)) { ai->CastSpell(DEATH_PACT, *pet); diff --git a/src/game/playerbot/PlayerbotHunterAI.cpp b/src/game/playerbot/PlayerbotHunterAI.cpp index 6726692bc..6459101de 100644 --- a/src/game/playerbot/PlayerbotHunterAI.cpp +++ b/src/game/playerbot/PlayerbotHunterAI.cpp @@ -113,15 +113,15 @@ void PlayerbotHunterAI::DoNextCombatManeuver(Unit *pTarget) // check for pet and heal if neccessary Pet *pet = m_bot->GetPet(); - if (( pet ) - && (((float) pet->GetHealth() / (float) pet->GetMaxHealth()) < 0.5f ) - && ( PET_MEND > 0 && !pet->getDeathState() != ALIVE && pVictim != m_bot && !pet->HasAura(PET_MEND, EFFECT_INDEX_0) && ai->GetManaPercent() >= 13 && ai->CastSpell(PET_MEND, *m_bot))) + if ((pet) + && (((float) pet->GetHealth() / (float) pet->GetMaxHealth()) < 0.5f) + && (PET_MEND > 0 && !pet->getDeathState() != ALIVE && pVictim != m_bot && !pet->HasAura(PET_MEND, EFFECT_INDEX_0) && ai->GetManaPercent() >= 13 && ai->CastSpell(PET_MEND, *m_bot))) { ai->TellMaster("healing pet."); return; } - else if (( pet ) - && ( INTIMIDATION > 0 && pVictim == pet && !pet->HasAura(INTIMIDATION, EFFECT_INDEX_0) && ai->CastSpell(INTIMIDATION, *m_bot))) + else if ((pet) + && (INTIMIDATION > 0 && pVictim == pet && !pet->HasAura(INTIMIDATION, EFFECT_INDEX_0) && ai->CastSpell(INTIMIDATION, *m_bot))) { //ai->TellMaster( "casting intimidation." ); // if pet has aggro :) return; @@ -148,24 +148,24 @@ void PlayerbotHunterAI::DoNextCombatManeuver(Unit *pTarget) if (!m_bot->GetUInt32Value(PLAYER_AMMO_ID)) ai->TellMaster("Out of ammo!"); // become monkey (increases dodge chance)... - ( ASPECT_OF_THE_MONKEY > 0 && !m_bot->HasAura(ASPECT_OF_THE_MONKEY, EFFECT_INDEX_0) && ai->CastSpell(ASPECT_OF_THE_MONKEY, *m_bot)); + (ASPECT_OF_THE_MONKEY > 0 && !m_bot->HasAura(ASPECT_OF_THE_MONKEY, EFFECT_INDEX_0) && ai->CastSpell(ASPECT_OF_THE_MONKEY, *m_bot)); } else if (dist > ATTACK_DISTANCE && !m_rangedCombat) { // switch to ranged combat m_rangedCombat = true; // increase ranged attack power... - ( ASPECT_OF_THE_HAWK > 0 && !m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0) && ai->CastSpell(ASPECT_OF_THE_HAWK, *m_bot)); + (ASPECT_OF_THE_HAWK > 0 && !m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0) && ai->CastSpell(ASPECT_OF_THE_HAWK, *m_bot)); } else if (m_rangedCombat && !m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0)) { // check if we have hawk aspect in ranged combat - ( ASPECT_OF_THE_HAWK > 0 && ai->CastSpell(ASPECT_OF_THE_HAWK, *m_bot)); + (ASPECT_OF_THE_HAWK > 0 && ai->CastSpell(ASPECT_OF_THE_HAWK, *m_bot)); } else if (!m_rangedCombat && !m_bot->HasAura(ASPECT_OF_THE_MONKEY, EFFECT_INDEX_0)) { // check if we have monkey aspect in melee combat - ( ASPECT_OF_THE_MONKEY > 0 && ai->CastSpell(ASPECT_OF_THE_MONKEY, *m_bot)); + (ASPECT_OF_THE_MONKEY > 0 && ai->CastSpell(ASPECT_OF_THE_MONKEY, *m_bot)); } // activate auto shot @@ -247,8 +247,8 @@ void PlayerbotHunterAI::DoNextCombatManeuver(Unit *pTarget) out << " > Shadowmeld"; else if (m_bot->getRace() == RACE_DRAENEI && ai->GetHealthPercent() < 25 && !m_bot->HasAura(GIFT_OF_THE_NAARU, EFFECT_INDEX_0) && ai->CastSpell(GIFT_OF_THE_NAARU, *m_bot)) out << " > Gift of the Naaru"; - else if (( pet && !pet->getDeathState() != ALIVE) - && ( MISDIRECTION > 0 && pVictim == m_bot && !m_bot->HasAura(MISDIRECTION, EFFECT_INDEX_0) && ai->GetManaPercent() >= 9 && ai->CastSpell(MISDIRECTION, *pet))) + else if ((pet && !pet->getDeathState() != ALIVE) + && (MISDIRECTION > 0 && pVictim == m_bot && !m_bot->HasAura(MISDIRECTION, EFFECT_INDEX_0) && ai->GetManaPercent() >= 9 && ai->CastSpell(MISDIRECTION, *pet))) out << " > Misdirection"; // give threat to pet /*else if( FREEZING_TRAP>0 && ai->GetManaPercent()>=5 && !pTarget->HasAura(FREEZING_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(ARCANE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(EXPLOSIVE_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(BEAR_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(IMMOLATION_TRAP, EFFECT_INDEX_0) && !pTarget->HasAura(FROST_TRAP, EFFECT_INDEX_0) && ai->CastSpell(FREEZING_TRAP,*pTarget) ) out << " > Freezing Trap"; // this can trap your bots too diff --git a/src/game/playerbot/PlayerbotWarlockAI.cpp b/src/game/playerbot/PlayerbotWarlockAI.cpp index af3dd8b41..f43dd2cce 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.cpp +++ b/src/game/playerbot/PlayerbotWarlockAI.cpp @@ -217,7 +217,7 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) LastSpellAffliction = LastSpellAffliction + 1; break; } - else if (( pet ) + else if ((pet) && (DARK_PACT > 0 && ai->GetManaPercent() <= 50 && LastSpellAffliction < 12 && pet->GetPower(POWER_MANA) > 0)) { ai->CastSpell(DARK_PACT, *m_bot); @@ -395,14 +395,14 @@ void PlayerbotWarlockAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(30); return; } - else if (( pet ) + else if ((pet) && (pItem == NULL && DARK_PACT > 0 && ai->GetManaPercent() <= 50 && pet->GetPower(POWER_MANA) > 0)) { ai->CastSpell(DARK_PACT, *m_bot); //ai->TellMaster("casting dark pact."); return; } - else if (( !pet ) + else if ((!pet) && (pItem == NULL && LIFE_TAP > 0 && ai->GetManaPercent() <= 50 && ai->GetHealthPercent() > 25)) { ai->CastSpell(LIFE_TAP, *m_bot); @@ -430,7 +430,7 @@ void PlayerbotWarlockAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(8); return; } - else if (( pet ) + else if ((pet) && (pItem == NULL && fItem == NULL && CONSUME_SHADOWS > 0 && !m_bot->HasAura(CONSUME_SHADOWS, EFFECT_INDEX_0) && ai->GetHealthPercent() < 75)) { ai->CastSpell(CONSUME_SHADOWS, *m_bot); @@ -463,20 +463,20 @@ void PlayerbotWarlockAI::DoNonCombatActions() } // check for buffs with demon - if (( pet ) - && ( SOUL_LINK > 0 && !m_bot->HasAura(SOUL_LINK_AURA, EFFECT_INDEX_0) && ai->GetBaseManaPercent() >= 16 && ai->CastSpell(SOUL_LINK, *m_bot))) + if ((pet) + && (SOUL_LINK > 0 && !m_bot->HasAura(SOUL_LINK_AURA, EFFECT_INDEX_0) && ai->GetBaseManaPercent() >= 16 && ai->CastSpell(SOUL_LINK, *m_bot))) { //ai->TellMaster( "casting soul link." ); return; } - else if (( pet ) - && ( BLOOD_PACT > 0 && !m_bot->HasAura(BLOOD_PACT, EFFECT_INDEX_0) && ai->CastSpell(BLOOD_PACT, *m_bot))) + else if ((pet) + && (BLOOD_PACT > 0 && !m_bot->HasAura(BLOOD_PACT, EFFECT_INDEX_0) && ai->CastSpell(BLOOD_PACT, *m_bot))) { //ai->TellMaster( "casting blood pact." ); return; } - else if (( pet ) - && ( FEL_INTELLIGENCE > 0 && !m_bot->HasAura(FEL_INTELLIGENCE, EFFECT_INDEX_0) && ai->CastSpell(FEL_INTELLIGENCE, *m_bot))) + else if ((pet) + && (FEL_INTELLIGENCE > 0 && !m_bot->HasAura(FEL_INTELLIGENCE, EFFECT_INDEX_0) && ai->CastSpell(FEL_INTELLIGENCE, *m_bot))) { //ai->TellMaster( "casting fel intelligence." ); return; From d956c88e7ebce2d93d45c26f289c9ac14f0aaa13 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Mon, 6 Sep 2010 16:45:01 +0400 Subject: [PATCH 120/187] Force newline generation for curly braces --- src/game/playerbot/PlayerbotAI.cpp | 61 ++++++++++++++++++++---------- src/game/playerbot/PlayerbotAI.h | 3 +- 2 files changed, 43 insertions(+), 21 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index f99a90e2a..fdc430cb1 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -83,7 +83,8 @@ PlayerbotAI::PlayerbotAI(PlayerbotMgr* const mgr, Player* const bot) : m_combatOrder(ORDERS_NONE), m_ScenarioType(SCENARIO_PVEEASY), m_TimeDoneEating(0), m_TimeDoneDrinking(0), m_CurrentlyCastingSpellId(0), m_spellIdCommand(0), - m_targetGuidCommand(0), m_classAI(0) { + m_targetGuidCommand(0), m_classAI(0) +{ // set bot state and needed item list m_botState = BOTSTATE_NORMAL; @@ -399,7 +400,8 @@ void PlayerbotAI::SendNotEquipList(Player& player) std::list* itemListForEqSlot = equip[equipSlot]; std::ostringstream out; out << descr[equipSlot] << ": "; - for (std::list::iterator it = itemListForEqSlot->begin(); it != itemListForEqSlot->end(); ++it) { + for (std::list::iterator it = itemListForEqSlot->begin(); it != itemListForEqSlot->end(); ++it) + { const ItemPrototype* const pItemProto = (*it)->GetProto(); std::string itemName = pItemProto->Name1; @@ -1356,7 +1358,8 @@ void PlayerbotAI::GetCombatTarget(Unit* forcedTarget) if (m_mgr->m_confDebugWhisper) TellMaster("Changing target to %s to protect %s", forcedTarget->GetName(), m_targetProtect->GetName()); } - } else if (forcedTarget) + } + else if (forcedTarget) { if (m_mgr->m_confDebugWhisper) TellMaster("Changing target to %s by force!", forcedTarget->GetName()); @@ -1457,7 +1460,8 @@ void PlayerbotAI::DoNextCombatManeuver() (GetClassAI())->DoNextCombatManeuver(m_targetCombat); } -void PlayerbotAI::DoCombatMovement() { +void PlayerbotAI::DoCombatMovement() +{ if (!m_targetCombat) return; float targetDist = m_bot->GetDistance(m_targetCombat); @@ -1473,7 +1477,9 @@ void PlayerbotAI::DoCombatMovement() { // TODO: just follow in spell range! how to determine bots spell range? if (targetDist > 25.0f) { m_bot->GetMotionMaster()->MoveChase(m_targetCombat); - } else { + } + else + { MovementClear(); } } @@ -1756,7 +1762,8 @@ void PlayerbotAI::TurnInQuests(WorldObject *questgiver) } // else multiple rewards - let master pick - else { + else + { out << "What reward should I take for |cff808080|Hquest:" << questID << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r? "; for (uint8 i = 0; i < pQuest->GetRewChoiceItemsCount(); ++i) @@ -2008,17 +2015,20 @@ Unit *PlayerbotAI::FindAttacker(ATTACKERINFOTYPE ait, Unit *victim) return a; } -void PlayerbotAI::SetCombatOrderByStr(std::string str, Unit *target) { +void PlayerbotAI::SetCombatOrderByStr(std::string str, Unit *target) +{ CombatOrderType co; if (str == "tank") co = ORDERS_TANK; else if (str == "assist") co = ORDERS_ASSIST; else if (str == "heal") co = ORDERS_HEAL; else if (str == "protect") co = ORDERS_PROTECT; - else co = ORDERS_RESET; + else + co = ORDERS_RESET; SetCombatOrder(co, target); } -void PlayerbotAI::SetCombatOrder(CombatOrderType co, Unit *target) { +void PlayerbotAI::SetCombatOrder(CombatOrderType co, Unit *target) +{ if ((co == ORDERS_ASSIST || co == ORDERS_PROTECT) && !target) { TellMaster("Erf, you forget to target assist/protect characters!"); return; @@ -2041,13 +2051,15 @@ void PlayerbotAI::SetCombatOrder(CombatOrderType co, Unit *target) { SendOrders(*GetMaster()); } -void PlayerbotAI::SetMovementOrder(MovementOrderType mo, Unit *followTarget) { +void PlayerbotAI::SetMovementOrder(MovementOrderType mo, Unit *followTarget) +{ m_movementOrder = mo; m_followTarget = followTarget; MovementReset(); } -void PlayerbotAI::MovementReset() { +void PlayerbotAI::MovementReset() +{ // stop moving... MovementClear(); @@ -2735,7 +2747,8 @@ uint32 PlayerbotAI::extractMoney(const std::string& text) const // also removes found item IDs from itemIdSearchList when found void PlayerbotAI::findItemsInEquip(std::list& itemIdSearchList, std::list& foundItemList) const { - for (uint8 slot = EQUIPMENT_SLOT_START; itemIdSearchList.size() > 0 && slot < EQUIPMENT_SLOT_END; slot++) { + for (uint8 slot = EQUIPMENT_SLOT_START; itemIdSearchList.size() > 0 && slot < EQUIPMENT_SLOT_END; slot++) + { Item* const pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); if (!pItem) continue; @@ -3372,7 +3385,8 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) hasCompleteQuests = true; comout << " |cFFFFFF00|Hquest:" << questId << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r"; } - else { + else + { hasIncompleteQuests = true; incomout << " |cFFFFFF00|Hquest:" << questId << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r"; } @@ -3567,7 +3581,8 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) 61437, 22810, 22027, 45927, 7266, 7267, 6477, 6478, 7355, 68398}; uint32 ignoredSpellsCount = sizeof(ignoredSpells) / sizeof(uint32); - for (PlayerSpellMap::iterator itr = m_bot->GetSpellMap().begin(); itr != m_bot->GetSpellMap().end(); ++itr) { + for (PlayerSpellMap::iterator itr = m_bot->GetSpellMap().begin(); itr != m_bot->GetSpellMap().end(); ++itr) + { const uint32 spellId = itr->first; if (itr->second.state == PLAYERSPELL_REMOVED || itr->second.disabled || IsPassiveSpell(spellId)) @@ -3582,7 +3597,8 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) SkillLineAbilityMapBounds const bounds = sSpellMgr.GetSkillLineAbilityMapBounds(spellId); bool isProfessionOrRidingSpell = false; - for (SkillLineAbilityMap::const_iterator skillIter = bounds.first; skillIter != bounds.second; ++skillIter) { + for (SkillLineAbilityMap::const_iterator skillIter = bounds.first; skillIter != bounds.second; ++skillIter) + { if (IsProfessionOrRidingSkill(skillIter->second->skillId) && skillIter->first == spellId) { isProfessionOrRidingSpell = true; break; @@ -3592,7 +3608,8 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) continue; bool isIgnoredSpell = false; - for (uint8 i = 0; i < ignoredSpellsCount; ++i) { + for (uint8 i = 0; i < ignoredSpellsCount; ++i) + { if (spellId == ignoredSpells[i]) { isIgnoredSpell = true; break; @@ -3608,7 +3625,8 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) if (posSpells[spellName] < spellId) posSpells[spellName] = spellId; } - else { + else + { if (negSpells.find(spellName) == negSpells.end()) negSpells[spellName] = spellId; else @@ -3617,12 +3635,14 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) } } - for (spellMap::const_iterator iter = posSpells.begin(); iter != posSpells.end(); ++iter) { + for (spellMap::const_iterator iter = posSpells.begin(); iter != posSpells.end(); ++iter) + { posOut << " |cffffffff|Hspell:" << iter->second << "|h[" << iter->first << "]|h|r"; } - for (spellMap::const_iterator iter = negSpells.begin(); iter != negSpells.end(); ++iter) { + for (spellMap::const_iterator iter = negSpells.begin(); iter != negSpells.end(); ++iter) + { negOut << " |cffffffff|Hspell:" << iter->second << "|h[" << iter->first << "]|h|r"; } @@ -3797,7 +3817,8 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) } } - else { + else + { std::string msg = "What? follow, stay, (c)ast , spells, (e)quip , (u)se , drop , report, quests, stats"; SendWhisper(msg, fromPlayer); m_bot->HandleEmoteCommand(EMOTE_ONESHOT_TALK); diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 9f9592bec..4eb9234c7 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -52,7 +52,8 @@ class MANGOS_DLL_SPEC PlayerbotAI SCENARIO_PVPHARD }; - enum CombatStyle { + enum CombatStyle + { COMBAT_MELEE = 0x01, // class melee attacker COMBAT_RANGED = 0x02 // class is ranged attacker }; From 5bd3026da7cedc90488a419b3fc494a564bbb366 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Mon, 6 Sep 2010 16:53:49 +0400 Subject: [PATCH 121/187] Remove unneeded braces --- src/game/playerbot/PlayerbotAI.cpp | 76 ++--------------------- src/game/playerbot/PlayerbotDruidAI.cpp | 42 +------------ src/game/playerbot/PlayerbotHunterAI.cpp | 16 ----- src/game/playerbot/PlayerbotMgr.cpp | 10 +-- src/game/playerbot/PlayerbotPriestAI.cpp | 2 - src/game/playerbot/PlayerbotShamanAI.cpp | 4 -- src/game/playerbot/PlayerbotWarlockAI.cpp | 10 --- src/game/playerbot/PlayerbotWarriorAI.cpp | 6 -- 8 files changed, 7 insertions(+), 159 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index fdc430cb1..9884ccf28 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -360,7 +360,6 @@ void PlayerbotAI::SendNotEquipList(Player& player) { const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); if (pBag) - { for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) { Item* const pItem = m_bot->GetItemByPos(bag, slot); @@ -381,7 +380,6 @@ void PlayerbotAI::SendNotEquipList(Player& player) std::list* itemListForEqSlot = equip[equipSlot]; itemListForEqSlot->push_back(pItem); } - } } TellMaster("Here's all the items in my inventory that I can equip."); @@ -610,14 +608,12 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) } else if ((pSpellInfo->EffectApplyAuraName[2] == SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED) && (pSpellInfo->EffectApplyAuraName[1] == SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED)) - { if ((pSpellInfo->EffectBasePoints[2] == master_speed2) && (pSpellInfo->EffectBasePoints[1] == master_speed1)) { spellMount = spellId; break; } - } } } if (spellMount > 0) m_bot->CastSpell(m_bot, spellMount, false); @@ -691,10 +687,8 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) p >> result; p.clear(); if (operation == PARTY_OP_LEAVE) - { if (member == GetMaster()->GetName()) m_bot->GetSession()->HandleGroupDisbandOpcode(p); // packet not used updated code - } return; } @@ -778,7 +772,6 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) { const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); if (pBag) - { for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) { const Item* const pItem = m_bot->GetItemByPos(bag, slot); @@ -798,7 +791,6 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) out << "x" << pItem->GetCount() << ' '; } } - } } // calculate how much money bot has @@ -1009,7 +1001,6 @@ Item* PlayerbotAI::FindMount(uint32 matchingRidingSkill) const { const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); if (pBag) - { for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) { Item* const pItem = m_bot->GetItemByPos(bag, slot); @@ -1026,7 +1017,6 @@ Item* PlayerbotAI::FindMount(uint32 matchingRidingSkill) const partialMatch = pItem; } } - } } return partialMatch; } @@ -1044,13 +1034,11 @@ Item* PlayerbotAI::FindFood() const continue; if (pItemProto->Class == ITEM_CLASS_CONSUMABLE && pItemProto->SubClass == ITEM_SUBCLASS_FOOD) - { // if is FOOD // this enum is no longer defined in mangos. Is it no longer valid? // according to google it was 11 if (pItemProto->Spells[0].SpellCategory == 11) return pItem; - } } } // list out items in other removable backpacks @@ -1058,7 +1046,6 @@ Item* PlayerbotAI::FindFood() const { const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); if (pBag) - { for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) { Item* const pItem = m_bot->GetItemByPos(bag, slot); @@ -1072,17 +1059,14 @@ Item* PlayerbotAI::FindFood() const // this enum is no longer defined in mangos. Is it no longer valid? // according to google it was 11 if (pItemProto->Class == ITEM_CLASS_CONSUMABLE && pItemProto->SubClass == ITEM_SUBCLASS_FOOD) - { // if is FOOD // this enum is no longer defined in mangos. Is it no longer valid? // according to google it was 11 // if (pItemProto->Spells[0].SpellCategory == SPELL_CATEGORY_FOOD) if (pItemProto->Spells[0].SpellCategory == 11) return pItem; - } } } - } } return NULL; } @@ -1101,7 +1085,6 @@ Item* PlayerbotAI::FindDrink() const continue; if (pItemProto->Class == ITEM_CLASS_CONSUMABLE && pItemProto->SubClass == ITEM_SUBCLASS_FOOD) - { // if (pItemProto->Spells[0].SpellCategory == SPELL_CATEGORY_DRINK) // this enum is no longer defined in mangos. Is it no longer valid? @@ -1109,7 +1092,6 @@ Item* PlayerbotAI::FindDrink() const // if (pItemProto->Spells[0].SpellCategory == 59) if (pItemProto->Spells[0].SpellCategory == 59) return pItem; - } } } // list out items in other removable backpacks @@ -1117,7 +1099,6 @@ Item* PlayerbotAI::FindDrink() const { const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); if (pBag) - { for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) { Item* const pItem = m_bot->GetItemByPos(bag, slot); @@ -1129,17 +1110,14 @@ Item* PlayerbotAI::FindDrink() const continue; if (pItemProto->Class == ITEM_CLASS_CONSUMABLE && pItemProto->SubClass == ITEM_SUBCLASS_FOOD) - { // if is WATER // SPELL_CATEGORY_DRINK is no longer defined in an enum in mangos // google says the valus is 59. Is this still valid? // if (pItemProto->Spells[0].SpellCategory == SPELL_CATEGORY_DRINK) if (pItemProto->Spells[0].SpellCategory == 59) return pItem; - } } } - } } return NULL; } @@ -1166,7 +1144,6 @@ Item* PlayerbotAI::FindBandage() const { const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); if (pBag) - { for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) { Item* const pItem = m_bot->GetItemByPos(bag, slot); @@ -1181,7 +1158,6 @@ Item* PlayerbotAI::FindBandage() const return pItem; } } - } } return NULL; } @@ -1208,7 +1184,6 @@ Item* PlayerbotAI::FindPoison() const { const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); if (pBag) - { for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) { Item* const pItem = m_bot->GetItemByPos(bag, slot); @@ -1223,7 +1198,6 @@ Item* PlayerbotAI::FindPoison() const return pItem; } } - } } return NULL; } @@ -1250,7 +1224,6 @@ Item* PlayerbotAI::FindConsumable(uint32 displayId) const { const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); if (pBag) - { for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) { Item* const pItem = m_bot->GetItemByPos(bag, slot); @@ -1265,7 +1238,6 @@ Item* PlayerbotAI::FindConsumable(uint32 displayId) const return pItem; } } - } } return NULL; } @@ -1467,21 +1439,16 @@ void PlayerbotAI::DoCombatMovement() float targetDist = m_bot->GetDistance(m_targetCombat); if (m_combatStyle == COMBAT_MELEE && !m_bot->hasUnitState(UNIT_STAT_CHASE) && ((m_movementOrder == MOVEMENT_STAY && targetDist <= ATTACK_DISTANCE) || (m_movementOrder != MOVEMENT_STAY))) - { // melee combat - chase target if in range or if we are not forced to stay m_bot->GetMotionMaster()->MoveChase(m_targetCombat); - } else if (m_combatStyle == COMBAT_RANGED && m_movementOrder != MOVEMENT_STAY) { // ranged combat - just move within spell range // TODO: just follow in spell range! how to determine bots spell range? - if (targetDist > 25.0f) { + if (targetDist > 25.0f) m_bot->GetMotionMaster()->MoveChase(m_targetCombat); - } else - { MovementClear(); - } } } @@ -1727,9 +1694,7 @@ void PlayerbotAI::TurnInQuests(WorldObject *questgiver) out << "Quest complete: |cff808080|Hquest:" << questID << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r"; } else - { out << "|cffff0000Unable to turn quest in:|r |cff808080|Hquest:" << questID << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r"; - } } // auto reward quest if one item as reward @@ -1752,13 +1717,11 @@ void PlayerbotAI::TurnInQuests(WorldObject *questgiver) << pRewardItem->ItemId << ":0:0:0:0:0:0:0" << "|h[" << itemName << "]|h|r"; } else - { out << "|cffff0000Unable to turn quest in:|r " << "|cff808080|Hquest:" << questID << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r" << " reward: |cffffffff|Hitem:" << pRewardItem->ItemId << ":0:0:0:0:0:0:0" << "|h[" << itemName << "]|h|r"; - } } // else multiple rewards - let master pick @@ -1777,15 +1740,13 @@ void PlayerbotAI::TurnInQuests(WorldObject *questgiver) } } - else if (status == QUEST_STATUS_INCOMPLETE) { + else if (status == QUEST_STATUS_INCOMPLETE) out << "|cffff0000Quest incomplete:|r " << " |cff808080|Hquest:" << questID << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r"; - } - else if (status == QUEST_STATUS_AVAILABLE) { + else if (status == QUEST_STATUS_AVAILABLE) out << "|cff00ff00Quest available:|r " << " |cff808080|Hquest:" << questID << ':' << pQuest->GetQuestLevel() << "|h[" << questTitle << "]|h|r"; - } if (!out.str().empty()) TellMaster(out.str()); @@ -2078,10 +2039,7 @@ void PlayerbotAI::MovementReset() { if (!FollowCheckTeleport(*((Player*) m_followTarget)->GetCorpse())) return; } - else - { - if (!FollowCheckTeleport(*m_followTarget)) return; - } + else if (!FollowCheckTeleport(*m_followTarget)) return; } if (m_bot->isAlive()) @@ -2191,11 +2149,9 @@ void PlayerbotAI::UpdateAI(const uint32 p_time) // get bot's corpse Corpse *corpse = m_bot->GetCorpse(); if (!corpse) - { //sLog.outDebug( "[PlayerbotAI]: %s has no corpse!", m_bot->GetName() ); return; - } - // teleport ghost from graveyard to corpse + // teleport ghost from graveyard to corpse //sLog.outDebug( "[PlayerbotAI]: Teleport %s to corpse...", m_bot->GetName() ); FollowCheckTeleport(*corpse); // check if we are allowed to resurrect now @@ -2482,7 +2438,6 @@ Item* PlayerbotAI::FindItem(uint32 ItemId) { const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); // 255, 20 to 23 if (pBag) - { for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) { sLog.outDebug("[%s's]bag[%u] slot = %u", m_bot->GetName(), bag, slot); // 1 to bagsize = ? @@ -2497,7 +2452,6 @@ Item* PlayerbotAI::FindItem(uint32 ItemId) return pItem; } } - } } return NULL; } @@ -2556,7 +2510,6 @@ bool PlayerbotAI::HasPick() { const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); // 255, 20 to 23 if (pBag) - { for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) { // sLog.outDebug("[%s's]bag[%u] slot = %u",m_bot->GetName(),bag,slot); // 1 to bagsize = ? @@ -2578,7 +2531,6 @@ bool PlayerbotAI::HasPick() } } } - } } std::ostringstream out; out << "|cffffffffI do not have a pick!"; @@ -2895,13 +2847,11 @@ bool PlayerbotAI::TradeItem(const Item& item, int8 slot) if ((slot >= 0 && slot < TRADE_SLOT_COUNT) && pTrade->GetTraderData()->GetItem(TradeSlots(slot)) == NULL) tradeSlot = slot; else - { for (uint8 i = 0; i < TRADE_SLOT_TRADED_COUNT && tradeSlot == -1; i++) { if (pTrade->GetTraderData()->GetItem(TradeSlots(i)) == NULL) tradeSlot = i; } - } if (tradeSlot == -1) return false; @@ -3010,14 +2960,12 @@ void PlayerbotAI::ItemLocalization(std::string& itemName, const uint32 itemID) c ItemLocale const *pItemInfo = sObjectMgr.GetItemLocale(itemID); if (pItemInfo) - { if (pItemInfo->Name.size() > loc && !pItemInfo->Name[loc].empty()) { const std::string name = pItemInfo->Name[loc]; if (Utf8FitTo(name, wnamepart)) itemName = name.c_str(); } - } } void PlayerbotAI::QuestLocalization(std::string& questTitle, const uint32 questID) const @@ -3027,14 +2975,12 @@ void PlayerbotAI::QuestLocalization(std::string& questTitle, const uint32 questI QuestLocale const *pQuestInfo = sObjectMgr.GetQuestLocale(questID); if (pQuestInfo) - { if (pQuestInfo->Title.size() > loc && !pQuestInfo->Title[loc].empty()) { const std::string title = pQuestInfo->Title[loc]; if (Utf8FitTo(title, wnamepart)) questTitle = title.c_str(); } - } } // handle commands sent through chat channels @@ -3240,7 +3186,6 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) uint32 lockId = go->GetGOInfo()->GetLockId(); LockEntry const *lockInfo = sLockStore.LookupEntry(lockId); if (lockInfo) - { for (int i = 0; i < 8; ++i) { uint32 skillId = SkillByLockType(LockType(lockInfo->Index[i])); @@ -3260,7 +3205,6 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) break; } } - } } for (uint32 l = 0; l < lootNum; l++) { @@ -3440,17 +3384,11 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) if (subcommand == "react" && argumentFound) { if (argument == "a" || argument == "aggressive") - { pet->GetCharmInfo()->SetReactState(REACT_AGGRESSIVE); - } else if (argument == "d" || argument == "defensive") - { pet->GetCharmInfo()->SetReactState(REACT_DEFENSIVE); - } else if (argument == "p" || argument == "passive") - { pet->GetCharmInfo()->SetReactState(REACT_PASSIVE); - } } else if (subcommand == "state" && !argumentFound) { @@ -3514,9 +3452,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) pet->RemoveAurasByCasterSpell(spellId, pet->GetGUID()); } else - { pet->ToggleAutocast(spellId, true); - } } } } @@ -3794,7 +3730,6 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) !m_bot->GetQuestRewardStatus(questID) && pQuest->GetRewChoiceItemsCount() > 1 && m_bot->CanRewardQuest(pQuest, false)) - { for (uint8 rewardIdx = 0; !wasRewarded && rewardIdx < pQuest->GetRewChoiceItemsCount(); ++rewardIdx) { ItemPrototype const * const pRewardItem = sObjectMgr.GetItemPrototype(pQuest->RewChoiceItemId[rewardIdx]); @@ -3813,7 +3748,6 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) wasRewarded = true; } } - } } } diff --git a/src/game/playerbot/PlayerbotDruidAI.cpp b/src/game/playerbot/PlayerbotDruidAI.cpp index 556a6d122..c84ed49dd 100644 --- a/src/game/playerbot/PlayerbotDruidAI.cpp +++ b/src/game/playerbot/PlayerbotDruidAI.cpp @@ -139,26 +139,16 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) pVictim->Attack(pTarget, true); } if (m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) - { m_bot->RemoveAurasDueToSpell(768); //ai->TellMaster("FormClearCat"); - } if (MOONKIN_FORM > 0 && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) - { ai->CastSpell (MOONKIN_FORM); - } else if (DIRE_BEAR_FORM > 0 && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && !m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) - { ai->CastSpell (DIRE_BEAR_FORM); - } else if (BEAR_FORM > 0 && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && !m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) && !m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) - { ai->CastSpell (BEAR_FORM); - } else if (DEMORALIZING_ROAR > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && !m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && !pTarget->HasAura(DEMORALIZING_ROAR, EFFECT_INDEX_0) && ai->GetRageAmount() >= 10) - { ai->CastSpell(DEMORALIZING_ROAR, *pTarget); - } if (FAERIE_FIRE > 0 && DruidSpellCombat < 1 && !pTarget->HasAura(FAERIE_FIRE, EFFECT_INDEX_0)) { ai->CastSpell(FAERIE_FIRE, *pTarget); @@ -507,60 +497,38 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) if (m_bot->GetComboPoints() == 5) { if (RIP > 0 && pTarget->getClass() == CLASS_ROGUE && ai->GetEnergyAmount() >= 30) - { ai->CastSpell(RIP, *pTarget); //ai->TellMaster("Rogue Rip"); - } else if (MAIM > 0 && pTarget->getClass() == CLASS_DRUID && ai->GetEnergyAmount() >= 35) - { ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("Druid Maim"); - } else if (MAIM > 0 && pTarget->getClass() == CLASS_SHAMAN && ai->GetEnergyAmount() >= 35) - { ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("Shaman Maim"); - } else if (MAIM > 0 && pTarget->getClass() == CLASS_WARLOCK && ai->GetEnergyAmount() >= 35) - { ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("Warlock Maim"); - } else if (FEROCIOUS_BITE > 0 && pTarget->getClass() == CLASS_HUNTER && ai->GetEnergyAmount() >= 35) - { ai->CastSpell(FEROCIOUS_BITE, *pTarget); //ai->TellMaster("Hunter Ferocious Bite"); - } else if (FEROCIOUS_BITE > 0 && pTarget->getClass() == CLASS_WARRIOR && ai->GetEnergyAmount() >= 35) - { ai->CastSpell(FEROCIOUS_BITE, *pTarget); //ai->TellMaster("Warrior Ferocious Bite"); - } else if (FEROCIOUS_BITE > 0 && pTarget->getClass() == CLASS_PALADIN && ai->GetEnergyAmount() >= 35) - { ai->CastSpell(FEROCIOUS_BITE, *pTarget); //ai->TellMaster("Paladin Ferocious Bite"); - } else if (FEROCIOUS_BITE > 0 && pTarget->getClass() == CLASS_DEATH_KNIGHT && ai->GetEnergyAmount() >= 25) - { ai->CastSpell(FEROCIOUS_BITE, *pTarget); //ai->TellMaster("DK Ferocious Bite"); - } else if (MAIM > 0 && pTarget->getClass() == CLASS_MAGE && ai->GetEnergyAmount() >= 35) - { ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("Mage Maim"); - } else if (MAIM > 0 && pTarget->getClass() == CLASS_PRIEST && ai->GetEnergyAmount() >= 35) - { ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("Priest Maim"); - } else if (MAIM > 0 && ai->GetEnergyAmount() >= 35) - { ai->CastSpell(MAIM, *pTarget); //ai->TellMaster("Else Maim"); - } break; } else @@ -581,26 +549,18 @@ void PlayerbotDruidAI::DoNonCombatActions() PlayerbotAI* ai = GetAI(); if (m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) - { m_bot->RemoveAurasDueToSpell(768); //ai->TellMaster("FormClearCat"); - } if (m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) - { m_bot->RemoveAurasDueToSpell(5487); //ai->TellMaster("FormClearBear"); - } if (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) - { m_bot->RemoveAurasDueToSpell(9634); //ai->TellMaster("FormClearDireBear"); - } if (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) - { m_bot->RemoveAurasDueToSpell(24858); //ai->TellMaster("FormClearMoonkin"); - } - // buff myself with MARK_OF_THE_WILD + // buff myself with MARK_OF_THE_WILD if (MARK_OF_THE_WILD > 0 && !m_bot->HasAura(MARK_OF_THE_WILD, EFFECT_INDEX_0)) ai->CastSpell (MARK_OF_THE_WILD, *m_bot); diff --git a/src/game/playerbot/PlayerbotHunterAI.cpp b/src/game/playerbot/PlayerbotHunterAI.cpp index 6459101de..dfa479612 100644 --- a/src/game/playerbot/PlayerbotHunterAI.cpp +++ b/src/game/playerbot/PlayerbotHunterAI.cpp @@ -122,22 +122,16 @@ void PlayerbotHunterAI::DoNextCombatManeuver(Unit *pTarget) } else if ((pet) && (INTIMIDATION > 0 && pVictim == pet && !pet->HasAura(INTIMIDATION, EFFECT_INDEX_0) && ai->CastSpell(INTIMIDATION, *m_bot))) - { //ai->TellMaster( "casting intimidation." ); // if pet has aggro :) return; - } // racial traits if (m_bot->getRace() == RACE_ORC && !m_bot->HasAura(BLOOD_FURY, EFFECT_INDEX_0)) - { ai->CastSpell(BLOOD_FURY, *m_bot); //ai->TellMaster( "Blood Fury." ); - } else if (m_bot->getRace() == RACE_TROLL && !m_bot->HasAura(BERSERKING, EFFECT_INDEX_0)) - { ai->CastSpell(BERSERKING, *m_bot); //ai->TellMaster( "Berserking." ); - } // check if ranged combat is possible (set m_rangedCombat and switch auras float dist = m_bot->GetDistance(pTarget); @@ -158,27 +152,19 @@ void PlayerbotHunterAI::DoNextCombatManeuver(Unit *pTarget) (ASPECT_OF_THE_HAWK > 0 && !m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0) && ai->CastSpell(ASPECT_OF_THE_HAWK, *m_bot)); } else if (m_rangedCombat && !m_bot->HasAura(ASPECT_OF_THE_HAWK, EFFECT_INDEX_0)) - { // check if we have hawk aspect in ranged combat (ASPECT_OF_THE_HAWK > 0 && ai->CastSpell(ASPECT_OF_THE_HAWK, *m_bot)); - } else if (!m_rangedCombat && !m_bot->HasAura(ASPECT_OF_THE_MONKEY, EFFECT_INDEX_0)) - { // check if we have monkey aspect in melee combat (ASPECT_OF_THE_MONKEY > 0 && ai->CastSpell(ASPECT_OF_THE_MONKEY, *m_bot)); - } // activate auto shot if (AUTO_SHOT > 0 && m_rangedCombat && !m_bot->FindCurrentSpellBySpellId(AUTO_SHOT)) - { ai->CastSpell(AUTO_SHOT, *pTarget); //ai->TellMaster( "started auto shot." ); - } else if (AUTO_SHOT > 0 && m_bot->FindCurrentSpellBySpellId(AUTO_SHOT)) - { m_bot->InterruptNonMeleeSpells(true, AUTO_SHOT); //ai->TellMaster( "stopped auto shot." ); - } // damage spells std::ostringstream out; @@ -387,7 +373,6 @@ void PlayerbotHunterAI::DoNonCombatActions() { const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); if (pBag) - { for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) { Item* const pItem = m_bot->GetItemByPos(bag, slot); @@ -411,7 +396,6 @@ void PlayerbotHunterAI::DoNonCombatActions() } } } - } } if (pet->HasAura(PET_MEND, EFFECT_INDEX_0) && !pet->HasAura(PET_FEED, EFFECT_INDEX_0)) ai->TellMaster("..no pet food!"); diff --git a/src/game/playerbot/PlayerbotMgr.cpp b/src/game/playerbot/PlayerbotMgr.cpp index e5dc44814..98d022194 100644 --- a/src/game/playerbot/PlayerbotMgr.cpp +++ b/src/game/playerbot/PlayerbotMgr.cpp @@ -163,13 +163,11 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) if (bot) bot->GetPlayerbotAI()->SetMovementOrder(PlayerbotAI::MOVEMENT_STAY); else - { for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) { Player* const bot = it->second; bot->GetPlayerbotAI()->SetMovementOrder(PlayerbotAI::MOVEMENT_STAY); } - } return; } @@ -182,13 +180,11 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) if (bot) bot->GetPlayerbotAI()->SetMovementOrder(PlayerbotAI::MOVEMENT_FOLLOW, m_master); else - { for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) { Player* const bot = it->second; bot->GetPlayerbotAI()->SetMovementOrder(PlayerbotAI::MOVEMENT_FOLLOW, m_master); } - } return; } } @@ -211,10 +207,8 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) Player* const bot = it->second; if (obj->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) - { bot->GetPlayerbotAI()->TurnInQuests(obj); - } - // add other go types here, i.e.: + // add other go types here, i.e.: // GAMEOBJECT_TYPE_CHEST - loot quest items of chest } } @@ -253,7 +247,6 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) p >> guid >> quest; Quest const* qInfo = sObjectMgr.GetQuestTemplate(quest); if (qInfo) - { for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) { Player* const bot = it->second; @@ -279,7 +272,6 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) bot->GetPlayerbotAI()->TellMaster("Got the quest."); } } - } return; } case CMSG_LOOT_ROLL: diff --git a/src/game/playerbot/PlayerbotPriestAI.cpp b/src/game/playerbot/PlayerbotPriestAI.cpp index f95c09668..9ac7c547b 100644 --- a/src/game/playerbot/PlayerbotPriestAI.cpp +++ b/src/game/playerbot/PlayerbotPriestAI.cpp @@ -100,10 +100,8 @@ void PlayerbotPriestAI::HealTarget(Unit &target, uint8 hp) ai->CastSpell(HEAL, target); } else if (hp < 80 && RENEW > 0 && ai->GetManaPercent() >= 19) - { //ai->TellMaster("I'm casting renew."); ai->CastSpell(RENEW, target); - } } // end HealTarget diff --git a/src/game/playerbot/PlayerbotShamanAI.cpp b/src/game/playerbot/PlayerbotShamanAI.cpp index da60fd5c5..1190b846c 100644 --- a/src/game/playerbot/PlayerbotShamanAI.cpp +++ b/src/game/playerbot/PlayerbotShamanAI.cpp @@ -108,13 +108,9 @@ void PlayerbotShamanAI::DoNextCombatManeuver(Unit *pTarget) // Heal myself if (ai->GetHealthPercent() < 30 && ai->GetManaPercent() >= 32) - { ai->CastSpell(HEALING_WAVE); - } else if (ai->GetHealthPercent() < 50 && ai->GetManaPercent() >= 19) - { ai->CastSpell(LESSER_HEALING_WAVE); - } else if (ai->GetHealthPercent() < 70) HealTarget (*m_bot, ai->GetHealthPercent()); diff --git a/src/game/playerbot/PlayerbotWarlockAI.cpp b/src/game/playerbot/PlayerbotWarlockAI.cpp index f43dd2cce..c49b3e647 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.cpp +++ b/src/game/playerbot/PlayerbotWarlockAI.cpp @@ -440,7 +440,6 @@ void PlayerbotWarlockAI::DoNonCombatActions() // check for demon if (SUMMON_FELGUARD > 0 || SUMMON_FELHUNTER > 0 || SUMMON_SUCCUBUS > 0 || SUMMON_VOIDWALKER > 0 || SUMMON_IMP > 0 && !m_demonSummonFailed) - { if (!pet) { // summon demon @@ -455,30 +454,21 @@ void PlayerbotWarlockAI::DoNonCombatActions() else if (SUMMON_IMP > 0 && ai->GetManaPercent() >= 64 && ai->CastSpell(SUMMON_IMP, *m_bot)) ai->TellMaster("summoning imp."); else - { m_demonSummonFailed = true; //ai->TellMaster( "summon demon failed!" ); - } } - } // check for buffs with demon if ((pet) && (SOUL_LINK > 0 && !m_bot->HasAura(SOUL_LINK_AURA, EFFECT_INDEX_0) && ai->GetBaseManaPercent() >= 16 && ai->CastSpell(SOUL_LINK, *m_bot))) - { //ai->TellMaster( "casting soul link." ); return; - } else if ((pet) && (BLOOD_PACT > 0 && !m_bot->HasAura(BLOOD_PACT, EFFECT_INDEX_0) && ai->CastSpell(BLOOD_PACT, *m_bot))) - { //ai->TellMaster( "casting blood pact." ); return; - } else if ((pet) && (FEL_INTELLIGENCE > 0 && !m_bot->HasAura(FEL_INTELLIGENCE, EFFECT_INDEX_0) && ai->CastSpell(FEL_INTELLIGENCE, *m_bot))) - { //ai->TellMaster( "casting fel intelligence." ); return; - } } // end DoNonCombatActions diff --git a/src/game/playerbot/PlayerbotWarriorAI.cpp b/src/game/playerbot/PlayerbotWarriorAI.cpp index 81ed23c16..c3874c53c 100644 --- a/src/game/playerbot/PlayerbotWarriorAI.cpp +++ b/src/game/playerbot/PlayerbotWarriorAI.cpp @@ -313,20 +313,14 @@ void PlayerbotWarriorAI::DoNonCombatActions() if (((COMMANDING_SHOUT > 0 && !m_bot->HasAura(COMMANDING_SHOUT, EFFECT_INDEX_0)) || (BATTLE_SHOUT > 0 && !m_bot->HasAura(BATTLE_SHOUT, EFFECT_INDEX_0))) && ai->GetRageAmount() < 10 && BLOODRAGE > 0 && !m_bot->HasAura(BLOODRAGE, EFFECT_INDEX_0)) - { // we do have a useful shout, no rage coming but can cast bloodrage... do it ai->CastSpell(BLOODRAGE, *m_bot); - } else if (COMMANDING_SHOUT > 0 && !m_bot->HasAura(COMMANDING_SHOUT, EFFECT_INDEX_0)) - { // use commanding shout now ai->CastSpell(COMMANDING_SHOUT, *m_bot); - } else if (BATTLE_SHOUT > 0 && !m_bot->HasAura(BATTLE_SHOUT, EFFECT_INDEX_0) && !m_bot->HasAura(COMMANDING_SHOUT, EFFECT_INDEX_0)) - { // use battle shout ai->CastSpell(BATTLE_SHOUT, *m_bot); - } // buff master with VIGILANCE if (VIGILANCE > 0) From ad57772e691a870213887d28a0a3bf198b054ddb Mon Sep 17 00:00:00 2001 From: blueboy Date: Mon, 13 Sep 2010 23:26:26 +0100 Subject: [PATCH 122/187] Adjust for rename of function 'HandleMoveTeleportAck' to 'HandleMoveTeleportAckOpcode' --- src/game/playerbot/PlayerbotAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index e852046b9..16b5d41a9 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2983,7 +2983,7 @@ void PlayerbotAI::HandleTeleportAck() p.appendPackGUID(m_bot->GetGUID()); p << (uint32) 0; // supposed to be flags? not used currently p << (uint32) time(0); // time - not currently used - m_bot->GetSession()->HandleMoveTeleportAck(p); + m_bot->GetSession()->HandleMoveTeleportAckOpcode(p); } else if (m_bot->IsBeingTeleportedFar()) m_bot->GetSession()->HandleMoveWorldportAckOpcode(); From 07f37055f713359cea759687293b8eb532e1335d Mon Sep 17 00:00:00 2001 From: blueboy Date: Tue, 14 Sep 2010 20:12:21 +0100 Subject: [PATCH 123/187] Range check for 'CastSpell' by KiriX --- src/game/playerbot/PlayerbotAI.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 16b5d41a9..09191a7ba 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2331,6 +2331,14 @@ bool PlayerbotAI::CastSpell(uint32 spellId) uint64 targetGUID = m_bot->GetSelection(); Unit* pTarget = ObjectAccessor::GetUnit(*m_bot, m_bot->GetSelection()); + SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(pSpellInfo->rangeIndex); + float max_range = GetSpellMaxRange(srange, false); + float dist = m_bot->GetCombatDistance(pTarget); + + if(dist > max_range) + return false; + + if (!pTarget) pTarget = m_bot; From 602064d66ed9cc8917fa224fe4fd6466e861017b Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 17 Sep 2010 00:09:19 +0400 Subject: [PATCH 124/187] Improve spell range checking This commit adds new member PlayerbotAI::m_spellRangeMap which holds spell ranges for registered spells. Also CastSpell() have been updated to use it. --- src/game/playerbot/PlayerbotAI.cpp | 26 +++++++++++++++++++------- src/game/playerbot/PlayerbotAI.h | 2 ++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 09191a7ba..05f16a2f2 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -306,7 +306,18 @@ uint32 PlayerbotAI::initSpell(uint32 spellId) } } if (next == 0) + { sLog.outDebug("initSpell: Found spellid: %u", spellId); + + // Add spell to spellrange map + const SpellEntry* const pSpellInfo = sSpellStore.LookupEntry(spellId); + Spell *spell = new Spell(m_bot, pSpellInfo, false); + SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(pSpellInfo->rangeIndex); + float range = GetSpellMaxRange(srange, IsPositiveSpell(spellId)); + m_bot->ApplySpellMod(spellId, SPELLMOD_RANGE, range, spell); + m_spellRangeMap.insert(std::pair(spellId, range)); + delete spell; + } return (next == 0) ? spellId : next; } @@ -2331,13 +2342,14 @@ bool PlayerbotAI::CastSpell(uint32 spellId) uint64 targetGUID = m_bot->GetSelection(); Unit* pTarget = ObjectAccessor::GetUnit(*m_bot, m_bot->GetSelection()); - SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(pSpellInfo->rangeIndex); - float max_range = GetSpellMaxRange(srange, false); - float dist = m_bot->GetCombatDistance(pTarget); - - if(dist > max_range) - return false; - + // Check spell range + std::map::iterator it = m_spellRangeMap.find(spellId); + if (it != m_spellRangeMap.end() && (int)it->second != 0) + { + float dist = m_bot->GetCombatDistance(pTarget); + if (dist > it->second + 1.25) // See Spell::CheckRange for modifier value + return false; + } if (!pTarget) pTarget = m_bot; diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 7065a8b11..f1f5aa55b 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -316,6 +316,8 @@ class MANGOS_DLL_SPEC PlayerbotAI Unit *m_targetProtect; // check Unit *m_followTarget; // whom to follow in non combat situation? + + std::map m_spellRangeMap; }; #endif From e467b12ab63bcc670111d1e95b6d9a7b46e9f62c Mon Sep 17 00:00:00 2001 From: chelobaka Date: Tue, 28 Sep 2010 14:56:15 +0400 Subject: [PATCH 125/187] Check line of sight on spell cast. Also fix possible segmentation fault. --- src/game/playerbot/PlayerbotAI.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index bc7d5267f..f07126d08 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2310,6 +2310,9 @@ bool PlayerbotAI::CastSpell(uint32 spellId) uint64 targetGUID = m_bot->GetSelection(); Unit* pTarget = ObjectAccessor::GetUnit(*m_bot, m_bot->GetSelection()); + if (!pTarget) + pTarget = m_bot; + // Check spell range std::map::iterator it = m_spellRangeMap.find(spellId); if (it != m_spellRangeMap.end() && (int)it->second != 0) @@ -2319,8 +2322,9 @@ bool PlayerbotAI::CastSpell(uint32 spellId) return false; } - if (!pTarget) - pTarget = m_bot; + // Check line of sight + if (!m_bot->IsWithinLOSInMap(pTarget)) + return false; if (IsPositiveSpell(spellId)) { From cfeb535e6068bd123881b2228842689c4416b748 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Wed, 29 Sep 2010 13:19:29 +0400 Subject: [PATCH 126/187] Fix quests turn in on gameobjects --- src/game/playerbot/PlayerbotMgr.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotMgr.cpp b/src/game/playerbot/PlayerbotMgr.cpp index 98d022194..42d53beff 100644 --- a/src/game/playerbot/PlayerbotMgr.cpp +++ b/src/game/playerbot/PlayerbotMgr.cpp @@ -191,7 +191,8 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) return; } /* EMOTE ends here */ - case CMSG_GAMEOBJ_USE: + case CMSG_GAMEOBJ_USE: // not sure if we still need this one + case CMSG_GAMEOBJ_REPORT_USE: { WorldPacket p(packet); p.rpos(0); // reset reader From 5d65a3f8fd963b57a910ec61e0d7a90b60b61566 Mon Sep 17 00:00:00 2001 From: blueboy Date: Fri, 8 Oct 2010 23:42:22 +0100 Subject: [PATCH 127/187] Fix for rogue attack. Now attacks in one operation, while stealthed --- src/game/playerbot/PlayerbotRogueAI.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotRogueAI.cpp b/src/game/playerbot/PlayerbotRogueAI.cpp index c99b756d3..e62b09ad6 100644 --- a/src/game/playerbot/PlayerbotRogueAI.cpp +++ b/src/game/playerbot/PlayerbotRogueAI.cpp @@ -65,9 +65,19 @@ bool PlayerbotRogueAI::DoFirstCombatManeuver(Unit *pTarget) { if (ai->GetManager()->m_confDebugWhisper) ai->TellMaster("First > Stealth (%d)", STEALTH); - return false; + + ai->SetIgnoreUpdateTime(10); + + return true; } + else if (STEALTH > 0 && m_bot->HasAura(STEALTH)) + { + float x,y,z; + pTarget->GetContactPoint(m_bot, x, y, z, ATTACK_DISTANCE); + m_bot->Relocate(x, y, z); + return false; + } return false; } From eca8be3a445bd8c5b3833858d7875e4e3f07fc73 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Tue, 12 Oct 2010 21:52:54 +0400 Subject: [PATCH 128/187] Fix multiple items trading Linking several items during trade process should make your bot put them all into trade window. --- src/game/playerbot/PlayerbotAI.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index f07126d08..d06ebbd00 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2868,13 +2868,17 @@ bool PlayerbotAI::TradeItem(const Item& item, int8 slot) int8 tradeSlot = -1; TradeData* pTrade = m_bot->GetTradeData(); - if ((slot >= 0 && slot < TRADE_SLOT_COUNT) && pTrade->GetTraderData()->GetItem(TradeSlots(slot)) == NULL) + if ((slot >= 0 && slot < TRADE_SLOT_COUNT) && pTrade->GetItem(TradeSlots(slot)) == NULL) tradeSlot = slot; else for (uint8 i = 0; i < TRADE_SLOT_TRADED_COUNT && tradeSlot == -1; i++) { - if (pTrade->GetTraderData()->GetItem(TradeSlots(i)) == NULL) + if (pTrade->GetItem(TradeSlots(i)) == NULL) + { tradeSlot = i; + // reserve trade slot to allow multiple items to be traded + pTrade->SetItem(TradeSlots(i), const_cast(&item)); + } } if (tradeSlot == -1) return false; From 2ce41462498e7d3103ee3cd5cf6f85b0df484808 Mon Sep 17 00:00:00 2001 From: blueboy Date: Tue, 12 Oct 2010 22:20:00 +0100 Subject: [PATCH 129/187] More elegant solution for rogue stealth attack & pick pocketing --- src/game/playerbot/PlayerbotAI.cpp | 61 +++++++++++++++++++++++++ src/game/playerbot/PlayerbotAI.h | 1 + src/game/playerbot/PlayerbotRogueAI.cpp | 29 ++++++------ src/game/playerbot/PlayerbotRogueAI.h | 2 +- 4 files changed, 78 insertions(+), 15 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index d06ebbd00..29aa9301e 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2480,6 +2480,67 @@ Item* PlayerbotAI::FindItem(uint32 ItemId) return NULL; } +bool PlayerbotAI::PickPocket(Unit* pTarget) +{ + bool looted = false; + + ObjectGuid markGuid = pTarget->GetObjectGuid(); + Creature *c = m_bot->GetMap()->GetCreature(markGuid); + m_bot->SendLoot(markGuid, LOOT_PICKPOCKETING); + Loot *loot = &c->loot; + uint32 lootNum = loot->GetMaxSlotInLootFor(m_bot); + + if (m_mgr->m_confDebugWhisper) + { + std::ostringstream out; + + // calculate how much money bot loots + uint32 copper = loot->gold; + uint32 gold = uint32(copper / 10000); + copper -= (gold * 10000); + uint32 silver = uint32(copper / 100); + copper -= (silver * 100); + + out << "|r|cff009900" << m_bot->GetName() << " loots: " << "|h|cffffffff[|r|cff00ff00" << gold + << "|r|cfffffc00g|r|cff00ff00" << silver + << "|r|cffcdcdcds|r|cff00ff00" << copper + << "|r|cff993300c" + << "|h|cffffffff]"; + + TellMaster(out.str().c_str()); + } + + if (loot->gold) + { + m_bot->ModifyMoney( loot->gold ); + m_bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, loot->gold); + loot->gold = 0; + loot->NotifyMoneyRemoved(); + } + + for (uint32 l = 0; l < lootNum; l++) + { + QuestItem *qitem = 0, *ffaitem = 0, *conditem = 0; + LootItem *item = loot->LootItemInSlot(l, m_bot, &qitem, &ffaitem, &conditem); + if (!item) + continue; + + ItemPosCountVec dest; + if (m_bot->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item->itemid, item->count) == EQUIP_ERR_OK) + { + Item* pItem = m_bot->StoreNewItem (dest, item->itemid, true, item->randomPropertyId); + m_bot->SendNewItem(pItem, uint32(item->count), false, false, true); + --loot->unlootedCount; + looted = true; + } + } + // release loot + if (looted) + m_bot->GetSession()->DoLootRelease(markGuid); + + return false; // ensures that the rogue only pick pockets target once +} + bool PlayerbotAI::HasPick() { QueryResult *result; diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 5daad39eb..8341580ce 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -179,6 +179,7 @@ class MANGOS_DLL_SPEC PlayerbotAI bool HasAura(const char* spellName, const Unit& player) const; bool HasAura(const char* spellName) const; + bool PickPocket(Unit* pTarget); bool HasPick(); uint8 GetHealthPercent(const Unit& target) const; diff --git a/src/game/playerbot/PlayerbotRogueAI.cpp b/src/game/playerbot/PlayerbotRogueAI.cpp index e62b09ad6..4e5547fbd 100644 --- a/src/game/playerbot/PlayerbotRogueAI.cpp +++ b/src/game/playerbot/PlayerbotRogueAI.cpp @@ -30,6 +30,7 @@ PlayerbotRogueAI::PlayerbotRogueAI(Player* const master, Player* const bot, Play DISTRACT = ai->initSpell(DISTRACT_1); PREPARATION = ai->initSpell(PREPARATION_1); PREMEDITATION = ai->initSpell(PREMEDITATION_1); + PICK_POCKET = ai->initSpell(PICK_POCKET_1); EVISCERATE = ai->initSpell(EVISCERATE_1); KIDNEY_SHOT = ai->initSpell(KIDNEY_SHOT_1); @@ -61,21 +62,19 @@ bool PlayerbotRogueAI::DoFirstCombatManeuver(Unit *pTarget) PlayerbotAI* ai = GetAI(); Player * m_bot = GetPlayerBot(); - if (STEALTH > 0 && !m_bot->HasAura(STEALTH) && ai->CastSpell(STEALTH, *m_bot)) + if (STEALTH > 0 && !m_bot->HasAura(STEALTH, EFFECT_INDEX_0) && ai->CastSpell(STEALTH, *m_bot)) { + if (ai->GetManager()->m_confDebugWhisper) ai->TellMaster("First > Stealth (%d)", STEALTH); - ai->SetIgnoreUpdateTime(10); + m_bot->addUnitState(UNIT_STAT_CHASE); // ensure that the bot does not use MoveChase(), as this doesn't seem to work with STEALTH return true; } - else if (STEALTH > 0 && m_bot->HasAura(STEALTH)) + else if (m_bot->HasAura(STEALTH, EFFECT_INDEX_0)) { - float x,y,z; - pTarget->GetContactPoint(m_bot, x, y, z, ATTACK_DISTANCE); - m_bot->Relocate(x, y, z); - + m_bot->GetMotionMaster()->MoveFollow(pTarget, 4.5f, m_bot->GetOrientation()); return false; } return false; @@ -95,7 +94,7 @@ void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) case PlayerbotAI::SCENARIO_DUEL: if (SINISTER_STRIKE > 0) ai->CastSpell(SINISTER_STRIKE); - return; + return; } ai->SetInFront(pTarget); @@ -135,8 +134,8 @@ void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) ai->TellMaster("CoS!"); return; } - else if (m_bot->HasAura(STEALTH)) - SpellSequence = RogueStealth; + else if (m_bot->HasAura(STEALTH, EFFECT_INDEX_0)) + SpellSequence = RogueStealth; else if (pTarget->IsNonMeleeSpellCasted(true)) SpellSequence = RogueSpellPreventing; else if (pVictim == m_bot && ai->GetHealthPercent() < 40) @@ -152,8 +151,10 @@ void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) switch (SpellSequence) { case RogueStealth: - out << "Case Stealth"; - if (PREMEDITATION > 0 && ai->CastSpell(PREMEDITATION, *pTarget)) + out << "Case Stealth"; + if (PICK_POCKET > 0 && ai->CastSpell(PICK_POCKET, *pTarget) && ai->PickPocket(pTarget)) + out << "First > Pick Pocket"; // Should never display, as PickPocket will always return false + else if (PREMEDITATION > 0 && ai->CastSpell(PREMEDITATION, *pTarget)) out << " > Premeditation"; else if (AMBUSH > 0 && ai->GetEnergyAmount() >= 60 && ai->CastSpell(AMBUSH, *pTarget)) out << " > Ambush"; @@ -162,8 +163,8 @@ void PlayerbotRogueAI::DoNextCombatManeuver(Unit *pTarget) else if (GARROTE > 0 && ai->GetEnergyAmount() >= 50 && ai->CastSpell(GARROTE, *pTarget)) out << " > Garrote"; else - out << " NONE!"; - break; + m_bot->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH); + break; case RogueThreat: out << "Case Threat"; if (GOUGE > 0 && ai->GetEnergyAmount() >= 45 && !pTarget->HasAura(GOUGE, EFFECT_INDEX_0) && ai->CastSpell(GOUGE, *pTarget)) diff --git a/src/game/playerbot/PlayerbotRogueAI.h b/src/game/playerbot/PlayerbotRogueAI.h index b15cc67d2..a72026895 100644 --- a/src/game/playerbot/PlayerbotRogueAI.h +++ b/src/game/playerbot/PlayerbotRogueAI.h @@ -88,7 +88,7 @@ class MANGOS_DLL_SPEC PlayerbotRogueAI : PlayerbotClassAI uint32 SINISTER_STRIKE, BACKSTAB, GOUGE, EVASION, SPRINT, KICK, FEINT, SHIV, FAN_OF_KNIVES; // SUBTLETY - uint32 SHADOWSTEP, STEALTH, VANISH, HEMORRHAGE, BLIND, SHADOW_DANCE, CLOAK_OF_SHADOWS, TRICK_TRADE, CRIPPLING_POISON, DEADLY_POISON, MIND_NUMBING_POISON, GHOSTLY_STRIKE, DISTRACT, PREPARATION, PREMEDITATION; + uint32 SHADOWSTEP, STEALTH, VANISH, HEMORRHAGE, BLIND, SHADOW_DANCE, PICK_POCKET, CLOAK_OF_SHADOWS, TRICK_TRADE, CRIPPLING_POISON, DEADLY_POISON, MIND_NUMBING_POISON, GHOSTLY_STRIKE, DISTRACT, PREPARATION, PREMEDITATION; // ASSASSINATION uint32 EVISCERATE, SLICE_DICE, GARROTE, EXPOSE_ARMOR, AMBUSH, RUPTURE, DISMANTLE, CHEAP_SHOT, KIDNEY_SHOT, MUTILATE, ENVENOM, DEADLY_THROW; From c3e2ff426a92d1114e0db5558d31f49d265ac4f8 Mon Sep 17 00:00:00 2001 From: blueboy Date: Fri, 15 Oct 2010 14:19:24 +0100 Subject: [PATCH 130/187] * Fix for packet extraction. Replace extractGuid() with readPackGUID() by BThallid * Tidy up code --- src/game/playerbot/PlayerbotAI.cpp | 106 ++++++++++++++--------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 29aa9301e..1eb1afef6 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -573,7 +573,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) case SMSG_FORCE_RUN_SPEED_CHANGE: { WorldPacket p(packet); - uint64 guid = extractGuid(p); + uint64 guid = p.readPackGUID(); if (guid != GetMaster()->GetGUID()) return; if (GetMaster()->IsMounted() && !m_bot->IsMounted()) @@ -642,7 +642,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) case SMSG_MOVE_SET_CAN_FLY: { WorldPacket p(packet); - uint64 guid = extractGuid(p); + uint64 guid = p.readPackGUID(); if (guid != m_bot->GetGUID()) return; m_bot->m_movementInfo.AddMovementFlag(MOVEFLAG_FLYING); @@ -654,7 +654,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) case SMSG_MOVE_UNSET_CAN_FLY: { WorldPacket p(packet); - uint64 guid = extractGuid(p); + uint64 guid = p.readPackGUID(); if (guid != m_bot->GetGUID()) return; m_bot->m_movementInfo.RemoveMovementFlag(MOVEFLAG_FLYING); @@ -827,8 +827,8 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) case SMSG_SPELL_GO: { WorldPacket p(packet); - uint64 castItemGuid = extractGuid(p); - uint64 casterGuid = extractGuid(p); + uint64 castItemGuid = p.readPackGUID(); + uint64 casterGuid = p.readPackGUID(); if (casterGuid != m_bot->GetGUID()) return; @@ -2482,63 +2482,63 @@ Item* PlayerbotAI::FindItem(uint32 ItemId) bool PlayerbotAI::PickPocket(Unit* pTarget) { - bool looted = false; + bool looted = false; - ObjectGuid markGuid = pTarget->GetObjectGuid(); - Creature *c = m_bot->GetMap()->GetCreature(markGuid); - m_bot->SendLoot(markGuid, LOOT_PICKPOCKETING); - Loot *loot = &c->loot; - uint32 lootNum = loot->GetMaxSlotInLootFor(m_bot); + ObjectGuid markGuid = pTarget->GetObjectGuid(); + Creature *c = m_bot->GetMap()->GetCreature(markGuid); + m_bot->SendLoot(markGuid, LOOT_PICKPOCKETING); + Loot *loot = &c->loot; + uint32 lootNum = loot->GetMaxSlotInLootFor(m_bot); - if (m_mgr->m_confDebugWhisper) - { - std::ostringstream out; + if (m_mgr->m_confDebugWhisper) + { + std::ostringstream out; - // calculate how much money bot loots - uint32 copper = loot->gold; - uint32 gold = uint32(copper / 10000); - copper -= (gold * 10000); - uint32 silver = uint32(copper / 100); - copper -= (silver * 100); + // calculate how much money bot loots + uint32 copper = loot->gold; + uint32 gold = uint32(copper / 10000); + copper -= (gold * 10000); + uint32 silver = uint32(copper / 100); + copper -= (silver * 100); - out << "|r|cff009900" << m_bot->GetName() << " loots: " << "|h|cffffffff[|r|cff00ff00" << gold - << "|r|cfffffc00g|r|cff00ff00" << silver - << "|r|cffcdcdcds|r|cff00ff00" << copper - << "|r|cff993300c" - << "|h|cffffffff]"; + out << "|r|cff009900" << m_bot->GetName() << " loots: " << "|h|cffffffff[|r|cff00ff00" << gold + << "|r|cfffffc00g|r|cff00ff00" << silver + << "|r|cffcdcdcds|r|cff00ff00" << copper + << "|r|cff993300c" + << "|h|cffffffff]"; - TellMaster(out.str().c_str()); - } + TellMaster(out.str().c_str()); + } - if (loot->gold) - { - m_bot->ModifyMoney( loot->gold ); - m_bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, loot->gold); - loot->gold = 0; - loot->NotifyMoneyRemoved(); - } + if (loot->gold) + { + m_bot->ModifyMoney( loot->gold ); + m_bot->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, loot->gold); + loot->gold = 0; + loot->NotifyMoneyRemoved(); + } - for (uint32 l = 0; l < lootNum; l++) - { - QuestItem *qitem = 0, *ffaitem = 0, *conditem = 0; - LootItem *item = loot->LootItemInSlot(l, m_bot, &qitem, &ffaitem, &conditem); - if (!item) - continue; + for (uint32 l = 0; l < lootNum; l++) + { + QuestItem *qitem = 0, *ffaitem = 0, *conditem = 0; + LootItem *item = loot->LootItemInSlot(l, m_bot, &qitem, &ffaitem, &conditem); + if (!item) + continue; - ItemPosCountVec dest; - if (m_bot->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item->itemid, item->count) == EQUIP_ERR_OK) - { - Item* pItem = m_bot->StoreNewItem (dest, item->itemid, true, item->randomPropertyId); - m_bot->SendNewItem(pItem, uint32(item->count), false, false, true); - --loot->unlootedCount; - looted = true; - } - } - // release loot - if (looted) - m_bot->GetSession()->DoLootRelease(markGuid); + ItemPosCountVec dest; + if (m_bot->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item->itemid, item->count) == EQUIP_ERR_OK) + { + Item* pItem = m_bot->StoreNewItem (dest, item->itemid, true, item->randomPropertyId); + m_bot->SendNewItem(pItem, uint32(item->count), false, false, true); + --loot->unlootedCount; + looted = true; + } + } + // release loot + if (looted) + m_bot->GetSession()->DoLootRelease(markGuid); - return false; // ensures that the rogue only pick pockets target once + return false; // ensures that the rogue only pick pockets target once } bool PlayerbotAI::HasPick() From f3a1ba373a5d601446ad776fce39e445c54aaaa3 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sat, 16 Oct 2010 08:58:02 +0400 Subject: [PATCH 131/187] Delete obsolete extractGuid() function --- src/game/playerbot/PlayerbotAI.cpp | 33 ------------------------------ 1 file changed, 33 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 1eb1afef6..53b1f44ff 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -32,39 +32,6 @@ float rand_float(float low, float high) return (rand() / (static_cast (RAND_MAX) + 1.0)) * (high - low) + low; } -/* - * Packets often compress the GUID (global unique identifier) - * This function extracts the guid from the packet and decompresses it. - * The first word (8 bits) in the packet represents how many words in the following packet(s) are part of - * the guid and what weight they hold. I call it the mask. For example) if mask is 01001001, - * there will be only 3 words. The first word is shifted to the left 0 times, - * the second is shifted 3 times, and the third is shifted 6. - * - * Possibly use ByteBuffer::readPackGUID? - */ -uint64 extractGuid(WorldPacket& packet) -{ - uint8 mask; - packet >> mask; - uint64 guid = 0; - uint8 bit = 0; - uint8 testMask = 1; - while (true) - { - if (mask & testMask) - { - uint8 word; - packet >> word; - guid += (word << bit); - } - if (bit == 7) - break; - ++bit; - testMask <<= 1; - } - return guid; -} - // ChatHandler already implements some useful commands the master can call on bots // These commands are protected inside the ChatHandler class so this class provides access to the commands // we'd like to call on our bots From bc311f228dd6119e23aa403f8e0d72441f87240c Mon Sep 17 00:00:00 2001 From: blueboy Date: Sat, 16 Oct 2010 22:58:46 +0100 Subject: [PATCH 132/187] Fix for PriestAI to allow casting of resurrection spell, by BThallid --- src/game/playerbot/PlayerbotPriestAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotPriestAI.cpp b/src/game/playerbot/PlayerbotPriestAI.cpp index 9ac7c547b..38aba57f0 100644 --- a/src/game/playerbot/PlayerbotPriestAI.cpp +++ b/src/game/playerbot/PlayerbotPriestAI.cpp @@ -388,7 +388,7 @@ void PlayerbotPriestAI::DoNonCombatActions() // buff master if (POWER_WORD_FORTITUDE > 0) - (!GetMaster()->HasAura(POWER_WORD_FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell(POWER_WORD_FORTITUDE, *(GetMaster()))); + (!GetMaster()->HasAura(POWER_WORD_FORTITUDE, EFFECT_INDEX_0) && GetMaster()->isAlive() && ai->CastSpell(POWER_WORD_FORTITUDE, *(GetMaster()))); // mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) From a33dfafae8f7d8eb1f843e1140cc9b66b49cbbcc Mon Sep 17 00:00:00 2001 From: blueboy Date: Mon, 18 Oct 2010 20:50:38 +0100 Subject: [PATCH 133/187] Tidy code: remove 'newline from EOF', for several files --- src/game/playerbot/PlayerbotClassAI.cpp | 1 - src/game/playerbot/PlayerbotDeathKnightAI.h | 1 - src/game/playerbot/PlayerbotHunterAI.h | 1 - src/game/playerbot/PlayerbotPaladinAI.h | 1 - 4 files changed, 4 deletions(-) diff --git a/src/game/playerbot/PlayerbotClassAI.cpp b/src/game/playerbot/PlayerbotClassAI.cpp index 1b7622b6b..cf8f98e54 100644 --- a/src/game/playerbot/PlayerbotClassAI.cpp +++ b/src/game/playerbot/PlayerbotClassAI.cpp @@ -14,4 +14,3 @@ void PlayerbotClassAI::DoNextCombatManeuver(Unit *) {} void PlayerbotClassAI::DoNonCombatActions(){} void PlayerbotClassAI::BuffPlayer(Player* target) {} - diff --git a/src/game/playerbot/PlayerbotDeathKnightAI.h b/src/game/playerbot/PlayerbotDeathKnightAI.h index 33645df16..58ff975c7 100644 --- a/src/game/playerbot/PlayerbotDeathKnightAI.h +++ b/src/game/playerbot/PlayerbotDeathKnightAI.h @@ -97,4 +97,3 @@ class MANGOS_DLL_SPEC PlayerbotDeathKnightAI : PlayerbotClassAI }; #endif - diff --git a/src/game/playerbot/PlayerbotHunterAI.h b/src/game/playerbot/PlayerbotHunterAI.h index 02eaac84b..60c92cd0e 100644 --- a/src/game/playerbot/PlayerbotHunterAI.h +++ b/src/game/playerbot/PlayerbotHunterAI.h @@ -118,4 +118,3 @@ class MANGOS_DLL_SPEC PlayerbotHunterAI : PlayerbotClassAI }; #endif - diff --git a/src/game/playerbot/PlayerbotPaladinAI.h b/src/game/playerbot/PlayerbotPaladinAI.h index a658eeb31..9ffe6807a 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.h +++ b/src/game/playerbot/PlayerbotPaladinAI.h @@ -119,4 +119,3 @@ class MANGOS_DLL_SPEC PlayerbotPaladinAI : PlayerbotClassAI }; #endif - From 0bb7a536fc8ace82cc2db32faa2ef4d348ee3f81 Mon Sep 17 00:00:00 2001 From: blueboy Date: Tue, 19 Oct 2010 00:25:42 +0100 Subject: [PATCH 134/187] Fix: Change 'BuildHeartBeatMsg' in core to use SendHeartBeat(bool) --- src/game/playerbot/PlayerbotAI.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 53b1f44ff..6cdcdb440 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2032,9 +2032,7 @@ void PlayerbotAI::MovementReset() void PlayerbotAI::MovementUpdate() { // send heartbeats to world - WorldPacket data; - m_bot->BuildHeartBeatMsg(&data); - m_bot->SendMessageToSet(&data, false); + m_bot->SendHeartBeat(false); // call set position (updates states, exploration, etc.) m_bot->SetPosition(m_bot->GetPositionX(), m_bot->GetPositionY(), m_bot->GetPositionZ(), m_bot->GetOrientation(), false); @@ -2337,9 +2335,8 @@ bool PlayerbotAI::CastSpell(uint32 spellId) m_bot->GetPosition(x,y,z); m_bot->GetNearPoint(m_bot, x, y, z, 1, 5, 0); m_bot->Relocate(x,y,z); - WorldPacket data; - m_bot->BuildHeartBeatMsg(&data); - m_bot->SendMessageToSet(&data,true); + m_bot->SendHeartBeat(true); + } */ From 2c2fe8ebc7596ed15325ef7f495b7ca4e1abb3d2 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Thu, 21 Oct 2010 13:10:55 +0400 Subject: [PATCH 135/187] Fix compilation errors after last MaNGOS merge --- src/game/playerbot/PlayerbotAI.cpp | 53 +++++++++++++++-------------- src/game/playerbot/PlayerbotMgr.cpp | 15 ++++---- 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 6cdcdb440..f662883f8 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -504,7 +504,7 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) m_bot->GetMotionMaster()->Clear(true); m_bot->GetMotionMaster()->MoveFollow(pPlayer, dist, angle); - m_bot->SetSelection(playerGuid); + m_bot->SetSelectionGuid(ObjectGuid(playerGuid)); m_ignoreAIUpdatesUntilTime = time(0) + 4; m_ScenarioType = SCENARIO_DUEL; } @@ -1359,7 +1359,7 @@ void PlayerbotAI::GetCombatTarget(Unit* forcedTarget) return; } - m_bot->SetSelection(m_targetCombat->GetGUID()); + m_bot->SetSelectionGuid((m_targetCombat->GetObjectGuid())); m_ignoreAIUpdatesUntilTime = time(0) + 1; if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) @@ -1385,7 +1385,7 @@ void PlayerbotAI::DoNextCombatManeuver() if (!m_targetCombat || m_targetCombat->isDead() || !m_targetCombat->IsInWorld() || !m_bot->IsHostileTo(m_targetCombat) || !m_bot->IsInMap(m_targetCombat)) { m_bot->AttackStop(); - m_bot->SetSelection(0); + m_bot->SetSelectionGuid(ObjectGuid()); MovementReset(); m_bot->InterruptNonMeleeSpells(true); m_targetCombat = 0; @@ -1634,16 +1634,16 @@ void PlayerbotAI::AcceptQuest(Quest const *qInfo, Player *pGiver) void PlayerbotAI::TurnInQuests(WorldObject *questgiver) { - uint64 giverGUID = questgiver->GetGUID(); + ObjectGuid giverGUID = questgiver->GetObjectGuid(); if (!m_bot->IsInMap(questgiver)) TellMaster("hey you are turning in quests without me!"); else { - m_bot->SetSelection(giverGUID); + m_bot->SetSelectionGuid(giverGUID); // auto complete every completed quest this NPC has - m_bot->PrepareQuestMenu(giverGUID); + m_bot->PrepareQuestMenu(giverGUID.GetRawValue()); QuestMenu& questMenu = m_bot->PlayerTalkClass->GetQuestMenu(); for (uint32 iI = 0; iI < questMenu.MenuItemCount(); ++iI) { @@ -2095,7 +2095,7 @@ void PlayerbotAI::UpdateAI(const uint32 p_time) m_lootCreature.clear(); m_lootCurrent = 0; // clear combat orders - m_bot->SetSelection(0); + m_bot->SetSelectionGuid(ObjectGuid()); m_bot->GetMotionMaster()->Clear(true); // set state to dead SetState(BOTSTATE_DEAD); @@ -2244,10 +2244,10 @@ bool PlayerbotAI::CastSpell(const char* args) bool PlayerbotAI::CastSpell(uint32 spellId, Unit& target) { - uint64 oldSel = m_bot->GetSelection(); - m_bot->SetSelection(target.GetGUID()); + ObjectGuid oldSel = m_bot->GetSelectionGuid(); + m_bot->SetSelectionGuid(target.GetObjectGuid()); bool rv = CastSpell(spellId); - m_bot->SetSelection(oldSel); + m_bot->SetSelectionGuid(oldSel); return rv; } @@ -2272,8 +2272,8 @@ bool PlayerbotAI::CastSpell(uint32 spellId) } // set target - uint64 targetGUID = m_bot->GetSelection(); - Unit* pTarget = ObjectAccessor::GetUnit(*m_bot, m_bot->GetSelection()); + ObjectGuid targetGUID = m_bot->GetSelectionGuid(); + Unit* pTarget = ObjectAccessor::GetUnit(*m_bot, targetGUID); if (!pTarget) pTarget = m_bot; @@ -2366,7 +2366,7 @@ bool PlayerbotAI::CastPetSpell(uint32 spellId, Unit* target) Unit* pTarget; if (!target) { - uint64 targetGUID = m_bot->GetSelection(); + ObjectGuid targetGUID = m_bot->GetSelectionGuid(); pTarget = ObjectAccessor::GetUnit(*m_bot, targetGUID); } else @@ -3118,8 +3118,8 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) SetMovementOrder(MOVEMENT_STAY); else if (text == "attack") { - uint64 attackOnGuid = fromPlayer.GetSelection(); - if (attackOnGuid) + ObjectGuid attackOnGuid = fromPlayer.GetSelectionGuid(); + if (!attackOnGuid.IsEmpty()) { Unit* thingToAttack = ObjectAccessor::GetUnit(*m_bot, attackOnGuid); if (!m_bot->IsFriendlyTo(thingToAttack) && m_bot->IsWithinLOSInMap(thingToAttack)) @@ -3156,11 +3156,11 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) return; } - uint64 castOnGuid = fromPlayer.GetSelection(); - if (spellId != 0 && castOnGuid != 0 && m_bot->HasSpell(spellId)) + ObjectGuid castOnGuid = fromPlayer.GetSelectionGuid(); + if (spellId != 0 && !castOnGuid.IsEmpty() && m_bot->HasSpell(spellId)) { m_spellIdCommand = spellId; - m_targetGuidCommand = castOnGuid; + m_targetGuidCommand = castOnGuid.GetRawValue(); } } @@ -3400,16 +3400,17 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) // drop a quest else if (text.size() > 5 && text.substr(0, 5) == "drop ") { - uint64 oldSelectionGUID = 0; - if (fromPlayer.GetSelection() != m_bot->GetGUID()) { - oldSelectionGUID = m_bot->GetGUID(); - fromPlayer.SetSelection(m_bot->GetGUID()); + ObjectGuid oldSelectionGUID = ObjectGuid(); + if (fromPlayer.GetSelectionGuid() != m_bot->GetObjectGuid()) + { + oldSelectionGUID = m_bot->GetObjectGuid(); + fromPlayer.SetSelectionGuid(oldSelectionGUID); } PlayerbotChatHandler ch(GetMaster()); if (!ch.dropQuest((char*) text.substr(5).c_str())) ch.sysmessage("ERROR: could not drop quest"); - if (oldSelectionGUID) - fromPlayer.SetSelection(oldSelectionGUID); + if (!oldSelectionGUID.IsEmpty()) + fromPlayer.SetSelectionGuid(oldSelectionGUID); } // Handle all pet related commands here @@ -3477,7 +3478,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) return; } - uint64 castOnGuid = fromPlayer.GetSelection(); + ObjectGuid castOnGuid = fromPlayer.GetSelectionGuid(); Unit* pTarget = ObjectAccessor::GetUnit(*m_bot, castOnGuid); CastPetSpell(spellId, pTarget); } @@ -3764,7 +3765,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) if (!itemIds.empty()) { uint32 itemId = itemIds.front(); bool wasRewarded = false; - uint64 questRewarderGUID = m_bot->GetSelection(); + ObjectGuid questRewarderGUID = m_bot->GetSelectionGuid(); Object* const pNpc = (WorldObject*) m_bot->GetObjectByTypeMask(questRewarderGUID, TYPEMASK_CREATURE_OR_GAMEOBJECT); if (!pNpc) return; diff --git a/src/game/playerbot/PlayerbotMgr.cpp b/src/game/playerbot/PlayerbotMgr.cpp index 42d53beff..4726fb8d8 100644 --- a/src/game/playerbot/PlayerbotMgr.cpp +++ b/src/game/playerbot/PlayerbotMgr.cpp @@ -140,8 +140,9 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) // emote to attack selected target case TEXTEMOTE_POINT: { - uint64 attackOnGuid = m_master->GetSelection(); - if (!attackOnGuid) return; + ObjectGuid attackOnGuid = m_master->GetSelectionGuid(); + if (attackOnGuid.IsEmpty()) + return; Unit* thingToAttack = ObjectAccessor::GetUnit(*m_master, attackOnGuid); if (!thingToAttack) return; @@ -159,7 +160,7 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) // emote to stay case TEXTEMOTE_STAND: { - Player* const bot = GetPlayerBot(m_master->GetSelection()); + Player* const bot = GetPlayerBot(m_master->GetSelectionGuid().GetRawValue()); if (bot) bot->GetPlayerbotAI()->SetMovementOrder(PlayerbotAI::MOVEMENT_STAY); else @@ -176,7 +177,7 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) case 324: case TEXTEMOTE_WAVE: { - Player* const bot = GetPlayerBot(m_master->GetSelection()); + Player* const bot = GetPlayerBot(m_master->GetSelectionGuid().GetRawValue()); if (bot) bot->GetPlayerbotAI()->SetMovementOrder(PlayerbotAI::MOVEMENT_FOLLOW, m_master); else @@ -770,8 +771,8 @@ bool ChatHandler::HandlePlayerbotCommand(char* args) if (orderStr == "protect" || orderStr == "assist") { char *targetChar = strtok(NULL, " "); - uint64 targetGUID = m_session->GetPlayer()->GetSelection(); - if (!targetChar && !targetGUID) + ObjectGuid targetGUID = m_session->GetPlayer()->GetSelectionGuid(); + if (!targetChar && targetGUID.IsEmpty()) { PSendSysMessage("|cffff0000Combat orders protect and assist expect a target either by selection or by giving target player in command string!"); SetSentErrorMessage(true); @@ -780,7 +781,7 @@ bool ChatHandler::HandlePlayerbotCommand(char* args) if (targetChar) { std::string targetStr = targetChar; - targetGUID = sObjectMgr.GetPlayerGUIDByName(targetStr.c_str()); + targetGUID.Set(sObjectMgr.GetPlayerGUIDByName(targetStr.c_str())); } target = ObjectAccessor::GetUnit(*m_session->GetPlayer(), targetGUID); if (!target) From fe1d8f6c5a7a628fa91ff295d49c0672f903c9ab Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 22 Oct 2010 00:16:39 +0400 Subject: [PATCH 136/187] Make bots accept resurrection requests Author BThallid. --- src/game/playerbot/PlayerbotAI.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index f662883f8..cda2f153e 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -827,6 +827,27 @@ void PlayerbotAI::HandleBotOutgoingPacket(const WorldPacket& packet) return; } + // if someone tries to resurrect, then accept + case SMSG_RESURRECT_REQUEST: + { + if (!m_bot->isAlive()) + { + WorldPacket p(packet); + ObjectGuid guid; + p >> guid; + + WorldPacket* const packet = new WorldPacket(CMSG_RESURRECT_RESPONSE, 8+1); + *packet << guid; + *packet << uint8(1); // accept + m_bot->GetSession()->QueuePacket(packet); // queue the packet to get around race condition + + // set back to normal + SetState(BOTSTATE_NORMAL); + SetIgnoreUpdateTime(0); + } + return; + } + /* uncomment this and your bots will tell you all their outgoing packet opcode names case SMSG_MONSTER_MOVE: case SMSG_UPDATE_WORLD_STATE: From d4d3ff085fd8270fd6e3fd5e920c438c7671425d Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 22 Oct 2010 00:23:29 +0400 Subject: [PATCH 137/187] Fix resurrection by priest bots --- src/game/playerbot/PlayerbotPriestAI.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/playerbot/PlayerbotPriestAI.cpp b/src/game/playerbot/PlayerbotPriestAI.cpp index 38aba57f0..7cfc4eabb 100644 --- a/src/game/playerbot/PlayerbotPriestAI.cpp +++ b/src/game/playerbot/PlayerbotPriestAI.cpp @@ -437,14 +437,14 @@ void PlayerbotPriestAI::DoNonCombatActions() continue; // first rezz em - if (!tPlayer->isAlive() && !tPlayer->GetPlayerbotAI()) + if (!tPlayer->isAlive()) { std::string msg = "Resurrecting "; msg += tPlayer->GetName(); GetPlayerBot()->Say(msg, LANG_UNIVERSAL); ai->CastSpell(RESURRECTION, *tPlayer); // rez is only 10 sec, but give time for lag - ai->SetIgnoreUpdateTime(17); + ai->SetIgnoreUpdateTime(12); } else if (tPlayer->isAlive()) { From 0f2610089f6230c992cf4a8696ad43b7ad9d9273 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Thu, 28 Oct 2010 20:32:37 +0400 Subject: [PATCH 138/187] Do not reset bot movement when casting instant spells. --- src/game/playerbot/PlayerbotAI.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index cda2f153e..bfd0040a7 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2334,8 +2334,11 @@ bool PlayerbotAI::CastSpell(uint32 spellId) return false; // stop movement to prevent cancel spell casting - sLog.outDebug("Bot movement reset for casting %s (%u)", pSpellInfo->SpellName[0], spellId); - MovementClear(); + if (sSpellCastTimesStore.LookupEntry(pSpellInfo->CastingTimeIndex)->CastTime) + { + sLog.outDebug("Bot movement reset for casting %s (%u)", pSpellInfo->SpellName[0], spellId); + MovementClear(); + } // actually cast spell m_bot->CastSpell(pTarget, pSpellInfo, false); From 7c3307ef02efa27f9bc589a13543f324756ed71b Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 29 Oct 2010 10:12:53 +0400 Subject: [PATCH 139/187] Fix possible segfault introduced in previous commit. --- src/game/playerbot/PlayerbotAI.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index bfd0040a7..9fc8d4b91 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2334,7 +2334,8 @@ bool PlayerbotAI::CastSpell(uint32 spellId) return false; // stop movement to prevent cancel spell casting - if (sSpellCastTimesStore.LookupEntry(pSpellInfo->CastingTimeIndex)->CastTime) + SpellCastTimesEntry const * castTimeEntry = sSpellCastTimesStore.LookupEntry(pSpellInfo->CastingTimeIndex); + if (castTimeEntry && castTimeEntry->CastTime) { sLog.outDebug("Bot movement reset for casting %s (%u)", pSpellInfo->SpellName[0], spellId); MovementClear(); From 9955611efd2dc262028526644ba281e532312c5c Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sat, 30 Oct 2010 00:15:21 +0400 Subject: [PATCH 140/187] Simplify pickaxe check. Patch by BThallid --- src/game/playerbot/PlayerbotAI.cpp | 75 +----------------------------- 1 file changed, 2 insertions(+), 73 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 9fc8d4b91..08d674e65 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2532,80 +2532,9 @@ bool PlayerbotAI::PickPocket(Unit* pTarget) bool PlayerbotAI::HasPick() { - QueryResult *result; - - // list out equiped items - for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; slot++) - { - Item* const pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); - if (pItem) - { - const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto) - continue; - - result = WorldDatabase.PQuery("SELECT TotemCategory FROM item_template WHERE entry = '%i'", pItemProto->ItemId); - if (result) - { - Field *fields = result->Fetch(); - uint32 tc = fields[0].GetUInt32(); - // sLog.outDebug("HasPick %u",tc); - if (tc == 165 || tc == 167) // pick = 165, hammer = 162 or hammer pick = 167 - return true; - } - } - } - - // list out items in backpack - for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; slot++) - { - // sLog.outDebug("[%s's]backpack slot = %u",m_bot->GetName(),slot); // 23 to 38 = 16 - Item* const pItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, slot); // 255, 23 to 38 - if (pItem) - { - const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto) - continue; - - result = WorldDatabase.PQuery("SELECT TotemCategory FROM item_template WHERE entry = '%i'", pItemProto->ItemId); - if (result) - { - Field *fields = result->Fetch(); - uint32 tc = fields[0].GetUInt32(); - // sLog.outDebug("HasPick %u",tc); - if (tc == 165 || tc == 167) // pick = 165, hammer = 162 or hammer pick = 167 - return true; - } - } - } - - // list out items in other removable backpacks - for (uint8 bag = INVENTORY_SLOT_BAG_START; bag < INVENTORY_SLOT_BAG_END; ++bag) // 20 to 23 = 4 - { - const Bag* const pBag = (Bag*) m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, bag); // 255, 20 to 23 - if (pBag) - for (uint8 slot = 0; slot < pBag->GetBagSize(); ++slot) - { - // sLog.outDebug("[%s's]bag[%u] slot = %u",m_bot->GetName(),bag,slot); // 1 to bagsize = ? - Item* const pItem = m_bot->GetItemByPos(bag, slot); // 20 to 23, 1 to bagsize - if (pItem) - { - const ItemPrototype* const pItemProto = pItem->GetProto(); - if (!pItemProto) - continue; + if (m_bot->HasItemTotemCategory(TC_MINING_PICK)) + return true; - result = WorldDatabase.PQuery("SELECT TotemCategory FROM item_template WHERE entry = '%i'", pItemProto->ItemId); - if (result) - { - Field *fields = result->Fetch(); - uint32 tc = fields[0].GetUInt32(); - // sLog.outDebug("HasPick %u",tc); - if (tc == 165 || tc == 167) - return true; - } - } - } - } std::ostringstream out; out << "|cffffffffI do not have a pick!"; TellMaster(out.str().c_str()); From 1e18eb717c412d2a0d1bd7f2fbb1b9a84566cdd9 Mon Sep 17 00:00:00 2001 From: blueboy Date: Sat, 30 Oct 2010 03:16:08 +0100 Subject: [PATCH 141/187] Update HasPick() check to include all possible mining picks --- src/game/playerbot/PlayerbotAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 08d674e65..fede83562 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2532,7 +2532,7 @@ bool PlayerbotAI::PickPocket(Unit* pTarget) bool PlayerbotAI::HasPick() { - if (m_bot->HasItemTotemCategory(TC_MINING_PICK)) + if (m_bot->HasItemTotemCategory(TC_MINING_PICK || TC_HAMMER_PICK || TC_BLADED_PICKAXE)) return true; std::ostringstream out; From 0602d804a4a92087371e8b6ceb59ce38b68ea518 Mon Sep 17 00:00:00 2001 From: blueboy Date: Sat, 30 Oct 2010 10:35:44 +0100 Subject: [PATCH 142/187] Fix HasPick() check, so parameters are correctly passed to HasItemTotemCategory() --- src/game/playerbot/PlayerbotAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index fede83562..9a899847b 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2532,7 +2532,7 @@ bool PlayerbotAI::PickPocket(Unit* pTarget) bool PlayerbotAI::HasPick() { - if (m_bot->HasItemTotemCategory(TC_MINING_PICK || TC_HAMMER_PICK || TC_BLADED_PICKAXE)) + if (m_bot->HasItemTotemCategory(TC_MINING_PICK) || m_bot->HasItemTotemCategory(TC_HAMMER_PICK) || m_bot->HasItemTotemCategory(TC_BLADED_PICKAXE)) return true; std::ostringstream out; From 604172ea26f54afddfa0a03567ebab885c7c8717 Mon Sep 17 00:00:00 2001 From: blueboy Date: Sat, 30 Oct 2010 19:31:50 +0100 Subject: [PATCH 143/187] Revert to BThalid's original patch, that works without change --- src/game/playerbot/PlayerbotAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 9a899847b..08d674e65 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2532,7 +2532,7 @@ bool PlayerbotAI::PickPocket(Unit* pTarget) bool PlayerbotAI::HasPick() { - if (m_bot->HasItemTotemCategory(TC_MINING_PICK) || m_bot->HasItemTotemCategory(TC_HAMMER_PICK) || m_bot->HasItemTotemCategory(TC_BLADED_PICKAXE)) + if (m_bot->HasItemTotemCategory(TC_MINING_PICK)) return true; std::ostringstream out; From 073cdd0e642d543f21f2ff76cc269d411ddf5065 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 22 Oct 2010 18:52:19 +0400 Subject: [PATCH 144/187] Fix auto selection of spell rank for low-level target. Game client selects approriate spell rank itself, and this bug was here for a long time unnoticed. Also whitespace fixed. --- src/game/Player.h | 2 +- src/game/SpellMgr.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/Player.h b/src/game/Player.h index db42a3c29..99a14eab7 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -2682,7 +2682,7 @@ class MANGOS_DLL_SPEC Player : public Unit // Playerbot mod: PlayerbotAI* m_playerbotAI; - PlayerbotMgr* m_playerbotMgr; + PlayerbotMgr* m_playerbotMgr; // Homebind coordinates uint32 m_homebindMapId; diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index 79a2438a5..501edf808 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -2300,7 +2300,7 @@ SpellEntry const* SpellMgr::SelectAuraRankForLevel(SpellEntry const* spellInfo, break; // if found appropriate level - if (level + 10 >= spellInfo->spellLevel) + if (level + 10 >= nextSpellInfo->spellLevel) return nextSpellInfo; // one rank less then From b517f999c65a454ba0fdf9e03659c52f3313e2f2 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sun, 24 Oct 2010 15:38:19 +0400 Subject: [PATCH 145/187] Remove aura check on spell cast. This check blocks casting of spells which apply auras with different modifiers. One example is talented Blessing of Might. --- src/game/playerbot/PlayerbotAI.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 08d674e65..cd439dee7 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2330,9 +2330,6 @@ bool PlayerbotAI::CastSpell(uint32 spellId) } } - if (HasAura(spellId, *pTarget)) - return false; - // stop movement to prevent cancel spell casting SpellCastTimesEntry const * castTimeEntry = sSpellCastTimesStore.LookupEntry(pSpellInfo->CastingTimeIndex); if (castTimeEntry && castTimeEntry->CastTime) From 509e9b147035ec1519083ce8b295462b94b669f6 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sun, 31 Oct 2010 22:21:24 +0300 Subject: [PATCH 146/187] Implement generic buffs New methods: * Buff() : performs different checks and calls CastSpell() if it is possible and makes any sence for target. Spell level is selected automatically to conform target level. * SelfBuff() : can be used for self buffs, like Mage Armor. * CanReceiveSpecificSpell() : checks if target can recieve specific spell from bot. Can be used for checking of paladin blessings and warlock curses. --- src/game/playerbot/PlayerbotAI.cpp | 71 ++++++++++++++++++++++++++++++ src/game/playerbot/PlayerbotAI.h | 5 +++ 2 files changed, 76 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index cd439dee7..aee20f307 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2420,6 +2420,77 @@ bool PlayerbotAI::CastPetSpell(uint32 spellId, Unit* target) return true; } +// Perform sanity checks and cast spell +bool PlayerbotAI::Buff(uint32 spellId, Unit* target) +{ + if (spellId == 0) + return false; + + SpellEntry const * spellProto = sSpellStore.LookupEntry(spellId); + + if (!spellProto) + return false; + + // Select appropriate spell rank for target's level + spellProto = sSpellMgr.SelectAuraRankForLevel(spellProto, target->getLevel()); + + if (!spellProto) + { + TellMaster("No spell rank found for target %s", target->GetName()); + return false; + } + + // Check if spell will boost one of already existent auras + bool willBenefitFromSpell = false; + for (uint8 i = 0; i < MAX_EFFECT_INDEX; ++i) + { + if (spellProto->EffectApplyAuraName[i] == SPELL_AURA_NONE) + break; + + bool sameOrBetterAuraFound = false; + uint32 bonus = m_bot->CalculateSpellDamage(target, spellProto, SpellEffectIndex(i)); + Unit::AuraList const& auras = target->GetAurasByType(AuraType(spellProto->EffectApplyAuraName[i])); + for (Unit::AuraList::const_iterator it = auras.begin(); it != auras.end(); ++it) + if ((*it)->GetModifier()->m_miscvalue == spellProto->EffectMiscValue[i] && (*it)->GetModifier()->m_amount >= bonus) + { + sameOrBetterAuraFound = true; + break; + } + willBenefitFromSpell = willBenefitFromSpell || !sameOrBetterAuraFound; + } + + if (!willBenefitFromSpell) + return false; + + return CastSpell(spellProto->Id, *target); +} + +// Can be used for personal buffs like Mage Armor and Inner Fire +bool PlayerbotAI::SelfBuff(uint32 spellId) +{ + if (spellId == 0) + return false; + + if (m_bot->HasAura(spellId)) + return false; + + return CastSpell(spellId, *m_bot); +} + +// Checks if spell is single per target per caster and will make any effect on target +bool PlayerbotAI::CanReceiveSpecificSpell(SpellSpecific spec, Unit* target) const +{ + if (IsSingleFromSpellSpecificPerTargetPerCaster(spec, spec)) + { + Unit::SpellAuraHolderMap holders = target->GetSpellAuraHolderMap(); + Unit::SpellAuraHolderMap::iterator it; + for (it = holders.begin(); it != holders.end(); ++it) + if ((*it).second->GetCasterGUID() == m_bot->GetGUID() && GetSpellSpecific((*it).second->GetId()) == spec) + return false; + } + return true; +} + Item* PlayerbotAI::FindItem(uint32 ItemId) { // list out items in main backpack diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 8341580ce..fc1e0a862 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -4,6 +4,7 @@ #include "Common.h" #include "../QuestDef.h" #include "../GameEventMgr.h" +#include "../SpellMgr.h" class WorldPacket; class WorldObject; @@ -179,6 +180,8 @@ class MANGOS_DLL_SPEC PlayerbotAI bool HasAura(const char* spellName, const Unit& player) const; bool HasAura(const char* spellName) const; + bool CanReceiveSpecificSpell(SpellSpecific spec, Unit* target) const; + bool PickPocket(Unit* pTarget); bool HasPick(); @@ -212,6 +215,8 @@ class MANGOS_DLL_SPEC PlayerbotAI bool CastSpell(uint32 spellId); bool CastSpell(uint32 spellId, Unit& target); bool CastPetSpell(uint32 spellId, Unit* target = NULL); + bool Buff(uint32 spellId, Unit* target); + bool SelfBuff(uint32 spellId); void UseItem(Item& item, uint8 targetSlot = 255); void EquipItem(Item& item); //void Stay(); From d349d0d407e5beb19abf137d331787fd5456efa0 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sun, 31 Oct 2010 22:36:47 +0300 Subject: [PATCH 147/187] Update paladin AI to use new buff system. --- src/game/playerbot/PlayerbotPaladinAI.cpp | 133 ++++++++++------------ src/game/playerbot/PlayerbotPaladinAI.h | 64 ++++++++++- 2 files changed, 119 insertions(+), 78 deletions(-) diff --git a/src/game/playerbot/PlayerbotPaladinAI.cpp b/src/game/playerbot/PlayerbotPaladinAI.cpp index 4e3869659..70608a326 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.cpp +++ b/src/game/playerbot/PlayerbotPaladinAI.cpp @@ -37,9 +37,10 @@ PlayerbotPaladinAI::PlayerbotPaladinAI(Player* const master, Player* const bot, EXORCISM = ai->initSpell(EXORCISM_1); SACRED_SHIELD = ai->initSpell(SACRED_SHIELD_1); DIVINE_PLEA = ai->initSpell(DIVINE_PLEA_1); - BLESSING_OF_KINGS = ai->initSpell(BLESSING_OF_KINGS_1); // Protection - GREATER_BLESSING_OF_KINGS = ai->initSpell(GREATER_BLESSING_OF_KINGS_1); - GREATER_BLESSING_OF_SANCTUARY = ai->initSpell(GREATER_BLESSING_OF_SANCTUARY_1); + BLESSING_OF_KINGS = BLESSING_OF_KINGS_1; + GREATER_BLESSING_OF_KINGS = GREATER_BLESSING_OF_KINGS_1; + BLESSING_OF_SANCTUARY = BLESSING_OF_SANCTUARY_1; + GREATER_BLESSING_OF_SANCTUARY = GREATER_BLESSING_OF_SANCTUARY_1; HAMMER_OF_JUSTICE = ai->initSpell(HAMMER_OF_JUSTICE_1); RIGHTEOUS_FURY = ai->initSpell(RIGHTEOUS_FURY_1); RIGHTEOUS_DEFENSE = ai->initSpell(RIGHTEOUS_DEFENSE_1); @@ -320,74 +321,13 @@ void PlayerbotPaladinAI::DoNonCombatActions() if (!m_bot) return; - // buff myself - if (GREATER_BLESSING_OF_MIGHT > 0 && !m_bot->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0)) - ai->CastSpell (GREATER_BLESSING_OF_MIGHT, *m_bot); - else if (BLESSING_OF_MIGHT > 0 && !m_bot->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0) && !m_bot->HasAura(BLESSING_OF_MIGHT, EFFECT_INDEX_0)) - ai->CastSpell (BLESSING_OF_MIGHT, *m_bot); + // Buff myself + if (ai->GetCombatOrder() == ai->ORDERS_TANK) + ai->SelfBuff(RIGHTEOUS_FURY); + BuffPlayer(m_bot); - if (DIVINE_FAVOR > 0 && !m_bot->HasAura(DIVINE_FAVOR, EFFECT_INDEX_0) && ai->GetManaPercent() >= 3) - ai->CastSpell(DIVINE_FAVOR, *m_bot); -/* - if (SEAL_OF_COMMAND > 0) - ai->CastSpell (SEAL_OF_COMMAND, *m_bot); // interferes with drinking/eating - */ - //Select Class buff seq. - ///Process Who is my master --> get the player class --> aura already present if not then proced --> cast the spell - //Priest - if (BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_PRIEST && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0) && !GetMaster()->HasAura(BLESSING_OF_WISDOM, EFFECT_INDEX_0)) - ai->CastSpell (BLESSING_OF_WISDOM, *(GetMaster())); - - if (GREATER_BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_PRIEST && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0)) - ai->CastSpell (GREATER_BLESSING_OF_WISDOM, *(GetMaster())); - - //Mage - if (BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_MAGE && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0) && !GetMaster()->HasAura(BLESSING_OF_WISDOM, EFFECT_INDEX_0)) - ai->CastSpell (BLESSING_OF_WISDOM, *(GetMaster())); - - if (GREATER_BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_MAGE && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0)) - ai->CastSpell (GREATER_BLESSING_OF_WISDOM, *(GetMaster())); - - //Paladin - if (BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_PALADIN && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0) && !GetMaster()->HasAura(BLESSING_OF_WISDOM, EFFECT_INDEX_0)) - ai->CastSpell (BLESSING_OF_WISDOM, *(GetMaster())); - - if (GREATER_BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_PALADIN && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0)) - ai->CastSpell (GREATER_BLESSING_OF_WISDOM, *(GetMaster())); - - //Warlock - if (BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_WARLOCK && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0) && !GetMaster()->HasAura(BLESSING_OF_WISDOM, EFFECT_INDEX_0)) - ai->CastSpell (BLESSING_OF_WISDOM, *(GetMaster())); - - if (GREATER_BLESSING_OF_WISDOM > 0 && GetMaster()->getClass() == CLASS_WARLOCK && !GetMaster()->HasAura(GREATER_BLESSING_OF_WISDOM, EFFECT_INDEX_0)) - ai->CastSpell (GREATER_BLESSING_OF_WISDOM, *(GetMaster())); - - //Warrior - if (BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_WARRIOR && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0) && !GetMaster()->HasAura(BLESSING_OF_MIGHT, EFFECT_INDEX_0) && !GetMaster()->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0)) - ai->CastSpell (BLESSING_OF_MIGHT, *(GetMaster())); - - if (GREATER_BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_WARRIOR && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0) && !GetMaster()->HasAura(DEFENSIVE_STANCE, EFFECT_INDEX_0)) - ai->CastSpell (GREATER_BLESSING_OF_MIGHT, *(GetMaster())); - - if (BLESSING_OF_KINGS > 0 && GetMaster()->getClass() == CLASS_WARRIOR && !GetMaster()->HasAura(GREATER_BLESSING_OF_KINGS, EFFECT_INDEX_0) && !GetMaster()->HasAura(BLESSING_OF_KINGS, EFFECT_INDEX_0) && !GetMaster()->HasAura(BERSERKER_STANCE, EFFECT_INDEX_0) && !GetMaster()->HasAura(BATTLE_STANCE, EFFECT_INDEX_0)) - ai->CastSpell (BLESSING_OF_KINGS, *(GetMaster())); - - if (GREATER_BLESSING_OF_KINGS > 0 && GetMaster()->getClass() == CLASS_WARRIOR && !GetMaster()->HasAura(GREATER_BLESSING_OF_KINGS, EFFECT_INDEX_0) && !GetMaster()->HasAura(BERSERKER_STANCE, EFFECT_INDEX_0) && !GetMaster()->HasAura(BATTLE_STANCE, EFFECT_INDEX_0)) - ai->CastSpell (GREATER_BLESSING_OF_KINGS, *(GetMaster())); - - //Rogue - if (BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_ROGUE && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0) && !GetMaster()->HasAura(BLESSING_OF_MIGHT, EFFECT_INDEX_0)) - ai->CastSpell (BLESSING_OF_MIGHT, *(GetMaster())); - - if (GREATER_BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_ROGUE && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0)) - ai->CastSpell (GREATER_BLESSING_OF_MIGHT, *(GetMaster())); - - //Shaman - if (BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_SHAMAN && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0) && !GetMaster()->HasAura(BLESSING_OF_MIGHT, EFFECT_INDEX_0)) - ai->CastSpell (BLESSING_OF_MIGHT, *(GetMaster())); - - if (GREATER_BLESSING_OF_MIGHT > 0 && GetMaster()->getClass() == CLASS_SHAMAN && !GetMaster()->HasAura(GREATER_BLESSING_OF_MIGHT, EFFECT_INDEX_0)) - ai->CastSpell (GREATER_BLESSING_OF_MIGHT, *(GetMaster())); + // Buff master + BuffPlayer(ai->GetMaster()); // mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) @@ -425,7 +365,7 @@ void PlayerbotPaladinAI::DoNonCombatActions() return; } - // heal group + // heal and buff group if (GetMaster()->GetGroup()) { Group::MemberSlotList const& groupSlot = GetMaster()->GetGroup()->GetMemberSlots(); @@ -435,13 +375,58 @@ void PlayerbotPaladinAI::DoNonCombatActions() if (!tPlayer || !tPlayer->isAlive()) continue; - // heal player - (HealTarget(*tPlayer, tPlayer->GetHealth() * 100 / tPlayer->GetMaxHealth())); + HealTarget(*tPlayer, tPlayer->GetHealth() * 100 / tPlayer->GetMaxHealth()); + if (tPlayer != m_bot && tPlayer != GetMaster()) + BuffPlayer(tPlayer); } } } void PlayerbotPaladinAI::BuffPlayer(Player* target) { - GetAI()->CastSpell(BLESSING_OF_MIGHT, *target); + PlayerbotAI * ai = GetAI(); + Pet * pet = target->GetPet(); + + // Check if target already has my blessing + if (!ai->CanReceiveSpecificSpell(SPELL_BLESSING, target)) + return; + + switch (target->getClass()) + { + case CLASS_DRUID: + case CLASS_SHAMAN: + case CLASS_PALADIN: + if (ai->Buff(BLESSING_OF_MIGHT, target)) + break; + else if (ai->Buff(BLESSING_OF_KINGS, target)) + break; + else if (ai->Buff(BLESSING_OF_WISDOM, target)) + break; + else + ai->Buff(BLESSING_OF_SANCTUARY, target); + break; + case CLASS_DEATH_KNIGHT: + case CLASS_HUNTER: + if (pet) + if (!ai->Buff(BLESSING_OF_MIGHT, target)) + ai->Buff(BLESSING_OF_KINGS, target); + case CLASS_ROGUE: + case CLASS_WARRIOR: + if (ai->Buff(BLESSING_OF_MIGHT, target)) + break; + else if (ai->Buff(BLESSING_OF_KINGS, target)) + break; + else + ai->Buff(BLESSING_OF_SANCTUARY, target); + break; + case CLASS_PRIEST: + case CLASS_MAGE: + case CLASS_WARLOCK: + if (ai->Buff(BLESSING_OF_WISDOM, target)) + break; + else if (ai->Buff(BLESSING_OF_KINGS, target)) + break; + else + ai->Buff(BLESSING_OF_SANCTUARY, target); + } } diff --git a/src/game/playerbot/PlayerbotPaladinAI.h b/src/game/playerbot/PlayerbotPaladinAI.h index 9ffe6807a..173570bd5 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.h +++ b/src/game/playerbot/PlayerbotPaladinAI.h @@ -96,15 +96,62 @@ class MANGOS_DLL_SPEC PlayerbotPaladinAI : PlayerbotClassAI private: // Heals the target based off its hps void HealTarget (Unit& target, uint8 hp); + // Cast on of the blessings on target using list. + void BuffBlessing(Unit* target, uint8 listSize, ...); // Retribution - uint32 RETRIBUTION_AURA, SEAL_OF_COMMAND, JUDGEMENT_OF_LIGHT, JUDGEMENT_OF_WISDOM, GREATER_BLESSING_OF_WISDOM, GREATER_BLESSING_OF_MIGHT, BLESSING_OF_WISDOM, BLESSING_OF_MIGHT, HAMMER_OF_JUSTICE, RIGHTEOUS_FURY, CRUSADER_AURA, CRUSADER_STRIKE, AVENGING_WRATH, DIVINE_STORM, JUDGEMENT_OF_JUSTICE; + uint32 RETRIBUTION_AURA, + SEAL_OF_COMMAND, + JUDGEMENT_OF_LIGHT, + JUDGEMENT_OF_WISDOM, + GREATER_BLESSING_OF_WISDOM, + GREATER_BLESSING_OF_MIGHT, + BLESSING_OF_WISDOM, + BLESSING_OF_MIGHT, + HAMMER_OF_JUSTICE, + RIGHTEOUS_FURY, + CRUSADER_AURA, + CRUSADER_STRIKE, + AVENGING_WRATH, + DIVINE_STORM, + JUDGEMENT_OF_JUSTICE; // Holy - uint32 FLASH_OF_LIGHT, HOLY_LIGHT, DIVINE_SHIELD, HAMMER_OF_WRATH, CONSECRATION, CONCENTRATION_AURA, DIVINE_FAVOR, SACRED_SHIELD, HOLY_SHOCK, HOLY_WRATH, LAY_ON_HANDS, EXORCISM, DIVINE_PLEA; + uint32 FLASH_OF_LIGHT, + HOLY_LIGHT, + DIVINE_SHIELD, + HAMMER_OF_WRATH, + CONSECRATION, + CONCENTRATION_AURA, + DIVINE_FAVOR, + SACRED_SHIELD, + HOLY_SHOCK, + HOLY_WRATH, + LAY_ON_HANDS, + EXORCISM, + DIVINE_PLEA; // Protection - uint32 GREATER_BLESSING_OF_KINGS, BLESSING_OF_KINGS, HAND_OF_PROTECTION, SHADOW_RESISTANCE_AURA, DEVOTION_AURA, FIRE_RESISTANCE_AURA, FROST_RESISTANCE_AURA, DEFENSIVE_STANCE, BERSERKER_STANCE, BATTLE_STANCE, DIVINE_SACRIFICE, DIVINE_PROTECTION, DIVINE_INTERVENTION, HOLY_SHIELD, AVENGERS_SHIELD, RIGHTEOUS_DEFENSE, GREATER_BLESSING_OF_SANCTUARY, HAND_OF_SACRIFICE, SHIELD_OF_RIGHTEOUSNESS; + uint32 GREATER_BLESSING_OF_KINGS, + BLESSING_OF_KINGS, + HAND_OF_PROTECTION, + SHADOW_RESISTANCE_AURA, + DEVOTION_AURA, + FIRE_RESISTANCE_AURA, + FROST_RESISTANCE_AURA, + DEFENSIVE_STANCE, + BERSERKER_STANCE, + BATTLE_STANCE, + DIVINE_SACRIFICE, + DIVINE_PROTECTION, + DIVINE_INTERVENTION, + HOLY_SHIELD, + AVENGERS_SHIELD, + RIGHTEOUS_DEFENSE, + BLESSING_OF_SANCTUARY, + GREATER_BLESSING_OF_SANCTUARY, + HAND_OF_SACRIFICE, + SHIELD_OF_RIGHTEOUSNESS; // cannot be protected uint32 FORBEARANCE; @@ -113,7 +160,16 @@ class MANGOS_DLL_SPEC PlayerbotPaladinAI : PlayerbotClassAI uint32 RECENTLY_BANDAGED; // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + uint32 ARCANE_TORRENT, + GIFT_OF_THE_NAARU, + STONEFORM, + ESCAPE_ARTIST, + EVERY_MAN_FOR_HIMSELF, + SHADOWMELD, + BLOOD_FURY, + WAR_STOMP, + BERSERKING, + WILL_OF_THE_FORSAKEN; uint32 SpellSequence, CombatCounter, HealCounter; }; From d37dc913c9e39b3d9b0c73e33c7571792be759ff Mon Sep 17 00:00:00 2001 From: chelobaka Date: Tue, 2 Nov 2010 01:20:10 +0300 Subject: [PATCH 148/187] Rearrange code to avoid compilation conflicts with SD2. --- src/game/playerbot/PlayerbotAI.cpp | 6 +++--- src/game/playerbot/PlayerbotAI.h | 3 +-- src/game/playerbot/PlayerbotPaladinAI.cpp | 1 + 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index aee20f307..fa8c94291 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2478,14 +2478,14 @@ bool PlayerbotAI::SelfBuff(uint32 spellId) } // Checks if spell is single per target per caster and will make any effect on target -bool PlayerbotAI::CanReceiveSpecificSpell(SpellSpecific spec, Unit* target) const +bool PlayerbotAI::CanReceiveSpecificSpell(uint8 spec, Unit* target) const { - if (IsSingleFromSpellSpecificPerTargetPerCaster(spec, spec)) + if (IsSingleFromSpellSpecificPerTargetPerCaster(SpellSpecific(spec), SpellSpecific(spec))) { Unit::SpellAuraHolderMap holders = target->GetSpellAuraHolderMap(); Unit::SpellAuraHolderMap::iterator it; for (it = holders.begin(); it != holders.end(); ++it) - if ((*it).second->GetCasterGUID() == m_bot->GetGUID() && GetSpellSpecific((*it).second->GetId()) == spec) + if ((*it).second->GetCasterGUID() == m_bot->GetGUID() && GetSpellSpecific((*it).second->GetId()) == SpellSpecific(spec)) return false; } return true; diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index fc1e0a862..049d0261b 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -4,7 +4,6 @@ #include "Common.h" #include "../QuestDef.h" #include "../GameEventMgr.h" -#include "../SpellMgr.h" class WorldPacket; class WorldObject; @@ -180,7 +179,7 @@ class MANGOS_DLL_SPEC PlayerbotAI bool HasAura(const char* spellName, const Unit& player) const; bool HasAura(const char* spellName) const; - bool CanReceiveSpecificSpell(SpellSpecific spec, Unit* target) const; + bool CanReceiveSpecificSpell(uint8 spec, Unit* target) const; bool PickPocket(Unit* pTarget); bool HasPick(); diff --git a/src/game/playerbot/PlayerbotPaladinAI.cpp b/src/game/playerbot/PlayerbotPaladinAI.cpp index 70608a326..12f114281 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.cpp +++ b/src/game/playerbot/PlayerbotPaladinAI.cpp @@ -386,6 +386,7 @@ void PlayerbotPaladinAI::BuffPlayer(Player* target) { PlayerbotAI * ai = GetAI(); Pet * pet = target->GetPet(); + uint8 SPELL_BLESSING = 2; // See SpellSpecific enum in SpellMgr.h // Check if target already has my blessing if (!ai->CanReceiveSpecificSpell(SPELL_BLESSING, target)) From e9feddc9153288fab0c9139b81e6de295ef5ef83 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Wed, 3 Nov 2010 17:18:19 +0300 Subject: [PATCH 149/187] Add HasSpellReagents() method --- src/game/playerbot/PlayerbotAI.cpp | 24 ++++++++++++++++++++++++ src/game/playerbot/PlayerbotAI.h | 1 + 2 files changed, 25 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index fa8c94291..df4a88130 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2609,6 +2609,30 @@ bool PlayerbotAI::HasPick() return false; } +bool PlayerbotAI::HasSpellReagents(uint32 spellId) +{ + const SpellEntry* const pSpellInfo = sSpellStore.LookupEntry(spellId); + if (!pSpellInfo) + return false; + + if (m_bot->CanNoReagentCast(pSpellInfo)) + return true; + + for (uint32 i = 0; i < MAX_SPELL_REAGENTS; ++i) + { + if(pSpellInfo->Reagent[i] <= 0) + continue; + + uint32 itemid = pSpellInfo->Reagent[i]; + uint32 count = pSpellInfo->ReagentCount[i]; + + if (!m_bot->HasItemCount(itemid, count)) + return false; + } + + return true; +} + // extracts all item ids in format below // I decided to roll my own extractor rather then use the one in ChatHandler // because this one works on a const string, and it handles multiple links diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 049d0261b..d90226615 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -183,6 +183,7 @@ class MANGOS_DLL_SPEC PlayerbotAI bool PickPocket(Unit* pTarget); bool HasPick(); + bool HasSpellReagents(uint32 spellId); uint8 GetHealthPercent(const Unit& target) const; uint8 GetHealthPercent() const; From 2d21762b8afd8cc1d255e84546b377d9e0e81db6 Mon Sep 17 00:00:00 2001 From: blueboy Date: Wed, 3 Nov 2010 17:47:15 +0000 Subject: [PATCH 150/187] Fix core change, now use 'update_diff' rather than 'p_time' --- src/game/Player.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 25fb041ad..d3c6f0544 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -1491,9 +1491,9 @@ void Player::Update(uint32 update_diff, uint32 tick_diff) // Playerbot mod if (m_playerbotAI) - m_playerbotAI->UpdateAI(p_time); + m_playerbotAI->UpdateAI(update_diff); else if (m_playerbotMgr) - m_playerbotMgr->UpdateAI(p_time); + m_playerbotMgr->UpdateAI(update_diff); } void Player::SetDeathState(DeathState s) From 1b5edd333af3bde2105ad2451f5f78d14369bdef Mon Sep 17 00:00:00 2001 From: chelobaka Date: Thu, 4 Nov 2010 23:34:01 +0300 Subject: [PATCH 151/187] Change return type of BuffPlayer() class AI method to boolean. This will let us exit UpdateAI cicle right after succesfull spellcast without wasting CPU time on useless iterations. --- src/game/playerbot/PlayerbotClassAI.cpp | 2 +- src/game/playerbot/PlayerbotClassAI.h | 2 +- src/game/playerbot/PlayerbotDruidAI.cpp | 2 +- src/game/playerbot/PlayerbotDruidAI.h | 2 +- src/game/playerbot/PlayerbotMageAI.cpp | 9 +++-- src/game/playerbot/PlayerbotMageAI.h | 2 +- src/game/playerbot/PlayerbotPaladinAI.cpp | 41 +++++++++++++---------- src/game/playerbot/PlayerbotPaladinAI.h | 2 +- src/game/playerbot/PlayerbotPriestAI.cpp | 4 +-- src/game/playerbot/PlayerbotPriestAI.h | 2 +- src/game/playerbot/PlayerbotRogueAI.cpp | 2 -- src/game/playerbot/PlayerbotRogueAI.h | 3 -- src/game/playerbot/PlayerbotShamanAI.cpp | 2 -- src/game/playerbot/PlayerbotShamanAI.h | 3 -- src/game/playerbot/PlayerbotWarriorAI.cpp | 2 -- src/game/playerbot/PlayerbotWarriorAI.h | 3 -- 16 files changed, 40 insertions(+), 43 deletions(-) diff --git a/src/game/playerbot/PlayerbotClassAI.cpp b/src/game/playerbot/PlayerbotClassAI.cpp index cf8f98e54..75a3fd242 100644 --- a/src/game/playerbot/PlayerbotClassAI.cpp +++ b/src/game/playerbot/PlayerbotClassAI.cpp @@ -13,4 +13,4 @@ void PlayerbotClassAI::DoNextCombatManeuver(Unit *) {} void PlayerbotClassAI::DoNonCombatActions(){} -void PlayerbotClassAI::BuffPlayer(Player* target) {} +bool PlayerbotClassAI::BuffPlayer(Player* target) {} diff --git a/src/game/playerbot/PlayerbotClassAI.h b/src/game/playerbot/PlayerbotClassAI.h index 129c8e4cc..3f9be21e2 100644 --- a/src/game/playerbot/PlayerbotClassAI.h +++ b/src/game/playerbot/PlayerbotClassAI.h @@ -28,7 +28,7 @@ class MANGOS_DLL_SPEC PlayerbotClassAI virtual void DoNonCombatActions(); // buff a specific player, usually a real PC who is not in group - virtual void BuffPlayer(Player* target); + virtual bool BuffPlayer(Player* target); // Utilities Player* GetMaster () {return m_master; } diff --git a/src/game/playerbot/PlayerbotDruidAI.cpp b/src/game/playerbot/PlayerbotDruidAI.cpp index c84ed49dd..eb11b0e19 100644 --- a/src/game/playerbot/PlayerbotDruidAI.cpp +++ b/src/game/playerbot/PlayerbotDruidAI.cpp @@ -634,7 +634,7 @@ void PlayerbotDruidAI::DoNonCombatActions() } } // end DoNonCombatActions -void PlayerbotDruidAI::BuffPlayer(Player* target) +bool PlayerbotDruidAI::BuffPlayer(Player* target) { GetAI()->CastSpell(MARK_OF_THE_WILD, *target); } diff --git a/src/game/playerbot/PlayerbotDruidAI.h b/src/game/playerbot/PlayerbotDruidAI.h index 9bb166ebc..3a7c10c11 100644 --- a/src/game/playerbot/PlayerbotDruidAI.h +++ b/src/game/playerbot/PlayerbotDruidAI.h @@ -104,7 +104,7 @@ class MANGOS_DLL_SPEC PlayerbotDruidAI : PlayerbotClassAI void DoNonCombatActions(); // buff a specific player, usually a real PC who is not in group - void BuffPlayer(Player *target); + bool BuffPlayer(Player *target); private: // Heals the target based off its hps diff --git a/src/game/playerbot/PlayerbotMageAI.cpp b/src/game/playerbot/PlayerbotMageAI.cpp index 5f19b521b..5fb24fa8a 100644 --- a/src/game/playerbot/PlayerbotMageAI.cpp +++ b/src/game/playerbot/PlayerbotMageAI.cpp @@ -435,7 +435,12 @@ void PlayerbotMageAI::DoNonCombatActions() } // end DoNonCombatActions -void PlayerbotMageAI::BuffPlayer(Player* target) +bool PlayerbotMageAI::BuffPlayer(Player* target) { - GetAI()->CastSpell(ARCANE_INTELLECT, *target); + if (DALARAN_INTELLECT) + return GetAI()->Buff(DALARAN_INTELLECT, target); + else if (ARCANE_INTELLECT) + return GetAI()->Buff(ARCANE_INTELLECT, target); + else + return false; } diff --git a/src/game/playerbot/PlayerbotMageAI.h b/src/game/playerbot/PlayerbotMageAI.h index 2dfe09c94..894470287 100644 --- a/src/game/playerbot/PlayerbotMageAI.h +++ b/src/game/playerbot/PlayerbotMageAI.h @@ -83,7 +83,7 @@ class MANGOS_DLL_SPEC PlayerbotMageAI : PlayerbotClassAI void DoNonCombatActions(); // buff a specific player, usually a real PC who is not in group - void BuffPlayer(Player *target); + bool BuffPlayer(Player *target); private: // ARCANE diff --git a/src/game/playerbot/PlayerbotPaladinAI.cpp b/src/game/playerbot/PlayerbotPaladinAI.cpp index 12f114281..f8258da31 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.cpp +++ b/src/game/playerbot/PlayerbotPaladinAI.cpp @@ -377,12 +377,13 @@ void PlayerbotPaladinAI::DoNonCombatActions() HealTarget(*tPlayer, tPlayer->GetHealth() * 100 / tPlayer->GetMaxHealth()); if (tPlayer != m_bot && tPlayer != GetMaster()) - BuffPlayer(tPlayer); + if (BuffPlayer(tPlayer)) + return; } } } -void PlayerbotPaladinAI::BuffPlayer(Player* target) +bool PlayerbotPaladinAI::BuffPlayer(Player* target) { PlayerbotAI * ai = GetAI(); Pet * pet = target->GetPet(); @@ -390,7 +391,7 @@ void PlayerbotPaladinAI::BuffPlayer(Player* target) // Check if target already has my blessing if (!ai->CanReceiveSpecificSpell(SPELL_BLESSING, target)) - return; + return false; switch (target->getClass()) { @@ -398,36 +399,42 @@ void PlayerbotPaladinAI::BuffPlayer(Player* target) case CLASS_SHAMAN: case CLASS_PALADIN: if (ai->Buff(BLESSING_OF_MIGHT, target)) - break; + return true; else if (ai->Buff(BLESSING_OF_KINGS, target)) - break; + return true; else if (ai->Buff(BLESSING_OF_WISDOM, target)) - break; + return true; + else if (ai->Buff(BLESSING_OF_SANCTUARY, target)) + return true; else - ai->Buff(BLESSING_OF_SANCTUARY, target); - break; + return false; case CLASS_DEATH_KNIGHT: case CLASS_HUNTER: if (pet) - if (!ai->Buff(BLESSING_OF_MIGHT, target)) - ai->Buff(BLESSING_OF_KINGS, target); + if (ai->Buff(BLESSING_OF_MIGHT, target)) + return true; + else if (ai->Buff(BLESSING_OF_KINGS, target)) + return true; case CLASS_ROGUE: case CLASS_WARRIOR: if (ai->Buff(BLESSING_OF_MIGHT, target)) - break; + return true; else if (ai->Buff(BLESSING_OF_KINGS, target)) - break; + return true; + else if (ai->Buff(BLESSING_OF_SANCTUARY, target)) + return true; else - ai->Buff(BLESSING_OF_SANCTUARY, target); - break; + return false; case CLASS_PRIEST: case CLASS_MAGE: case CLASS_WARLOCK: if (ai->Buff(BLESSING_OF_WISDOM, target)) - break; + return true; else if (ai->Buff(BLESSING_OF_KINGS, target)) - break; + return true; + else if (ai->Buff(BLESSING_OF_SANCTUARY, target)) + return true; else - ai->Buff(BLESSING_OF_SANCTUARY, target); + return false; } } diff --git a/src/game/playerbot/PlayerbotPaladinAI.h b/src/game/playerbot/PlayerbotPaladinAI.h index 173570bd5..97c992597 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.h +++ b/src/game/playerbot/PlayerbotPaladinAI.h @@ -91,7 +91,7 @@ class MANGOS_DLL_SPEC PlayerbotPaladinAI : PlayerbotClassAI void DoNonCombatActions(); // buff a specific player, usually a real PC who is not in group - void BuffPlayer(Player *target); + bool BuffPlayer(Player *target); private: // Heals the target based off its hps diff --git a/src/game/playerbot/PlayerbotPriestAI.cpp b/src/game/playerbot/PlayerbotPriestAI.cpp index 7cfc4eabb..3549c5f27 100644 --- a/src/game/playerbot/PlayerbotPriestAI.cpp +++ b/src/game/playerbot/PlayerbotPriestAI.cpp @@ -456,7 +456,7 @@ void PlayerbotPriestAI::DoNonCombatActions() } } // end DoNonCombatActions -void PlayerbotPriestAI::BuffPlayer(Player* target) +bool PlayerbotPriestAI::BuffPlayer(Player* target) { - GetAI()->CastSpell(POWER_WORD_FORTITUDE, *target); + return GetAI()->CastSpell(POWER_WORD_FORTITUDE, *target); } diff --git a/src/game/playerbot/PlayerbotPriestAI.h b/src/game/playerbot/PlayerbotPriestAI.h index 4d75281bf..aefcf5a6a 100644 --- a/src/game/playerbot/PlayerbotPriestAI.h +++ b/src/game/playerbot/PlayerbotPriestAI.h @@ -85,7 +85,7 @@ class MANGOS_DLL_SPEC PlayerbotPriestAI : PlayerbotClassAI void DoNonCombatActions(); // buff a specific player, usually a real PC who is not in group - void BuffPlayer(Player *target); + bool BuffPlayer(Player *target); private: // Heals the target based off its hps diff --git a/src/game/playerbot/PlayerbotRogueAI.cpp b/src/game/playerbot/PlayerbotRogueAI.cpp index 4e5547fbd..a8ea5cdaa 100644 --- a/src/game/playerbot/PlayerbotRogueAI.cpp +++ b/src/game/playerbot/PlayerbotRogueAI.cpp @@ -342,5 +342,3 @@ void PlayerbotRogueAI::DoNonCombatActions() } } // end DoNonCombatActions - -void PlayerbotRogueAI::BuffPlayer(Player* target) {} diff --git a/src/game/playerbot/PlayerbotRogueAI.h b/src/game/playerbot/PlayerbotRogueAI.h index a72026895..19bc7ea92 100644 --- a/src/game/playerbot/PlayerbotRogueAI.h +++ b/src/game/playerbot/PlayerbotRogueAI.h @@ -80,9 +80,6 @@ class MANGOS_DLL_SPEC PlayerbotRogueAI : PlayerbotClassAI // all non combat actions go here, ex buffs, heals, rezzes void DoNonCombatActions(); - // buff a specific player, usually a real PC who is not in group - void BuffPlayer(Player *target); - private: // COMBAT uint32 SINISTER_STRIKE, BACKSTAB, GOUGE, EVASION, SPRINT, KICK, FEINT, SHIV, FAN_OF_KNIVES; diff --git a/src/game/playerbot/PlayerbotShamanAI.cpp b/src/game/playerbot/PlayerbotShamanAI.cpp index 1190b846c..9debfc0fc 100644 --- a/src/game/playerbot/PlayerbotShamanAI.cpp +++ b/src/game/playerbot/PlayerbotShamanAI.cpp @@ -523,5 +523,3 @@ void PlayerbotShamanAI::DoNonCombatActions() } } } // end DoNonCombatActions - -void PlayerbotShamanAI::BuffPlayer(Player* target) {} diff --git a/src/game/playerbot/PlayerbotShamanAI.h b/src/game/playerbot/PlayerbotShamanAI.h index 2b31d64a2..8a87dd128 100644 --- a/src/game/playerbot/PlayerbotShamanAI.h +++ b/src/game/playerbot/PlayerbotShamanAI.h @@ -93,9 +93,6 @@ class MANGOS_DLL_SPEC PlayerbotShamanAI : PlayerbotClassAI // all non combat actions go here, ex buffs, heals, rezzes void DoNonCombatActions(); - // buff a specific player, usually a real PC who is not in group - void BuffPlayer(Player *target); - private: // Heals the target based off its hps void HealTarget (Unit& target, uint8 hp); diff --git a/src/game/playerbot/PlayerbotWarriorAI.cpp b/src/game/playerbot/PlayerbotWarriorAI.cpp index c3874c53c..f4fd8093c 100644 --- a/src/game/playerbot/PlayerbotWarriorAI.cpp +++ b/src/game/playerbot/PlayerbotWarriorAI.cpp @@ -354,5 +354,3 @@ void PlayerbotWarriorAI::DoNonCombatActions() return; } } // end DoNonCombatActions - -void PlayerbotWarriorAI::BuffPlayer(Player* target) {} diff --git a/src/game/playerbot/PlayerbotWarriorAI.h b/src/game/playerbot/PlayerbotWarriorAI.h index 53ea8b9b9..24ba6fb6d 100644 --- a/src/game/playerbot/PlayerbotWarriorAI.h +++ b/src/game/playerbot/PlayerbotWarriorAI.h @@ -81,9 +81,6 @@ class MANGOS_DLL_SPEC PlayerbotWarriorAI : PlayerbotClassAI // all non combat actions go here, ex buffs, heals, rezzes void DoNonCombatActions(); - // buff a specific player, usually a real PC who is not in group - void BuffPlayer(Player *target); - private: // ARMS uint32 BATTLE_STANCE, CHARGE, HEROIC_STRIKE, REND, THUNDER_CLAP, HAMSTRING, MOCKING_BLOW, RETALIATION, SWEEPING_STRIKES, MORTAL_STRIKE, BLADESTORM, HEROIC_THROW, SHATTERING_THROW; From 8ec87b40cfcb7f0fcacd9fb1d5a9619ca91483a2 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Thu, 4 Nov 2010 23:37:06 +0300 Subject: [PATCH 152/187] Update Mage AI to use new buff system. --- src/game/playerbot/PlayerbotMageAI.cpp | 82 +++++++++++++++++--------- src/game/playerbot/PlayerbotMageAI.h | 64 ++++++++++++++++++-- 2 files changed, 113 insertions(+), 33 deletions(-) diff --git a/src/game/playerbot/PlayerbotMageAI.cpp b/src/game/playerbot/PlayerbotMageAI.cpp index 5fb24fa8a..4733db663 100644 --- a/src/game/playerbot/PlayerbotMageAI.cpp +++ b/src/game/playerbot/PlayerbotMageAI.cpp @@ -337,49 +337,77 @@ void PlayerbotMageAI::DoNextCombatManeuver(Unit *pTarget) void PlayerbotMageAI::DoNonCombatActions() { Player * m_bot = GetPlayerBot(); - if (!m_bot) + Player * master = GetMaster(); + + if (!m_bot || !master) return; SpellSequence = SPELL_FROST; PlayerbotAI* ai = GetAI(); - // buff master - if (DALARAN_BRILLIANCE > 0) - (!GetMaster()->HasAura(DALARAN_BRILLIANCE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 81 && ai->CastSpell (DALARAN_BRILLIANCE, *GetMaster())); - else if (ARCANE_BRILLIANCE > 0) - (!GetMaster()->HasAura(ARCANE_BRILLIANCE, EFFECT_INDEX_0) && !GetMaster()->HasAura(DALARAN_BRILLIANCE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 97 && ai->CastSpell (ARCANE_BRILLIANCE, *GetMaster())); - - // buff myself - if (DALARAN_INTELLECT > 0) - (!m_bot->HasAura(DALARAN_INTELLECT, EFFECT_INDEX_0) && !m_bot->HasAura(DALARAN_BRILLIANCE, EFFECT_INDEX_0) && !m_bot->HasAura(ARCANE_BRILLIANCE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 31 && ai->CastSpell (DALARAN_INTELLECT, *m_bot)); - else if (ARCANE_INTELLECT > 0) - (!m_bot->HasAura(ARCANE_INTELLECT, EFFECT_INDEX_0) && !m_bot->HasAura(DALARAN_BRILLIANCE, EFFECT_INDEX_0) && !m_bot->HasAura(ARCANE_BRILLIANCE, EFFECT_INDEX_0) && !m_bot->HasAura(DALARAN_INTELLECT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 37 && ai->CastSpell (ARCANE_INTELLECT, *m_bot)); - - if (MOLTEN_ARMOR > 0) - (!m_bot->HasAura(MOLTEN_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(MAGE_ARMOR, EFFECT_INDEX_0) && ai->GetManaPercent() >= 31 && ai->CastSpell (MOLTEN_ARMOR, *m_bot)); - else if (MAGE_ARMOR > 0) - (!m_bot->HasAura(MAGE_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(MOLTEN_ARMOR, EFFECT_INDEX_0) && ai->GetManaPercent() >= 31 && ai->CastSpell (MAGE_ARMOR, *m_bot)); - else if (ICE_ARMOR > 0) - (!m_bot->HasAura(ICE_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(MOLTEN_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(MAGE_ARMOR, EFFECT_INDEX_0) && ai->GetManaPercent() >= 34 && ai->CastSpell (ICE_ARMOR, *m_bot)); - else if (FROST_ARMOR > 0) - (!m_bot->HasAura(FROST_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(MOLTEN_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(MAGE_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(ICE_ARMOR, EFFECT_INDEX_0) && ai->GetManaPercent() >= 34 && ai->CastSpell (FROST_ARMOR, *m_bot)); + // Buff armor + if (MOLTEN_ARMOR) + { + if (ai->SelfBuff(MOLTEN_ARMOR)) + return; + } + else if (MAGE_ARMOR) + { + if (ai->SelfBuff(MAGE_ARMOR)) + return; + } + else if (ICE_ARMOR) + { + if (ai->SelfBuff(ICE_ARMOR)) + return; + } + else if (FROST_ARMOR) + { + if (ai->SelfBuff(FROST_ARMOR)) + return; + } // buff master's group - if (GetMaster()->GetGroup()) + if (master->GetGroup()) { + // Buff master with group buff... + if ((DALARAN_BRILLIANCE || ARCANE_BRILLIANCE) && ai->HasSpellReagents(ARCANE_BRILLIANCE)) + { + if (DALARAN_BRILLIANCE) + { + if (ai->Buff(DALARAN_BRILLIANCE, master)) + return; + } + else + { + if (ai->Buff(ARCANE_BRILLIANCE, master)) + return; + } + } + + // ...and check group for new members joined or resurrected, or just buff everyone if no group buff available Group::MemberSlotList const& groupSlot = GetMaster()->GetGroup()->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { Player *tPlayer = sObjectMgr.GetPlayer(itr->guid); - if (!tPlayer || !tPlayer->isAlive()) + if (!tPlayer || !tPlayer->isAlive() || tPlayer == m_bot) continue; // buff - (!tPlayer->HasAura(ARCANE_INTELLECT, EFFECT_INDEX_0) && !tPlayer->HasAura(DALARAN_BRILLIANCE, EFFECT_INDEX_0) && !tPlayer->HasAura(ARCANE_BRILLIANCE, EFFECT_INDEX_0) && !tPlayer->HasAura(DALARAN_INTELLECT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 37 && ai->CastSpell (ARCANE_INTELLECT, *tPlayer)); - (!tPlayer->HasAura(DALARAN_INTELLECT, EFFECT_INDEX_0) && !tPlayer->HasAura(DALARAN_BRILLIANCE, EFFECT_INDEX_0) && !tPlayer->HasAura(ARCANE_BRILLIANCE, EFFECT_INDEX_0) && ai->GetManaPercent() >= 31 && ai->CastSpell (DALARAN_INTELLECT, *tPlayer)); - (!tPlayer->HasAura(DAMPEN_MAGIC, EFFECT_INDEX_0) && !tPlayer->HasAura(AMPLIFY_MAGIC, EFFECT_INDEX_0) && ai->GetManaPercent() >= 32 && ai->CastSpell (DAMPEN_MAGIC, *tPlayer)); - (!tPlayer->HasAura(AMPLIFY_MAGIC, EFFECT_INDEX_0) && !tPlayer->HasAura(DAMPEN_MAGIC, EFFECT_INDEX_0) && ai->GetManaPercent() >= 32 && ai->CastSpell (AMPLIFY_MAGIC, *tPlayer)); + if (BuffPlayer(tPlayer)) + return; } + } + // There is no group, buff master + else + { + if (BuffPlayer(master)) + return; + } + + // Buff self finally + if (BuffPlayer(m_bot)) + return; // conjure food & water if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) diff --git a/src/game/playerbot/PlayerbotMageAI.h b/src/game/playerbot/PlayerbotMageAI.h index 894470287..226f373bd 100644 --- a/src/game/playerbot/PlayerbotMageAI.h +++ b/src/game/playerbot/PlayerbotMageAI.h @@ -87,24 +87,76 @@ class MANGOS_DLL_SPEC PlayerbotMageAI : PlayerbotClassAI private: // ARCANE - uint32 ARCANE_MISSILES, ARCANE_EXPLOSION, COUNTERSPELL, SLOW, ARCANE_BARRAGE, ARCANE_BLAST, MIRROR_IMAGE, ARCANE_POWER; + uint32 ARCANE_MISSILES, + ARCANE_EXPLOSION, + COUNTERSPELL, + SLOW, + ARCANE_BARRAGE, + ARCANE_BLAST, + MIRROR_IMAGE, + ARCANE_POWER; // FIRE - uint32 FIREBALL, FIRE_BLAST, FLAMESTRIKE, SCORCH, PYROBLAST, BLAST_WAVE, COMBUSTION, DRAGONS_BREATH, LIVING_BOMB, FROSTFIRE_BOLT, FIRE_WARD; + uint32 FIREBALL, + FIRE_BLAST, + FLAMESTRIKE, + SCORCH, + PYROBLAST, + BLAST_WAVE, + COMBUSTION, + DRAGONS_BREATH, + LIVING_BOMB, + FROSTFIRE_BOLT, + FIRE_WARD; // FROST - uint32 DEEP_FREEZE, FROSTBOLT, FROST_NOVA, BLIZZARD, ICY_VEINS, CONE_OF_COLD, ICE_BARRIER, SUMMON_WATER_ELEMENTAL, ICE_LANCE, FROST_WARD, ICE_BLOCK, COLD_SNAP; + uint32 DEEP_FREEZE, + FROSTBOLT, + FROST_NOVA, + BLIZZARD, + ICY_VEINS, + CONE_OF_COLD, + ICE_BARRIER, + SUMMON_WATER_ELEMENTAL, + ICE_LANCE, + FROST_WARD, + ICE_BLOCK, + COLD_SNAP; // buffs - uint32 FROST_ARMOR, ICE_ARMOR, MAGE_ARMOR, MOLTEN_ARMOR, ARCANE_INTELLECT, ARCANE_BRILLIANCE, DALARAN_INTELLECT, DALARAN_BRILLIANCE, MANA_SHIELD, DAMPEN_MAGIC, AMPLIFY_MAGIC; + uint32 FROST_ARMOR, + ICE_ARMOR, + MAGE_ARMOR, + MOLTEN_ARMOR, + ARCANE_INTELLECT, + ARCANE_BRILLIANCE, + DALARAN_INTELLECT, + DALARAN_BRILLIANCE, + MANA_SHIELD, + DAMPEN_MAGIC, + AMPLIFY_MAGIC; // first aid uint32 RECENTLY_BANDAGED; // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + uint32 ARCANE_TORRENT, + GIFT_OF_THE_NAARU, + STONEFORM, + ESCAPE_ARTIST, + EVERY_MAN_FOR_HIMSELF, + SHADOWMELD, + BLOOD_FURY, + WAR_STOMP, + BERSERKING, + WILL_OF_THE_FORSAKEN; - uint32 SpellSequence, LastSpellArcane, LastSpellFire, LastSpellFrost, CONJURE_WATER, CONJURE_FOOD; + uint32 SpellSequence, + LastSpellArcane, + LastSpellFire, + LastSpellFrost, + CONJURE_WATER, + CONJURE_FOOD; }; #endif From 516aad8053baf5209171f0bceff778bc5ad9a292 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 5 Nov 2010 10:47:08 +0300 Subject: [PATCH 153/187] Work around weird spellchains in spell init. Some spells have spell chains linking to another spells, Prayer of Spirit in case of Divine Spirit for example. Now initSpell checks if next rank is the same spell. --- src/game/playerbot/PlayerbotAI.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index df4a88130..87f83c2fa 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -263,6 +263,10 @@ uint32 PlayerbotAI::initSpell(uint32 spellId) SpellChainMapNext const& nextMap = sSpellMgr.GetSpellChainNext(); for (SpellChainMapNext::const_iterator itr = nextMap.lower_bound(spellId); itr != nextMap.upper_bound(spellId); ++itr) { + // Work around buggy chains + if (sSpellStore.LookupEntry(spellId)->SpellIconID != sSpellStore.LookupEntry(itr->second)->SpellIconID) + continue; + SpellChainNode const* node = sSpellMgr.GetSpellChainNode(itr->second); // If next spell is a requirement for this one then skip it if (node->req == spellId) From 9fed01bdd6b4772052ab3c2dc9df59a0ee39fc9b Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 5 Nov 2010 11:08:13 +0300 Subject: [PATCH 154/187] Check if master is alive before buffing in MageAI --- src/game/playerbot/PlayerbotMageAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotMageAI.cpp b/src/game/playerbot/PlayerbotMageAI.cpp index 4733db663..c470287e3 100644 --- a/src/game/playerbot/PlayerbotMageAI.cpp +++ b/src/game/playerbot/PlayerbotMageAI.cpp @@ -401,7 +401,7 @@ void PlayerbotMageAI::DoNonCombatActions() // There is no group, buff master else { - if (BuffPlayer(master)) + if (master->isAlive() && BuffPlayer(master)) return; } From 5f5da10042ae15e725223b983e73d4f806416181 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 5 Nov 2010 11:09:28 +0300 Subject: [PATCH 155/187] Update PriestAI to use new buff system. Also do some refactoring. No logic changes. --- src/game/playerbot/PlayerbotPriestAI.cpp | 127 ++++++++++++----------- src/game/playerbot/PlayerbotPriestAI.h | 2 +- 2 files changed, 67 insertions(+), 62 deletions(-) diff --git a/src/game/playerbot/PlayerbotPriestAI.cpp b/src/game/playerbot/PlayerbotPriestAI.cpp index 3549c5f27..ddfd10eed 100644 --- a/src/game/playerbot/PlayerbotPriestAI.cpp +++ b/src/game/playerbot/PlayerbotPriestAI.cpp @@ -61,48 +61,27 @@ PlayerbotPriestAI::PlayerbotPriestAI(Player* const master, Player* const bot, Pl PlayerbotPriestAI::~PlayerbotPriestAI() {} -void PlayerbotPriestAI::HealTarget(Unit &target, uint8 hp) +bool PlayerbotPriestAI::HealTarget(Unit* target) { PlayerbotAI* ai = GetAI(); - -// return ((hp < 80 && !target.HasAura(RENEW, EFFECT_INDEX_0) && ai->CastSpell(RENEW, target)) || -// (hp < 60 && ai->CastSpell(HEAL, target)) || -// (hp < 30 && ai->CastSpell(FLASH_HEAL, target)) ); - - if (hp < 25 && FLASH_HEAL > 0 && ai->GetManaPercent() >= 20) - { - ai->TellMaster("I'm casting flash heal."); - ai->CastSpell(FLASH_HEAL, target); - } - else if (hp < 30 && GREATER_HEAL > 0 && ai->GetManaPercent() >= 36) - { - ai->TellMaster("I'm casting one of the sorted heal spells."); - ai->CastSpell(GREATER_HEAL, target); - } - else if (hp < 33 && BINDING_HEAL > 0 && ai->GetManaPercent() >= 27) - { - ai->TellMaster("I'm casting binding heal."); - ai->CastSpell(BINDING_HEAL, target); - } - else if (hp < 40 && PRAYER_OF_HEALING > 0 && ai->GetManaPercent() >= 54) - { - ai->TellMaster("I'm casting prayer of healing."); - ai->CastSpell(PRAYER_OF_HEALING, target); - } - else if (hp < 50 && CIRCLE_OF_HEALING > 0 && ai->GetManaPercent() >= 24) - { - ai->TellMaster("I'm casting circle of healing."); - ai->CastSpell(CIRCLE_OF_HEALING, target); - } - else if (hp < 60 && HEAL > 0 && ai->GetManaPercent() >= 36) - { - ai->TellMaster("I'm casting one of the sorted heal spells."); - ai->CastSpell(HEAL, target); - } - else if (hp < 80 && RENEW > 0 && ai->GetManaPercent() >= 19) - //ai->TellMaster("I'm casting renew."); - ai->CastSpell(RENEW, target); - + uint8 hp = target->GetHealth() * 100 / target->GetMaxHealth(); + + if (hp < 25 && FLASH_HEAL && ai->CastSpell(FLASH_HEAL, *target)) + return true; + else if (hp < 30 && GREATER_HEAL > 0 && ai->CastSpell(GREATER_HEAL, *target)) + return true; + else if (hp < 33 && BINDING_HEAL > 0 && ai->CastSpell(BINDING_HEAL, *target)) + return true; + else if (hp < 40 && PRAYER_OF_HEALING > 0 && ai->CastSpell(PRAYER_OF_HEALING, *target)) + return true; + else if (hp < 50 && CIRCLE_OF_HEALING > 0 && ai->CastSpell(CIRCLE_OF_HEALING, *target)) + return true; + else if (hp < 60 && HEAL > 0 && ai->CastSpell(HEAL, *target)) + return true; + else if (hp < 80 && RENEW > 0 && ai->CastSpell(RENEW, *target)) + return true; + else + return false; } // end HealTarget void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) @@ -149,7 +128,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) ai->CastSpell(DESPERATE_PRAYER, *m_bot); } else if (ai->GetHealthPercent() < 80) - HealTarget (*m_bot, ai->GetHealthPercent()); + HealTarget (m_bot); // Heal master uint32 masterHP = GetMaster()->GetHealth() * 100 / GetMaster()->GetMaxHealth(); @@ -158,7 +137,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) if (masterHP < 25 && POWER_WORD_SHIELD > 0 && !GetMaster()->HasAura(POWER_WORD_SHIELD, EFFECT_INDEX_0)) ai->CastSpell(POWER_WORD_SHIELD, *(GetMaster())); else if (masterHP < 80) - HealTarget (*GetMaster(), masterHP); + HealTarget (GetMaster()); } // Heal group @@ -173,7 +152,7 @@ void PlayerbotPriestAI::DoNextCombatManeuver(Unit *pTarget) uint32 memberHP = m_groupMember->GetHealth() * 100 / m_groupMember->GetMaxHealth(); if (memberHP < 25) - HealTarget(*m_groupMember, memberHP); + HealTarget(m_groupMember); } } @@ -374,21 +353,15 @@ void PlayerbotPriestAI::DoNonCombatActions() { PlayerbotAI* ai = GetAI(); Player * m_bot = GetPlayerBot(); - if (!m_bot) + Player * master = GetMaster(); + if (!m_bot || !master) return; SpellSequence = SPELL_HOLY; - // buff myself - if (POWER_WORD_FORTITUDE > 0) - (!m_bot->HasAura(POWER_WORD_FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell (POWER_WORD_FORTITUDE, *m_bot)); - - if (INNER_FIRE > 0) - (!m_bot->HasAura(INNER_FIRE, EFFECT_INDEX_0) && ai->CastSpell (INNER_FIRE, *m_bot)); - - // buff master - if (POWER_WORD_FORTITUDE > 0) - (!GetMaster()->HasAura(POWER_WORD_FORTITUDE, EFFECT_INDEX_0) && GetMaster()->isAlive() && ai->CastSpell(POWER_WORD_FORTITUDE, *(GetMaster()))); + // selfbuff goes first + if (ai->SelfBuff(INNER_FIRE)) + return; // mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) @@ -427,13 +400,20 @@ void PlayerbotPriestAI::DoNonCombatActions() } // buff and heal master's group - if (GetMaster()->GetGroup()) + if (master->GetGroup()) { + // Buff master with group buffs + if (PRAYER_OF_FORTITUDE && ai->HasSpellReagents(PRAYER_OF_FORTITUDE) && ai->Buff(PRAYER_OF_FORTITUDE, master)) + return; + + if (PRAYER_OF_SPIRIT && ai->HasSpellReagents(PRAYER_OF_SPIRIT) && ai->Buff(PRAYER_OF_SPIRIT, master)) + return; + Group::MemberSlotList const& groupSlot = GetMaster()->GetGroup()->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { Player *tPlayer = sObjectMgr.GetPlayer(itr->guid); - if (!tPlayer) + if (!tPlayer || tPlayer == m_bot) continue; // first rezz em @@ -443,20 +423,45 @@ void PlayerbotPriestAI::DoNonCombatActions() msg += tPlayer->GetName(); GetPlayerBot()->Say(msg, LANG_UNIVERSAL); ai->CastSpell(RESURRECTION, *tPlayer); - // rez is only 10 sec, but give time for lag - ai->SetIgnoreUpdateTime(12); } else if (tPlayer->isAlive()) { // buff and heal - (!tPlayer->HasAura(POWER_WORD_FORTITUDE, EFFECT_INDEX_0) && ai->CastSpell (POWER_WORD_FORTITUDE, *tPlayer)); - (HealTarget(*tPlayer, tPlayer->GetHealth() * 100 / tPlayer->GetMaxHealth())); + if (BuffPlayer(tPlayer)) + return; + + if (HealTarget(tPlayer)) + return; } } } + else + { + if (master->isAlive()) + { + if (BuffPlayer(master)) + return; + if (HealTarget(master)) + return; + } + else + if (ai->CastSpell(RESURRECTION, *master)) + ai->TellMaster("Resurrecting you, Master."); + } + + BuffPlayer(m_bot); } // end DoNonCombatActions bool PlayerbotPriestAI::BuffPlayer(Player* target) { - return GetAI()->CastSpell(POWER_WORD_FORTITUDE, *target); + PlayerbotAI * ai = GetAI(); + if (ai->Buff(POWER_WORD_FORTITUDE, target)) + return true; + + ai->TellMaster("Divine Spirit is %u %s", DIVINE_SPIRIT, sSpellStore.LookupEntry(DIVINE_SPIRIT)->SpellName[0]); + + if (target->getPowerType() == POWER_MANA && ai->Buff(DIVINE_SPIRIT, target)) + return true; + + return false; } diff --git a/src/game/playerbot/PlayerbotPriestAI.h b/src/game/playerbot/PlayerbotPriestAI.h index aefcf5a6a..67df6a67f 100644 --- a/src/game/playerbot/PlayerbotPriestAI.h +++ b/src/game/playerbot/PlayerbotPriestAI.h @@ -89,7 +89,7 @@ class MANGOS_DLL_SPEC PlayerbotPriestAI : PlayerbotClassAI private: // Heals the target based off its hps - void HealTarget (Unit& target, uint8 hp); + bool HealTarget (Unit* target); // holy uint32 BINDING_HEAL, From b3bf29af6b4a926af4e73a038180c120d14b0376 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 5 Nov 2010 11:12:34 +0300 Subject: [PATCH 156/187] Remove debug whisper in PriestAI --- src/game/playerbot/PlayerbotPriestAI.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/game/playerbot/PlayerbotPriestAI.cpp b/src/game/playerbot/PlayerbotPriestAI.cpp index ddfd10eed..ed2d7debb 100644 --- a/src/game/playerbot/PlayerbotPriestAI.cpp +++ b/src/game/playerbot/PlayerbotPriestAI.cpp @@ -458,8 +458,6 @@ bool PlayerbotPriestAI::BuffPlayer(Player* target) if (ai->Buff(POWER_WORD_FORTITUDE, target)) return true; - ai->TellMaster("Divine Spirit is %u %s", DIVINE_SPIRIT, sSpellStore.LookupEntry(DIVINE_SPIRIT)->SpellName[0]); - if (target->getPowerType() == POWER_MANA && ai->Buff(DIVINE_SPIRIT, target)) return true; From 7a25194c2b6fd1a45d60546f28eb5e8c4e842ae0 Mon Sep 17 00:00:00 2001 From: blueboy Date: Sat, 6 Nov 2010 01:30:03 +0000 Subject: [PATCH 157/187] Reverse core change, now use 'p_time' rather than 'update_diff' --- src/game/Player.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index f699815c3..0db9b11db 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -1495,9 +1495,9 @@ void Player::Update( uint32 p_time ) // Playerbot mod if (m_playerbotAI) - m_playerbotAI->UpdateAI(update_diff); + m_playerbotAI->UpdateAI(p_time); else if (m_playerbotMgr) - m_playerbotMgr->UpdateAI(update_diff); + m_playerbotMgr->UpdateAI(p_time); } void Player::SetDeathState(DeathState s) From ea806f33a979b33c02a927b9582f5cf6abe216aa Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sat, 6 Nov 2010 17:16:23 +0300 Subject: [PATCH 158/187] Add callback argument to Buff() method. Druids can cast their buffs only in two forms and resetting form in each non-combat period is very mana ineffective. Since Buff() method combine logic with action there are two ways out: split the method or add a callback which will reset druid form. Splitting the method will expose undesired members to class interface. So callback was chosen. Also initSpell() debug message was made more verbose. --- src/game/playerbot/PlayerbotAI.cpp | 10 +++++++--- src/game/playerbot/PlayerbotAI.h | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 87f83c2fa..40931127e 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -279,10 +279,10 @@ uint32 PlayerbotAI::initSpell(uint32 spellId) } if (next == 0) { - sLog.outDebug("initSpell: Found spellid: %u", spellId); + const SpellEntry* const pSpellInfo = sSpellStore.LookupEntry(spellId); + sLog.outDebug("Playerbot spell init: %s is %u", pSpellInfo->SpellName[0], spellId); // Add spell to spellrange map - const SpellEntry* const pSpellInfo = sSpellStore.LookupEntry(spellId); Spell *spell = new Spell(m_bot, pSpellInfo, false); SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(pSpellInfo->rangeIndex); float range = GetSpellMaxRange(srange, IsPositiveSpell(spellId)); @@ -2425,7 +2425,7 @@ bool PlayerbotAI::CastPetSpell(uint32 spellId, Unit* target) } // Perform sanity checks and cast spell -bool PlayerbotAI::Buff(uint32 spellId, Unit* target) +bool PlayerbotAI::Buff(uint32 spellId, Unit* target, void (*beforeCast)(Player *)) { if (spellId == 0) return false; @@ -2466,6 +2466,10 @@ bool PlayerbotAI::Buff(uint32 spellId, Unit* target) if (!willBenefitFromSpell) return false; + // Druids may need to shapeshift before casting + if (beforeCast) + (*beforeCast)(m_bot); + return CastSpell(spellProto->Id, *target); } diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index d90226615..fd0828f32 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -215,7 +215,7 @@ class MANGOS_DLL_SPEC PlayerbotAI bool CastSpell(uint32 spellId); bool CastSpell(uint32 spellId, Unit& target); bool CastPetSpell(uint32 spellId, Unit* target = NULL); - bool Buff(uint32 spellId, Unit* target); + bool Buff(uint32 spellId, Unit* target, void (*beforeCast)(Player *) = NULL); bool SelfBuff(uint32 spellId); void UseItem(Item& item, uint8 targetSlot = 255); void EquipItem(Item& item); From b2d79c0b01487f56475e040b895aa73566f2f2d6 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sun, 7 Nov 2010 00:02:24 +0300 Subject: [PATCH 159/187] Revise druid AI. * Now AI uses Buff() method with callback argument to reset shapeshift form when it's needed. * Healing was slightly modified and refactored. * Added resurrection code. --- src/game/playerbot/PlayerbotDruidAI.cpp | 173 ++++++++++++++---------- src/game/playerbot/PlayerbotDruidAI.h | 65 +++++++-- 2 files changed, 160 insertions(+), 78 deletions(-) diff --git a/src/game/playerbot/PlayerbotDruidAI.cpp b/src/game/playerbot/PlayerbotDruidAI.cpp index eb11b0e19..2eb4ae2c0 100644 --- a/src/game/playerbot/PlayerbotDruidAI.cpp +++ b/src/game/playerbot/PlayerbotDruidAI.cpp @@ -19,10 +19,10 @@ PlayerbotDruidAI::PlayerbotDruidAI(Player* const master, Player* const bot, Play FORCE_OF_NATURE = ai->initSpell(FORCE_OF_NATURE_1); HURRICANE = ai->initSpell(HURRICANE_1); MARK_OF_THE_WILD = ai->initSpell(MARK_OF_THE_WILD_1); // buffs + GIFT_OF_THE_WILD = ai->initSpell(GIFT_OF_THE_WILD_1); THORNS = ai->initSpell(THORNS_1); BARKSKIN = ai->initSpell(BARKSKIN_1); INNERVATE = ai->initSpell(INNERVATE_1); - MANA_REJUVENATION = 0; // Who on earth put it here? FAERIE_FIRE = ai->initSpell(FAERIE_FIRE_1); // debuffs REJUVENATION = ai->initSpell(REJUVENATION_1); // heals REGROWTH = ai->initSpell(REGROWTH_1); @@ -32,12 +32,14 @@ PlayerbotDruidAI::PlayerbotDruidAI(Player* const master, Player* const bot, Play HEALING_TOUCH = ai->initSpell(HEALING_TOUCH_1); SWIFTMEND = ai->initSpell(SWIFTMEND_1); TRANQUILITY = ai->initSpell(TRANQUILITY_1); + REVIVE = ai->initSpell(REVIVE_1); // Druid Forms MOONKIN_FORM = ai->initSpell(MOONKIN_FORM_1); DIRE_BEAR_FORM = ai->initSpell(DIRE_BEAR_FORM_1); BEAR_FORM = ai->initSpell(BEAR_FORM_1); CAT_FORM = ai->initSpell(CAT_FORM_1); TREE_OF_LIFE = ai->initSpell(TREE_OF_LIFE_1); + TRAVEL_FORM = ai->initSpell(TRAVEL_FORM_1); // Cat Attack type's RAKE = ai->initSpell(RAKE_1); CLAW = ai->initSpell(CLAW_1); // 45 @@ -66,31 +68,39 @@ PlayerbotDruidAI::PlayerbotDruidAI(Player* const master, Player* const bot, Play PlayerbotDruidAI::~PlayerbotDruidAI() {} -void PlayerbotDruidAI::HealTarget(Unit &target, uint8 hp) +bool PlayerbotDruidAI::HealTarget(Unit *target) { PlayerbotAI* ai = GetAI(); - Player *m_bot = GetPlayerBot(); + uint8 hp = target->GetHealth() * 100 / target->GetMaxHealth(); + + if (hp >= 70) + return false; + + // Reset form if needed + GoBuffForm(GetPlayerBot()); - if (hp < 70 && REJUVENATION > 0 && !target.HasAura(REJUVENATION, EFFECT_INDEX_0) && !target.HasAura(REGROWTH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 21) - ai->CastSpell(REJUVENATION, target); + if (hp < 70 && REJUVENATION > 0 && !target->HasAura(REJUVENATION) && ai->CastSpell(REJUVENATION, *target)) + return true; - if (hp < 60 && LIFEBLOOM > 0 && !target.HasAura(LIFEBLOOM, EFFECT_INDEX_0) && ai->GetManaPercent() >= 28) - ai->CastSpell(LIFEBLOOM, target); + if (hp < 60 && LIFEBLOOM > 0 && !target->HasAura(LIFEBLOOM) && ai->CastSpell(LIFEBLOOM,*target)) + return true; - if (hp < 55 && REGROWTH > 0 && !target.HasAura(REGROWTH, EFFECT_INDEX_0) && !target.HasAura(REJUVENATION, EFFECT_INDEX_0) && ai->GetManaPercent() >= 33) - ai->CastSpell(REGROWTH, target); + if (hp < 55 && REGROWTH > 0 && !target->HasAura(REGROWTH) && ai->CastSpell(REGROWTH, *target)) + return true; - if (hp < 50 && SWIFTMEND > 0 && target.HasAura(REJUVENATION, EFFECT_INDEX_0) || target.HasAura(REGROWTH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 16) - ai->CastSpell(SWIFTMEND, target); + if (hp < 50 && SWIFTMEND > 0 && (target->HasAura(REJUVENATION) || target->HasAura(REGROWTH)) && ai->CastSpell(SWIFTMEND, *target)) + return true; - if (hp < 45 && WILD_GROWTH > 0 && !target.HasAura(WILD_GROWTH, EFFECT_INDEX_0) && ai->GetManaPercent() >= 26) - ai->CastSpell(WILD_GROWTH, target); + if (hp < 45 && WILD_GROWTH > 0 && !target->HasAura(WILD_GROWTH) && ai->CastSpell(WILD_GROWTH, *target)) + return true; - if (hp < 30 && NOURISH > 0 && ai->GetManaPercent() >= 18) - ai->CastSpell(NOURISH, target); + if (hp < 30 && NOURISH > 0 && ai->CastSpell(NOURISH, *target)) + return true; - if (hp < 25 && HEALING_TOUCH > 0 && ai->GetManaPercent() >= 38) - ai->CastSpell(HEALING_TOUCH, target); + if (hp < 25 && HEALING_TOUCH > 0 && ai->CastSpell(HEALING_TOUCH, *target)) + return true; + + return false; } // end HealTarget void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) @@ -218,12 +228,6 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) DruidSpellCombat++; break; } - else if (MANA_REJUVENATION > 0 && m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0) && ai->GetManaPercent() < 50 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0) && DruidSpellCombat < 12 && !m_bot->HasAura(MANA_REJUVENATION, EFFECT_INDEX_0)) - { - ai->CastSpell(MANA_REJUVENATION, *m_bot); - DruidSpellCombat++; - break; - } else if (ENRAGE > 0 && (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0) || m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) && DruidSpellCombat < 2 && !m_bot->HasAura(ENRAGE, EFFECT_INDEX_0)) { ai->CastSpell(ENRAGE, *m_bot); @@ -367,12 +371,6 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) DruidSpellCombat++; break; } - else if (MANA_REJUVENATION > 0 && ai->GetManaPercent() < 50 && DruidSpellCombat < 12 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0) && !m_bot->HasAura(MANA_REJUVENATION, EFFECT_INDEX_0)) - { - ai->CastSpell(MANA_REJUVENATION, *m_bot); - DruidSpellCombat++; - break; - } else if (DruidSpellCombat > 13) { DruidSpellCombat = 0; @@ -413,12 +411,12 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) } if (ai->GetHealthPercent() <= 40) { - HealTarget (*m_bot, ai->GetHealthPercent()); + HealTarget (m_bot); break; } if (masterHP <= 40) { - HealTarget (*GetMaster(), masterHP); + HealTarget (GetMaster()); break; } else @@ -543,31 +541,12 @@ void PlayerbotDruidAI::DoNextCombatManeuver(Unit *pTarget) void PlayerbotDruidAI::DoNonCombatActions() { Player * m_bot = GetPlayerBot(); - if (!m_bot) + Player * master = GetMaster(); + if (!m_bot || !master) return; PlayerbotAI* ai = GetAI(); - if (m_bot->HasAura(CAT_FORM, EFFECT_INDEX_0)) - m_bot->RemoveAurasDueToSpell(768); - //ai->TellMaster("FormClearCat"); - if (m_bot->HasAura(BEAR_FORM, EFFECT_INDEX_0)) - m_bot->RemoveAurasDueToSpell(5487); - //ai->TellMaster("FormClearBear"); - if (m_bot->HasAura(DIRE_BEAR_FORM, EFFECT_INDEX_0)) - m_bot->RemoveAurasDueToSpell(9634); - //ai->TellMaster("FormClearDireBear"); - if (m_bot->HasAura(MOONKIN_FORM, EFFECT_INDEX_0)) - m_bot->RemoveAurasDueToSpell(24858); - //ai->TellMaster("FormClearMoonkin"); - // buff myself with MARK_OF_THE_WILD - if (MARK_OF_THE_WILD > 0 && !m_bot->HasAura(MARK_OF_THE_WILD, EFFECT_INDEX_0)) - ai->CastSpell (MARK_OF_THE_WILD, *m_bot); - - // Thorns generates aggro for moonkin - if (THORNS > 0 && !m_bot->HasAura(THORNS, EFFECT_INDEX_0)) - ai->CastSpell (THORNS, *m_bot); - // mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); @@ -582,18 +561,8 @@ void PlayerbotDruidAI::DoNonCombatActions() ai->SetIgnoreUpdateTime(30); return; } - else if (pItem == NULL && INNERVATE > 0 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0) && ai->GetManaPercent() <= 70) - { - ai->CastSpell(INNERVATE, *m_bot); - //ai->TellMaster("casting innervate."); + else if (!pItem && INNERVATE > 0 && !m_bot->HasAura(INNERVATE) && ai->GetManaPercent() <= 20 && ai->CastSpell(INNERVATE, *m_bot)) return; - } - else if (pItem == NULL && MANA_REJUVENATION > 0 && !m_bot->HasAura(INNERVATE, EFFECT_INDEX_0) && !m_bot->HasAura(MANA_REJUVENATION, EFFECT_INDEX_0) && ai->GetManaPercent() <= 70) - { - ai->CastSpell(MANA_REJUVENATION, *m_bot); - //ai->TellMaster("casting mana rejuvenation."); - return; - } // hp check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) @@ -617,24 +586,88 @@ void PlayerbotDruidAI::DoNonCombatActions() } // buff and heal master's group - if (GetMaster()->GetGroup()) + if (master->GetGroup()) { + // Buff master with group buff + if (master->isAlive() && GIFT_OF_THE_WILD && ai->HasSpellReagents(GIFT_OF_THE_WILD) && ai->Buff(GIFT_OF_THE_WILD, master)) + return; + Group::MemberSlotList const& groupSlot = GetMaster()->GetGroup()->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { Player *tPlayer = sObjectMgr.GetPlayer(itr->guid); - if (!tPlayer || !tPlayer->isAlive()) + if (!tPlayer || tPlayer == m_bot) continue; - // buff and heal - (!tPlayer->HasAura(MARK_OF_THE_WILD, EFFECT_INDEX_0) && ai->CastSpell (MARK_OF_THE_WILD, *tPlayer)); - //(!tPlayer->HasAura(THORNS, EFFECT_INDEX_0) && ai->CastSpell (THORNS, *tPlayer)); - (HealTarget(*tPlayer, tPlayer->GetHealth() * 100 / tPlayer->GetMaxHealth())); + // Resurrect member if needed + if (!tPlayer->isAlive()) + { + std::string msg = "Resurrecting "; + msg += tPlayer->GetName(); + m_bot->Say(msg, LANG_UNIVERSAL); + ai->CastSpell(REVIVE, *tPlayer); + } + else if (tPlayer->isAlive()) + { + // buff and heal + if (BuffPlayer(tPlayer)) + return; + + if (HealTarget(tPlayer)) + return; + } + } + } + else + { + if (master->isAlive()) + { + if (BuffPlayer(master)) + return; + if (HealTarget(master)) + return; } + else + if (ai->CastSpell(REVIVE, *master)) + ai->TellMaster("Resurrecting you, Master."); } + + BuffPlayer(m_bot); } // end DoNonCombatActions bool PlayerbotDruidAI::BuffPlayer(Player* target) { - GetAI()->CastSpell(MARK_OF_THE_WILD, *target); + PlayerbotAI * ai = GetAI(); + + Pet * pet = target->GetPet(); + if (pet) + { + if (ai->Buff(MARK_OF_THE_WILD, pet, &(PlayerbotDruidAI::GoBuffForm))) + return true; + else if (ai->Buff(THORNS, pet, &(PlayerbotDruidAI::GoBuffForm))) + return true; + } + + if (ai->Buff(MARK_OF_THE_WILD, target, &(PlayerbotDruidAI::GoBuffForm))) + return true; + else if (ai->Buff(THORNS, target, &(PlayerbotDruidAI::GoBuffForm))) + return true; + else + return false; +} + +void PlayerbotDruidAI::GoBuffForm(Player *self) +{ + // RANK_1 spell ids used because this is a static method which does not have access to instance. + // There is only one rank for these spells anyway. + if (self->HasAura(CAT_FORM_1)) + self->RemoveAurasDueToSpell(CAT_FORM_1); + if (self->HasAura(BEAR_FORM_1)) + self->RemoveAurasDueToSpell(BEAR_FORM_1); + if (self->HasAura(DIRE_BEAR_FORM_1)) + self->RemoveAurasDueToSpell(DIRE_BEAR_FORM_1); + if (self->HasAura(MOONKIN_FORM_1)) + self->RemoveAurasDueToSpell(MOONKIN_FORM_1); + if (self->HasAura(TRAVEL_FORM_1)) + self->RemoveAurasDueToSpell(TRAVEL_FORM_1); } diff --git a/src/game/playerbot/PlayerbotDruidAI.h b/src/game/playerbot/PlayerbotDruidAI.h index 3a7c10c11..9399289fe 100644 --- a/src/game/playerbot/PlayerbotDruidAI.h +++ b/src/game/playerbot/PlayerbotDruidAI.h @@ -108,31 +108,80 @@ class MANGOS_DLL_SPEC PlayerbotDruidAI : PlayerbotClassAI private: // Heals the target based off its hps - void HealTarget (Unit& target, uint8 hp); + bool HealTarget (Unit *target); + // Callback method to reset shapeshift forms blocking buffs and heals + static void GoBuffForm(Player *self); // druid cat/bear/dire bear/moonkin/tree of life forms - uint32 CAT_FORM, BEAR_FORM, DIRE_BEAR_FORM, MOONKIN_FORM, TREE_OF_LIFE; + uint32 CAT_FORM, + BEAR_FORM, + DIRE_BEAR_FORM, + MOONKIN_FORM, + TREE_OF_LIFE, + TRAVEL_FORM; // druid cat attacks - uint32 CLAW, COWER, TIGERS_FURY, RAKE, RIP, FEROCIOUS_BITE, MAIM, MANGLE; + uint32 CLAW, + COWER, + TIGERS_FURY, + RAKE, + RIP, + FEROCIOUS_BITE, + MAIM, + MANGLE; // druid bear/dire bear attacks & buffs - uint32 BASH, MAUL, SWIPE, DEMORALIZING_ROAR, CHALLENGING_ROAR, GROWL, ENRAGE; + uint32 BASH, + MAUL, + SWIPE, + DEMORALIZING_ROAR, + CHALLENGING_ROAR, + GROWL, + ENRAGE; // druid attacks & debuffs - uint32 MOONFIRE, ROOTS, WRATH, STARFALL, STARFIRE, INSECT_SWARM, FAERIE_FIRE, FORCE_OF_NATURE, HURRICANE; + uint32 MOONFIRE, + ROOTS, + WRATH, + STARFALL, + STARFIRE, + INSECT_SWARM, + FAERIE_FIRE, + FORCE_OF_NATURE, + HURRICANE; // druid buffs - uint32 MARK_OF_THE_WILD, THORNS, MANA_REJUVENATION, INNERVATE, BARKSKIN; + uint32 MARK_OF_THE_WILD, + GIFT_OF_THE_WILD, + THORNS, + INNERVATE, + BARKSKIN; // druid heals - uint32 LIFEBLOOM, REJUVENATION, REGROWTH, NOURISH, HEALING_TOUCH, WILD_GROWTH, SWIFTMEND, TRANQUILITY; + uint32 LIFEBLOOM, + REJUVENATION, + REGROWTH, + NOURISH, + HEALING_TOUCH, + WILD_GROWTH, + SWIFTMEND, + TRANQUILITY, + REVIVE; // first aid uint32 RECENTLY_BANDAGED; // racial - uint32 ARCANE_TORRENT, GIFT_OF_THE_NAARU, STONEFORM, ESCAPE_ARTIST, EVERY_MAN_FOR_HIMSELF, SHADOWMELD, BLOOD_FURY, WAR_STOMP, BERSERKING, WILL_OF_THE_FORSAKEN; + uint32 ARCANE_TORRENT, + GIFT_OF_THE_NAARU, + STONEFORM, + ESCAPE_ARTIST, + EVERY_MAN_FOR_HIMSELF, + SHADOWMELD, + BLOOD_FURY, + WAR_STOMP, + BERSERKING, + WILL_OF_THE_FORSAKEN; uint32 SpellSequence, DruidSpellCombat; }; From 4f89f844ebfb35428d84fc0228b515b489217ca7 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sun, 7 Nov 2010 00:15:06 +0300 Subject: [PATCH 160/187] Minor updates to buff related code for priest and mage. --- src/game/playerbot/PlayerbotMageAI.cpp | 6 ++++++ src/game/playerbot/PlayerbotPriestAI.cpp | 23 +++++++++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/game/playerbot/PlayerbotMageAI.cpp b/src/game/playerbot/PlayerbotMageAI.cpp index c470287e3..ce61f847d 100644 --- a/src/game/playerbot/PlayerbotMageAI.cpp +++ b/src/game/playerbot/PlayerbotMageAI.cpp @@ -465,6 +465,12 @@ void PlayerbotMageAI::DoNonCombatActions() bool PlayerbotMageAI::BuffPlayer(Player* target) { + PlayerbotAI * ai = GetAI(); + Pet * pet = target->GetPet(); + + if (pet && pet->getPowerType() == POWER_MANA && ai->Buff(ARCANE_INTELLECT, pet)) + return true; + if (DALARAN_INTELLECT) return GetAI()->Buff(DALARAN_INTELLECT, target); else if (ARCANE_INTELLECT) diff --git a/src/game/playerbot/PlayerbotPriestAI.cpp b/src/game/playerbot/PlayerbotPriestAI.cpp index ed2d7debb..868bacc18 100644 --- a/src/game/playerbot/PlayerbotPriestAI.cpp +++ b/src/game/playerbot/PlayerbotPriestAI.cpp @@ -66,6 +66,9 @@ bool PlayerbotPriestAI::HealTarget(Unit* target) PlayerbotAI* ai = GetAI(); uint8 hp = target->GetHealth() * 100 / target->GetMaxHealth(); + if (hp >= 80) + return false; + if (hp < 25 && FLASH_HEAL && ai->CastSpell(FLASH_HEAL, *target)) return true; else if (hp < 30 && GREATER_HEAL > 0 && ai->CastSpell(GREATER_HEAL, *target)) @@ -403,11 +406,14 @@ void PlayerbotPriestAI::DoNonCombatActions() if (master->GetGroup()) { // Buff master with group buffs - if (PRAYER_OF_FORTITUDE && ai->HasSpellReagents(PRAYER_OF_FORTITUDE) && ai->Buff(PRAYER_OF_FORTITUDE, master)) - return; + if (master->isAlive()) + { + if (PRAYER_OF_FORTITUDE && ai->HasSpellReagents(PRAYER_OF_FORTITUDE) && ai->Buff(PRAYER_OF_FORTITUDE, master)) + return; - if (PRAYER_OF_SPIRIT && ai->HasSpellReagents(PRAYER_OF_SPIRIT) && ai->Buff(PRAYER_OF_SPIRIT, master)) - return; + if (PRAYER_OF_SPIRIT && ai->HasSpellReagents(PRAYER_OF_SPIRIT) && ai->Buff(PRAYER_OF_SPIRIT, master)) + return; + } Group::MemberSlotList const& groupSlot = GetMaster()->GetGroup()->GetMemberSlots(); for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) @@ -421,7 +427,7 @@ void PlayerbotPriestAI::DoNonCombatActions() { std::string msg = "Resurrecting "; msg += tPlayer->GetName(); - GetPlayerBot()->Say(msg, LANG_UNIVERSAL); + m_bot->Say(msg, LANG_UNIVERSAL); ai->CastSpell(RESURRECTION, *tPlayer); } else if (tPlayer->isAlive()) @@ -455,10 +461,15 @@ void PlayerbotPriestAI::DoNonCombatActions() bool PlayerbotPriestAI::BuffPlayer(Player* target) { PlayerbotAI * ai = GetAI(); + Pet * pet = target->GetPet(); + + if (pet && ai->Buff(POWER_WORD_FORTITUDE, pet)) + return true; + if (ai->Buff(POWER_WORD_FORTITUDE, target)) return true; - if (target->getPowerType() == POWER_MANA && ai->Buff(DIVINE_SPIRIT, target)) + if ((target->getClass() == CLASS_DRUID || target->getPowerType() == POWER_MANA) && ai->Buff(DIVINE_SPIRIT, target)) return true; return false; From 1bdade2213446e6a334c57c94778effe53952540 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sun, 7 Nov 2010 22:43:04 +0300 Subject: [PATCH 161/187] Remove annoying debug whisper. Also fix paladin blessings init. --- src/game/playerbot/PlayerbotAI.cpp | 4 ---- src/game/playerbot/PlayerbotPaladinAI.cpp | 8 ++++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 40931127e..a481d81c5 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2437,12 +2437,8 @@ bool PlayerbotAI::Buff(uint32 spellId, Unit* target, void (*beforeCast)(Player * // Select appropriate spell rank for target's level spellProto = sSpellMgr.SelectAuraRankForLevel(spellProto, target->getLevel()); - if (!spellProto) - { - TellMaster("No spell rank found for target %s", target->GetName()); return false; - } // Check if spell will boost one of already existent auras bool willBenefitFromSpell = false; diff --git a/src/game/playerbot/PlayerbotPaladinAI.cpp b/src/game/playerbot/PlayerbotPaladinAI.cpp index f8258da31..d6cea1b5a 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.cpp +++ b/src/game/playerbot/PlayerbotPaladinAI.cpp @@ -37,10 +37,10 @@ PlayerbotPaladinAI::PlayerbotPaladinAI(Player* const master, Player* const bot, EXORCISM = ai->initSpell(EXORCISM_1); SACRED_SHIELD = ai->initSpell(SACRED_SHIELD_1); DIVINE_PLEA = ai->initSpell(DIVINE_PLEA_1); - BLESSING_OF_KINGS = BLESSING_OF_KINGS_1; - GREATER_BLESSING_OF_KINGS = GREATER_BLESSING_OF_KINGS_1; - BLESSING_OF_SANCTUARY = BLESSING_OF_SANCTUARY_1; - GREATER_BLESSING_OF_SANCTUARY = GREATER_BLESSING_OF_SANCTUARY_1; + BLESSING_OF_KINGS = ai->initSpell(BLESSING_OF_KINGS_1); + GREATER_BLESSING_OF_KINGS = ai->initSpell(GREATER_BLESSING_OF_KINGS_1); + BLESSING_OF_SANCTUARY = ai->initSpell(BLESSING_OF_SANCTUARY_1); + GREATER_BLESSING_OF_SANCTUARY = ai->initSpell(GREATER_BLESSING_OF_SANCTUARY_1); HAMMER_OF_JUSTICE = ai->initSpell(HAMMER_OF_JUSTICE_1); RIGHTEOUS_FURY = ai->initSpell(RIGHTEOUS_FURY_1); RIGHTEOUS_DEFENSE = ai->initSpell(RIGHTEOUS_DEFENSE_1); From 09fc5d0058d8c0d332341819bf4d3ec65639e85f Mon Sep 17 00:00:00 2001 From: chelobaka Date: Mon, 8 Nov 2010 21:57:27 +0300 Subject: [PATCH 162/187] Make paladin bots use greater blessings when possible. Also fix pet buffing. --- src/game/playerbot/PlayerbotPaladinAI.cpp | 96 +++++++++++++++++++---- src/game/playerbot/PlayerbotPaladinAI.h | 4 +- 2 files changed, 81 insertions(+), 19 deletions(-) diff --git a/src/game/playerbot/PlayerbotPaladinAI.cpp b/src/game/playerbot/PlayerbotPaladinAI.cpp index d6cea1b5a..8fca74929 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.cpp +++ b/src/game/playerbot/PlayerbotPaladinAI.cpp @@ -386,11 +386,14 @@ void PlayerbotPaladinAI::DoNonCombatActions() bool PlayerbotPaladinAI::BuffPlayer(Player* target) { PlayerbotAI * ai = GetAI(); - Pet * pet = target->GetPet(); uint8 SPELL_BLESSING = 2; // See SpellSpecific enum in SpellMgr.h - // Check if target already has my blessing - if (!ai->CanReceiveSpecificSpell(SPELL_BLESSING, target)) + Pet * pet = target->GetPet(); + bool petCanBeBlessed = false; + if (pet) + petCanBeBlessed = ai->CanReceiveSpecificSpell(SPELL_BLESSING, pet); + + if (!ai->CanReceiveSpecificSpell(SPELL_BLESSING, target) && !petCanBeBlessed) return false; switch (target->getClass()) @@ -398,43 +401,102 @@ bool PlayerbotPaladinAI::BuffPlayer(Player* target) case CLASS_DRUID: case CLASS_SHAMAN: case CLASS_PALADIN: - if (ai->Buff(BLESSING_OF_MIGHT, target)) + if (Bless(BLESSING_OF_MIGHT, target)) return true; - else if (ai->Buff(BLESSING_OF_KINGS, target)) + if (Bless(BLESSING_OF_KINGS, target)) return true; - else if (ai->Buff(BLESSING_OF_WISDOM, target)) + if (Bless(BLESSING_OF_WISDOM, target)) return true; - else if (ai->Buff(BLESSING_OF_SANCTUARY, target)) + if (Bless(BLESSING_OF_SANCTUARY, target)) return true; else return false; case CLASS_DEATH_KNIGHT: case CLASS_HUNTER: - if (pet) - if (ai->Buff(BLESSING_OF_MIGHT, target)) + if (petCanBeBlessed) + if (Bless(BLESSING_OF_MIGHT, pet)) + return true; + if (Bless(BLESSING_OF_KINGS, pet)) return true; - else if (ai->Buff(BLESSING_OF_KINGS, target)) + if (Bless(BLESSING_OF_SANCTUARY, pet)) return true; case CLASS_ROGUE: case CLASS_WARRIOR: - if (ai->Buff(BLESSING_OF_MIGHT, target)) + if (Bless(BLESSING_OF_MIGHT, target)) return true; - else if (ai->Buff(BLESSING_OF_KINGS, target)) + if (Bless(BLESSING_OF_KINGS, target)) return true; - else if (ai->Buff(BLESSING_OF_SANCTUARY, target)) + if (Bless(BLESSING_OF_SANCTUARY, target)) return true; else return false; + case CLASS_WARLOCK: + if (petCanBeBlessed) + { + if (pet->getPowerType() == POWER_MANA) + { + if (Bless(BLESSING_OF_WISDOM, pet)) + return true; + } + else + { + if (Bless(BLESSING_OF_MIGHT, pet)) + return true; + } + if (Bless(BLESSING_OF_KINGS, pet)) + return true; + if (Bless(BLESSING_OF_SANCTUARY, pet)) + return true; + } case CLASS_PRIEST: case CLASS_MAGE: - case CLASS_WARLOCK: - if (ai->Buff(BLESSING_OF_WISDOM, target)) + if (Bless(BLESSING_OF_WISDOM, target)) return true; - else if (ai->Buff(BLESSING_OF_KINGS, target)) + if (Bless(BLESSING_OF_KINGS, target)) return true; - else if (ai->Buff(BLESSING_OF_SANCTUARY, target)) + if (Bless(BLESSING_OF_SANCTUARY, target)) return true; else return false; } } + +bool PlayerbotPaladinAI::Bless(uint32 spellId, Unit *target) +{ + if (spellId == 0) + return false; + + PlayerbotAI * ai = GetAI(); + + if (spellId == BLESSING_OF_MIGHT) + { + if (GREATER_BLESSING_OF_MIGHT && ai->HasSpellReagents(GREATER_BLESSING_OF_MIGHT) && ai->Buff(GREATER_BLESSING_OF_MIGHT, target)) + return true; + else + return ai->Buff(spellId, target); + } + else if (spellId == BLESSING_OF_WISDOM) + { + if (GREATER_BLESSING_OF_WISDOM && ai->HasSpellReagents(GREATER_BLESSING_OF_WISDOM) && ai->Buff(GREATER_BLESSING_OF_WISDOM, target)) + return true; + else + return ai->Buff(spellId, target); + } + else if (spellId == BLESSING_OF_KINGS) + { + if (GREATER_BLESSING_OF_KINGS && ai->HasSpellReagents(GREATER_BLESSING_OF_KINGS) && ai->Buff(GREATER_BLESSING_OF_KINGS, target)) + return true; + else + return ai->Buff(spellId, target); + } + else if (spellId == BLESSING_OF_SANCTUARY) + { + if (GREATER_BLESSING_OF_SANCTUARY && ai->HasSpellReagents(GREATER_BLESSING_OF_SANCTUARY) && ai->Buff(GREATER_BLESSING_OF_SANCTUARY, target)) + return true; + else + return ai->Buff(spellId, target); + } + + // Should not happen, but let it be here + return false; +} diff --git a/src/game/playerbot/PlayerbotPaladinAI.h b/src/game/playerbot/PlayerbotPaladinAI.h index 97c992597..d49401649 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.h +++ b/src/game/playerbot/PlayerbotPaladinAI.h @@ -96,8 +96,8 @@ class MANGOS_DLL_SPEC PlayerbotPaladinAI : PlayerbotClassAI private: // Heals the target based off its hps void HealTarget (Unit& target, uint8 hp); - // Cast on of the blessings on target using list. - void BuffBlessing(Unit* target, uint8 listSize, ...); + // Bless target using greater blessing if possible + bool Bless(uint32 spellId, Unit *target); // Retribution uint32 RETRIBUTION_AURA, From 3b7d275433f78d24e5ba493269986597964d6f16 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Mon, 8 Nov 2010 22:10:29 +0300 Subject: [PATCH 163/187] Do not use dalaran intellect since it doesn't downrank. --- src/game/playerbot/PlayerbotMageAI.cpp | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/game/playerbot/PlayerbotMageAI.cpp b/src/game/playerbot/PlayerbotMageAI.cpp index ce61f847d..049a6b241 100644 --- a/src/game/playerbot/PlayerbotMageAI.cpp +++ b/src/game/playerbot/PlayerbotMageAI.cpp @@ -371,18 +371,10 @@ void PlayerbotMageAI::DoNonCombatActions() if (master->GetGroup()) { // Buff master with group buff... - if ((DALARAN_BRILLIANCE || ARCANE_BRILLIANCE) && ai->HasSpellReagents(ARCANE_BRILLIANCE)) + if (ARCANE_BRILLIANCE && ai->HasSpellReagents(ARCANE_BRILLIANCE)) { - if (DALARAN_BRILLIANCE) - { - if (ai->Buff(DALARAN_BRILLIANCE, master)) - return; - } - else - { - if (ai->Buff(ARCANE_BRILLIANCE, master)) - return; - } + if (ai->Buff(ARCANE_BRILLIANCE, master)) + return; } // ...and check group for new members joined or resurrected, or just buff everyone if no group buff available @@ -471,10 +463,8 @@ bool PlayerbotMageAI::BuffPlayer(Player* target) if (pet && pet->getPowerType() == POWER_MANA && ai->Buff(ARCANE_INTELLECT, pet)) return true; - if (DALARAN_INTELLECT) - return GetAI()->Buff(DALARAN_INTELLECT, target); - else if (ARCANE_INTELLECT) - return GetAI()->Buff(ARCANE_INTELLECT, target); + if (ARCANE_INTELLECT) + return ai->Buff(ARCANE_INTELLECT, target); else return false; } From 71024fae619579d47458e2794d6af61d286995f7 Mon Sep 17 00:00:00 2001 From: blueboy Date: Wed, 10 Nov 2010 00:22:59 +0000 Subject: [PATCH 164/187] Fix core change, now use 'update_diff' rather than 'p_time' --- src/game/Player.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index a0ec09940..d0eb8077e 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -1491,9 +1491,9 @@ void Player::Update(uint32 update_diff, uint32 tick_diff) // Playerbot mod if (m_playerbotAI) - m_playerbotAI->UpdateAI(p_time); + m_playerbotAI->UpdateAI(update_diff); else if (m_playerbotMgr) - m_playerbotMgr->UpdateAI(p_time); + m_playerbotMgr->UpdateAI(update_diff); } void Player::SetDeathState(DeathState s) From 798494e6e4e10c96d48160b524aa540f2fbfc1e6 Mon Sep 17 00:00:00 2001 From: blueboy Date: Wed, 10 Nov 2010 08:16:13 +0000 Subject: [PATCH 165/187] Reverse core change, now use 'p_time' rather than 'update_diff' --- src/game/Player.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 7c6155984..cdc13f93c 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -1495,9 +1495,9 @@ void Player::Update( uint32 p_time ) // Playerbot mod if (m_playerbotAI) - m_playerbotAI->UpdateAI(update_diff); + m_playerbotAI->UpdateAI(p_time); else if (m_playerbotMgr) - m_playerbotMgr->UpdateAI(update_diff); + m_playerbotMgr->UpdateAI(p_time); } void Player::SetDeathState(DeathState s) From 29c5be7a7514da8e1cba69dfccde2bf00aa5c2ae Mon Sep 17 00:00:00 2001 From: chelobaka Date: Wed, 10 Nov 2010 21:34:50 +0300 Subject: [PATCH 166/187] Make paladins use redemption. Also fixed resurrection part for priests and druids. --- src/game/playerbot/PlayerbotDruidAI.cpp | 15 ++++++++++----- src/game/playerbot/PlayerbotPaladinAI.cpp | 17 ++++++++++++++++- src/game/playerbot/PlayerbotPaladinAI.h | 1 + src/game/playerbot/PlayerbotPriestAI.cpp | 15 ++++++++++----- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/game/playerbot/PlayerbotDruidAI.cpp b/src/game/playerbot/PlayerbotDruidAI.cpp index 2eb4ae2c0..6ff97614c 100644 --- a/src/game/playerbot/PlayerbotDruidAI.cpp +++ b/src/game/playerbot/PlayerbotDruidAI.cpp @@ -602,12 +602,17 @@ void PlayerbotDruidAI::DoNonCombatActions() // Resurrect member if needed if (!tPlayer->isAlive()) { - std::string msg = "Resurrecting "; - msg += tPlayer->GetName(); - m_bot->Say(msg, LANG_UNIVERSAL); - ai->CastSpell(REVIVE, *tPlayer); + if (ai->CastSpell(REVIVE, *tPlayer)) + { + std::string msg = "Resurrecting "; + msg += tPlayer->GetName(); + m_bot->Say(msg, LANG_UNIVERSAL); + return; + } + else + continue; } - else if (tPlayer->isAlive()) + else { // buff and heal if (BuffPlayer(tPlayer)) diff --git a/src/game/playerbot/PlayerbotPaladinAI.cpp b/src/game/playerbot/PlayerbotPaladinAI.cpp index 8fca74929..449b8be0c 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.cpp +++ b/src/game/playerbot/PlayerbotPaladinAI.cpp @@ -57,6 +57,8 @@ PlayerbotPaladinAI::PlayerbotPaladinAI(Player* const master, Player* const bot, AVENGERS_SHIELD = ai->initSpell(AVENGERS_SHIELD_1); HAND_OF_SACRIFICE = ai->initSpell(HAND_OF_SACRIFICE_1); SHIELD_OF_RIGHTEOUSNESS = ai->initSpell(SHIELD_OF_RIGHTEOUSNESS_1); + REDEMPTION = ai->initSpell(REDEMPTION_1); + // Warrior auras DEFENSIVE_STANCE = 71; //Def Stance BERSERKER_STANCE = 2458; //Ber Stance @@ -372,9 +374,22 @@ void PlayerbotPaladinAI::DoNonCombatActions() for (Group::member_citerator itr = groupSlot.begin(); itr != groupSlot.end(); itr++) { Player *tPlayer = sObjectMgr.GetPlayer(itr->guid); - if (!tPlayer || !tPlayer->isAlive()) + if (!tPlayer) continue; + if (!tPlayer->isAlive()) + { + if (ai->CastSpell(REDEMPTION, *tPlayer)) + { + std::string msg = "Resurrecting "; + msg += tPlayer->GetName(); + m_bot->Say(msg, LANG_UNIVERSAL); + return; + } + else + continue; + } + HealTarget(*tPlayer, tPlayer->GetHealth() * 100 / tPlayer->GetMaxHealth()); if (tPlayer != m_bot && tPlayer != GetMaster()) if (BuffPlayer(tPlayer)) diff --git a/src/game/playerbot/PlayerbotPaladinAI.h b/src/game/playerbot/PlayerbotPaladinAI.h index d49401649..27df47306 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.h +++ b/src/game/playerbot/PlayerbotPaladinAI.h @@ -129,6 +129,7 @@ class MANGOS_DLL_SPEC PlayerbotPaladinAI : PlayerbotClassAI HOLY_WRATH, LAY_ON_HANDS, EXORCISM, + REDEMPTION, DIVINE_PLEA; // Protection diff --git a/src/game/playerbot/PlayerbotPriestAI.cpp b/src/game/playerbot/PlayerbotPriestAI.cpp index 868bacc18..0ae589057 100644 --- a/src/game/playerbot/PlayerbotPriestAI.cpp +++ b/src/game/playerbot/PlayerbotPriestAI.cpp @@ -425,12 +425,17 @@ void PlayerbotPriestAI::DoNonCombatActions() // first rezz em if (!tPlayer->isAlive()) { - std::string msg = "Resurrecting "; - msg += tPlayer->GetName(); - m_bot->Say(msg, LANG_UNIVERSAL); - ai->CastSpell(RESURRECTION, *tPlayer); + if (ai->CastSpell(RESURRECTION, *tPlayer)) + { + std::string msg = "Resurrecting "; + msg += tPlayer->GetName(); + m_bot->Say(msg, LANG_UNIVERSAL); + return; + } + else + continue; } - else if (tPlayer->isAlive()) + else { // buff and heal if (BuffPlayer(tPlayer)) From 8c0c05210d35e024db75f863e999860fe3b20a03 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Wed, 10 Nov 2010 21:59:35 +0300 Subject: [PATCH 167/187] Minor improvements to paladin healing --- src/game/playerbot/PlayerbotPaladinAI.cpp | 31 +++++++++++++---------- src/game/playerbot/PlayerbotPaladinAI.h | 2 +- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/game/playerbot/PlayerbotPaladinAI.cpp b/src/game/playerbot/PlayerbotPaladinAI.cpp index 449b8be0c..c9382a50a 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.cpp +++ b/src/game/playerbot/PlayerbotPaladinAI.cpp @@ -77,22 +77,24 @@ PlayerbotPaladinAI::PlayerbotPaladinAI(Player* const master, Player* const bot, PlayerbotPaladinAI::~PlayerbotPaladinAI() {} -void PlayerbotPaladinAI::HealTarget(Unit &target, uint8 hp) +bool PlayerbotPaladinAI::HealTarget(Unit *target) { PlayerbotAI* ai = GetAI(); + uint8 hp = target->GetHealth() * 100 / target->GetMaxHealth(); - if (hp < 40 && HOLY_LIGHT > 0 && ai->GetManaPercent() >= 34) - ai->CastSpell(HOLY_LIGHT, target); + if (hp < 25 && ai->CastSpell(LAY_ON_HANDS, *target)) + return true; - if (hp < 35 && HOLY_SHOCK > 0 && ai->GetManaPercent() >= 21) - ai->CastSpell(HOLY_SHOCK, target); + if (hp < 30 && ai->CastSpell(FLASH_OF_LIGHT, *target)) + return true; - if (hp < 30 && FLASH_OF_LIGHT > 0 && ai->GetManaPercent() >= 8) - ai->CastSpell(FLASH_OF_LIGHT, target); + if (hp < 35 && ai->CastSpell(HOLY_SHOCK, *target)) + return true; - if (hp < 25 && LAY_ON_HANDS > 0 && ai->GetHealthPercent() > 30 && ai->GetManaPercent() >= 8) - ai->CastSpell(LAY_ON_HANDS, target); + if (hp < 40 && ai->CastSpell(HOLY_LIGHT, *target)) + return true; + return false; } // end HealTarget void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) @@ -136,7 +138,8 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) uint32 memberHP = m_groupMember->GetHealth() * 100 / m_groupMember->GetMaxHealth(); if (memberHP < 40 && ai->GetManaPercent() >= 40) // do not heal bots without plenty of mana for master & self - HealTarget(*m_groupMember, memberHP); + if (HealTarget(m_groupMember)); + return; } } @@ -286,13 +289,13 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) case Healing: if (ai->GetHealthPercent() <= 40) { - HealTarget (*m_bot, ai->GetHealthPercent()); + HealTarget (m_bot); out << " ...healing bot"; break; } if (masterHP <= 40) { - HealTarget (*GetMaster(), masterHP); + HealTarget (GetMaster()); out << " ...healing master"; break; } @@ -390,7 +393,9 @@ void PlayerbotPaladinAI::DoNonCombatActions() continue; } - HealTarget(*tPlayer, tPlayer->GetHealth() * 100 / tPlayer->GetMaxHealth()); + if (HealTarget(tPlayer)) + return; + if (tPlayer != m_bot && tPlayer != GetMaster()) if (BuffPlayer(tPlayer)) return; diff --git a/src/game/playerbot/PlayerbotPaladinAI.h b/src/game/playerbot/PlayerbotPaladinAI.h index 27df47306..55d8e9e5f 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.h +++ b/src/game/playerbot/PlayerbotPaladinAI.h @@ -95,7 +95,7 @@ class MANGOS_DLL_SPEC PlayerbotPaladinAI : PlayerbotClassAI private: // Heals the target based off its hps - void HealTarget (Unit& target, uint8 hp); + bool HealTarget (Unit *target); // Bless target using greater blessing if possible bool Bless(uint32 spellId, Unit *target); From 70201f3bb8ca54b1215f2a7d016b791b0910d21b Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 12 Nov 2010 18:40:19 +0300 Subject: [PATCH 168/187] Do not send bot heartbeat packets. --- src/game/playerbot/PlayerbotAI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index a481d81c5..33839f53f 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2057,7 +2057,7 @@ void PlayerbotAI::MovementReset() void PlayerbotAI::MovementUpdate() { // send heartbeats to world - m_bot->SendHeartBeat(false); + // m_bot->SendHeartBeat(false); // call set position (updates states, exploration, etc.) m_bot->SetPosition(m_bot->GetPositionX(), m_bot->GetPositionY(), m_bot->GetPositionZ(), m_bot->GetOrientation(), false); From d497040c6786465f5e75aa84b9dee5999ed87ccc Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sat, 13 Nov 2010 18:17:39 +0300 Subject: [PATCH 169/187] Ignore messages from Gatherer addon. --- src/game/playerbot/PlayerbotAI.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 33839f53f..1a600158a 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -3094,7 +3094,8 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) text.find("X-Perl") != std::wstring::npos || text.find("HealBot") != std::wstring::npos || text.find("LOOT_OPENED") != std::wstring::npos || - text.find("CTRA") != std::wstring::npos) + text.find("CTRA") != std::wstring::npos || + text.find("GathX") == 0) // Gatherer return; // if message is not from a player in the masters account auto reply and ignore @@ -3853,7 +3854,6 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) } } } - } else { From 4f35f2f5e7dc28eec03c7cd7f69b6e21b4ac5d76 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sun, 14 Nov 2010 13:48:03 +0300 Subject: [PATCH 170/187] Update bot orientation for nearby players. PlayerbotAI::SetInFront() now explicitly updates bot MovementInfo with current orientation and broadcast heartbeat packed to players. --- src/game/playerbot/PlayerbotAI.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 1a600158a..d0486e18d 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2082,9 +2082,20 @@ bool PlayerbotAI::IsMoving() void PlayerbotAI::SetInFront(const Unit* obj) { - // removed SendUpdateToPlayer (is not updating movement/orientation) - if (!m_bot->HasInArc(M_PI_F, obj)) - m_bot->SetInFront(obj); + m_bot->SetInFront(obj); + + // TODO: Schmoozerd wrote a patch which adds MovementInfo::ChangeOrientation() + // and added a call to it inside WorldObject::SetOrientation. Check if it is + // merged to the core. + // http://getmangos.com/community/viewtopic.php?pid=128003 + float ori = m_bot->GetAngle(obj); + float x, y, z; + x = m_bot->m_movementInfo.GetPos()->x; + y = m_bot->m_movementInfo.GetPos()->y; + z = m_bot->m_movementInfo.GetPos()->z; + m_bot->m_movementInfo.ChangePosition(x,y,z,ori); + + m_bot->SendHeartBeat(false); } // some possible things to use in AI @@ -2326,12 +2337,7 @@ bool PlayerbotAI::CastSpell(uint32 spellId) if (pTarget && m_bot->IsFriendlyTo(pTarget)) return false; - // search for Creature::reachWithSpellAttack to also see some examples of spell distance usage - if (!m_bot->isInFrontInMap(pTarget, 10)) - { - m_bot->SetInFront(pTarget); - MovementUpdate(); - } + SetInFront(pTarget); } // stop movement to prevent cancel spell casting From 4a67903cd7fbcb56ea5c88020292545babdfb4b7 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Mon, 15 Nov 2010 13:43:53 +0300 Subject: [PATCH 171/187] Fix VC compilation error, typos and whitespaces. --- src/game/playerbot/PlayerbotAI.cpp | 2 +- src/game/playerbot/PlayerbotAI.h | 12 ++++++------ src/game/playerbot/PlayerbotClassAI.cpp | 2 +- src/game/playerbot/PlayerbotClassAI.h | 6 +++--- src/game/playerbot/PlayerbotPaladinAI.cpp | 3 ++- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index d0486e18d..9e97279ff 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2454,7 +2454,7 @@ bool PlayerbotAI::Buff(uint32 spellId, Unit* target, void (*beforeCast)(Player * break; bool sameOrBetterAuraFound = false; - uint32 bonus = m_bot->CalculateSpellDamage(target, spellProto, SpellEffectIndex(i)); + int32 bonus = m_bot->CalculateSpellDamage(target, spellProto, SpellEffectIndex(i)); Unit::AuraList const& auras = target->GetAurasByType(AuraType(spellProto->EffectApplyAuraName[i])); for (Unit::AuraList::const_iterator it = auras.begin(); it != auras.end(); ++it) if ((*it)->GetModifier()->m_miscvalue == spellProto->EffectMiscValue[i] && (*it)->GetModifier()->m_amount >= bonus) diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index fd0828f32..0614a11ec 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -140,10 +140,10 @@ class MANGOS_DLL_SPEC PlayerbotAI void HandleTeleportAck(); // Returns what kind of situation we are in so the ai can react accordingly - ScenarioType GetScenarioType() {return m_ScenarioType; } + ScenarioType GetScenarioType() { return m_ScenarioType; } - PlayerbotClassAI* GetClassAI() {return m_classAI; } - PlayerbotMgr* const GetManager() {return m_mgr; } + PlayerbotClassAI* GetClassAI() { return m_classAI; } + PlayerbotMgr* const GetManager() { return m_mgr; } // finds spell ID for matching substring args // in priority of full text match, spells not taking reagents, and highest rank @@ -228,10 +228,10 @@ class MANGOS_DLL_SPEC PlayerbotAI Unit *GetCurrentTarget() { return m_targetCombat; }; void DoNextCombatManeuver(); void DoCombatMovement(); - void SetIgnoreUpdateTime(uint8 t) {m_ignoreAIUpdatesUntilTime = time(0) + t; }; + void SetIgnoreUpdateTime(uint8 t) { m_ignoreAIUpdatesUntilTime = time(0) + t; }; - Player *GetPlayerBot() const {return m_bot; } - Player *GetPlayer() const {return m_bot; } + Player *GetPlayerBot() const { return m_bot; } + Player *GetPlayer() const { return m_bot; } Player *GetMaster() const; BotState GetState() { return m_botState; }; diff --git a/src/game/playerbot/PlayerbotClassAI.cpp b/src/game/playerbot/PlayerbotClassAI.cpp index 75a3fd242..98a82307a 100644 --- a/src/game/playerbot/PlayerbotClassAI.cpp +++ b/src/game/playerbot/PlayerbotClassAI.cpp @@ -13,4 +13,4 @@ void PlayerbotClassAI::DoNextCombatManeuver(Unit *) {} void PlayerbotClassAI::DoNonCombatActions(){} -bool PlayerbotClassAI::BuffPlayer(Player* target) {} +bool PlayerbotClassAI::BuffPlayer(Player* target) { return false; } diff --git a/src/game/playerbot/PlayerbotClassAI.h b/src/game/playerbot/PlayerbotClassAI.h index 3f9be21e2..d37d75385 100644 --- a/src/game/playerbot/PlayerbotClassAI.h +++ b/src/game/playerbot/PlayerbotClassAI.h @@ -31,9 +31,9 @@ class MANGOS_DLL_SPEC PlayerbotClassAI virtual bool BuffPlayer(Player* target); // Utilities - Player* GetMaster () {return m_master; } - Player* GetPlayerBot() {return m_bot; } - PlayerbotAI* GetAI (){return m_ai; }; + Player* GetMaster () { return m_master; } + Player* GetPlayerBot() { return m_bot; } + PlayerbotAI* GetAI (){ return m_ai; }; private: diff --git a/src/game/playerbot/PlayerbotPaladinAI.cpp b/src/game/playerbot/PlayerbotPaladinAI.cpp index c9382a50a..465553554 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.cpp +++ b/src/game/playerbot/PlayerbotPaladinAI.cpp @@ -138,7 +138,7 @@ void PlayerbotPaladinAI::DoNextCombatManeuver(Unit *pTarget) uint32 memberHP = m_groupMember->GetHealth() * 100 / m_groupMember->GetMaxHealth(); if (memberHP < 40 && ai->GetManaPercent() >= 40) // do not heal bots without plenty of mana for master & self - if (HealTarget(m_groupMember)); + if (HealTarget(m_groupMember)) return; } } @@ -479,6 +479,7 @@ bool PlayerbotPaladinAI::BuffPlayer(Player* target) else return false; } + return false; } bool PlayerbotPaladinAI::Bless(uint32 spellId, Unit *target) From b02a6b353dcfffe6bb8b3bd01a9daafc13005db3 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Mon, 15 Nov 2010 21:33:08 +0300 Subject: [PATCH 172/187] Handle extra whitespaces in 'drop' command. --- src/game/playerbot/PlayerbotAI.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 9e97279ff..383f7e5ab 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -3464,7 +3464,8 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) fromPlayer.SetSelectionGuid(oldSelectionGUID); } PlayerbotChatHandler ch(GetMaster()); - if (!ch.dropQuest((char*) text.substr(5).c_str())) + int8 linkStart = text.find("|"); + if (linkStart < 0 || !ch.dropQuest((char*) text.substr(linkStart).c_str())) ch.sysmessage("ERROR: could not drop quest"); if (!oldSelectionGUID.IsEmpty()) fromPlayer.SetSelectionGuid(oldSelectionGUID); From f17ae4fd7f1a4158f5bbc50925b514a8b9322600 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Tue, 16 Nov 2010 00:23:30 +0300 Subject: [PATCH 173/187] Cleanup warlock demon summoning. --- src/game/playerbot/PlayerbotWarlockAI.cpp | 35 +++++++++-------------- src/game/playerbot/PlayerbotWarlockAI.h | 2 -- 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/src/game/playerbot/PlayerbotWarlockAI.cpp b/src/game/playerbot/PlayerbotWarlockAI.cpp index c49b3e647..1e3239b77 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.cpp +++ b/src/game/playerbot/PlayerbotWarlockAI.cpp @@ -66,8 +66,6 @@ PlayerbotWarlockAI::PlayerbotWarlockAI(Player* const master, Player* const bot, EVERY_MAN_FOR_HIMSELF = ai->initSpell(EVERY_MAN_FOR_HIMSELF_ALL); // human BLOOD_FURY = ai->initSpell(BLOOD_FURY_WARLOCK); // orc WILL_OF_THE_FORSAKEN = ai->initSpell(WILL_OF_THE_FORSAKEN_ALL); // undead - - m_demonSummonFailed = false; } PlayerbotWarlockAI::~PlayerbotWarlockAI() {} @@ -438,25 +436,20 @@ void PlayerbotWarlockAI::DoNonCombatActions() return; } - // check for demon - if (SUMMON_FELGUARD > 0 || SUMMON_FELHUNTER > 0 || SUMMON_SUCCUBUS > 0 || SUMMON_VOIDWALKER > 0 || SUMMON_IMP > 0 && !m_demonSummonFailed) - if (!pet) - { - // summon demon - if (SUMMON_FELGUARD > 0 && ai->CastSpell(SUMMON_FELGUARD, *m_bot)) - ai->TellMaster("summoning felguard."); - else if (SUMMON_FELHUNTER > 0 && ai->CastSpell(SUMMON_FELHUNTER, *m_bot)) - ai->TellMaster("summoning felhunter."); - else if (SUMMON_SUCCUBUS > 0 && ai->CastSpell(SUMMON_SUCCUBUS, *m_bot)) - ai->TellMaster("summoning succubus."); - else if (SUMMON_VOIDWALKER > 0 && ai->CastSpell(SUMMON_VOIDWALKER, *m_bot)) - ai->TellMaster("summoning voidwalker."); - else if (SUMMON_IMP > 0 && ai->GetManaPercent() >= 64 && ai->CastSpell(SUMMON_IMP, *m_bot)) - ai->TellMaster("summoning imp."); - else - m_demonSummonFailed = true; - //ai->TellMaster( "summon demon failed!" ); - } + // Summon demon + if (!pet) + { + if (SUMMON_FELGUARD && ai->CastSpell(SUMMON_FELGUARD)) + ai->TellMaster("Summoning Felguard."); + else if (SUMMON_FELHUNTER && ai->CastSpell(SUMMON_FELHUNTER)) + ai->TellMaster("Summoning Felhunter."); + else if (SUMMON_SUCCUBUS && ai->CastSpell(SUMMON_SUCCUBUS)) + ai->TellMaster("Summoning Succubus."); + else if (SUMMON_VOIDWALKER && ai->CastSpell(SUMMON_VOIDWALKER)) + ai->TellMaster("Summoning Voidwalker."); + else if (SUMMON_IMP && ai->CastSpell(SUMMON_IMP)) + ai->TellMaster("Summoning Imp."); + } // check for buffs with demon if ((pet) diff --git a/src/game/playerbot/PlayerbotWarlockAI.h b/src/game/playerbot/PlayerbotWarlockAI.h index 273a800a8..b9ddeecc4 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.h +++ b/src/game/playerbot/PlayerbotWarlockAI.h @@ -109,8 +109,6 @@ class MANGOS_DLL_SPEC PlayerbotWarlockAI : PlayerbotClassAI private: - bool m_demonSummonFailed; - // CURSES uint32 CURSE_OF_WEAKNESS, CURSE_OF_AGONY, From 5c265d8b06f3a2bc079e4f63b04170aff3d53eb6 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 19 Nov 2010 20:36:56 +0300 Subject: [PATCH 174/187] Rework UseItem() method. New version of UseItem() can now target units (players, pets, etc). Three convinience wrappers where created for using items on bots, on their equipped items and on units. --- src/game/playerbot/PlayerbotAI.cpp | 52 ++++++++++++++++++++++++++++++ src/game/playerbot/PlayerbotAI.h | 7 ++++ 2 files changed, 59 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 383f7e5ab..d206aa9db 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2871,6 +2871,58 @@ void PlayerbotAI::findItemsInInv(std::list& itemIdSearchList, std::list< } } +// use item on self +void PlayerbotAI::UseItem(Item *item) +{ + UseItem(item, TARGET_FLAG_SELF, ObjectGuid()); +} + +// use item on equipped item +void PlayerbotAI::UseItem(Item *item, uint8 targetInventorySlot) +{ + if (targetInventorySlot >= EQUIPMENT_SLOT_END) + return; + + Item* const targetItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, targetInventorySlot); + if (!targetItem) + return; + + UseItem(item, TARGET_FLAG_ITEM, targetItem->GetObjectGuid()); +} + +// use item on unit +void PlayerbotAI::UseItem(Item *item, Unit *target) +{ + if (!target) + return; + + UseItem(item, TARGET_FLAG_UNIT, target->GetObjectGuid()); +} + +// generic item use method +void PlayerbotAI::UseItem(Item *item, uint32 targetFlag, ObjectGuid targetGUID) +{ + if (!item) + return; + + uint8 bagIndex = item->GetBagSlot(); + uint8 slot = item->GetSlot(); + uint8 cast_count = 1; + uint32 spellid = item->GetProto()->Spells[0].SpellId; + ObjectGuid item_guid = item->GetObjectGuid(); + uint32 glyphIndex = 0; + uint8 unk_flags = 0; + + WorldPacket *packet = new WorldPacket(CMSG_USE_ITEM, 28); + *packet << bagIndex << slot << cast_count << spellid << item_guid + << glyphIndex << unk_flags << targetFlag; + + if (targetFlag & (TARGET_FLAG_UNIT | TARGET_FLAG_ITEM)) + *packet << targetGUID.WriteAsPacked(); + + m_bot->GetSession()->QueuePacket(packet); +} + // submits packet to use an item void PlayerbotAI::UseItem(Item& item, uint8 targetSlot) { diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 0614a11ec..51da566d1 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -4,6 +4,7 @@ #include "Common.h" #include "../QuestDef.h" #include "../GameEventMgr.h" +#include "../ObjectGuid.h" class WorldPacket; class WorldObject; @@ -218,6 +219,12 @@ class MANGOS_DLL_SPEC PlayerbotAI bool Buff(uint32 spellId, Unit* target, void (*beforeCast)(Player *) = NULL); bool SelfBuff(uint32 spellId); void UseItem(Item& item, uint8 targetSlot = 255); + + void UseItem(Item *item, uint32 targetFlag, ObjectGuid targetGUID); + void UseItem(Item *item, uint8 targetInventorySlot); + void UseItem(Item *item, Unit *target); + void UseItem(Item *item); + void EquipItem(Item& item); //void Stay(); //bool Follow(Player& player); From 8c8ac512e7a1129114dadda0bfa6de12e7e9aa7e Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 19 Nov 2010 21:18:00 +0300 Subject: [PATCH 175/187] Improve warlock AI. Changes: * Create healthstone and use it during fight. * Create soulstone and use it on master. * Use demonic empowerment. * Optimize non-combat actions and cleanup. --- src/game/playerbot/PlayerbotWarlockAI.cpp | 194 ++++++++++++++-------- src/game/playerbot/PlayerbotWarlockAI.h | 28 +++- 2 files changed, 150 insertions(+), 72 deletions(-) diff --git a/src/game/playerbot/PlayerbotWarlockAI.cpp b/src/game/playerbot/PlayerbotWarlockAI.cpp index 1e3239b77..58e5829a0 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.cpp +++ b/src/game/playerbot/PlayerbotWarlockAI.cpp @@ -47,6 +47,8 @@ PlayerbotWarlockAI::PlayerbotWarlockAI(Player* const master, Player* const bot, HEALTH_FUNNEL = ai->initSpell(HEALTH_FUNNEL_1); DETECT_INVISIBILITY = ai->initSpell(DETECT_INVISIBILITY_1); CREATE_FIRESTONE = ai->initSpell(CREATE_FIRESTONE_1); + CREATE_HEALTHSTONE = ai->initSpell(CREATE_HEALTHSTONE_1); + CREATE_SOULSTONE = ai->initSpell(CREATE_SOULSTONE_1); // demon summon SUMMON_IMP = ai->initSpell(SUMMON_IMP_1); SUMMON_VOIDWALKER = ai->initSpell(SUMMON_VOIDWALKER_1); @@ -66,6 +68,8 @@ PlayerbotWarlockAI::PlayerbotWarlockAI(Player* const master, Player* const bot, EVERY_MAN_FOR_HIMSELF = ai->initSpell(EVERY_MAN_FOR_HIMSELF_ALL); // human BLOOD_FURY = ai->initSpell(BLOOD_FURY_WARLOCK); // orc WILL_OF_THE_FORSAKEN = ai->initSpell(WILL_OF_THE_FORSAKEN_ALL); // undead + + m_lastDemon = 0; } PlayerbotWarlockAI::~PlayerbotWarlockAI() {} @@ -93,9 +97,21 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) Unit* pVictim = pTarget->getVictim(); Pet *pet = m_bot->GetPet(); - // Damage Spells - ai->SetInFront(pTarget); + // Empower demon + if (pet && DEMONIC_EMPOWERMENT) + ai->CastSpell(DEMONIC_EMPOWERMENT); + // TODO (Playerbot): Use voidwalker sacrifice on low health if possible + + // Use healthstone + if (ai->GetHealthPercent() < 30) + { + Item* healthStone = ai->FindConsumable(HEALTHSTONE_DISPLAYID); + if (healthStone) + ai->UseItem(healthStone); + } + + // Damage Spells switch (SpellSequence) { case SPELL_CURSES: @@ -327,107 +343,149 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) void PlayerbotWarlockAI::DoNonCombatActions() { - PlayerbotAI *ai = GetAI(); - if (!ai) - return; + SpellSequence = SPELL_CURSES; + PlayerbotAI *ai = GetAI(); Player * m_bot = GetPlayerBot(); - if (!m_bot) + if (!ai || !m_bot) return; + Pet *pet = m_bot->GetPet(); + + if (pet && pet->GetEntry() != m_lastDemon) + { + // TODO (Playerbot): Init pet spells + m_lastDemon = pet->GetEntry(); + } + // Destroy extra soul shards uint8 shardCount = m_bot->GetItemCount(SOUL_SHARD, false, NULL); uint8 freeSpace = ai->GetFreeBagSpace(); if (shardCount > MAX_SHARD_COUNT || (freeSpace == 0 && shardCount > 1)) m_bot->DestroyItemCount(SOUL_SHARD, shardCount > MAX_SHARD_COUNT ? shardCount - MAX_SHARD_COUNT : 1, true, false); - SpellSequence = SPELL_CURSES; + // buff myself DEMON_SKIN, DEMON_ARMOR, FEL_ARMOR + if (FEL_ARMOR) + { + if (ai->SelfBuff(FEL_ARMOR)) + return; + } + else if (DEMON_ARMOR) + { + if (ai->SelfBuff(DEMON_ARMOR)) + return; + } + else if (DEMON_SKIN) + { + if (ai->SelfBuff(DEMON_SKIN)) + return; + } - Pet *pet = m_bot->GetPet(); + // healthstone creation + if (CREATE_HEALTHSTONE) + { + Item* const healthStone = ai->FindConsumable(HEALTHSTONE_DISPLAYID); + if (!healthStone && ai->CastSpell(CREATE_HEALTHSTONE)) + ai->SetIgnoreUpdateTime(5); + } - // buff myself DEMON_SKIN, DEMON_ARMOR, FEL_ARMOR - if (FEL_ARMOR > 0) - (!m_bot->HasAura(FEL_ARMOR, EFFECT_INDEX_0) && ai->CastSpell(FEL_ARMOR, *m_bot)); - else if (DEMON_ARMOR > 0) - (!m_bot->HasAura(DEMON_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(FEL_ARMOR, EFFECT_INDEX_0) && ai->CastSpell(DEMON_ARMOR, *m_bot)); - else if (DEMON_SKIN > 0) - (!m_bot->HasAura(DEMON_SKIN, EFFECT_INDEX_0) && !m_bot->HasAura(FEL_ARMOR, EFFECT_INDEX_0) && !m_bot->HasAura(DEMON_ARMOR, EFFECT_INDEX_0) && ai->CastSpell(DEMON_SKIN, *m_bot)); - - // buff myself & master DETECT_INVISIBILITY - if (DETECT_INVISIBILITY > 0) - (!m_bot->HasAura(DETECT_INVISIBILITY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 2 && ai->CastSpell(DETECT_INVISIBILITY, *m_bot)); - if (DETECT_INVISIBILITY > 0) - (!GetMaster()->HasAura(DETECT_INVISIBILITY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 2 && ai->CastSpell(DETECT_INVISIBILITY, *GetMaster())); - - // firestone creation and use - proof of concept for updated UseItem method. + // soulstone creation and use + if (CREATE_SOULSTONE) + { + Item* soulStone = ai->FindConsumable(SOULSTONE_DISPLAYID); + if (!soulStone) + { + if (!m_bot->HasSpellCooldown(CREATE_SOULSTONE) && ai->CastSpell(CREATE_SOULSTONE)) + return; + } + else + { + uint32 soulStoneSpell = soulStone->GetProto()->Spells[0].SpellId; + Player * master = GetMaster(); + if (!master->HasAura(soulStoneSpell)) + { + ai->UseItem(soulStone, master); + } + else + { + // TODO (Playerbot): soulstone non-bot group members + } + } + } + + // firestone creation and use Item* const weapon = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); if (weapon && weapon->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) == 0) { Item* const stone = ai->FindConsumable(FIRESTONE_DISPLAYID); if (!stone) { - if (CREATE_FIRESTONE > 0 && m_bot->HasItemCount(SOUL_SHARD, 1, false)) - { - ai->CastSpell(CREATE_FIRESTONE); + if (CREATE_FIRESTONE && m_bot->HasItemCount(SOUL_SHARD, 1, false) && ai->CastSpell(CREATE_FIRESTONE)) ai->SetIgnoreUpdateTime(5); - } } else { - ai->UseItem(*stone, EQUIPMENT_SLOT_MAINHAND); + ai->UseItem(stone, EQUIPMENT_SLOT_MAINHAND); ai->SetIgnoreUpdateTime(5); } } - // mana check if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) m_bot->SetStandState(UNIT_STAND_STATE_STAND); - Item* pItem = ai->FindDrink(); - Item* fItem = ai->FindBandage(); - - if (pItem != NULL && ai->GetManaPercent() < 25) + // mana check + if (pet && DARK_PACT && pet->GetPower(POWER_MANA) > 0 && ai->GetManaPercent() <= 50) { - ai->TellMaster("I could use a drink."); - ai->UseItem(*pItem); - ai->SetIgnoreUpdateTime(30); - return; + if (ai->CastSpell(DARK_PACT, *m_bot)) + return; } - else if ((pet) - && (pItem == NULL && DARK_PACT > 0 && ai->GetManaPercent() <= 50 && pet->GetPower(POWER_MANA) > 0)) + + if (LIFE_TAP && ai->GetManaPercent() <= 50 && ai->GetHealthPercent() > 50) { - ai->CastSpell(DARK_PACT, *m_bot); - //ai->TellMaster("casting dark pact."); - return; + if (ai->CastSpell(LIFE_TAP, *m_bot)) + return; } - else if ((!pet) - && (pItem == NULL && LIFE_TAP > 0 && ai->GetManaPercent() <= 50 && ai->GetHealthPercent() > 25)) + + if (ai->GetManaPercent() < 25) { - ai->CastSpell(LIFE_TAP, *m_bot); - //ai->TellMaster("casting life tap."); - return; + Item* pItem = ai->FindDrink(); + if (pItem) + { + ai->TellMaster("I could use a drink."); + ai->UseItem(pItem); + // TODO (Playerbot): Get exact drinking time + ai->SetIgnoreUpdateTime(30); + return; + } } // hp check - if (m_bot->getStandState() != UNIT_STAND_STATE_STAND) - m_bot->SetStandState(UNIT_STAND_STATE_STAND); - - pItem = ai->FindFood(); - - if (pItem != NULL && ai->GetHealthPercent() < 30) + if (ai->GetHealthPercent() < 30) { - ai->TellMaster("I could use some food."); - ai->UseItem(*pItem); - ai->SetIgnoreUpdateTime(30); - return; + Item* pItem = ai->FindFood(); + if (pItem) + { + ai->TellMaster("I could use some food."); + ai->UseItem(pItem); + // TODO (Playerbot): Get exact eating time + ai->SetIgnoreUpdateTime(30); + return; + } } - else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) + + if (ai->GetHealthPercent() < 50 && !m_bot->HasAura(RECENTLY_BANDAGED)) { - ai->TellMaster("I could use first aid."); - ai->UseItem(*fItem); - ai->SetIgnoreUpdateTime(8); - return; + Item* fItem = ai->FindBandage(); + if (fItem) + { + ai->TellMaster("I could use first aid."); + ai->UseItem(fItem); + ai->SetIgnoreUpdateTime(8); + return; + } } + + /* TODO (Playerbot): Heal Voidwalker else if ((pet) && (pItem == NULL && fItem == NULL && CONSUME_SHADOWS > 0 && !m_bot->HasAura(CONSUME_SHADOWS, EFFECT_INDEX_0) && ai->GetHealthPercent() < 75)) { @@ -435,8 +493,9 @@ void PlayerbotWarlockAI::DoNonCombatActions() //ai->TellMaster("casting consume shadows."); return; } - + */ // Summon demon + // TODO (Playerbot): Remember last demon and resummon him if possible if (!pet) { if (SUMMON_FELGUARD && ai->CastSpell(SUMMON_FELGUARD)) @@ -451,12 +510,13 @@ void PlayerbotWarlockAI::DoNonCombatActions() ai->TellMaster("Summoning Imp."); } + // Soul link demon + if (pet && SOUL_LINK && !m_bot->HasAura(SOUL_LINK_AURA) && ai->CastSpell(SOUL_LINK, *m_bot)) + return; + // check for buffs with demon + // TODO (Playerbot): Fix pet buffs if ((pet) - && (SOUL_LINK > 0 && !m_bot->HasAura(SOUL_LINK_AURA, EFFECT_INDEX_0) && ai->GetBaseManaPercent() >= 16 && ai->CastSpell(SOUL_LINK, *m_bot))) - //ai->TellMaster( "casting soul link." ); - return; - else if ((pet) && (BLOOD_PACT > 0 && !m_bot->HasAura(BLOOD_PACT, EFFECT_INDEX_0) && ai->CastSpell(BLOOD_PACT, *m_bot))) //ai->TellMaster( "casting blood pact." ); return; diff --git a/src/game/playerbot/PlayerbotWarlockAI.h b/src/game/playerbot/PlayerbotWarlockAI.h index b9ddeecc4..8b6564004 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.h +++ b/src/game/playerbot/PlayerbotWarlockAI.h @@ -16,9 +16,19 @@ enum enum StoneDisplayId { - FIRESTONE_DISPLAYID = 7409, - SPELLSTONE_DISPLAYID = 13291, - SOULSTONE_DISPLAYID = 6009 + FIRESTONE_DISPLAYID = 7409, + SPELLSTONE_DISPLAYID = 13291, + SOULSTONE_DISPLAYID = 6009, + HEALTHSTONE_DISPLAYID = 8026 +}; + +enum DemonEntry +{ + DEMON_IMP = 416, + DEMON_VOIDWALKER = 1860, + DEMON_SUCCUBUS = 1863, + DEMON_FELHUNTER = 417, + DEMON_FELGUARD = 17252 }; enum WarlockSpells @@ -147,6 +157,7 @@ class MANGOS_DLL_SPEC PlayerbotWarlockAI : PlayerbotClassAI // DEMONOLOGY uint32 DEMON_SKIN, DEMON_ARMOR, + DEMONIC_EMPOWERMENT, SHADOW_WARD, FEL_ARMOR, SOULSHATTER, @@ -154,7 +165,9 @@ class MANGOS_DLL_SPEC PlayerbotWarlockAI : PlayerbotClassAI SOUL_LINK_AURA, HEALTH_FUNNEL, DETECT_INVISIBILITY, - CREATE_FIRESTONE; + CREATE_FIRESTONE, + CREATE_SOULSTONE, + CREATE_HEALTHSTONE; // DEMON SUMMON uint32 SUMMON_IMP, @@ -183,7 +196,12 @@ class MANGOS_DLL_SPEC PlayerbotWarlockAI : PlayerbotClassAI BERSERKING, WILL_OF_THE_FORSAKEN; - uint32 SpellSequence, LastSpellCurse, LastSpellAffliction, LastSpellDestruction; + uint32 SpellSequence, + LastSpellCurse, + LastSpellAffliction, + LastSpellDestruction; + + uint32 m_lastDemon; }; #endif From 56513607abb016776a973295af64d06bb9f5cf6e Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 19 Nov 2010 21:59:34 +0300 Subject: [PATCH 176/187] Add method to initialize pet spells. This one can be not optimal since spells are looked by their icon id. Can't figure out anything better. --- src/game/playerbot/PlayerbotAI.cpp | 29 +++++++++++++++++++++++++++++ src/game/playerbot/PlayerbotAI.h | 1 + 2 files changed, 30 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index d206aa9db..55316c062 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -293,6 +293,35 @@ uint32 PlayerbotAI::initSpell(uint32 spellId) return (next == 0) ? spellId : next; } + +// Pet spells do not form chains like player spells. +// One of the options to initialize a spell is to use spell icon id +uint32 PlayerbotAI::initPetSpell(uint32 spellIconId) +{ + Pet * pet = m_bot->GetPet(); + + if (!pet) + return 0; + + for (PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end(); ++itr) + { + const uint32 spellId = itr->first; + + if (itr->second.state == PETSPELL_REMOVED || IsPassiveSpell(spellId)) + continue; + + const SpellEntry* const pSpellInfo = sSpellStore.LookupEntry(spellId); + if (!pSpellInfo) + continue; + + if (pSpellInfo->SpellIconID == spellIconId) + return spellId; + } + + // Nothing found + return 0; +} + /* * Send a list of equipment that is in bot's inventor that is currently unequipped. * This is called when the master is inspecting the bot. diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 51da566d1..49319955c 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -152,6 +152,7 @@ class MANGOS_DLL_SPEC PlayerbotAI uint32 getPetSpellId(const char* args) const; // Initialize spell using rank 1 spell id uint32 initSpell(uint32 spellId); + uint32 initPetSpell(uint32 spellIconId); // extracts item ids from links void extractItemIds(const std::string& text, std::list& itemIds) const; From 610c4c1fefcaa802acc97dd6ec9fcf8bae5e929c Mon Sep 17 00:00:00 2001 From: chelobaka Date: Fri, 19 Nov 2010 23:55:23 +0300 Subject: [PATCH 177/187] Another hunk of warlock changes. * Automatic demon buffs * Use voidwalker's sacrifice * Bug fixes --- src/game/playerbot/PlayerbotWarlockAI.cpp | 79 +++++++++++++++++------ src/game/playerbot/PlayerbotWarlockAI.h | 42 +++++++++++- 2 files changed, 100 insertions(+), 21 deletions(-) diff --git a/src/game/playerbot/PlayerbotWarlockAI.cpp b/src/game/playerbot/PlayerbotWarlockAI.cpp index 58e5829a0..eb4d1621d 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.cpp +++ b/src/game/playerbot/PlayerbotWarlockAI.cpp @@ -39,6 +39,7 @@ PlayerbotWarlockAI::PlayerbotWarlockAI(Player* const master, Player* const bot, // DEMONOLOGY DEMON_SKIN = ai->initSpell(DEMON_SKIN_1); DEMON_ARMOR = ai->initSpell(DEMON_ARMOR_1); + DEMONIC_EMPOWERMENT = ai->initSpell(DEMONIC_EMPOWERMENT_1); FEL_ARMOR = ai->initSpell(FEL_ARMOR_1); SHADOW_WARD = ai->initSpell(SHADOW_WARD_1); SOULSHATTER = ai->initSpell(SOULSHATTER_1); @@ -98,10 +99,15 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) Pet *pet = m_bot->GetPet(); // Empower demon - if (pet && DEMONIC_EMPOWERMENT) + if (pet && DEMONIC_EMPOWERMENT && !m_bot->HasSpellCooldown(DEMONIC_EMPOWERMENT)) ai->CastSpell(DEMONIC_EMPOWERMENT); // TODO (Playerbot): Use voidwalker sacrifice on low health if possible + if (ai->GetHealthPercent() < 50) + { + if (pet && pet->GetEntry() == DEMON_VOIDWALKER && SACRIFICE && !m_bot->HasAura(SACRIFICE)) + ai->CastPetSpell(SACRIFICE); + } // Use healthstone if (ai->GetHealthPercent() < 30) @@ -352,9 +358,50 @@ void PlayerbotWarlockAI::DoNonCombatActions() Pet *pet = m_bot->GetPet(); + // Initialize pet spells if (pet && pet->GetEntry() != m_lastDemon) { - // TODO (Playerbot): Init pet spells + switch (pet->GetEntry()) + { + case DEMON_IMP: + { + BLOOD_PACT = ai->initPetSpell(BLOOD_PACT_ICON); + FIREBOLT = ai->initPetSpell(FIREBOLT_ICON); + FIRE_SHIELD = ai->initPetSpell(FIRE_SHIELD_ICON); + break; + } + case DEMON_VOIDWALKER: + { + CONSUME_SHADOWS = ai->initPetSpell(CONSUME_SHADOWS_ICON); + SACRIFICE = ai->initPetSpell(SACRIFICE_ICON); + SUFFERING = ai->initPetSpell(SUFFERING_ICON); + TORMENT = ai->initPetSpell(TORMENT_ICON); + break; + } + case DEMON_SUCCUBUS: + { + LASH_OF_PAIN = ai->initPetSpell(LASH_OF_PAIN_ICON); + SEDUCTION = ai->initPetSpell(SEDUCTION_ICON); + SOOTHING_KISS = ai->initPetSpell(SOOTHING_KISS_ICON); + break; + } + case DEMON_FELHUNTER: + { + DEVOUR_MAGIC = ai->initPetSpell(DEVOUR_MAGIC_ICON); + FEL_INTELLIGENCE = ai->initPetSpell(FEL_INTELLIGENCE_ICON); + SHADOW_BITE = ai->initPetSpell(SHADOW_BITE_ICON); + SPELL_LOCK = ai->initPetSpell(SPELL_LOCK_ICON); + break; + } + case DEMON_FELGUARD: + { + ANGUISH = ai->initPetSpell(ANGUISH_ICON); + CLEAVE = ai->initPetSpell(CLEAVE_ICON); + INTERCEPT = ai->initPetSpell(INTERCEPT_ICON); + break; + } + } + m_lastDemon = pet->GetEntry(); } @@ -402,7 +449,7 @@ void PlayerbotWarlockAI::DoNonCombatActions() { uint32 soulStoneSpell = soulStone->GetProto()->Spells[0].SpellId; Player * master = GetMaster(); - if (!master->HasAura(soulStoneSpell)) + if (!master->HasAura(soulStoneSpell) && !m_bot->HasSpellCooldown(soulStoneSpell)) { ai->UseItem(soulStone, master); } @@ -485,15 +532,10 @@ void PlayerbotWarlockAI::DoNonCombatActions() } } - /* TODO (Playerbot): Heal Voidwalker - else if ((pet) - && (pItem == NULL && fItem == NULL && CONSUME_SHADOWS > 0 && !m_bot->HasAura(CONSUME_SHADOWS, EFFECT_INDEX_0) && ai->GetHealthPercent() < 75)) - { - ai->CastSpell(CONSUME_SHADOWS, *m_bot); - //ai->TellMaster("casting consume shadows."); - return; - } - */ + //Heal Voidwalker + if (pet && pet->GetEntry() == DEMON_VOIDWALKER && CONSUME_SHADOWS && pet->GetHealthPercent() < 75 && !pet->HasAura(CONSUME_SHADOWS)) + ai->CastPetSpell(CONSUME_SHADOWS); + // Summon demon // TODO (Playerbot): Remember last demon and resummon him if possible if (!pet) @@ -514,14 +556,11 @@ void PlayerbotWarlockAI::DoNonCombatActions() if (pet && SOUL_LINK && !m_bot->HasAura(SOUL_LINK_AURA) && ai->CastSpell(SOUL_LINK, *m_bot)) return; - // check for buffs with demon - // TODO (Playerbot): Fix pet buffs - if ((pet) - && (BLOOD_PACT > 0 && !m_bot->HasAura(BLOOD_PACT, EFFECT_INDEX_0) && ai->CastSpell(BLOOD_PACT, *m_bot))) - //ai->TellMaster( "casting blood pact." ); + // Check demon buffs + if (pet && pet->GetEntry() == DEMON_IMP && BLOOD_PACT && !m_bot->HasAura(BLOOD_PACT) && ai->CastPetSpell(BLOOD_PACT)) return; - else if ((pet) - && (FEL_INTELLIGENCE > 0 && !m_bot->HasAura(FEL_INTELLIGENCE, EFFECT_INDEX_0) && ai->CastSpell(FEL_INTELLIGENCE, *m_bot))) - //ai->TellMaster( "casting fel intelligence." ); + + if (pet && pet->GetEntry() == DEMON_FELHUNTER && FEL_INTELLIGENCE && !m_bot->HasAura(FEL_INTELLIGENCE) && ai->CastPetSpell(FEL_INTELLIGENCE)) return; + } // end DoNonCombatActions diff --git a/src/game/playerbot/PlayerbotWarlockAI.h b/src/game/playerbot/PlayerbotWarlockAI.h index 8b6564004..0e2ce303c 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.h +++ b/src/game/playerbot/PlayerbotWarlockAI.h @@ -31,6 +31,32 @@ enum DemonEntry DEMON_FELGUARD = 17252 }; +enum DemonSpellIconIds +{ + // Imp + BLOOD_PACT_ICON = 541, + FIREBOLT_ICON = 18, + FIRE_SHIELD_ICON = 16, + // Felguard + ANGUISH_ICON = 173, + CLEAVE_ICON = 277, + INTERCEPT_ICON = 516, + // Felhunter + DEVOUR_MAGIC_ICON = 47, + FEL_INTELLIGENCE_ICON = 1940, + SHADOW_BITE_ICON = 2027, + SPELL_LOCK_ICON = 77, + // Succubus + LASH_OF_PAIN_ICON = 596, + SEDUCTION_ICON = 48, + SOOTHING_KISS_ICON = 694, + // Voidwalker + CONSUME_SHADOWS_ICON = 207, + SACRIFICE_ICON = 693, + SUFFERING_ICON = 9, + TORMENT_ICON = 173 +}; + enum WarlockSpells { BANISH_1 = 710, @@ -178,8 +204,22 @@ class MANGOS_DLL_SPEC PlayerbotWarlockAI : PlayerbotClassAI // DEMON SKILLS uint32 BLOOD_PACT, + FIREBOLT, + FIRE_SHIELD, + ANGUISH, + CLEAVE, + INTERCEPT, + DEVOUR_MAGIC, + FEL_INTELLIGENCE, + SHADOW_BITE, + SPELL_LOCK, + LASH_OF_PAIN, + SEDUCTION, + SOOTHING_KISS, CONSUME_SHADOWS, - FEL_INTELLIGENCE; + SACRIFICE, + SUFFERING, + TORMENT; // first aid uint32 RECENTLY_BANDAGED; From c0b5cffaad4b4b2ac6f9cf662f8071ac26fb15ac Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sat, 20 Nov 2010 08:32:55 +0300 Subject: [PATCH 178/187] Remove old version of UseItem(). --- src/game/playerbot/PlayerbotAI.cpp | 54 ++----------------- src/game/playerbot/PlayerbotAI.h | 1 - src/game/playerbot/PlayerbotDeathKnightAI.cpp | 4 +- src/game/playerbot/PlayerbotDruidAI.cpp | 6 +-- src/game/playerbot/PlayerbotHunterAI.cpp | 6 +-- src/game/playerbot/PlayerbotMageAI.cpp | 6 +-- src/game/playerbot/PlayerbotPaladinAI.cpp | 6 +-- src/game/playerbot/PlayerbotPriestAI.cpp | 6 +-- src/game/playerbot/PlayerbotRogueAI.cpp | 8 +-- src/game/playerbot/PlayerbotShamanAI.cpp | 6 +-- src/game/playerbot/PlayerbotWarriorAI.cpp | 4 +- 11 files changed, 29 insertions(+), 78 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 55316c062..d369f7aa4 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -1304,7 +1304,7 @@ void PlayerbotAI::Feast() Item* pItem = FindDrink(); if (pItem != NULL) { - UseItem(*pItem); + UseItem(pItem); m_TimeDoneDrinking = currentTime + 30; return; } @@ -1318,7 +1318,7 @@ void PlayerbotAI::Feast() if (pItem != NULL) { //TellMaster("eating now..."); - UseItem(*pItem); + UseItem(pItem); m_TimeDoneEating = currentTime + 30; return; } @@ -2952,54 +2952,6 @@ void PlayerbotAI::UseItem(Item *item, uint32 targetFlag, ObjectGuid targetGUID) m_bot->GetSession()->QueuePacket(packet); } -// submits packet to use an item -void PlayerbotAI::UseItem(Item& item, uint8 targetSlot) -{ - uint8 bagIndex = item.GetBagSlot(); - uint8 slot = item.GetSlot(); - uint8 cast_count = 1; - uint32 spellid; - uint64 item_guid = item.GetGUID(); - uint32 glyphIndex = 0; // ?? - uint8 unk_flags = 0; // not 0x02 - uint32 targetFlag; - - WorldPacket* packet; - - // create target data - // note other targets are possible but not supported at the moment - // see SpellCastTargets::read in Spell.cpp to see other options - // for setting target - - if (targetSlot < EQUIPMENT_SLOT_END) - { - targetFlag = TARGET_FLAG_ITEM; - Item* const targetItem = m_bot->GetItemByPos(INVENTORY_SLOT_BAG_0, targetSlot); - PackedGuid targetGUID = targetItem->GetObjectGuid().WriteAsPacked(); - spellid = item.GetProto()->Spells[0].SpellId; - packet = new WorldPacket(CMSG_USE_ITEM, 1 + 1 + 1 + 4 + 8 + 4 + 1 + 8); - *packet << bagIndex << slot << cast_count << spellid << item_guid - << glyphIndex << unk_flags << targetFlag << targetGUID; - } - else - { - targetFlag = TARGET_FLAG_SELF; - spellid = 0; - packet = new WorldPacket(CMSG_USE_ITEM, 1 + 1 + 1 + 4 + 8 + 4 + 1); - *packet << bagIndex << slot << cast_count << spellid << item_guid - << glyphIndex << unk_flags << targetFlag; - } - - m_bot->GetSession()->QueuePacket(packet); // queue the packet to get around race condition - - // certain items cause player to sit (food,drink) - // tell bot to stop following if this is the case - // (doesn't work since we queued the packet!) - // maybe its not needed??? - //if (! m_bot->IsStandState()) - // m_bot->GetMotionMaster()->Clear(); -} - // submits packet to use an item void PlayerbotAI::EquipItem(Item& item) { @@ -3311,7 +3263,7 @@ void PlayerbotAI::HandleCommand(const std::string& text, Player& fromPlayer) extractItemIds(text, itemIds); findItemsInInv(itemIds, itemList); for (std::list::iterator it = itemList.begin(); it != itemList.end(); ++it) - UseItem(**it); + UseItem(*it); } // equip items diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 49319955c..5defa7ee5 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -219,7 +219,6 @@ class MANGOS_DLL_SPEC PlayerbotAI bool CastPetSpell(uint32 spellId, Unit* target = NULL); bool Buff(uint32 spellId, Unit* target, void (*beforeCast)(Player *) = NULL); bool SelfBuff(uint32 spellId); - void UseItem(Item& item, uint8 targetSlot = 255); void UseItem(Item *item, uint32 targetFlag, ObjectGuid targetGUID); void UseItem(Item *item, uint8 targetInventorySlot); diff --git a/src/game/playerbot/PlayerbotDeathKnightAI.cpp b/src/game/playerbot/PlayerbotDeathKnightAI.cpp index 68a69032e..a274f55a9 100644 --- a/src/game/playerbot/PlayerbotDeathKnightAI.cpp +++ b/src/game/playerbot/PlayerbotDeathKnightAI.cpp @@ -488,14 +488,14 @@ void PlayerbotDeathKnightAI::DoNonCombatActions() if (pItem != NULL && ai->GetHealthPercent() < 30) { ai->TellMaster("I could use some food."); - ai->UseItem(*pItem); + ai->UseItem(pItem); ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); - ai->UseItem(*fItem); + ai->UseItem(fItem); ai->SetIgnoreUpdateTime(8); return; } diff --git a/src/game/playerbot/PlayerbotDruidAI.cpp b/src/game/playerbot/PlayerbotDruidAI.cpp index 6ff97614c..abb023858 100644 --- a/src/game/playerbot/PlayerbotDruidAI.cpp +++ b/src/game/playerbot/PlayerbotDruidAI.cpp @@ -557,7 +557,7 @@ void PlayerbotDruidAI::DoNonCombatActions() if (pItem != NULL && ai->GetManaPercent() < 30) { ai->TellMaster("I could use a drink."); - ai->UseItem(*pItem); + ai->UseItem(pItem); ai->SetIgnoreUpdateTime(30); return; } @@ -573,14 +573,14 @@ void PlayerbotDruidAI::DoNonCombatActions() if (pItem != NULL && ai->GetHealthPercent() < 30) { ai->TellMaster("I could use some food."); - ai->UseItem(*pItem); + ai->UseItem(pItem); ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); - ai->UseItem(*fItem); + ai->UseItem(fItem); ai->SetIgnoreUpdateTime(8); return; } diff --git a/src/game/playerbot/PlayerbotHunterAI.cpp b/src/game/playerbot/PlayerbotHunterAI.cpp index dfa479612..f953fe127 100644 --- a/src/game/playerbot/PlayerbotHunterAI.cpp +++ b/src/game/playerbot/PlayerbotHunterAI.cpp @@ -281,7 +281,7 @@ void PlayerbotHunterAI::DoNonCombatActions() if (pItem != NULL && ai->GetManaPercent() < 30) { ai->TellMaster("I could use a drink."); - ai->UseItem(*pItem); + ai->UseItem(pItem); ai->SetIgnoreUpdateTime(30); return; } @@ -295,14 +295,14 @@ void PlayerbotHunterAI::DoNonCombatActions() if (pItem != NULL && ai->GetHealthPercent() < 30) { ai->TellMaster("I could use some food."); - ai->UseItem(*pItem); + ai->UseItem(pItem); ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); - ai->UseItem(*fItem); + ai->UseItem(fItem); ai->SetIgnoreUpdateTime(8); return; } diff --git a/src/game/playerbot/PlayerbotMageAI.cpp b/src/game/playerbot/PlayerbotMageAI.cpp index 049a6b241..a412b17b3 100644 --- a/src/game/playerbot/PlayerbotMageAI.cpp +++ b/src/game/playerbot/PlayerbotMageAI.cpp @@ -418,7 +418,7 @@ void PlayerbotMageAI::DoNonCombatActions() else if (pItem != NULL && ai->GetManaPercent() < 30) { ai->TellMaster("I could use a drink."); - ai->UseItem(*pItem); + ai->UseItem(pItem); ai->SetIgnoreUpdateTime(30); return; } @@ -441,14 +441,14 @@ void PlayerbotMageAI::DoNonCombatActions() if (pItem != NULL && ai->GetHealthPercent() < 30) { ai->TellMaster("I could use some food."); - ai->UseItem(*pItem); + ai->UseItem(pItem); ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); - ai->UseItem(*fItem); + ai->UseItem(fItem); ai->SetIgnoreUpdateTime(8); return; } diff --git a/src/game/playerbot/PlayerbotPaladinAI.cpp b/src/game/playerbot/PlayerbotPaladinAI.cpp index 465553554..e94fd0f79 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.cpp +++ b/src/game/playerbot/PlayerbotPaladinAI.cpp @@ -344,7 +344,7 @@ void PlayerbotPaladinAI::DoNonCombatActions() if (pItem != NULL && ai->GetManaPercent() < 40) { ai->TellMaster("I could use a drink."); - ai->UseItem(*pItem); + ai->UseItem(pItem); ai->SetIgnoreUpdateTime(30); return; } @@ -358,14 +358,14 @@ void PlayerbotPaladinAI::DoNonCombatActions() if (pItem != NULL && ai->GetHealthPercent() < 40) { ai->TellMaster("I could use some food."); - ai->UseItem(*pItem); + ai->UseItem(pItem); ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); - ai->UseItem(*fItem); + ai->UseItem(fItem); ai->SetIgnoreUpdateTime(8); return; } diff --git a/src/game/playerbot/PlayerbotPriestAI.cpp b/src/game/playerbot/PlayerbotPriestAI.cpp index 0ae589057..126aacc2b 100644 --- a/src/game/playerbot/PlayerbotPriestAI.cpp +++ b/src/game/playerbot/PlayerbotPriestAI.cpp @@ -376,7 +376,7 @@ void PlayerbotPriestAI::DoNonCombatActions() if (pItem != NULL && ai->GetManaPercent() < 30) { ai->TellMaster("I could use a drink."); - ai->UseItem(*pItem); + ai->UseItem(pItem); ai->SetIgnoreUpdateTime(30); return; } @@ -390,14 +390,14 @@ void PlayerbotPriestAI::DoNonCombatActions() if (pItem != NULL && ai->GetHealthPercent() < 30) { ai->TellMaster("I could use some food."); - ai->UseItem(*pItem); + ai->UseItem(pItem); ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); - ai->UseItem(*fItem); + ai->UseItem(fItem); ai->SetIgnoreUpdateTime(8); return; } diff --git a/src/game/playerbot/PlayerbotRogueAI.cpp b/src/game/playerbot/PlayerbotRogueAI.cpp index a8ea5cdaa..13cbf83ed 100644 --- a/src/game/playerbot/PlayerbotRogueAI.cpp +++ b/src/game/playerbot/PlayerbotRogueAI.cpp @@ -296,14 +296,14 @@ void PlayerbotRogueAI::DoNonCombatActions() if (pItem != NULL && ai->GetHealthPercent() < 30) { ai->TellMaster("I could use some food."); - ai->UseItem(*pItem); + ai->UseItem(pItem); ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); - ai->UseItem(*fItem); + ai->UseItem(fItem); ai->SetIgnoreUpdateTime(8); return; } @@ -321,7 +321,7 @@ void PlayerbotRogueAI::DoNonCombatActions() poison = ai->FindConsumable(DEADLY_POISON_DISPLAYID); if (poison) { - ai->UseItem(*poison, EQUIPMENT_SLOT_MAINHAND); + ai->UseItem(poison, EQUIPMENT_SLOT_MAINHAND); ai->SetIgnoreUpdateTime(5); } } @@ -336,7 +336,7 @@ void PlayerbotRogueAI::DoNonCombatActions() poison = ai->FindConsumable(INSTANT_POISON_DISPLAYID); if (poison) { - ai->UseItem(*poison, EQUIPMENT_SLOT_OFFHAND); + ai->UseItem(poison, EQUIPMENT_SLOT_OFFHAND); ai->SetIgnoreUpdateTime(5); } } diff --git a/src/game/playerbot/PlayerbotShamanAI.cpp b/src/game/playerbot/PlayerbotShamanAI.cpp index 9debfc0fc..0b9c63ce9 100644 --- a/src/game/playerbot/PlayerbotShamanAI.cpp +++ b/src/game/playerbot/PlayerbotShamanAI.cpp @@ -482,7 +482,7 @@ void PlayerbotShamanAI::DoNonCombatActions() if (pItem != NULL && ai->GetManaPercent() < 30) { ai->TellMaster("I could use a drink."); - ai->UseItem(*pItem); + ai->UseItem(pItem); ai->SetIgnoreUpdateTime(30); return; } @@ -496,14 +496,14 @@ void PlayerbotShamanAI::DoNonCombatActions() if (pItem != NULL && ai->GetHealthPercent() < 30) { ai->TellMaster("I could use some food."); - ai->UseItem(*pItem); + ai->UseItem(pItem); ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); - ai->UseItem(*fItem); + ai->UseItem(fItem); ai->SetIgnoreUpdateTime(8); return; } diff --git a/src/game/playerbot/PlayerbotWarriorAI.cpp b/src/game/playerbot/PlayerbotWarriorAI.cpp index f4fd8093c..c6c5fc633 100644 --- a/src/game/playerbot/PlayerbotWarriorAI.cpp +++ b/src/game/playerbot/PlayerbotWarriorAI.cpp @@ -336,14 +336,14 @@ void PlayerbotWarriorAI::DoNonCombatActions() if (pItem != NULL && ai->GetHealthPercent() < 30) { ai->TellMaster("I could use some food."); - ai->UseItem(*pItem); + ai->UseItem(pItem); ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); - ai->UseItem(*fItem); + ai->UseItem(fItem); ai->SetIgnoreUpdateTime(8); return; } From c75898929f7bc5558db440a3e06776e10e918a5a Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sat, 20 Nov 2010 18:22:13 +0300 Subject: [PATCH 179/187] Set AI update delay inside UseItem(). Delay is calculated based on item spell cast time and duration. Explicit delays after UseItem() call were deleted. --- src/game/playerbot/PlayerbotAI.cpp | 38 ++++++++++++++++++- src/game/playerbot/PlayerbotDeathKnightAI.cpp | 2 - src/game/playerbot/PlayerbotDruidAI.cpp | 3 -- src/game/playerbot/PlayerbotHunterAI.cpp | 3 -- src/game/playerbot/PlayerbotMageAI.cpp | 3 -- src/game/playerbot/PlayerbotPaladinAI.cpp | 3 -- src/game/playerbot/PlayerbotPriestAI.cpp | 3 -- src/game/playerbot/PlayerbotRogueAI.cpp | 2 - src/game/playerbot/PlayerbotShamanAI.cpp | 3 -- src/game/playerbot/PlayerbotWarlockAI.cpp | 8 +--- src/game/playerbot/PlayerbotWarriorAI.cpp | 2 - 11 files changed, 37 insertions(+), 33 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index d369f7aa4..b72e532c1 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2937,19 +2937,53 @@ void PlayerbotAI::UseItem(Item *item, uint32 targetFlag, ObjectGuid targetGUID) uint8 bagIndex = item->GetBagSlot(); uint8 slot = item->GetSlot(); uint8 cast_count = 1; - uint32 spellid = item->GetProto()->Spells[0].SpellId; ObjectGuid item_guid = item->GetObjectGuid(); uint32 glyphIndex = 0; uint8 unk_flags = 0; + uint32 spellId = 0; + for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i) + { + if (item->GetProto()->Spells[i].SpellId > 0) + { + spellId = item->GetProto()->Spells[i].SpellId; + break; + } + } + WorldPacket *packet = new WorldPacket(CMSG_USE_ITEM, 28); - *packet << bagIndex << slot << cast_count << spellid << item_guid + *packet << bagIndex << slot << cast_count << spellId << item_guid << glyphIndex << unk_flags << targetFlag; if (targetFlag & (TARGET_FLAG_UNIT | TARGET_FLAG_ITEM)) *packet << targetGUID.WriteAsPacked(); m_bot->GetSession()->QueuePacket(packet); + + SpellEntry const * spellInfo = sSpellStore.LookupEntry(spellId); + if (!spellInfo) + { + TellMaster("Can't find spell entry for spell %u on item %u", spellId, item->GetEntry()); + return; + } + + SpellCastTimesEntry const * castingTimeEntry = sSpellCastTimesStore.LookupEntry(spellInfo->CastingTimeIndex); + if (!castingTimeEntry) + { + TellMaster("Can't find casting time entry for spell %u with index %u", spellId, spellInfo->CastingTimeIndex); + return; + } + + uint8 duration, castTime; + castTime = (uint8)((float)castingTimeEntry->CastTime / 1000.0f); + + if (item->GetProto()->Class == ITEM_CLASS_CONSUMABLE && item->GetProto()->SubClass == ITEM_SUBCLASS_FOOD) + { + duration = (uint8)((float)GetSpellDuration(spellInfo) / 1000.0f); + SetIgnoreUpdateTime(castTime + duration); + } + else + SetIgnoreUpdateTime(castTime); } // submits packet to use an item diff --git a/src/game/playerbot/PlayerbotDeathKnightAI.cpp b/src/game/playerbot/PlayerbotDeathKnightAI.cpp index a274f55a9..8cbb60f12 100644 --- a/src/game/playerbot/PlayerbotDeathKnightAI.cpp +++ b/src/game/playerbot/PlayerbotDeathKnightAI.cpp @@ -489,14 +489,12 @@ void PlayerbotDeathKnightAI::DoNonCombatActions() { ai->TellMaster("I could use some food."); ai->UseItem(pItem); - ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(fItem); - ai->SetIgnoreUpdateTime(8); return; } } // end DoNonCombatActions diff --git a/src/game/playerbot/PlayerbotDruidAI.cpp b/src/game/playerbot/PlayerbotDruidAI.cpp index abb023858..18d6d5827 100644 --- a/src/game/playerbot/PlayerbotDruidAI.cpp +++ b/src/game/playerbot/PlayerbotDruidAI.cpp @@ -558,7 +558,6 @@ void PlayerbotDruidAI::DoNonCombatActions() { ai->TellMaster("I could use a drink."); ai->UseItem(pItem); - ai->SetIgnoreUpdateTime(30); return; } else if (!pItem && INNERVATE > 0 && !m_bot->HasAura(INNERVATE) && ai->GetManaPercent() <= 20 && ai->CastSpell(INNERVATE, *m_bot)) @@ -574,14 +573,12 @@ void PlayerbotDruidAI::DoNonCombatActions() { ai->TellMaster("I could use some food."); ai->UseItem(pItem); - ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(fItem); - ai->SetIgnoreUpdateTime(8); return; } diff --git a/src/game/playerbot/PlayerbotHunterAI.cpp b/src/game/playerbot/PlayerbotHunterAI.cpp index f953fe127..410802e61 100644 --- a/src/game/playerbot/PlayerbotHunterAI.cpp +++ b/src/game/playerbot/PlayerbotHunterAI.cpp @@ -282,7 +282,6 @@ void PlayerbotHunterAI::DoNonCombatActions() { ai->TellMaster("I could use a drink."); ai->UseItem(pItem); - ai->SetIgnoreUpdateTime(30); return; } @@ -296,14 +295,12 @@ void PlayerbotHunterAI::DoNonCombatActions() { ai->TellMaster("I could use some food."); ai->UseItem(pItem); - ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(fItem); - ai->SetIgnoreUpdateTime(8); return; } else if (pItem == NULL && fItem == NULL && m_bot->getRace() == RACE_DRAENEI && !m_bot->HasAura(GIFT_OF_THE_NAARU, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) diff --git a/src/game/playerbot/PlayerbotMageAI.cpp b/src/game/playerbot/PlayerbotMageAI.cpp index a412b17b3..df21cdda1 100644 --- a/src/game/playerbot/PlayerbotMageAI.cpp +++ b/src/game/playerbot/PlayerbotMageAI.cpp @@ -419,7 +419,6 @@ void PlayerbotMageAI::DoNonCombatActions() { ai->TellMaster("I could use a drink."); ai->UseItem(pItem); - ai->SetIgnoreUpdateTime(30); return; } @@ -442,14 +441,12 @@ void PlayerbotMageAI::DoNonCombatActions() { ai->TellMaster("I could use some food."); ai->UseItem(pItem); - ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(fItem); - ai->SetIgnoreUpdateTime(8); return; } diff --git a/src/game/playerbot/PlayerbotPaladinAI.cpp b/src/game/playerbot/PlayerbotPaladinAI.cpp index e94fd0f79..c27e30302 100644 --- a/src/game/playerbot/PlayerbotPaladinAI.cpp +++ b/src/game/playerbot/PlayerbotPaladinAI.cpp @@ -345,7 +345,6 @@ void PlayerbotPaladinAI::DoNonCombatActions() { ai->TellMaster("I could use a drink."); ai->UseItem(pItem); - ai->SetIgnoreUpdateTime(30); return; } @@ -359,14 +358,12 @@ void PlayerbotPaladinAI::DoNonCombatActions() { ai->TellMaster("I could use some food."); ai->UseItem(pItem); - ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(fItem); - ai->SetIgnoreUpdateTime(8); return; } diff --git a/src/game/playerbot/PlayerbotPriestAI.cpp b/src/game/playerbot/PlayerbotPriestAI.cpp index 126aacc2b..e2a7aac45 100644 --- a/src/game/playerbot/PlayerbotPriestAI.cpp +++ b/src/game/playerbot/PlayerbotPriestAI.cpp @@ -377,7 +377,6 @@ void PlayerbotPriestAI::DoNonCombatActions() { ai->TellMaster("I could use a drink."); ai->UseItem(pItem); - ai->SetIgnoreUpdateTime(30); return; } @@ -391,14 +390,12 @@ void PlayerbotPriestAI::DoNonCombatActions() { ai->TellMaster("I could use some food."); ai->UseItem(pItem); - ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(fItem); - ai->SetIgnoreUpdateTime(8); return; } diff --git a/src/game/playerbot/PlayerbotRogueAI.cpp b/src/game/playerbot/PlayerbotRogueAI.cpp index 13cbf83ed..5d7b69f31 100644 --- a/src/game/playerbot/PlayerbotRogueAI.cpp +++ b/src/game/playerbot/PlayerbotRogueAI.cpp @@ -297,14 +297,12 @@ void PlayerbotRogueAI::DoNonCombatActions() { ai->TellMaster("I could use some food."); ai->UseItem(pItem); - ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(fItem); - ai->SetIgnoreUpdateTime(8); return; } diff --git a/src/game/playerbot/PlayerbotShamanAI.cpp b/src/game/playerbot/PlayerbotShamanAI.cpp index 0b9c63ce9..9b12907e7 100644 --- a/src/game/playerbot/PlayerbotShamanAI.cpp +++ b/src/game/playerbot/PlayerbotShamanAI.cpp @@ -483,7 +483,6 @@ void PlayerbotShamanAI::DoNonCombatActions() { ai->TellMaster("I could use a drink."); ai->UseItem(pItem); - ai->SetIgnoreUpdateTime(30); return; } @@ -497,14 +496,12 @@ void PlayerbotShamanAI::DoNonCombatActions() { ai->TellMaster("I could use some food."); ai->UseItem(pItem); - ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(fItem); - ai->SetIgnoreUpdateTime(8); return; } diff --git a/src/game/playerbot/PlayerbotWarlockAI.cpp b/src/game/playerbot/PlayerbotWarlockAI.cpp index eb4d1621d..0eeabf269 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.cpp +++ b/src/game/playerbot/PlayerbotWarlockAI.cpp @@ -102,7 +102,7 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) if (pet && DEMONIC_EMPOWERMENT && !m_bot->HasSpellCooldown(DEMONIC_EMPOWERMENT)) ai->CastSpell(DEMONIC_EMPOWERMENT); - // TODO (Playerbot): Use voidwalker sacrifice on low health if possible + // Use voidwalker sacrifice on low health if possible if (ai->GetHealthPercent() < 50) { if (pet && pet->GetEntry() == DEMON_VOIDWALKER && SACRIFICE && !m_bot->HasAura(SACRIFICE)) @@ -473,7 +473,6 @@ void PlayerbotWarlockAI::DoNonCombatActions() else { ai->UseItem(stone, EQUIPMENT_SLOT_MAINHAND); - ai->SetIgnoreUpdateTime(5); } } @@ -500,8 +499,6 @@ void PlayerbotWarlockAI::DoNonCombatActions() { ai->TellMaster("I could use a drink."); ai->UseItem(pItem); - // TODO (Playerbot): Get exact drinking time - ai->SetIgnoreUpdateTime(30); return; } } @@ -514,8 +511,6 @@ void PlayerbotWarlockAI::DoNonCombatActions() { ai->TellMaster("I could use some food."); ai->UseItem(pItem); - // TODO (Playerbot): Get exact eating time - ai->SetIgnoreUpdateTime(30); return; } } @@ -527,7 +522,6 @@ void PlayerbotWarlockAI::DoNonCombatActions() { ai->TellMaster("I could use first aid."); ai->UseItem(fItem); - ai->SetIgnoreUpdateTime(8); return; } } diff --git a/src/game/playerbot/PlayerbotWarriorAI.cpp b/src/game/playerbot/PlayerbotWarriorAI.cpp index c6c5fc633..7f899fae0 100644 --- a/src/game/playerbot/PlayerbotWarriorAI.cpp +++ b/src/game/playerbot/PlayerbotWarriorAI.cpp @@ -337,14 +337,12 @@ void PlayerbotWarriorAI::DoNonCombatActions() { ai->TellMaster("I could use some food."); ai->UseItem(pItem); - ai->SetIgnoreUpdateTime(30); return; } else if (pItem == NULL && fItem != NULL && !m_bot->HasAura(RECENTLY_BANDAGED, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) { ai->TellMaster("I could use first aid."); ai->UseItem(fItem); - ai->SetIgnoreUpdateTime(8); return; } else if (pItem == NULL && fItem == NULL && m_bot->getRace() == RACE_DRAENEI && !m_bot->HasAura(GIFT_OF_THE_NAARU, EFFECT_INDEX_0) && ai->GetHealthPercent() < 70) From bf69cdcdb3288fc3769888473ff5a55abdb18621 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Sat, 20 Nov 2010 18:44:04 +0300 Subject: [PATCH 180/187] Next pack of warlock changes. * Drain Mana and Curse of Exhaustoin were removed from combat sequence. * Removed all mana checks for combat spells. It is impossible to hardcode. * Some cleanup Warlock AI is still far from being perfect. Spell sequences was very poor idea from the begging. AI should adecuately react to game events, not just spam spells. --- src/game/playerbot/PlayerbotWarlockAI.cpp | 135 ++++++++++------------ 1 file changed, 61 insertions(+), 74 deletions(-) diff --git a/src/game/playerbot/PlayerbotWarlockAI.cpp b/src/game/playerbot/PlayerbotWarlockAI.cpp index 0eeabf269..037d43dac 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.cpp +++ b/src/game/playerbot/PlayerbotWarlockAI.cpp @@ -121,39 +121,32 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) switch (SpellSequence) { case SPELL_CURSES: - if (CURSE_OF_AGONY > 0 && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && LastSpellCurse < 1 && ai->GetManaPercent() >= 14) + if (CURSE_OF_AGONY && !pTarget->HasAura(CURSE_OF_AGONY) && !pTarget->HasAura(SHADOWFLAME) && LastSpellCurse < 1) { ai->CastSpell(CURSE_OF_AGONY, *pTarget); SpellSequence = SPELL_AFFLICTION; - LastSpellCurse = LastSpellCurse + 1; + ++LastSpellCurse; break; } - else if (CURSE_OF_THE_ELEMENTS > 0 && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && LastSpellCurse < 2 && ai->GetManaPercent() >= 10) + else if (CURSE_OF_THE_ELEMENTS && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS) && !pTarget->HasAura(SHADOWFLAME) && !pTarget->HasAura(CURSE_OF_AGONY) && !pTarget->HasAura(CURSE_OF_WEAKNESS) && LastSpellCurse < 2) { ai->CastSpell(CURSE_OF_THE_ELEMENTS, *pTarget); SpellSequence = SPELL_AFFLICTION; - LastSpellCurse = LastSpellCurse + 1; + ++LastSpellCurse; break; } - else if (CURSE_OF_EXHAUSTION > 0 && !pTarget->HasAura(CURSE_OF_EXHAUSTION, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && LastSpellCurse < 3 && ai->GetManaPercent() >= 6) - { - ai->CastSpell(CURSE_OF_EXHAUSTION, *pTarget); - SpellSequence = SPELL_AFFLICTION; - LastSpellCurse = LastSpellCurse + 1; - break; - } - else if (CURSE_OF_WEAKNESS > 0 && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_EXHAUSTION, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && LastSpellCurse < 4 && ai->GetManaPercent() >= 14) + else if (CURSE_OF_WEAKNESS && !pTarget->HasAura(CURSE_OF_WEAKNESS) && !pTarget->HasAura(SHADOWFLAME) && !pTarget->HasAura(CURSE_OF_AGONY) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS) && LastSpellCurse < 3) { ai->CastSpell(CURSE_OF_WEAKNESS, *pTarget); SpellSequence = SPELL_AFFLICTION; - LastSpellCurse = LastSpellCurse + 1; + ++LastSpellCurse; break; } - else if (CURSE_OF_TONGUES > 0 && !pTarget->HasAura(CURSE_OF_TONGUES, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_WEAKNESS, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_EXHAUSTION, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_AGONY, EFFECT_INDEX_0) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS, EFFECT_INDEX_0) && LastSpellCurse < 5 && ai->GetManaPercent() >= 4) + else if (CURSE_OF_TONGUES && !pTarget->HasAura(CURSE_OF_TONGUES) && !pTarget->HasAura(SHADOWFLAME) && !pTarget->HasAura(CURSE_OF_WEAKNESS) && !pTarget->HasAura(CURSE_OF_AGONY) && !pTarget->HasAura(CURSE_OF_THE_ELEMENTS) && LastSpellCurse < 4) { ai->CastSpell(CURSE_OF_TONGUES, *pTarget); SpellSequence = SPELL_AFFLICTION; - LastSpellCurse = LastSpellCurse + 1; + ++LastSpellCurse; break; } LastSpellCurse = 0; @@ -161,88 +154,80 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) //break; case SPELL_AFFLICTION: - if (LIFE_TAP > 0 && LastSpellAffliction < 1 && ai->GetManaPercent() <= 50) + if (LIFE_TAP && LastSpellAffliction < 1 && ai->GetManaPercent() <= 50 && ai->GetHealthPercent() > 50) { ai->CastSpell(LIFE_TAP, *m_bot); SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction + 1; + ++LastSpellAffliction; break; } - else if (CORRUPTION > 0 && !pTarget->HasAura(CORRUPTION, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && LastSpellAffliction < 2 && ai->GetManaPercent() >= 19) + else if (CORRUPTION && !pTarget->HasAura(CORRUPTION) && !pTarget->HasAura(SHADOWFLAME) && !pTarget->HasAura(SEED_OF_CORRUPTION) && LastSpellAffliction < 2) { ai->CastSpell(CORRUPTION, *pTarget); SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction + 1; + ++LastSpellAffliction; break; } - else if (DRAIN_SOUL > 0 && pTarget->GetHealth() < pTarget->GetMaxHealth() * 0.40 && !pTarget->HasAura(DRAIN_SOUL, EFFECT_INDEX_0) && LastSpellAffliction < 3 && ai->GetManaPercent() >= 19) + else if (DRAIN_SOUL && pTarget->GetHealth() < pTarget->GetMaxHealth() * 0.40 && !pTarget->HasAura(DRAIN_SOUL) && LastSpellAffliction < 3) { ai->CastSpell(DRAIN_SOUL, *pTarget); - ai->SetIgnoreUpdateTime(15); + //ai->SetIgnoreUpdateTime(15); SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction + 1; + ++LastSpellAffliction; break; } - else if (DRAIN_LIFE > 0 && LastSpellAffliction < 4 && !pTarget->HasAura(DRAIN_SOUL, EFFECT_INDEX_0) && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_LIFE, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_MANA, EFFECT_INDEX_0) && ai->GetHealthPercent() <= 70 && ai->GetManaPercent() >= 23) + else if (DRAIN_LIFE && LastSpellAffliction < 4 && !pTarget->HasAura(DRAIN_SOUL) && !pTarget->HasAura(SEED_OF_CORRUPTION) && !pTarget->HasAura(DRAIN_LIFE) && !pTarget->HasAura(DRAIN_MANA) && ai->GetHealthPercent() <= 70) { ai->CastSpell(DRAIN_LIFE, *pTarget); - ai->SetIgnoreUpdateTime(5); + //ai->SetIgnoreUpdateTime(5); SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction + 1; + ++LastSpellAffliction; break; } - else if (DRAIN_MANA > 0 && pTarget->GetPower(POWER_MANA) > 0 && !pTarget->HasAura(DRAIN_SOUL, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_MANA, EFFECT_INDEX_0) && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && !pTarget->HasAura(DRAIN_LIFE, EFFECT_INDEX_0) && LastSpellAffliction < 5 && ai->GetManaPercent() < 70 && ai->GetManaPercent() >= 17) - { - ai->CastSpell(DRAIN_MANA, *pTarget); - ai->SetIgnoreUpdateTime(5); - SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction + 1; - break; - } - else if (UNSTABLE_AFFLICTION > 0 && LastSpellAffliction < 6 && !pTarget->HasAura(UNSTABLE_AFFLICTION, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && ai->GetManaPercent() >= 20) + else if (UNSTABLE_AFFLICTION && LastSpellAffliction < 5 && !pTarget->HasAura(UNSTABLE_AFFLICTION) && !pTarget->HasAura(SHADOWFLAME)) { ai->CastSpell(UNSTABLE_AFFLICTION, *pTarget); SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction + 1; + ++LastSpellAffliction; break; } - else if (HAUNT > 0 && LastSpellAffliction < 7 && !pTarget->HasAura(HAUNT, EFFECT_INDEX_0) && ai->GetManaPercent() >= 12) + else if (HAUNT && LastSpellAffliction < 6 && !pTarget->HasAura(HAUNT)) { ai->CastSpell(HAUNT, *pTarget); SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction + 1; + ++LastSpellAffliction; break; } - else if (SEED_OF_CORRUPTION > 0 && !pTarget->HasAura(SEED_OF_CORRUPTION, EFFECT_INDEX_0) && LastSpellAffliction < 9 && ai->GetManaPercent() >= 34) + else if (SEED_OF_CORRUPTION && !pTarget->HasAura(SEED_OF_CORRUPTION) && LastSpellAffliction < 7) { ai->CastSpell(SEED_OF_CORRUPTION, *pTarget); SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction + 1; + ++LastSpellAffliction; break; } - else if (HOWL_OF_TERROR > 0 && !pTarget->HasAura(HOWL_OF_TERROR, EFFECT_INDEX_0) && ai->GetAttackerCount() > 3 && LastSpellAffliction < 10 && ai->GetManaPercent() >= 11) + else if (HOWL_OF_TERROR && !pTarget->HasAura(HOWL_OF_TERROR) && ai->GetAttackerCount() > 3 && LastSpellAffliction < 8) { ai->CastSpell(HOWL_OF_TERROR, *pTarget); ai->TellMaster("casting howl of terror!"); SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction + 1; + ++LastSpellAffliction; break; } - else if (FEAR > 0 && !pTarget->HasAura(FEAR, EFFECT_INDEX_0) && pVictim == m_bot && ai->GetAttackerCount() >= 2 && LastSpellAffliction < 11 && ai->GetManaPercent() >= 12) + else if (FEAR && !pTarget->HasAura(FEAR) && pVictim == m_bot && ai->GetAttackerCount() >= 2 && LastSpellAffliction < 9) { ai->CastSpell(FEAR, *pTarget); //ai->TellMaster("casting fear!"); - ai->SetIgnoreUpdateTime(1.5); + //ai->SetIgnoreUpdateTime(1.5); SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction + 1; + ++LastSpellAffliction; break; } else if ((pet) - && (DARK_PACT > 0 && ai->GetManaPercent() <= 50 && LastSpellAffliction < 12 && pet->GetPower(POWER_MANA) > 0)) + && (DARK_PACT > 0 && ai->GetManaPercent() <= 50 && LastSpellAffliction < 10 && pet->GetPower(POWER_MANA) > 0)) { ai->CastSpell(DARK_PACT, *m_bot); SpellSequence = SPELL_DESTRUCTION; - LastSpellAffliction = LastSpellAffliction + 1; + ++LastSpellAffliction; break; } LastSpellAffliction = 0; @@ -250,93 +235,93 @@ void PlayerbotWarlockAI::DoNextCombatManeuver(Unit *pTarget) //break; case SPELL_DESTRUCTION: - if (SHADOWFURY > 0 && LastSpellDestruction < 1 && !pTarget->HasAura(SHADOWFURY, EFFECT_INDEX_0) && ai->GetManaPercent() >= 37) + if (SHADOWFURY && LastSpellDestruction < 1 && !pTarget->HasAura(SHADOWFURY)) { ai->CastSpell(SHADOWFURY, *pTarget); SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; + ++LastSpellDestruction; break; } - else if (SHADOW_BOLT > 0 && LastSpellDestruction < 2 && ai->GetManaPercent() >= 23) + else if (SHADOW_BOLT && LastSpellDestruction < 2) { ai->CastSpell(SHADOW_BOLT, *pTarget); SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; + ++LastSpellDestruction; break; } - else if (RAIN_OF_FIRE > 0 && LastSpellDestruction < 3 && ai->GetAttackerCount() >= 3 && ai->GetManaPercent() >= 77) + else if (RAIN_OF_FIRE && LastSpellDestruction < 3 && ai->GetAttackerCount() >= 3) { ai->CastSpell(RAIN_OF_FIRE, *pTarget); //ai->TellMaster("casting rain of fire!"); - ai->SetIgnoreUpdateTime(8); + //ai->SetIgnoreUpdateTime(8); SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; + ++LastSpellDestruction; break; } - else if (SHADOWFLAME > 0 && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && LastSpellDestruction < 4 && ai->GetManaPercent() >= 25) + else if (SHADOWFLAME && !pTarget->HasAura(SHADOWFLAME) && LastSpellDestruction < 4) { ai->CastSpell(SHADOWFLAME, *pTarget); SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; + ++LastSpellDestruction; break; } - else if (IMMOLATE > 0 && !pTarget->HasAura(IMMOLATE, EFFECT_INDEX_0) && !pTarget->HasAura(SHADOWFLAME, EFFECT_INDEX_0) && LastSpellDestruction < 5 && ai->GetManaPercent() >= 23) + else if (IMMOLATE && !pTarget->HasAura(IMMOLATE) && !pTarget->HasAura(SHADOWFLAME) && LastSpellDestruction < 5) { ai->CastSpell(IMMOLATE, *pTarget); SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; + ++LastSpellDestruction; break; } - else if (CONFLAGRATE > 0 && LastSpellDestruction < 6 && ai->GetManaPercent() >= 16) + else if (CONFLAGRATE && LastSpellDestruction < 6) { ai->CastSpell(CONFLAGRATE, *pTarget); SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; + ++LastSpellDestruction; break; } - else if (INCINERATE > 0 && LastSpellDestruction < 7 && ai->GetManaPercent() >= 19) + else if (INCINERATE && LastSpellDestruction < 7) { ai->CastSpell(INCINERATE, *pTarget); SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; + ++LastSpellDestruction; break; } - else if (SEARING_PAIN > 0 && LastSpellDestruction < 8 && ai->GetManaPercent() >= 11) + else if (SEARING_PAIN && LastSpellDestruction < 8) { ai->CastSpell(SEARING_PAIN, *pTarget); SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; + ++LastSpellDestruction; break; } - else if (SOUL_FIRE > 0 && LastSpellDestruction < 9 && ai->GetManaPercent() >= 13) + else if (SOUL_FIRE && LastSpellDestruction < 9) { ai->CastSpell(SOUL_FIRE, *pTarget); - ai->SetIgnoreUpdateTime(6); + //ai->SetIgnoreUpdateTime(6); SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; + ++LastSpellDestruction; break; } - else if (CHAOS_BOLT > 0 && LastSpellDestruction < 10 && ai->GetManaPercent() >= 9) + else if (CHAOS_BOLT && LastSpellDestruction < 10) { ai->CastSpell(CHAOS_BOLT, *pTarget); SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; + ++LastSpellDestruction; break; } - else if (SHADOWBURN > 0 && LastSpellDestruction < 11 && pTarget->GetHealth() < pTarget->GetMaxHealth() * 0.20 && !pTarget->HasAura(SHADOWBURN, EFFECT_INDEX_0) && ai->GetManaPercent() >= 27) + else if (SHADOWBURN && LastSpellDestruction < 11 && pTarget->GetHealth() < pTarget->GetMaxHealth() * 0.20 && !pTarget->HasAura(SHADOWBURN)) { ai->CastSpell(SHADOWBURN, *pTarget); SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; + ++LastSpellDestruction; break; } - else if (HELLFIRE > 0 && LastSpellDestruction < 12 && !m_bot->HasAura(HELLFIRE, EFFECT_INDEX_0) && ai->GetAttackerCount() >= 5 && ai->GetHealthPercent() >= 10 && ai->GetManaPercent() >= 87) + else if (HELLFIRE && LastSpellDestruction < 12 && !m_bot->HasAura(HELLFIRE) && ai->GetAttackerCount() >= 5 && ai->GetHealthPercent() >= 50) { ai->CastSpell(HELLFIRE); ai->TellMaster("casting hellfire!"); - ai->SetIgnoreUpdateTime(15); + //ai->SetIgnoreUpdateTime(15); SpellSequence = SPELL_CURSES; - LastSpellDestruction = LastSpellDestruction + 1; + ++LastSpellDestruction; break; } else @@ -452,6 +437,7 @@ void PlayerbotWarlockAI::DoNonCombatActions() if (!master->HasAura(soulStoneSpell) && !m_bot->HasSpellCooldown(soulStoneSpell)) { ai->UseItem(soulStone, master); + return; } else { @@ -468,11 +454,12 @@ void PlayerbotWarlockAI::DoNonCombatActions() if (!stone) { if (CREATE_FIRESTONE && m_bot->HasItemCount(SOUL_SHARD, 1, false) && ai->CastSpell(CREATE_FIRESTONE)) - ai->SetIgnoreUpdateTime(5); + return; } else { ai->UseItem(stone, EQUIPMENT_SLOT_MAINHAND); + return; } } From 2d156ab99db06078964aac0a1635840da28ff5a8 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Mon, 22 Nov 2010 22:36:14 +0300 Subject: [PATCH 181/187] Yet another hunk of warlock changes. * Added soul shard check for out-of-combat spells * Bot will try to resummon his lost demon if he can. If there is no soul shard for this, then imp will be summoned. When bot will acuire soul shard, he will try to summon his demon of choice. Explicit demon summoning by 'cast' command will overwrite demon of choice with new one. * Some cleanup --- src/game/playerbot/PlayerbotWarlockAI.cpp | 68 ++++++++++++++++------- src/game/playerbot/PlayerbotWarlockAI.h | 4 +- 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/game/playerbot/PlayerbotWarlockAI.cpp b/src/game/playerbot/PlayerbotWarlockAI.cpp index 037d43dac..a1cb8a9ef 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.cpp +++ b/src/game/playerbot/PlayerbotWarlockAI.cpp @@ -71,6 +71,8 @@ PlayerbotWarlockAI::PlayerbotWarlockAI(Player* const master, Player* const bot, WILL_OF_THE_FORSAKEN = ai->initSpell(WILL_OF_THE_FORSAKEN_ALL); // undead m_lastDemon = 0; + m_demonOfChoice = DEMON_IMP; + m_isTempImp = false; } PlayerbotWarlockAI::~PlayerbotWarlockAI() {} @@ -388,6 +390,9 @@ void PlayerbotWarlockAI::DoNonCombatActions() } m_lastDemon = pet->GetEntry(); + + if (!m_isTempImp) + m_demonOfChoice = pet->GetEntry(); } // Destroy extra soul shards @@ -414,11 +419,11 @@ void PlayerbotWarlockAI::DoNonCombatActions() } // healthstone creation - if (CREATE_HEALTHSTONE) + if (CREATE_HEALTHSTONE && shardCount > 0) { Item* const healthStone = ai->FindConsumable(HEALTHSTONE_DISPLAYID); if (!healthStone && ai->CastSpell(CREATE_HEALTHSTONE)) - ai->SetIgnoreUpdateTime(5); + return; } // soulstone creation and use @@ -427,7 +432,7 @@ void PlayerbotWarlockAI::DoNonCombatActions() Item* soulStone = ai->FindConsumable(SOULSTONE_DISPLAYID); if (!soulStone) { - if (!m_bot->HasSpellCooldown(CREATE_SOULSTONE) && ai->CastSpell(CREATE_SOULSTONE)) + if (shardCount > 0 && !m_bot->HasSpellCooldown(CREATE_SOULSTONE) && ai->CastSpell(CREATE_SOULSTONE)) return; } else @@ -439,10 +444,6 @@ void PlayerbotWarlockAI::DoNonCombatActions() ai->UseItem(soulStone, master); return; } - else - { - // TODO (Playerbot): soulstone non-bot group members - } } } @@ -453,7 +454,7 @@ void PlayerbotWarlockAI::DoNonCombatActions() Item* const stone = ai->FindConsumable(FIRESTONE_DISPLAYID); if (!stone) { - if (CREATE_FIRESTONE && m_bot->HasItemCount(SOUL_SHARD, 1, false) && ai->CastSpell(CREATE_FIRESTONE)) + if (CREATE_FIRESTONE && shardCount > 0 && ai->CastSpell(CREATE_FIRESTONE)) return; } else @@ -518,19 +519,46 @@ void PlayerbotWarlockAI::DoNonCombatActions() ai->CastPetSpell(CONSUME_SHADOWS); // Summon demon - // TODO (Playerbot): Remember last demon and resummon him if possible - if (!pet) + if (!pet || m_isTempImp) { - if (SUMMON_FELGUARD && ai->CastSpell(SUMMON_FELGUARD)) - ai->TellMaster("Summoning Felguard."); - else if (SUMMON_FELHUNTER && ai->CastSpell(SUMMON_FELHUNTER)) - ai->TellMaster("Summoning Felhunter."); - else if (SUMMON_SUCCUBUS && ai->CastSpell(SUMMON_SUCCUBUS)) - ai->TellMaster("Summoning Succubus."); - else if (SUMMON_VOIDWALKER && ai->CastSpell(SUMMON_VOIDWALKER)) - ai->TellMaster("Summoning Voidwalker."); - else if (SUMMON_IMP && ai->CastSpell(SUMMON_IMP)) - ai->TellMaster("Summoning Imp."); + uint32 summonSpellId; + if (m_demonOfChoice != DEMON_IMP && shardCount > 0) + { + switch (m_demonOfChoice) + { + case DEMON_VOIDWALKER: + summonSpellId = SUMMON_VOIDWALKER; + break; + case DEMON_FELGUARD: + summonSpellId = SUMMON_FELGUARD; + break; + case DEMON_FELHUNTER: + summonSpellId = SUMMON_FELHUNTER; + break; + case DEMON_SUCCUBUS: + summonSpellId = SUMMON_SUCCUBUS; + break; + default: + summonSpellId = 0; + } + if (ai->CastSpell(summonSpellId)) + { + ai->TellMaster("Summoning favorite demon..."); + m_isTempImp = false; + return; + } + } + else + { + if (!pet && SUMMON_IMP && ai->CastSpell(SUMMON_IMP)) + { + if (m_demonOfChoice != DEMON_IMP) + m_isTempImp = true; + + ai->TellMaster("Summoning Imp..."); + return; + } + } } // Soul link demon diff --git a/src/game/playerbot/PlayerbotWarlockAI.h b/src/game/playerbot/PlayerbotWarlockAI.h index 0e2ce303c..97d1b2c11 100644 --- a/src/game/playerbot/PlayerbotWarlockAI.h +++ b/src/game/playerbot/PlayerbotWarlockAI.h @@ -241,7 +241,9 @@ class MANGOS_DLL_SPEC PlayerbotWarlockAI : PlayerbotClassAI LastSpellAffliction, LastSpellDestruction; - uint32 m_lastDemon; + uint32 m_lastDemon; // Last demon entry used for spell initialization + uint32 m_demonOfChoice; // Preferred demon entry + bool m_isTempImp; // True if imp summoned temporarily until soul shard acquired for demon of choice. }; #endif From d2e498812744c58a8b5a354dbb9567644d98bad6 Mon Sep 17 00:00:00 2001 From: chelobaka Date: Tue, 23 Nov 2010 20:51:59 +0300 Subject: [PATCH 182/187] Check pets for combat state and attackers. Also do some refactoring and cleanup. --- src/game/playerbot/PlayerbotAI.cpp | 79 ++++++++++++++---------------- src/game/playerbot/PlayerbotAI.h | 5 +- 2 files changed, 40 insertions(+), 44 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index b72e532c1..372847836 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -1788,8 +1788,12 @@ void PlayerbotAI::TurnInQuests(WorldObject *questgiver) bool PlayerbotAI::IsInCombat() { + Pet *pet; bool inCombat = false; inCombat |= m_bot->isInCombat(); + pet = m_bot->GetPet(); + if (pet) + inCombat |= pet->isInCombat(); inCombat |= GetMaster()->isInCombat(); if (m_bot->GetGroup()) { @@ -1797,48 +1801,47 @@ bool PlayerbotAI::IsInCombat() while (ref) { inCombat |= ref->getSource()->isInCombat(); + pet = ref->getSource()->GetPet(); + if (pet) + inCombat |= pet->isInCombat(); ref = ref->next(); } } return inCombat; } -void PlayerbotAI::UpdateAttackerInfo() +void PlayerbotAI::UpdateAttackersForTarget(Unit *victim) { - // clear old list - m_attackerInfo.clear(); - - // check own attackers - HostileReference *ref = m_bot->getHostileRefManager().getFirst(); + HostileReference *ref = victim->getHostileRefManager().getFirst(); while (ref) { ThreatManager *target = ref->getSource(); uint64 guid = target->getOwner()->GetGUID(); m_attackerInfo[guid].attacker = target->getOwner(); m_attackerInfo[guid].victim = target->getOwner()->getVictim(); - m_attackerInfo[guid].threat = target->getThreat(m_bot); + m_attackerInfo[guid].threat = target->getThreat(victim); m_attackerInfo[guid].count = 1; - m_attackerInfo[guid].source = 1; + //m_attackerInfo[guid].source = 1; // source is not used so far. ref = ref->next(); } +} + +void PlayerbotAI::UpdateAttackerInfo() +{ + // clear old list + m_attackerInfo.clear(); + + // check own attackers + UpdateAttackersForTarget(m_bot); + Pet *pet = m_bot->GetPet(); + if (pet) + UpdateAttackersForTarget(pet); // check master's attackers - ref = GetMaster()->getHostileRefManager().getFirst(); - while (ref) - { - ThreatManager *target = ref->getSource(); - uint64 guid = target->getOwner()->GetGUID(); - if (m_attackerInfo.find(guid) == m_attackerInfo.end()) - { - m_attackerInfo[guid].attacker = target->getOwner(); - m_attackerInfo[guid].victim = target->getOwner()->getVictim(); - m_attackerInfo[guid].count = 0; - m_attackerInfo[guid].source = 2; - } - m_attackerInfo[guid].threat = target->getThreat(m_bot); - m_attackerInfo[guid].count++; - ref = ref->next(); - } + UpdateAttackersForTarget(GetMaster()); + pet = GetMaster()->GetPet(); + if (pet) + UpdateAttackersForTarget(pet); // check all group members now if (m_bot->GetGroup()) @@ -1851,22 +1854,12 @@ void PlayerbotAI::UpdateAttackerInfo() gref = gref->next(); continue; } - ref = gref->getSource()->getHostileRefManager().getFirst(); - while (ref) - { - ThreatManager *target = ref->getSource(); - uint64 guid = target->getOwner()->GetGUID(); - if (m_attackerInfo.find(guid) == m_attackerInfo.end()) - { - m_attackerInfo[guid].attacker = target->getOwner(); - m_attackerInfo[guid].victim = target->getOwner()->getVictim(); - m_attackerInfo[guid].count = 0; - m_attackerInfo[guid].source = 3; - } - m_attackerInfo[guid].threat = target->getThreat(m_bot); - m_attackerInfo[guid].count++; - ref = ref->next(); - } + + UpdateAttackersForTarget(gref->getSource()); + pet = gref->getSource()->GetPet(); + if (pet) + UpdateAttackersForTarget(pet); + gref = gref->next(); } } @@ -2227,7 +2220,7 @@ void PlayerbotAI::UpdateAI(const uint32 p_time) else if (m_spellIdCommand != 0) { Unit* pTarget = ObjectAccessor::GetUnit(*m_bot, m_targetGuidCommand); - if (pTarget != NULL) + if (pTarget) CastSpell(m_spellIdCommand, *pTarget); m_spellIdCommand = 0; m_targetGuidCommand = 0; @@ -2242,12 +2235,12 @@ void PlayerbotAI::UpdateAI(const uint32 p_time) { SetState(BOTSTATE_LOOTING); m_attackerInfo.clear(); - m_ignoreAIUpdatesUntilTime = time(0); + SetIgnoreUpdateTime(); } else if (m_botState == BOTSTATE_LOOTING) { DoLoot(); - m_ignoreAIUpdatesUntilTime = time(0); + SetIgnoreUpdateTime(); } /* // are we sitting, if so feast if possible diff --git a/src/game/playerbot/PlayerbotAI.h b/src/game/playerbot/PlayerbotAI.h index 5defa7ee5..4efed3302 100644 --- a/src/game/playerbot/PlayerbotAI.h +++ b/src/game/playerbot/PlayerbotAI.h @@ -235,7 +235,7 @@ class MANGOS_DLL_SPEC PlayerbotAI Unit *GetCurrentTarget() { return m_targetCombat; }; void DoNextCombatManeuver(); void DoCombatMovement(); - void SetIgnoreUpdateTime(uint8 t) { m_ignoreAIUpdatesUntilTime = time(0) + t; }; + void SetIgnoreUpdateTime(uint8 t = 0) { m_ignoreAIUpdatesUntilTime = time(0) + t; }; Player *GetPlayerBot() const { return m_bot; } Player *GetPlayer() const { return m_bot; } @@ -284,6 +284,9 @@ class MANGOS_DLL_SPEC PlayerbotAI bool TradeItem(const Item& item, int8 slot = -1); bool TradeCopper(uint32 copper); + // Helper routines not needed by class AIs. + void UpdateAttackersForTarget(Unit *victim); + // it is safe to keep these back reference pointers because m_bot // owns the "this" object and m_master owns m_bot. The owner always cleans up. PlayerbotMgr* const m_mgr; From 169243a32875bb1caf32a202ca27597fe9aeb43a Mon Sep 17 00:00:00 2001 From: chelobaka Date: Tue, 23 Nov 2010 22:54:47 +0300 Subject: [PATCH 183/187] Do not interrupt channeled spells during combat. Not sure about non-combat channeled spells now... --- src/game/playerbot/PlayerbotAI.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 372847836..10d1dcae5 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2228,8 +2228,12 @@ void PlayerbotAI::UpdateAI(const uint32 p_time) // handle combat (either self/master/group in combat, or combat state and valid target) else if (IsInCombat() || (m_botState == BOTSTATE_COMBAT && m_targetCombat)) - DoNextCombatManeuver(); - + { + if (!pSpell || !pSpell->IsChannelActive()) + DoNextCombatManeuver(); + else + SetIgnoreUpdateTime(1); // It's better to update AI more frequently during combat + } // bot was in combat recently - loot now else if (m_botState == BOTSTATE_COMBAT) { From 93f70556cc878c038f4e2a2111589827b2fc737f Mon Sep 17 00:00:00 2001 From: blueboy Date: Mon, 29 Nov 2010 01:25:52 +0000 Subject: [PATCH 184/187] Fix for merge & compile error --- src/game/Makefile.am | 3 +-- src/game/playerbot/PlayerbotAI.cpp | 2 +- src/game/playerbot/PlayerbotClassAI.h | 2 +- src/game/playerbot/PlayerbotMgr.cpp | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/game/Makefile.am b/src/game/Makefile.am index 6fca778d5..202ac3eaf 100644 --- a/src/game/Makefile.am +++ b/src/game/Makefile.am @@ -17,8 +17,7 @@ ## Process this file with automake to produce Makefile.in ## Sub-directories to parse -SUBDIRS = playerbot -SUBDIRS = vmap +SUBDIRS = playerbot vmap ## CPP flags for includes, defines, etc. AM_CPPFLAGS = $(MANGOS_INCLUDES) -I$(top_builddir)/src/shared -I$(srcdir) -I$(srcdir)/../../dep/include -I$(srcdir)/../framework -I$(srcdir)/../shared -I$(srcdir)/vmap -I$(srcdir)/../realmd -I$(srcdir)/../../dep/include/g3dlite -DSYSCONFDIR=\"$(sysconfdir)/\" diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index 10d1dcae5..ce3f9c219 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -18,7 +18,7 @@ #include "../Player.h" #include "../ObjectMgr.h" #include "../Chat.h" -#include "../WorldPacket.h" +#include "WorldPacket.h" #include "../Spell.h" #include "../Unit.h" #include "../SpellAuras.h" diff --git a/src/game/playerbot/PlayerbotClassAI.h b/src/game/playerbot/PlayerbotClassAI.h index d37d75385..c6dfe06a7 100644 --- a/src/game/playerbot/PlayerbotClassAI.h +++ b/src/game/playerbot/PlayerbotClassAI.h @@ -6,7 +6,7 @@ #include "../SpellMgr.h" #include "../Player.h" #include "../ObjectMgr.h" -#include "../WorldPacket.h" +#include "WorldPacket.h" #include "../Unit.h" #include "../SharedDefines.h" #include "PlayerbotAI.h" diff --git a/src/game/playerbot/PlayerbotMgr.cpp b/src/game/playerbot/PlayerbotMgr.cpp index 4726fb8d8..975ab7d31 100644 --- a/src/game/playerbot/PlayerbotMgr.cpp +++ b/src/game/playerbot/PlayerbotMgr.cpp @@ -2,7 +2,7 @@ #include "../Player.h" #include "PlayerbotAI.h" #include "PlayerbotMgr.h" -#include "../WorldPacket.h" +#include "WorldPacket.h" #include "../Chat.h" #include "../ObjectMgr.h" #include "../GossipDef.h" From a504ceffab12b2883511706dad815055654f824f Mon Sep 17 00:00:00 2001 From: blueboy Date: Tue, 30 Nov 2010 12:35:28 +0000 Subject: [PATCH 185/187] Fix merge conflict in game.vcxproj.filters --- win/VC100/game.vcxproj.filters | 3 --- 1 file changed, 3 deletions(-) diff --git a/win/VC100/game.vcxproj.filters b/win/VC100/game.vcxproj.filters index e4fd63d70..42e5e5223 100644 --- a/win/VC100/game.vcxproj.filters +++ b/win/VC100/game.vcxproj.filters @@ -897,7 +897,6 @@ Object -<<<<<<< HEAD World/Handlers @@ -936,7 +935,6 @@ World/Handlers -======= vmaps @@ -966,7 +964,6 @@ vmaps ->>>>>>> a1c4e1dd990a26256e1bb80bbabcecc723a016a6 From b49379bc047a2f89c87dde70b7bbb30e75626e48 Mon Sep 17 00:00:00 2001 From: blueboy Date: Fri, 3 Dec 2010 21:03:30 +0000 Subject: [PATCH 186/187] Fix for removal of GUID_LOPART from the core --- src/game/playerbot/PlayerbotMgr.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/game/playerbot/PlayerbotMgr.cpp b/src/game/playerbot/PlayerbotMgr.cpp index 975ab7d31..991e17f6d 100644 --- a/src/game/playerbot/PlayerbotMgr.cpp +++ b/src/game/playerbot/PlayerbotMgr.cpp @@ -323,7 +323,8 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) sLog.outDebug("PlayerbotMgr: CMSG_REPAIR_ITEM"); - uint64 npcGUID, itemGUID; + ObjectGuid npcGUID; + uint64 itemGUID; uint8 guildBank; p.rpos(0); //reset packet pointer @@ -345,7 +346,7 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) Creature *unit = bot->GetNPCIfCanInteractWith(npcGUID, UNIT_NPC_FLAG_REPAIR); if (!unit) // Check if NPC can repair bot or not { - sLog.outDebug("PlayerbotMgr: HandleRepairItemOpcode - Unit (GUID: %u) not found or you can't interact with him.", uint32(GUID_LOPART(npcGUID))); + sLog.outDebug("PlayerbotMgr: HandleRepairItemOpcode - Unit (GUID: %s) not found or you can't interact with him.", npcGUID.GetString().c_str()); return; } @@ -364,7 +365,7 @@ void PlayerbotMgr::HandleMasterIncomingPacket(const WorldPacket& packet) } else // Handle feature (repair all items) for bot { - sLog.outDebug("ITEM: Repair all items, npcGUID = %u", GUID_LOPART(npcGUID)); + sLog.outDebug("ITEM: Repair all items, npcGUID = %s", npcGUID.GetString().c_str()); TotalCost = bot->DurabilityRepairAll(true, discountMod, guildBank > 0 ? true : false); } From d4c764e4ead220ef0bf22fa3d5680c2ffbddd136 Mon Sep 17 00:00:00 2001 From: BThallid Date: Sun, 5 Dec 2010 21:37:14 -0600 Subject: [PATCH 187/187] Check for a valid Buff target to prevent crash. --- src/game/playerbot/PlayerbotAI.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/game/playerbot/PlayerbotAI.cpp b/src/game/playerbot/PlayerbotAI.cpp index ce3f9c219..3aa3efc45 100644 --- a/src/game/playerbot/PlayerbotAI.cpp +++ b/src/game/playerbot/PlayerbotAI.cpp @@ -2467,6 +2467,9 @@ bool PlayerbotAI::Buff(uint32 spellId, Unit* target, void (*beforeCast)(Player * if (!spellProto) return false; + if (!target) + return false; + // Select appropriate spell rank for target's level spellProto = sSpellMgr.SelectAuraRankForLevel(spellProto, target->getLevel()); if (!spellProto)