mirror of
https://github.com/mod-playerbots/mod-playerbots
synced 2025-11-29 15:58:20 +08:00
grobbulus fixed
This commit is contained in:
@@ -283,7 +283,7 @@ void AiFactory::AddDefaultCombatStrategies(Player* player, PlayerbotAI* const fa
|
|||||||
else if (tab == 1)
|
else if (tab == 1)
|
||||||
engine->addStrategies("fire", "fire aoe", "threat", nullptr);
|
engine->addStrategies("fire", "fire aoe", "threat", nullptr);
|
||||||
else
|
else
|
||||||
engine->addStrategies("frost", "frost aoe", "threat", "dps aoe", nullptr);
|
engine->addStrategies("frost", "frost aoe", "threat", nullptr);
|
||||||
|
|
||||||
engine->addStrategies("dps", "dps assist", "cure", "ranged", nullptr);
|
engine->addStrategies("dps", "dps assist", "cure", "ranged", nullptr);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -33,6 +33,11 @@
|
|||||||
#include "GuildMgr.h"
|
#include "GuildMgr.h"
|
||||||
#include "SayAction.h"
|
#include "SayAction.h"
|
||||||
|
|
||||||
|
std::vector<std::string> PlayerbotAI::dispel_whitelist = {
|
||||||
|
"mutating injection",
|
||||||
|
"frostbolt",
|
||||||
|
};
|
||||||
|
|
||||||
std::vector<std::string>& split(std::string const s, char delim, std::vector<std::string>& elems);
|
std::vector<std::string>& split(std::string const s, char delim, std::vector<std::string>& elems);
|
||||||
std::vector<std::string> split(std::string const s, char delim);
|
std::vector<std::string> split(std::string const s, char delim);
|
||||||
char* strstri(char const* str1, char const* str2);
|
char* strstri(char const* str1, char const* str2);
|
||||||
@@ -2749,6 +2754,16 @@ bool PlayerbotAI::canDispel(SpellInfo const* spellInfo, uint32 dispelType)
|
|||||||
if (spellInfo->Dispel != dispelType)
|
if (spellInfo->Dispel != dispelType)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (!spellInfo->SpellName[0]) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (std::string &wl : dispel_whitelist) {
|
||||||
|
if (strcmpi((const char*)spellInfo->SpellName[0], wl.c_str()) == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return !spellInfo->SpellName[0] || (strcmpi((const char*)spellInfo->SpellName[0], "demon skin") && strcmpi((const char*)spellInfo->SpellName[0], "mage armor") &&
|
return !spellInfo->SpellName[0] || (strcmpi((const char*)spellInfo->SpellName[0], "demon skin") && strcmpi((const char*)spellInfo->SpellName[0], "mage armor") &&
|
||||||
strcmpi((const char*)spellInfo->SpellName[0], "frost armor") && strcmpi((const char*)spellInfo->SpellName[0], "wavering will") &&
|
strcmpi((const char*)spellInfo->SpellName[0], "frost armor") && strcmpi((const char*)spellInfo->SpellName[0], "wavering will") &&
|
||||||
strcmpi((const char*)spellInfo->SpellName[0], "chilled") && strcmpi((const char*)spellInfo->SpellName[0], "mana tap") &&
|
strcmpi((const char*)spellInfo->SpellName[0], "chilled") && strcmpi((const char*)spellInfo->SpellName[0], "mana tap") &&
|
||||||
|
|||||||
@@ -432,7 +432,7 @@ class PlayerbotAI : public PlayerbotAIBase
|
|||||||
|
|
||||||
bool CanMove();
|
bool CanMove();
|
||||||
bool IsInRealGuild();
|
bool IsInRealGuild();
|
||||||
|
static std::vector<std::string> dispel_whitelist;
|
||||||
private:
|
private:
|
||||||
void _fillGearScoreData(Player* player, Item* item, std::vector<uint32>* gearScore, uint32& twoHandScore);
|
void _fillGearScoreData(Player* player, Item* item, std::vector<uint32>* gearScore, uint32& twoHandScore);
|
||||||
bool IsTellAllowed(PlayerbotSecurityLevel securityLevel = PLAYERBOT_SECURITY_ALLOW_ALL);
|
bool IsTellAllowed(PlayerbotSecurityLevel securityLevel = PLAYERBOT_SECURITY_ALLOW_ALL);
|
||||||
|
|||||||
@@ -99,8 +99,8 @@ uint32 RotateGrobbulusAction::GetCurrWaypoint()
|
|||||||
if (!boss) {
|
if (!boss) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
BossAI* boss_ai = dynamic_cast<BossAI*>(boss->GetAI());
|
auto* boss_ai = dynamic_cast<boss_grobbulus::boss_grobbulusAI*>(boss->GetAI());
|
||||||
EventMap* eventMap = boss_ai->GetEvents();
|
EventMap* eventMap = &boss_ai->events;
|
||||||
const uint32 event_time = eventMap->GetNextEventTime(2);
|
const uint32 event_time = eventMap->GetNextEventTime(2);
|
||||||
return (event_time / 15000) % intervals;
|
return (event_time / 15000) % intervals;
|
||||||
}
|
}
|
||||||
@@ -116,7 +116,7 @@ bool HeiganDanceAction::CalculateSafe() {
|
|||||||
uint32 curr_erupt = eventMap->GetNextEventTime(3);
|
uint32 curr_erupt = eventMap->GetNextEventTime(3);
|
||||||
uint32 curr_dance = eventMap->GetNextEventTime(4);
|
uint32 curr_dance = eventMap->GetNextEventTime(4);
|
||||||
uint32 curr_timer = eventMap->GetTimer();
|
uint32 curr_timer = eventMap->GetTimer();
|
||||||
if ((curr_phase == PHASE_SLOW_DANCE && curr_dance - curr_timer >= 80000) || (curr_phase == PHASE_FAST_DANCE && curr_dance - curr_timer >= 40000)) {
|
if ((curr_phase == 0 && curr_dance - curr_timer >= 80000) || (curr_phase == 1 && curr_dance - curr_timer >= 40000)) {
|
||||||
ResetSafe();
|
ResetSafe();
|
||||||
} else if (curr_erupt != prev_erupt) {
|
} else if (curr_erupt != prev_erupt) {
|
||||||
NextSafe();
|
NextSafe();
|
||||||
@@ -128,16 +128,15 @@ bool HeiganDanceAction::CalculateSafe() {
|
|||||||
|
|
||||||
bool HeiganDanceMeleeAction::Execute(Event event) {
|
bool HeiganDanceMeleeAction::Execute(Event event) {
|
||||||
CalculateSafe();
|
CalculateSafe();
|
||||||
if (prev_phase == PHASE_SLOW_DANCE && botAI->IsMainTank(bot) && !AI_VALUE2(bool, "has aggro", "boss target")) {
|
if (prev_phase == 0 && botAI->IsMainTank(bot) && !AI_VALUE2(bool, "has aggro", "boss target")) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// botAI->TellMaster("Let\'s go " + std::to_string(curr_safe));
|
|
||||||
return MoveInside(bot->GetMapId(), waypoints[curr_safe].first, waypoints[curr_safe].second, bot->GetPositionZ(), botAI->IsMainTank(bot) ? 0 : 0);
|
return MoveInside(bot->GetMapId(), waypoints[curr_safe].first, waypoints[curr_safe].second, bot->GetPositionZ(), botAI->IsMainTank(bot) ? 0 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HeiganDanceRangedAction::Execute(Event event) {
|
bool HeiganDanceRangedAction::Execute(Event event) {
|
||||||
CalculateSafe();
|
CalculateSafe();
|
||||||
if (prev_phase != PHASE_FAST_DANCE) {
|
if (prev_phase != 1) {
|
||||||
return MoveTo(bot->GetMapId(), platform.first, platform.second, 276.54f);
|
return MoveTo(bot->GetMapId(), platform.first, platform.second, 276.54f);
|
||||||
}
|
}
|
||||||
botAI->InterruptSpell();
|
botAI->InterruptSpell();
|
||||||
|
|||||||
@@ -5,6 +5,8 @@
|
|||||||
#include "MovementActions.h"
|
#include "MovementActions.h"
|
||||||
#include "AttackAction.h"
|
#include "AttackAction.h"
|
||||||
#include "GenericActions.h"
|
#include "GenericActions.h"
|
||||||
|
#include "PlayerbotAI.h"
|
||||||
|
#include "Playerbots.h"
|
||||||
|
|
||||||
// just for test
|
// just for test
|
||||||
// class TryToGetBossAIAction : public Action
|
// class TryToGetBossAIAction : public Action
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ float HeiganDanceMultiplier::GetValue(Action* action)
|
|||||||
if (dynamic_cast<SetBehindTargetAction*>(action)) {
|
if (dynamic_cast<SetBehindTargetAction*>(action)) {
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
if (curr_phase != PHASE_FAST_DANCE && (int32)curr_dance - curr_timer >= 3000) {
|
if (curr_phase != 1 && (int32)curr_dance - curr_timer >= 3000) {
|
||||||
return 1.0f;
|
return 1.0f;
|
||||||
}
|
}
|
||||||
if (dynamic_cast<HeiganDanceAction*>(action) || dynamic_cast<CurePartyMemberAction*>(action)) {
|
if (dynamic_cast<HeiganDanceAction*>(action) || dynamic_cast<CurePartyMemberAction*>(action)) {
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#include "EventMap.h"
|
||||||
#include "Playerbots.h"
|
#include "Playerbots.h"
|
||||||
#include "RaidNaxxTrigger.h"
|
#include "RaidNaxxTrigger.h"
|
||||||
#include "ScriptedCreature.h"
|
#include "ScriptedCreature.h"
|
||||||
@@ -21,12 +22,15 @@ bool MutatingInjectionRemovedTrigger::IsActive()
|
|||||||
return HasNoAuraTrigger::IsActive() && botAI->GetState() == BOT_STATE_COMBAT && botAI->IsRanged(bot);
|
return HasNoAuraTrigger::IsActive() && botAI->GetState() == BOT_STATE_COMBAT && botAI->IsRanged(bot);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BossEventTrigger::IsActive()
|
template<class T>
|
||||||
|
bool BossEventTrigger<T>::IsActive()
|
||||||
{
|
{
|
||||||
Unit* boss = AI_VALUE(Unit*, "boss target");
|
Unit* boss = AI_VALUE(Unit*, "boss target");
|
||||||
if (!boss || boss->GetEntry() != boss_entry) {
|
if (!boss || boss->GetEntry() != boss_entry) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
T* ai = dynamic_cast<T*>(boss->GetAI());
|
||||||
|
EventMap *eventMap = &ai->events;
|
||||||
if (!eventMap) {
|
if (!eventMap) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -54,18 +58,18 @@ bool BossEventTrigger::IsActive()
|
|||||||
// return phase_mask == this->phase_mask;
|
// return phase_mask == this->phase_mask;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// bool GrobbulusCloudTrigger::IsActive()
|
bool GrobbulusCloudTrigger::IsActive()
|
||||||
// {
|
{
|
||||||
// Unit* boss = AI_VALUE(Unit*, "boss target");
|
Unit* boss = AI_VALUE(Unit*, "boss target");
|
||||||
// if (!boss || boss->GetEntry() != boss_entry) {
|
if (!boss || boss->GetEntry() != boss_entry) {
|
||||||
// return false;
|
return false;
|
||||||
// }
|
}
|
||||||
// if (!botAI->IsMainTank(bot)) {
|
if (!botAI->IsMainTank(bot)) {
|
||||||
// return false;
|
return false;
|
||||||
// }
|
}
|
||||||
// // bot->Yell("has aggro on " + boss->GetName() + " : " + to_string(AI_VALUE2(bool, "has aggro", "boss target")), LANG_UNIVERSAL);
|
// bot->Yell("has aggro on " + boss->GetName() + " : " + to_string(AI_VALUE2(bool, "has aggro", "boss target")), LANG_UNIVERSAL);
|
||||||
// return AI_VALUE2(bool, "has aggro", "boss target");
|
return AI_VALUE2(bool, "has aggro", "boss target");
|
||||||
// }
|
}
|
||||||
|
|
||||||
bool HeiganMeleeTrigger::IsActive()
|
bool HeiganMeleeTrigger::IsActive()
|
||||||
{
|
{
|
||||||
@@ -160,3 +164,5 @@ bool HeiganRangedTrigger::IsActive()
|
|||||||
// // bot->Yell("Time to taunt!", LANG_UNIVERSAL);
|
// // bot->Yell("Time to taunt!", LANG_UNIVERSAL);
|
||||||
// return true;
|
// return true;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
template bool BossEventTrigger<boss_grobbulus::boss_grobbulusAI>::IsActive();
|
||||||
@@ -34,6 +34,7 @@ public:
|
|||||||
virtual bool IsActive();
|
virtual bool IsActive();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<class T>
|
||||||
class BossEventTrigger : public Trigger
|
class BossEventTrigger : public Trigger
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -45,7 +46,6 @@ public:
|
|||||||
virtual bool IsActive();
|
virtual bool IsActive();
|
||||||
protected:
|
protected:
|
||||||
uint32 boss_entry, event_id, last_event_time;
|
uint32 boss_entry, event_id, last_event_time;
|
||||||
EventMap *eventMap;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class BossPhaseTrigger : public Trigger
|
class BossPhaseTrigger : public Trigger
|
||||||
@@ -61,12 +61,10 @@ protected:
|
|||||||
uint32 phase_mask;
|
uint32 phase_mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
class GrobbulusCloudTrigger : public BossEventTrigger
|
class GrobbulusCloudTrigger : public BossEventTrigger<boss_grobbulus::boss_grobbulusAI>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
GrobbulusCloudTrigger(PlayerbotAI* ai): BossEventTrigger(ai, 15931, 2, "grobbulus cloud event") {
|
GrobbulusCloudTrigger(PlayerbotAI* ai): BossEventTrigger(ai, 15931, 2, "grobbulus cloud event") { }
|
||||||
this->eventMap = boss_grobbulus::boss_grobbulusAI
|
|
||||||
}
|
|
||||||
virtual bool IsActive();
|
virtual bool IsActive();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -205,4 +203,6 @@ public:
|
|||||||
// LoathebTrigger(PlayerbotAI* ai) : BossPhaseTrigger(ai, "loatheb", 0, "loatheb trigger") {}
|
// LoathebTrigger(PlayerbotAI* ai) : BossPhaseTrigger(ai, "loatheb", 0, "loatheb trigger") {}
|
||||||
// };
|
// };
|
||||||
|
|
||||||
|
|
||||||
|
// template BossEventTrigger<class boss_grobbulus::boss_grobbulusAI>;
|
||||||
#endif
|
#endif
|
||||||
@@ -195,8 +195,8 @@ class TriggerContext : public NamedObjectContext<Trigger>
|
|||||||
creators["rpg duel"] = &TriggerContext::rpg_duel;
|
creators["rpg duel"] = &TriggerContext::rpg_duel;
|
||||||
|
|
||||||
creators["mutating injection"] = &TriggerContext::mutating_injection;
|
creators["mutating injection"] = &TriggerContext::mutating_injection;
|
||||||
// creators["mutating injection removed"] = &TriggerContext::mutating_injection_removed;
|
creators["mutating injection removed"] = &TriggerContext::mutating_injection_removed;
|
||||||
// creators["grobbulus cloud"] = &TriggerContext::grobbulus_cloud;
|
creators["grobbulus cloud"] = &TriggerContext::grobbulus_cloud;
|
||||||
creators["heigan melee"] = &TriggerContext::heigan_melee;
|
creators["heigan melee"] = &TriggerContext::heigan_melee;
|
||||||
creators["heigan ranged"] = &TriggerContext::heigan_ranged;
|
creators["heigan ranged"] = &TriggerContext::heigan_ranged;
|
||||||
|
|
||||||
@@ -367,8 +367,8 @@ class TriggerContext : public NamedObjectContext<Trigger>
|
|||||||
static Trigger* rpg_duel(PlayerbotAI* botAI) { return new RpgDuelTrigger(botAI); }
|
static Trigger* rpg_duel(PlayerbotAI* botAI) { return new RpgDuelTrigger(botAI); }
|
||||||
|
|
||||||
static Trigger* mutating_injection(PlayerbotAI* ai) { return new MutatingInjectionTrigger(ai); }
|
static Trigger* mutating_injection(PlayerbotAI* ai) { return new MutatingInjectionTrigger(ai); }
|
||||||
// static Trigger* mutating_injection_removed(PlayerbotAI* ai) { return new MutatingInjectionRemovedTrigger(ai); }
|
static Trigger* mutating_injection_removed(PlayerbotAI* ai) { return new MutatingInjectionRemovedTrigger(ai); }
|
||||||
// static Trigger* grobbulus_cloud(PlayerbotAI* ai) { return new GrobbulusCloudTrigger(ai); }
|
static Trigger* grobbulus_cloud(PlayerbotAI* ai) { return new GrobbulusCloudTrigger(ai); }
|
||||||
static Trigger* heigan_melee(PlayerbotAI* ai) { return new HeiganMeleeTrigger(ai); }
|
static Trigger* heigan_melee(PlayerbotAI* ai) { return new HeiganMeleeTrigger(ai); }
|
||||||
static Trigger* heigan_ranged(PlayerbotAI* ai) { return new HeiganRangedTrigger(ai); }
|
static Trigger* heigan_ranged(PlayerbotAI* ai) { return new HeiganRangedTrigger(ai); }
|
||||||
// static Trigger* thaddius_phase_pet(PlayerbotAI* ai) { return new ThaddiusPhasePetTrigger(ai); }
|
// static Trigger* thaddius_phase_pet(PlayerbotAI* ai) { return new ThaddiusPhasePetTrigger(ai); }
|
||||||
|
|||||||
Reference in New Issue
Block a user