diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index 82f2373a..3124c6d7 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -940,13 +940,13 @@ void PlayerbotAI::ChangeEngine(BotState type) switch (type) { case BOT_STATE_COMBAT: - LOG_DEBUG("playerbots", "=== {} COMBAT ===", bot->GetName().c_str()); + // LOG_DEBUG("playerbots", "=== {} COMBAT ===", bot->GetName().c_str()); break; case BOT_STATE_NON_COMBAT: - LOG_DEBUG("playerbots", "=== {} NON-COMBAT ===", bot->GetName().c_str()); + // LOG_DEBUG("playerbots", "=== {} NON-COMBAT ===", bot->GetName().c_str()); break; case BOT_STATE_DEAD: - LOG_DEBUG("playerbots", "=== {} DEAD ===", bot->GetName().c_str()); + // LOG_DEBUG("playerbots", "=== {} DEAD ===", bot->GetName().c_str()); break; } } @@ -2060,18 +2060,18 @@ bool PlayerbotAI::CanCastSpell(std::string const name, Unit* target, Item* itemT bool PlayerbotAI::CanCastSpell(uint32 spellid, Unit* target, bool checkHasSpell, Item* itemTarget) { if (!spellid) { - // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { - // LOG_DEBUG("playerbots", "Can cast spell failed. No spellid. - spellid: {}, bot name: {}", - // spellid, bot->GetName()); - // } + if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { + LOG_DEBUG("playerbots", "Can cast spell failed. No spellid. - spellid: {}, bot name: {}", + spellid, bot->GetName()); + } return false; } if (bot->HasUnitState(UNIT_STATE_LOST_CONTROL)) { - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) { - // LOG_DEBUG("playerbots", "Can cast spell failed. Unit state lost control. - spellid: {}, bot name: {}", - // spellid, bot->GetName()); - // } + if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { + LOG_DEBUG("playerbots", "Can cast spell failed. Unit state lost control. - spellid: {}, bot name: {}", + spellid, bot->GetName()); + } return false; } @@ -2079,7 +2079,7 @@ bool PlayerbotAI::CanCastSpell(uint32 spellid, Unit* target, bool checkHasSpell, if (!target) target = bot; - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) + // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) // LOG_DEBUG("playerbots", "Can cast spell? - target name: {}, spellid: {}, bot name: {}", // target->GetName(), spellid, bot->GetName()); @@ -2088,42 +2088,42 @@ bool PlayerbotAI::CanCastSpell(uint32 spellid, Unit* target, bool checkHasSpell, return true; if (checkHasSpell && !bot->HasSpell(spellid)) { - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) { - // LOG_DEBUG("playerbots", "Can cast spell failed. Bot not has spell. - target name: {}, spellid: {}, bot name: {}", - // target->GetName(), spellid, bot->GetName()); - // } + if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { + LOG_DEBUG("playerbots", "Can cast spell failed. Bot not has spell. - target name: {}, spellid: {}, bot name: {}", + target->GetName(), spellid, bot->GetName()); + } return false; } if (bot->GetCurrentSpell(CURRENT_CHANNELED_SPELL) != nullptr) { - // LOG_DEBUG("playerbots", "CanCastSpell() target name: {}, spellid: {}, bot name: {}, failed because has current channeled spell", - // target->GetName(), spellid, bot->GetName()); + LOG_DEBUG("playerbots", "CanCastSpell() target name: {}, spellid: {}, bot name: {}, failed because has current channeled spell", + target->GetName(), spellid, bot->GetName()); return false; } if (bot->HasSpellCooldown(spellid)) { - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) { - // LOG_DEBUG("playerbots", "Can cast spell failed. Spell not has cooldown. - target name: {}, spellid: {}, bot name: {}", - // target->GetName(), spellid, bot->GetName()); - // } + if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { + LOG_DEBUG("playerbots", "Can cast spell failed. Spell not has cooldown. - target name: {}, spellid: {}, bot name: {}", + target->GetName(), spellid, bot->GetName()); + } return false; } SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid); if (!spellInfo) { - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) { - // LOG_DEBUG("playerbots", "Can cast spell failed. No spellInfo. - target name: {}, spellid: {}, bot name: {}", - // target->GetName(), spellid, bot->GetName()); - // } + if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { + LOG_DEBUG("playerbots", "Can cast spell failed. No spellInfo. - target name: {}, spellid: {}, bot name: {}", + target->GetName(), spellid, bot->GetName()); + } return false; } uint32 CastingTime = !spellInfo->IsChanneled() ? spellInfo->CalcCastTime(bot) : spellInfo->GetDuration(); if (CastingTime && bot->isMoving()) { - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) { - // LOG_DEBUG("playerbots", "Casting time and bot is moving - target name: {}, spellid: {}, bot name: {}", - // target->GetName(), spellid, bot->GetName()); - // } + if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { + LOG_DEBUG("playerbots", "Casting time and bot is moving - target name: {}, spellid: {}, bot name: {}", + target->GetName(), spellid, bot->GetName()); + } return false; } @@ -2147,10 +2147,10 @@ bool PlayerbotAI::CanCastSpell(uint32 spellid, Unit* target, bool checkHasSpell, // } if (target->IsImmunedToSpell(spellInfo)) { - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) { - // LOG_DEBUG("playerbots", "target is immuned to spell - target name: {}, spellid: {}, bot name: {}", - // target->GetName(), spellid, bot->GetName()); - // } + if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { + LOG_DEBUG("playerbots", "target is immuned to spell - target name: {}, spellid: {}, bot name: {}", + target->GetName(), spellid, bot->GetName()); + } return false; } @@ -2159,7 +2159,7 @@ bool PlayerbotAI::CanCastSpell(uint32 spellid, Unit* target, bool checkHasSpell, // for (uint8 i = EFFECT_0; i <= EFFECT_2; i++) // { // if (target->IsImmunedToSpellEffect(spellInfo, i)) { - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) { + // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { // LOG_DEBUG("playerbots", "target is immuned to spell effect - target name: {}, spellid: {}, bot name: {}", // target->GetName(), spellid, bot->GetName()); // } @@ -2169,10 +2169,10 @@ bool PlayerbotAI::CanCastSpell(uint32 spellid, Unit* target, bool checkHasSpell, // } if (bot != target && sServerFacade->GetDistance2d(bot, target) > sPlayerbotAIConfig->sightDistance) { - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) { - // LOG_DEBUG("playerbots", "target is out of sight distance - target name: {}, spellid: {}, bot name: {}", - // target->GetName(), spellid, bot->GetName()); - // } + if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { + LOG_DEBUG("playerbots", "target is out of sight distance - target name: {}, spellid: {}, bot name: {}", + target->GetName(), spellid, bot->GetName()); + } return false; } } @@ -2188,7 +2188,7 @@ bool PlayerbotAI::CanCastSpell(uint32 spellid, Unit* target, bool checkHasSpell, SpellCastResult result = spell->CheckCast(true); delete spell; - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) { + // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { // if (result != SPELL_FAILED_NOT_READY && result != SPELL_CAST_OK) { // LOG_DEBUG("playerbots", "CanCastSpell - target name: {}, spellid: {}, bot name: {}, result: {}", // target->GetName(), spellid, bot->GetName(), result); @@ -2209,12 +2209,11 @@ bool PlayerbotAI::CanCastSpell(uint32 spellid, Unit* target, bool checkHasSpell, case SPELL_FAILED_NOT_SHAPESHIFT: return true; default: - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) { - // if (result != SPELL_FAILED_NOT_READY && result != SPELL_CAST_OK) { - // LOG_DEBUG("playerbots", "CanCastSpell Check Failed. - target name: {}, spellid: {}, bot name: {}, result: {}", - // target->GetName(), spellid, bot->GetName(), result); - // } - // } + if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { + // if (result != SPELL_FAILED_NOT_READY && result != SPELL_CAST_OK) { + LOG_DEBUG("playerbots", "CanCastSpell Check Failed. - target name: {}, spellid: {}, bot name: {}, result: {}", + target->GetName(), spellid, bot->GetName(), result); + } return false; } } @@ -2381,7 +2380,7 @@ bool PlayerbotAI::CastSpell(uint32 spellId, Unit* target, Item* itemTarget) aiObjectContext->GetValue("stay time")->Set(0); if (bot->IsFlying() || bot->HasUnitState(UNIT_STATE_IN_FLIGHT)) { - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) { + // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { // LOG_DEBUG("playerbots", "Spell cast is flying - target name: {}, spellid: {}, bot name: {}}", // target->GetName(), spellId, bot->GetName()); // } @@ -2411,7 +2410,7 @@ bool PlayerbotAI::CastSpell(uint32 spellId, Unit* target, Item* itemTarget) if (failWithDelay) { SetNextCheckDelay(sPlayerbotAIConfig->globalCoolDown); - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) { + // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { // LOG_DEBUG("playerbots", "Spell cast fail with delay - target name: {}, spellid: {}, bot name: {}", // target->GetName(), spellId, bot->GetName()); // } @@ -2430,7 +2429,7 @@ bool PlayerbotAI::CastSpell(uint32 spellId, Unit* target, Item* itemTarget) { bot->GetTradeData()->SetSpell(spellId); delete spell; - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) { + // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { // LOG_DEBUG("playerbots", "Spell cast no item - target name: {}, spellid: {}, bot name: {}", // target->GetName(), spellId, bot->GetName()); // } @@ -2485,7 +2484,7 @@ bool PlayerbotAI::CastSpell(uint32 spellId, Unit* target, Item* itemTarget) // spell->m_targets.SetUnitTarget(target); // SpellCastResult spellSuccess = spell->CheckCast(true); - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) { + // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { // LOG_DEBUG("playerbots", "Spell cast result - target name: {}, spellid: {}, bot name: {}, result: {}", // target->GetName(), spellId, bot->GetName(), spellSuccess); // } @@ -2495,7 +2494,7 @@ bool PlayerbotAI::CastSpell(uint32 spellId, Unit* target, Item* itemTarget) SpellCastResult result = spell->prepare(&targets); if (result != SPELL_CAST_OK) { - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) { + // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { // LOG_DEBUG("playerbots", "Spell cast failed. - target name: {}, spellid: {}, bot name: {}, result: {}", // target->GetName(), spellId, bot->GetName(), result); // } @@ -2508,7 +2507,7 @@ bool PlayerbotAI::CastSpell(uint32 spellId, Unit* target, Item* itemTarget) // { // spell->cancel(); // delete spell; - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) { + // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { // LOG_DEBUG("playerbots", "Spell cast loot - target name: {}, spellid: {}, bot name: {}", // target->GetName(), spellId, bot->GetName()); // } diff --git a/src/RandomPlayerbotFactory.cpp b/src/RandomPlayerbotFactory.cpp index 063b3089..e00eef84 100644 --- a/src/RandomPlayerbotFactory.cpp +++ b/src/RandomPlayerbotFactory.cpp @@ -206,11 +206,11 @@ Player* RandomPlayerbotFactory::CreateRandomBot(WorldSession* session, uint8 cls player->setCinematic(2); player->SetAtLoginFlag(AT_LOGIN_NONE); - // player->SaveToDB(true, false); - // if (player->getClass() == CLASS_DEATH_KNIGHT) - // { - // player->learnSpell(50977, false); - // } + player->SaveToDB(true, false); + if (player->getClass() == CLASS_DEATH_KNIGHT) + { + player->learnSpell(50977, false); + } // player->RewardQuest(const Quest *quest, uint32 reward, Object *questGiver) LOG_DEBUG("playerbots", "Random bot created for account {} - name: \"{}\"; race: {}; class: {}", accountId, name.c_str(), race, cls); diff --git a/src/strategy/actions/GenericSpellActions.cpp b/src/strategy/actions/GenericSpellActions.cpp index 377f29d9..aa51841a 100644 --- a/src/strategy/actions/GenericSpellActions.cpp +++ b/src/strategy/actions/GenericSpellActions.cpp @@ -63,10 +63,10 @@ bool CastSpellAction::Execute(Event event) bool CastSpellAction::isPossible() { if (botAI->IsInVehicle() && !botAI->IsInVehicle(false, false, true)) { - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) { - // LOG_DEBUG("playerbots", "Can cast spell failed. Vehicle. - bot name: {}", - // bot->GetName()); - // } + if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && botAI->HasRealPlayerMaster())) { + LOG_DEBUG("playerbots", "Can cast spell failed. Vehicle. - bot name: {}", + bot->GetName()); + } return false; } @@ -75,10 +75,10 @@ bool CastSpellAction::isPossible() if (spell == "mount" && bot->IsInCombat()) { - // if (!sPlayerbotAIConfig->logInGroupOnly || bot->GetGroup()) { - // LOG_DEBUG("playerbots", "Can cast spell failed. Mount. - bot name: {}", - // bot->GetName()); - // } + if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && botAI->HasRealPlayerMaster())) { + LOG_DEBUG("playerbots", "Can cast spell failed. Mount. - bot name: {}", + bot->GetName()); + } bot->Dismount(); return false; } diff --git a/src/strategy/actions/GenericSpellActions.h b/src/strategy/actions/GenericSpellActions.h index bbe1b480..cda5afc6 100644 --- a/src/strategy/actions/GenericSpellActions.h +++ b/src/strategy/actions/GenericSpellActions.h @@ -66,10 +66,10 @@ class CastDebuffSpellOnAttackerAction : public CastDebuffSpellAction // ActionThreatType getThreatType() override { return ActionThreatType::Aoe; } }; -class CastDebuffSpellOnMeleeAttackerAction : public CastAuraSpellAction +class CastDebuffSpellOnMeleeAttackerAction : public CastDebuffSpellAction { public: - CastDebuffSpellOnMeleeAttackerAction(PlayerbotAI* botAI, std::string const spell, bool isOwner = true) : CastAuraSpellAction(botAI, spell, isOwner) { } + CastDebuffSpellOnMeleeAttackerAction(PlayerbotAI* botAI, std::string const spell, bool isOwner = true, float needLifeTime = 8.0f) : CastDebuffSpellAction(botAI, spell, isOwner, needLifeTime) { } Value* GetTargetValue() override; std::string const getName() override { return spell + " on attacker"; } diff --git a/src/strategy/deathknight/BloodDKStrategy.cpp b/src/strategy/deathknight/BloodDKStrategy.cpp index bc610dbf..079d4ad9 100644 --- a/src/strategy/deathknight/BloodDKStrategy.cpp +++ b/src/strategy/deathknight/BloodDKStrategy.cpp @@ -80,12 +80,14 @@ BloodDKStrategy::BloodDKStrategy(PlayerbotAI* botAI) : GenericDKStrategy(botAI) NextAction** BloodDKStrategy::getDefaultActions() { return NextAction::array(0, - new NextAction("rune strike", ACTION_NORMAL + 7), - new NextAction("icy touch", ACTION_NORMAL + 6), - new NextAction("heart strike", ACTION_NORMAL + 5), - new NextAction("blood strike", ACTION_NORMAL + 4), + new NextAction("rune strike", ACTION_NORMAL + 8), + new NextAction("icy touch", ACTION_NORMAL + 7), + new NextAction("heart strike", ACTION_NORMAL + 6), + new NextAction("blood strike", ACTION_NORMAL + 5), + new NextAction("dancing rune weapon", ACTION_NORMAL + 4), new NextAction("death coil", ACTION_NORMAL + 3), new NextAction("plague strike", ACTION_NORMAL + 2), + new NextAction("horn of winter", ACTION_NORMAL + 1), new NextAction("melee", ACTION_NORMAL), NULL); } diff --git a/src/strategy/deathknight/DKActions.h b/src/strategy/deathknight/DKActions.h index 170bd0a2..2c6d384b 100644 --- a/src/strategy/deathknight/DKActions.h +++ b/src/strategy/deathknight/DKActions.h @@ -113,17 +113,23 @@ class CastIcyTouchAction : public CastSpellAction class CastIcyTouchOnAttackerAction : public CastDebuffSpellOnMeleeAttackerAction { public: - CastIcyTouchOnAttackerAction(PlayerbotAI* botAI) : CastDebuffSpellOnMeleeAttackerAction(botAI, "icy touch", true) { } + CastIcyTouchOnAttackerAction(PlayerbotAI* botAI) : CastDebuffSpellOnMeleeAttackerAction(botAI, "icy touch", true, .0f) { } }; //debuff ps -BEGIN_DEBUFF_ACTION(CastPlagueStrikeAction, "plague strike") -END_SPELL_ACTION() + +class CastPlagueStrikeAction : public CastSpellAction +{ + public: + CastPlagueStrikeAction(PlayerbotAI* ai) : CastSpellAction(ai, "plague strike") {} +}; +// BEGIN_DEBUFF_ACTION(CastPlagueStrikeAction, "plague strike") +// END_SPELL_ACTION() class CastPlagueStrikeOnAttackerAction : public CastDebuffSpellOnMeleeAttackerAction { public: - CastPlagueStrikeOnAttackerAction(PlayerbotAI* botAI) : CastDebuffSpellOnMeleeAttackerAction(botAI, "plague strike", true) { } + CastPlagueStrikeOnAttackerAction(PlayerbotAI* botAI) : CastDebuffSpellOnMeleeAttackerAction(botAI, "plague strike", true, .0f) { } }; //debuff @@ -142,10 +148,10 @@ class CastUnholyBlightAction : public CastBuffSpellAction CastUnholyBlightAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "unholy blight") { } }; -class CastSummonGargoyleAction : public CastBuffSpellAction +class CastSummonGargoyleAction : public CastSpellAction { public: - CastSummonGargoyleAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "summon gargoyle") { } + CastSummonGargoyleAction(PlayerbotAI* botAI) : CastSpellAction(botAI, "summon gargoyle") { } }; class CastGhoulFrenzyAction : public CastBuffSpellAction @@ -230,10 +236,10 @@ class CastDeathAndDecayAction : public CastSpellAction CastDeathAndDecayAction(PlayerbotAI* botAI) : CastSpellAction(botAI, "death and decay") { } }; -class CastHornOfWinterAction : public CastBuffSpellAction +class CastHornOfWinterAction : public CastSpellAction { public: - CastHornOfWinterAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "horn of winter") { } + CastHornOfWinterAction(PlayerbotAI* botAI) : CastSpellAction(botAI, "horn of winter") { } }; class CastImprovedIcyTalonsAction : public CastBuffSpellAction @@ -260,10 +266,10 @@ class CastDeathRuneMasteryAction : public CastBuffSpellAction CastDeathRuneMasteryAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "death rune mastery") { } }; -class CastDancingWeaponAction : public CastBuffSpellAction +class CastDancingRuneWeaponAction : public CastSpellAction { public: - CastDancingWeaponAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "dancing weapon") { } + CastDancingRuneWeaponAction(PlayerbotAI* botAI) : CastSpellAction(botAI, "dancing rune weapon") { } }; class CastEmpowerRuneWeaponAction : public CastBuffSpellAction diff --git a/src/strategy/deathknight/DKAiObjectContext.cpp b/src/strategy/deathknight/DKAiObjectContext.cpp index a6ffebd6..b01d8a6d 100644 --- a/src/strategy/deathknight/DKAiObjectContext.cpp +++ b/src/strategy/deathknight/DKAiObjectContext.cpp @@ -85,6 +85,8 @@ class DeathKnightTriggerFactoryInternal : public NamedObjectContext creators["raise dead"] = &DeathKnightTriggerFactoryInternal::raise_dead; creators["chains of ice"] = &DeathKnightTriggerFactoryInternal::chains_of_ice; creators["unbreakable armor"] = &DeathKnightTriggerFactoryInternal::unbreakable_armor; + creators["high blood rune"] = &DeathKnightTriggerFactoryInternal::high_blood_rune; + creators["freezing fog"] = &DeathKnightTriggerFactoryInternal::freezing_fog; } private: @@ -106,6 +108,9 @@ class DeathKnightTriggerFactoryInternal : public NamedObjectContext static Trigger* raise_dead(PlayerbotAI* botAI) { return new RaiseDeadTrigger(botAI); } static Trigger* chains_of_ice(PlayerbotAI* botAI) { return new ChainsOfIceSnareTrigger(botAI); } static Trigger* unbreakable_armor(PlayerbotAI* botAI) { return new UnbreakableArmorTrigger(botAI); } + static Trigger* high_blood_rune(PlayerbotAI* botAI) { return new HighBloodRuneTrigger(botAI); } + static Trigger* freezing_fog(PlayerbotAI* botAI) { return new FreezingFogTrigger(botAI); } + }; class DeathKnightAiObjectContextInternal : public NamedObjectContext @@ -164,7 +169,7 @@ class DeathKnightAiObjectContextInternal : public NamedObjectContext creators["death pact"] = &DeathKnightAiObjectContextInternal::death_pact; creators["death rune_mastery"] = &DeathKnightAiObjectContextInternal::death_rune_mastery; //creators["hysteria"] = &DeathKnightAiObjectContextInternal::hysteria; - creators["dancing weapon"] = &DeathKnightAiObjectContextInternal::dancing_weapon; + creators["dancing rune weapon"] = &DeathKnightAiObjectContextInternal::dancing_rune_weapon; creators["dark command"] = &DeathKnightAiObjectContextInternal::dark_command; } @@ -221,7 +226,7 @@ class DeathKnightAiObjectContextInternal : public NamedObjectContext static Action* death_pact(PlayerbotAI* botAI) { return new CastDeathPactAction(botAI); } static Action* death_rune_mastery(PlayerbotAI* botAI) { return new CastDeathRuneMasteryAction(botAI); } //static Action* hysteria(PlayerbotAI* botAI) { return new CastHysteriaAction(botAI); } - static Action* dancing_weapon(PlayerbotAI* botAI) { return new CastDancingWeaponAction(botAI); } + static Action* dancing_rune_weapon(PlayerbotAI* botAI) { return new CastDancingRuneWeaponAction(botAI); } static Action* dark_command(PlayerbotAI* botAI) { return new CastDarkCommandAction(botAI); } static Action* mind_freeze_on_enemy_healer(PlayerbotAI* botAI) { return new CastMindFreezeOnEnemyHealerAction(botAI); } }; diff --git a/src/strategy/deathknight/DKTriggers.cpp b/src/strategy/deathknight/DKTriggers.cpp index c9c6a17c..07cf2364 100644 --- a/src/strategy/deathknight/DKTriggers.cpp +++ b/src/strategy/deathknight/DKTriggers.cpp @@ -27,4 +27,9 @@ bool PestilenceTrigger::IsActive() { return true; } return false; +} + +bool HighBloodRuneTrigger::IsActive() { + // bot->Say(std::to_string(bot->GetBaseRune(0)) + "_" + std::to_string(bot->GetRuneCooldown(0)) + " " + std::to_string(bot->GetBaseRune(1)) + "_" + std::to_string(bot->GetRuneCooldown(1)), LANG_UNIVERSAL); + return !bot->GetRuneCooldown(0) && !bot->GetRuneCooldown(1); } \ No newline at end of file diff --git a/src/strategy/deathknight/DKTriggers.h b/src/strategy/deathknight/DKTriggers.h index 04600e9d..bcf138b7 100644 --- a/src/strategy/deathknight/DKTriggers.h +++ b/src/strategy/deathknight/DKTriggers.h @@ -12,19 +12,31 @@ class PlayerbotAI; BUFF_TRIGGER(HornOfWinterTrigger, "horn of winter"); BUFF_TRIGGER(BoneShieldTrigger, "bone shield"); BUFF_TRIGGER(ImprovedIcyTalonsTrigger, "improved icy talons"); -DEBUFF_CHECKISOWNER_TRIGGER(PlagueStrikeDebuffTrigger, "blood plague"); -DEBUFF_CHECKISOWNER_TRIGGER(IcyTouchDebuffTrigger, "frost fever"); +// DEBUFF_CHECKISOWNER_TRIGGER(PlagueStrikeDebuffTrigger, "blood plague"); +class PlagueStrikeDebuffTrigger : public DebuffTrigger +{ + public: + PlagueStrikeDebuffTrigger(PlayerbotAI* botAI) : DebuffTrigger(botAI, "blood plague", true, .0f) { } +}; + +// DEBUFF_CHECKISOWNER_TRIGGER(IcyTouchDebuffTrigger, "frost fever"); +class IcyTouchDebuffTrigger : public DebuffTrigger +{ + public: + IcyTouchDebuffTrigger(PlayerbotAI* botAI) : DebuffTrigger(botAI, "frost fever", true, .0f) { } +}; + BUFF_TRIGGER(UnbreakableArmorTrigger, "unbreakable armor"); class PlagueStrikeDebuffOnAttackerTrigger : public DebuffOnMeleeAttackerTrigger { public: - PlagueStrikeDebuffOnAttackerTrigger(PlayerbotAI* botAI) : DebuffOnMeleeAttackerTrigger(botAI, "blood plague", true) { } + PlagueStrikeDebuffOnAttackerTrigger(PlayerbotAI* botAI) : DebuffOnMeleeAttackerTrigger(botAI, "blood plague", true, .0f) { } }; class IcyTouchDebuffOnAttackerTrigger : public DebuffOnMeleeAttackerTrigger { public: - IcyTouchDebuffOnAttackerTrigger(PlayerbotAI* botAI) : DebuffOnMeleeAttackerTrigger(botAI, "frost fever", true) { } + IcyTouchDebuffOnAttackerTrigger(PlayerbotAI* botAI) : DebuffOnMeleeAttackerTrigger(botAI, "frost fever", true, .0f) { } }; class DKPresenceTrigger : public BuffTrigger @@ -114,4 +126,17 @@ class StrangulateOnEnemyHealerTrigger : public InterruptEnemyHealerTrigger StrangulateOnEnemyHealerTrigger(PlayerbotAI* botAI) : InterruptEnemyHealerTrigger(botAI, "strangulate") { } }; +class HighBloodRuneTrigger : public Trigger +{ + public: + HighBloodRuneTrigger(PlayerbotAI* botAI) : Trigger(botAI, "high blood rune") { } + bool IsActive() override; +}; + +class FreezingFogTrigger : public HasAuraTrigger +{ + public: + FreezingFogTrigger(PlayerbotAI* botAI) : HasAuraTrigger(botAI, "freezing fog") { } +}; + #endif diff --git a/src/strategy/deathknight/FrostDKStrategy.cpp b/src/strategy/deathknight/FrostDKStrategy.cpp index 307801db..1383a468 100644 --- a/src/strategy/deathknight/FrostDKStrategy.cpp +++ b/src/strategy/deathknight/FrostDKStrategy.cpp @@ -82,6 +82,7 @@ NextAction** FrostDKStrategy::getDefaultActions() new NextAction("frost strike", ACTION_NORMAL + 4), // new NextAction("death strike", ACTION_NORMAL + 3), new NextAction("empower rune weapon", ACTION_NORMAL + 2), + new NextAction("horn of winter", ACTION_NORMAL), new NextAction("melee", ACTION_NORMAL), NULL ); @@ -91,6 +92,9 @@ void FrostDKStrategy::InitTriggers(std::vector& triggers) { GenericDKStrategy::InitTriggers(triggers); triggers.push_back(new TriggerNode("unbreakable armor", NextAction::array(0, new NextAction("unbreakable armor", ACTION_NORMAL + 4), nullptr))); + triggers.push_back(new TriggerNode("high blood rune", NextAction::array(0, new NextAction("blood strike", ACTION_NORMAL + 1), nullptr))); + triggers.push_back(new TriggerNode("freezing fog", NextAction::array(0, new NextAction("howling blast", ACTION_HIGH + 1), nullptr))); + // triggers.push_back(new TriggerNode("empower rune weapon", NextAction::array(0, new NextAction("empower rune weapon", ACTION_NORMAL + 4), nullptr))); } diff --git a/src/strategy/deathknight/UnholyDKStrategy.cpp b/src/strategy/deathknight/UnholyDKStrategy.cpp index 107294a7..4369689f 100644 --- a/src/strategy/deathknight/UnholyDKStrategy.cpp +++ b/src/strategy/deathknight/UnholyDKStrategy.cpp @@ -72,12 +72,14 @@ UnholyDKStrategy::UnholyDKStrategy(PlayerbotAI* botAI) : GenericDKStrategy(botAI NextAction** UnholyDKStrategy::getDefaultActions() { return NextAction::array(0, - new NextAction("scourge strike", ACTION_NORMAL + 6), - new NextAction("blood strike", ACTION_NORMAL + 5), - new NextAction("ghoul frenzy", ACTION_NORMAL + 4), + new NextAction("scourge strike", ACTION_NORMAL + 7), + new NextAction("blood strike", ACTION_NORMAL + 6), + new NextAction("ghoul frenzy", ACTION_NORMAL + 5), + new NextAction("summon gargoyle", ACTION_NORMAL + 4), new NextAction("death coil", ACTION_NORMAL + 3), new NextAction("plague strike", ACTION_NORMAL + 2), - new NextAction("icy touch", ACTION_NORMAL + 1), + new NextAction("icy touch", ACTION_NORMAL + 1), + new NextAction("horn of winter", ACTION_NORMAL), new NextAction("melee", ACTION_NORMAL), nullptr); } diff --git a/src/strategy/druid/DruidActions.h b/src/strategy/druid/DruidActions.h index afacddb1..1fea0640 100644 --- a/src/strategy/druid/DruidActions.h +++ b/src/strategy/druid/DruidActions.h @@ -136,6 +136,7 @@ class CastHurricaneAction : public CastSpellAction { public: CastHurricaneAction(PlayerbotAI* botAI) : CastSpellAction(botAI, "hurricane") { } + ActionThreatType getThreatType() override { return ActionThreatType::Aoe; } }; class CastMoonfireAction : public CastDebuffSpellAction diff --git a/src/strategy/druid/GenericDruidNonCombatStrategy.cpp b/src/strategy/druid/GenericDruidNonCombatStrategy.cpp index 495f6dc4..ef24811a 100644 --- a/src/strategy/druid/GenericDruidNonCombatStrategy.cpp +++ b/src/strategy/druid/GenericDruidNonCombatStrategy.cpp @@ -17,6 +17,8 @@ class GenericDruidNonCombatStrategyActionNodeFactory : public NamedObjectFactory // creators["innervate"] = &innervate; creators["regrowth_on_party"] = ®rowth_on_party; creators["rejuvenation on party"] = &rejuvenation_on_party; + creators["remove curse on party"] = &remove_curse_on_party; + creators["abolish poison on party"] = &abolish_poison_on_party; } private: @@ -65,6 +67,20 @@ class GenericDruidNonCombatStrategyActionNodeFactory : public NamedObjectFactory /*A*/ NULL, /*C*/ NULL); } + static ActionNode* remove_curse_on_party(PlayerbotAI* ai) + { + return new ActionNode ("remove curse on party", + /*P*/ NextAction::array(0, new NextAction("caster form"), nullptr), + /*A*/ NULL, + /*C*/ NULL); + } + static ActionNode* abolish_poison_on_party(PlayerbotAI* ai) + { + return new ActionNode ("abolish poison on party", + /*P*/ NextAction::array(0, new NextAction("caster form"), nullptr), + /*A*/ NULL, + /*C*/ NULL); + } // static ActionNode* innervate([[maybe_unused]] PlayerbotAI* botAI) // { // return new ActionNode ("innervate", @@ -84,7 +100,7 @@ void GenericDruidNonCombatStrategy::InitTriggers(std::vector& trig NonCombatStrategy::InitTriggers(triggers); triggers.push_back(new TriggerNode("mark of the wild", NextAction::array(0, new NextAction("mark of the wild", 14.0f), nullptr))); - triggers.push_back(new TriggerNode("thorns", NextAction::array(0, new NextAction("thorns", 12.0f), nullptr))); + // triggers.push_back(new TriggerNode("thorns", NextAction::array(0, new NextAction("thorns", 12.0f), nullptr))); // triggers.push_back(new TriggerNode("cure poison", NextAction::array(0, new NextAction("abolish poison", 21.0f), nullptr))); triggers.push_back(new TriggerNode("party member cure poison", NextAction::array(0, new NextAction("abolish poison on party", 20.0f), nullptr))); triggers.push_back(new TriggerNode("party member dead", NextAction::array(0, new NextAction("revive", ACTION_CRITICAL_HEAL + 10), nullptr))); @@ -106,6 +122,9 @@ void GenericDruidNonCombatStrategy::InitTriggers(std::vector& trig triggers.push_back(new TriggerNode("party member almost full health", NextAction::array(0, new NextAction("rejuvenation on party", ACTION_LIGHT_HEAL + 2), NULL))); + + triggers.push_back(new TriggerNode("party member remove curse", + NextAction::array(0, new NextAction("remove curse on party", ACTION_DISPEL + 7), NULL))); } GenericDruidBuffStrategy::GenericDruidBuffStrategy(PlayerbotAI* botAI) : NonCombatStrategy(botAI) diff --git a/src/strategy/hunter/HunterActions.h b/src/strategy/hunter/HunterActions.h index 6ece5bae..4f570dbb 100644 --- a/src/strategy/hunter/HunterActions.h +++ b/src/strategy/hunter/HunterActions.h @@ -53,6 +53,7 @@ BEGIN_RANGED_SPELL_ACTION(CastMultiShotAction, "multi-shot") END_SPELL_ACTION() BEGIN_RANGED_SPELL_ACTION(CastVolleyAction, "volley") + ActionThreatType getThreatType() override { return ActionThreatType::Aoe; } END_SPELL_ACTION() DEBUFF_CHECKISOWNER_ACTION(CastSerpentStingAction, "serpent sting"); diff --git a/src/strategy/mage/ArcaneMageStrategy.cpp b/src/strategy/mage/ArcaneMageStrategy.cpp index 4dce3368..c5c46aa4 100644 --- a/src/strategy/mage/ArcaneMageStrategy.cpp +++ b/src/strategy/mage/ArcaneMageStrategy.cpp @@ -37,7 +37,7 @@ class ArcaneMageStrategyActionNodeFactory : public NamedObjectFactory* GetTargetValue() override; std::string const getName() override { return spell + " on attacker"; } diff --git a/src/strategy/warlock/WarlockActions.h b/src/strategy/warlock/WarlockActions.h index 3b5f177e..0ec8cfbb 100644 --- a/src/strategy/warlock/WarlockActions.h +++ b/src/strategy/warlock/WarlockActions.h @@ -148,6 +148,7 @@ class CastRainOfFireAction : public CastSpellAction { public: CastRainOfFireAction(PlayerbotAI* botAI) : CastSpellAction(botAI, "rain of fire") { } + ActionThreatType getThreatType() override { return ActionThreatType::Aoe; } }; class CastShadowfuryAction : public CastSpellAction