diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index 96161f5c..47501b29 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -811,12 +811,13 @@ AiPlayerbot.OpenGoSpell = 6477 # # Additional randombot strategies -# Strategies added here are applied to all randombots, in addition (or subtraction) to spec-based default strategies. These rules are processed after the defaults. -AiPlayerbot.RandomBotCombatStrategies = "+dps,+dps assist,-threat" +# Strategies added here are applied to all randombots, in addition (or subtraction) to spec/role-based default strategies. These rules are processed after the defaults. +# Example: "+threat,-potions" +AiPlayerbot.RandomBotCombatStrategies = "" AiPlayerbot.RandomBotNonCombatStrategies = "" # Additional altbot strategies -# Strategies added here are applied to all altbots, in addition (or subtraction) to spec-based default strategies. These rules are processed after the defaults. +# Strategies added here are applied to all altbots, in addition (or subtraction) to spec/role-based default strategies. These rules are processed after the defaults. AiPlayerbot.CombatStrategies = "" AiPlayerbot.NonCombatStrategies = "" diff --git a/data/sql/characters/playerbots_arena_team_names.sql b/data/sql/characters/base/playerbots_arena_team_names.sql similarity index 100% rename from data/sql/characters/playerbots_arena_team_names.sql rename to data/sql/characters/base/playerbots_arena_team_names.sql diff --git a/data/sql/characters/playerbots_guild_names.sql b/data/sql/characters/base/playerbots_guild_names.sql similarity index 100% rename from data/sql/characters/playerbots_guild_names.sql rename to data/sql/characters/base/playerbots_guild_names.sql diff --git a/data/sql/characters/playerbots_names.sql b/data/sql/characters/base/playerbots_names.sql similarity index 100% rename from data/sql/characters/playerbots_names.sql rename to data/sql/characters/base/playerbots_names.sql diff --git a/data/sql/characters/updates/.gitkeep b/data/sql/characters/updates/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/data/sql/playerbots/updates/db_playerbots/2024_08_07_00.sql b/data/sql/playerbots/updates/2024_08_07_00.sql similarity index 100% rename from data/sql/playerbots/updates/db_playerbots/2024_08_07_00.sql rename to data/sql/playerbots/updates/2024_08_07_00.sql diff --git a/data/sql/playerbots/updates/db_playerbots/2024_11_25_00.sql b/data/sql/playerbots/updates/2024_11_25_00.sql similarity index 100% rename from data/sql/playerbots/updates/db_playerbots/2024_11_25_00.sql rename to data/sql/playerbots/updates/2024_11_25_00.sql diff --git a/data/sql/playerbots/updates/db_playerbots/2025_02_24_00.sql b/data/sql/playerbots/updates/2025_02_24_00.sql similarity index 100% rename from data/sql/playerbots/updates/db_playerbots/2025_02_24_00.sql rename to data/sql/playerbots/updates/2025_02_24_00.sql diff --git a/data/sql/playerbots/updates/db_playerbots/2025_03_03_00.sql b/data/sql/playerbots/updates/2025_03_03_00.sql similarity index 100% rename from data/sql/playerbots/updates/db_playerbots/2025_03_03_00.sql rename to data/sql/playerbots/updates/2025_03_03_00.sql diff --git a/data/sql/playerbots/updates/db_playerbots/2025_04_26_00.sql b/data/sql/playerbots/updates/2025_04_26_00.sql similarity index 100% rename from data/sql/playerbots/updates/db_playerbots/2025_04_26_00.sql rename to data/sql/playerbots/updates/2025_04_26_00.sql diff --git a/data/sql/playerbots/updates/db_playerbots/2025_05_05_00_accountlinking.sql b/data/sql/playerbots/updates/2025_05_05_00_accountlinking.sql similarity index 100% rename from data/sql/playerbots/updates/db_playerbots/2025_05_05_00_accountlinking.sql rename to data/sql/playerbots/updates/2025_05_05_00_accountlinking.sql diff --git a/data/sql/playerbots/updates/db_playerbots/2025_05_09_00.sql b/data/sql/playerbots/updates/2025_05_09_00.sql similarity index 100% rename from data/sql/playerbots/updates/db_playerbots/2025_05_09_00.sql rename to data/sql/playerbots/updates/2025_05_09_00.sql diff --git a/data/sql/playerbots/updates/db_playerbots/2025_07_01_00_account_type.sql b/data/sql/playerbots/updates/2025_07_01_00_account_type.sql similarity index 100% rename from data/sql/playerbots/updates/db_playerbots/2025_07_01_00_account_type.sql rename to data/sql/playerbots/updates/2025_07_01_00_account_type.sql diff --git a/data/sql/world/world_charsections_dbc.sql b/data/sql/world/base/charsections_dbc.sql similarity index 100% rename from data/sql/world/world_charsections_dbc.sql rename to data/sql/world/base/charsections_dbc.sql diff --git a/data/sql/world/world_emotetextsound_dbc.sql b/data/sql/world/base/emotetextsound_dbc.sql similarity index 100% rename from data/sql/world/world_emotetextsound_dbc.sql rename to data/sql/world/base/emotetextsound_dbc.sql diff --git a/data/sql/world/world_playerbots_rpg_races.sql b/data/sql/world/base/playerbots_rpg_races.sql similarity index 100% rename from data/sql/world/world_playerbots_rpg_races.sql rename to data/sql/world/base/playerbots_rpg_races.sql diff --git a/data/sql/world/updates/2025_08_27_00.sql b/data/sql/world/updates/2025_08_27_00.sql new file mode 100644 index 00000000..066894c8 --- /dev/null +++ b/data/sql/world/updates/2025_08_27_00.sql @@ -0,0 +1,3 @@ +DELETE FROM spell_dbc WHERE ID = 30758; +INSERT INTO spell_dbc (`ID`,`Category`,`DispelType`,`Mechanic`,`Attributes`,`AttributesEx`,`AttributesEx2`,`AttributesEx3`,`AttributesEx4`,`AttributesEx5`,`AttributesEx6`,`AttributesEx7`,`ShapeshiftMask`,`unk_320_2`,`ShapeshiftExclude`,`unk_320_3`,`Targets`,`TargetCreatureType`,`RequiresSpellFocus`,`FacingCasterFlags`,`CasterAuraState`,`TargetAuraState`,`ExcludeCasterAuraState`,`ExcludeTargetAuraState`,`CasterAuraSpell`,`TargetAuraSpell`,`ExcludeCasterAuraSpell`,`ExcludeTargetAuraSpell`,`CastingTimeIndex`,`RecoveryTime`,`CategoryRecoveryTime`,`InterruptFlags`,`AuraInterruptFlags`,`ChannelInterruptFlags`,`ProcTypeMask`,`ProcChance`,`ProcCharges`,`MaxLevel`,`BaseLevel`,`SpellLevel`,`DurationIndex`,`PowerType`,`ManaCost`,`ManaCostPerLevel`,`ManaPerSecond`,`ManaPerSecondPerLevel`,`RangeIndex`,`Speed`,`ModalNextSpell`,`CumulativeAura`,`Totem_1`,`Totem_2`,`Reagent_1`,`Reagent_2`,`Reagent_3`,`Reagent_4`,`Reagent_5`,`Reagent_6`,`Reagent_7`,`Reagent_8`,`ReagentCount_1`,`ReagentCount_2`,`ReagentCount_3`,`ReagentCount_4`,`ReagentCount_5`,`ReagentCount_6`,`ReagentCount_7`,`ReagentCount_8`,`EquippedItemClass`,`EquippedItemSubclass`,`EquippedItemInvTypes`,`Effect_1`,`Effect_2`,`Effect_3`,`EffectDieSides_1`,`EffectDieSides_2`,`EffectDieSides_3`,`EffectRealPointsPerLevel_1`,`EffectRealPointsPerLevel_2`,`EffectRealPointsPerLevel_3`,`EffectBasePoints_1`,`EffectBasePoints_2`,`EffectBasePoints_3`,`EffectMechanic_1`,`EffectMechanic_2`,`EffectMechanic_3`,`ImplicitTargetA_1`,`ImplicitTargetA_2`,`ImplicitTargetA_3`,`ImplicitTargetB_1`,`ImplicitTargetB_2`,`ImplicitTargetB_3`,`EffectRadiusIndex_1`,`EffectRadiusIndex_2`,`EffectRadiusIndex_3`,`EffectAura_1`,`EffectAura_2`,`EffectAura_3`,`EffectAuraPeriod_1`,`EffectAuraPeriod_2`,`EffectAuraPeriod_3`,`EffectMultipleValue_1`,`EffectMultipleValue_2`,`EffectMultipleValue_3`,`EffectChainTargets_1`,`EffectChainTargets_2`,`EffectChainTargets_3`,`EffectItemType_1`,`EffectItemType_2`,`EffectItemType_3`,`EffectMiscValue_1`,`EffectMiscValue_2`,`EffectMiscValue_3`,`EffectMiscValueB_1`,`EffectMiscValueB_2`,`EffectMiscValueB_3`,`EffectTriggerSpell_1`,`EffectTriggerSpell_2`,`EffectTriggerSpell_3`,`EffectPointsPerCombo_1`,`EffectPointsPerCombo_2`,`EffectPointsPerCombo_3`,`EffectSpellClassMaskA_1`,`EffectSpellClassMaskA_2`,`EffectSpellClassMaskA_3`,`EffectSpellClassMaskB_1`,`EffectSpellClassMaskB_2`,`EffectSpellClassMaskB_3`,`EffectSpellClassMaskC_1`,`EffectSpellClassMaskC_2`,`EffectSpellClassMaskC_3`,`SpellVisualID_1`,`SpellVisualID_2`,`SpellIconID`,`ActiveIconID`,`SpellPriority`,`Name_Lang_enUS`,`Name_Lang_enGB`,`Name_Lang_koKR`,`Name_Lang_frFR`,`Name_Lang_deDE`,`Name_Lang_enCN`,`Name_Lang_zhCN`,`Name_Lang_enTW`,`Name_Lang_zhTW`,`Name_Lang_esES`,`Name_Lang_esMX`,`Name_Lang_ruRU`,`Name_Lang_ptPT`,`Name_Lang_ptBR`,`Name_Lang_itIT`,`Name_Lang_Unk`,`Name_Lang_Mask`,`NameSubtext_Lang_enUS`,`NameSubtext_Lang_enGB`,`NameSubtext_Lang_koKR`,`NameSubtext_Lang_frFR`,`NameSubtext_Lang_deDE`,`NameSubtext_Lang_enCN`,`NameSubtext_Lang_zhCN`,`NameSubtext_Lang_enTW`,`NameSubtext_Lang_zhTW`,`NameSubtext_Lang_esES`,`NameSubtext_Lang_esMX`,`NameSubtext_Lang_ruRU`,`NameSubtext_Lang_ptPT`,`NameSubtext_Lang_ptBR`,`NameSubtext_Lang_itIT`,`NameSubtext_Lang_Unk`,`NameSubtext_Lang_Mask`,`Description_Lang_enUS`,`Description_Lang_enGB`,`Description_Lang_koKR`,`Description_Lang_frFR`,`Description_Lang_deDE`,`Description_Lang_enCN`,`Description_Lang_zhCN`,`Description_Lang_enTW`,`Description_Lang_zhTW`,`Description_Lang_esES`,`Description_Lang_esMX`,`Description_Lang_ruRU`,`Description_Lang_ptPT`,`Description_Lang_ptBR`,`Description_Lang_itIT`,`Description_Lang_Unk`,`Description_Lang_Mask`,`AuraDescription_Lang_enUS`,`AuraDescription_Lang_enGB`,`AuraDescription_Lang_koKR`,`AuraDescription_Lang_frFR`,`AuraDescription_Lang_deDE`,`AuraDescription_Lang_enCN`,`AuraDescription_Lang_zhCN`,`AuraDescription_Lang_enTW`,`AuraDescription_Lang_zhTW`,`AuraDescription_Lang_esES`,`AuraDescription_Lang_esMX`,`AuraDescription_Lang_ruRU`,`AuraDescription_Lang_ptPT`,`AuraDescription_Lang_ptBR`,`AuraDescription_Lang_itIT`,`AuraDescription_Lang_Unk`,`AuraDescription_Lang_Mask`,`ManaCostPct`,`StartRecoveryCategory`,`StartRecoveryTime`,`MaxTargetLevel`,`SpellClassSet`,`SpellClassMask_1`,`SpellClassMask_2`,`SpellClassMask_3`,`MaxTargets`,`DefenseType`,`PreventionType`,`StanceBarOrder`,`EffectChainAmplitude_1`,`EffectChainAmplitude_2`,`EffectChainAmplitude_3`,`MinFactionID`,`MinReputation`,`RequiredAuraVision`,`RequiredTotemCategoryID_1`,`RequiredTotemCategoryID_2`,`RequiredAreasID`,`SchoolMask`,`RuneCostID`,`SpellMissileID`,`PowerDisplayID`,`EffectBonusMultiplier_1`,`EffectBonusMultiplier_2`,`EffectBonusMultiplier_3`,`SpellDescriptionVariableID`,`SpellDifficultyID`) + VALUES (30758,0,0,0,696254720,132128,268976133,269680640,8388736,393224,4100,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,101,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,52,0,0,0,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,'aedm','','','','','','','','','','','','','','','',16712190,'','','','','','','','','','','','','','','','',16712172,'','','','','','','','','','','','','','','','',16712188,'','','','','','','','','','','','','','','','',16712188,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0); \ No newline at end of file diff --git a/src/AiFactory.cpp b/src/AiFactory.cpp index 643899e9..c9202a71 100644 --- a/src/AiFactory.cpp +++ b/src/AiFactory.cpp @@ -472,6 +472,10 @@ void AiFactory::AddDefaultCombatStrategies(Player* player, PlayerbotAI* const fa } } } + if (sRandomPlayerbotMgr->IsRandomBot(player)) + { + engine->ChangeStrategy(sPlayerbotAIConfig->randomBotCombatStrategies); + } else { engine->ChangeStrategy(sPlayerbotAIConfig->combatStrategies); diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index 5dbe5cb9..d0a776b3 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -722,7 +722,8 @@ void PlayerbotAI::HandleTeleportAck() // SetNextCheckDelay(urand(2000, 5000)); if (sPlayerbotAIConfig->applyInstanceStrategies) ApplyInstanceStrategies(bot->GetMapId(), true); - EvaluateHealerDpsStrategy(); + if (sPlayerbotAIConfig->restrictHealerDPS) + EvaluateHealerDpsStrategy(); Reset(true); } diff --git a/src/PlayerbotAIConfig.cpp b/src/PlayerbotAIConfig.cpp index f69cbf19..7a6fa429 100644 --- a/src/PlayerbotAIConfig.cpp +++ b/src/PlayerbotAIConfig.cpp @@ -375,7 +375,7 @@ bool PlayerbotAIConfig::Initialize() randomChangeMultiplier = sConfigMgr->GetOption("AiPlayerbot.RandomChangeMultiplier", 1.0); - randomBotCombatStrategies = sConfigMgr->GetOption("AiPlayerbot.RandomBotCombatStrategies", "-threat"); + randomBotCombatStrategies = sConfigMgr->GetOption("AiPlayerbot.RandomBotCombatStrategies", ""); randomBotNonCombatStrategies = sConfigMgr->GetOption("AiPlayerbot.RandomBotNonCombatStrategies", ""); combatStrategies = sConfigMgr->GetOption("AiPlayerbot.CombatStrategies", "+custom::say"); nonCombatStrategies = sConfigMgr->GetOption("AiPlayerbot.NonCombatStrategies", "+custom::say,+return"); diff --git a/src/factory/PlayerbotFactory.cpp b/src/factory/PlayerbotFactory.cpp index 23d956cd..6081443d 100644 --- a/src/factory/PlayerbotFactory.cpp +++ b/src/factory/PlayerbotFactory.cpp @@ -123,7 +123,7 @@ void PlayerbotFactory::Init() if (id == 47181 || id == 50358 || id == 47242 || id == 52639 || id == 47147 || id == 7218) // Test Enchant continue; - if (id == 15463) // Legendary Arcane Amalgamation + if (id == 15463 || id == 15490) // Legendary Arcane Amalgamation continue; SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(id); diff --git a/src/strategy/raids/vaultofarchavon/RaidVoAActionContext.h b/src/strategy/raids/vaultofarchavon/RaidVoAActionContext.h index b2ac1fbd..42b0ae9e 100644 --- a/src/strategy/raids/vaultofarchavon/RaidVoAActionContext.h +++ b/src/strategy/raids/vaultofarchavon/RaidVoAActionContext.h @@ -20,6 +20,8 @@ public: creators["emalon lighting nova action"] = &RaidVoAActionContext::emalon_lighting_nova_action; creators["emalon overcharge action"] = &RaidVoAActionContext::emalon_overcharge_action; creators["emalon fall from floor action"] = &RaidVoAActionContext::emalon_fall_from_floor_action; + creators["emalon nature resistance action"] = &RaidVoAActionContext::emalon_nature_resistance_action; + creators["koralon fire resistance action"] = &RaidVoAActionContext::koralon_fire_resistance_action; } private: @@ -27,6 +29,8 @@ private: static Action* emalon_lighting_nova_action(PlayerbotAI* ai) { return new EmalonLightingNovaAction(ai); } static Action* emalon_overcharge_action(PlayerbotAI* ai) { return new EmalonOverchargeAction(ai); } static Action* emalon_fall_from_floor_action(PlayerbotAI* ai) { return new EmalonFallFromFloorAction(ai); } + static Action* emalon_nature_resistance_action(PlayerbotAI* ai) { return new BossNatureResistanceAction(ai, "emalon the storm watcher"); } + static Action* koralon_fire_resistance_action(PlayerbotAI* ai) { return new BossFireResistanceAction(ai, "koralon the flame watcher"); } }; #endif diff --git a/src/strategy/raids/vaultofarchavon/RaidVoAStrategy.cpp b/src/strategy/raids/vaultofarchavon/RaidVoAStrategy.cpp index 36469698..505cac1b 100644 --- a/src/strategy/raids/vaultofarchavon/RaidVoAStrategy.cpp +++ b/src/strategy/raids/vaultofarchavon/RaidVoAStrategy.cpp @@ -24,4 +24,16 @@ void RaidVoAStrategy::InitTriggers(std::vector& triggers) triggers.push_back(new TriggerNode( "emalon fall from floor trigger", NextAction::array(0, new NextAction("emalon fall from floor action", ACTION_RAID), nullptr))); + + triggers.push_back(new TriggerNode( + "emalon nature resistance trigger", + NextAction::array(0, new NextAction("emalon nature resistance action", ACTION_RAID), nullptr))); + + // + // Koralon the Flame Watcher + // + + triggers.push_back(new TriggerNode( + "koralon fire resistance trigger", + NextAction::array(0, new NextAction("koralon fire resistance action", ACTION_RAID), nullptr))); } diff --git a/src/strategy/raids/vaultofarchavon/RaidVoATriggerContext.h b/src/strategy/raids/vaultofarchavon/RaidVoATriggerContext.h index ee32c7fb..16ae0caf 100644 --- a/src/strategy/raids/vaultofarchavon/RaidVoATriggerContext.h +++ b/src/strategy/raids/vaultofarchavon/RaidVoATriggerContext.h @@ -19,6 +19,8 @@ public: creators["emalon lighting nova trigger"] = &RaidVoATriggerContext::emalon_lighting_nova_trigger; creators["emalon overcharge trigger"] = &RaidVoATriggerContext::emalon_overcharge_trigger; creators["emalon fall from floor trigger"] = &RaidVoATriggerContext::emalon_fall_from_floor_trigger; + creators["emalon nature resistance trigger"] = &RaidVoATriggerContext::emalon_nature_resistance_trigger; + creators["koralon fire resistance trigger"] = &RaidVoATriggerContext::koralon_fire_resistance_trigger; } private: @@ -26,6 +28,8 @@ private: static Trigger* emalon_lighting_nova_trigger(PlayerbotAI* ai) { return new EmalonLightingNovaTrigger(ai); } static Trigger* emalon_overcharge_trigger(PlayerbotAI* ai) { return new EmalonOverchargeTrigger(ai); } static Trigger* emalon_fall_from_floor_trigger(PlayerbotAI* ai) { return new EmalonFallFromFloorTrigger(ai); } + static Trigger* emalon_nature_resistance_trigger(PlayerbotAI* ai) { return new BossNatureResistanceTrigger(ai, "emalon the storm watcher"); } + static Trigger* koralon_fire_resistance_trigger(PlayerbotAI* ai) { return new BossFireResistanceTrigger(ai, "koralon the flame watcher"); } }; #endif