Merge branch 'azerothcore:master' into Playerbot

This commit is contained in:
ZhengPeiRu21
2022-06-24 15:25:18 -06:00
committed by GitHub
16 changed files with 136 additions and 59 deletions

View File

@@ -260,9 +260,34 @@ public:
return true;
}
static bool HandleDeserterRemoveAll(ChatHandler* handler, bool isInstance)
static bool HandleDeserterRemoveAll(ChatHandler* handler, bool isInstance, Optional<std::string> maxTime)
{
CharacterDatabase.Query("DELETE FROM character_aura WHERE spell = {} AND remainTime <= 1800000", isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER);
int32 remainTime = isInstance ? 1800 : 900;
if (maxTime)
{
remainTime = TimeStringToSecs(*maxTime);
if (remainTime == 0)
{
remainTime = Acore::StringTo<int32>(*maxTime).value_or(0);
}
}
if (remainTime == 0)
{
handler->SendSysMessage(LANG_BAD_VALUE);
handler->SetSentErrorMessage(true);
return false;
}
if (remainTime < 0)
{
CharacterDatabase.Execute("DELETE FROM character_aura WHERE spell = {}", isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER);
}
else
{
CharacterDatabase.Execute("DELETE FROM character_aura WHERE spell = {} AND remainTime <= {}", isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER, remainTime * IN_MILLISECONDS);
}
std::shared_lock<std::shared_mutex> lock(*HashMapHolder<Player>::GetLock());
HashMapHolder<Player>::MapType const& onlinePlayerList = ObjectAccessor::GetPlayers();
@@ -270,7 +295,7 @@ public:
{
Player* player = itr->second;
Aura* aura = player->GetAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER);
if (aura && aura->GetDuration() <= 1800000)
if (aura && (remainTime < 0 || aura->GetDuration() <= remainTime * IN_MILLISECONDS))
{
player->RemoveAura(isInstance ? LFG_SPELL_DUNGEON_DESERTER : BG_SPELL_DESERTER);
}
@@ -304,14 +329,14 @@ public:
return HandleDeserterRemove(handler, player, false);
}
static bool HandleDeserterInstanceRemoveAll(ChatHandler* handler)
static bool HandleDeserterInstanceRemoveAll(ChatHandler* handler, Optional<std::string> maxTime)
{
return HandleDeserterRemoveAll(handler, true);
return HandleDeserterRemoveAll(handler, true, maxTime);
}
static bool HandleDeserterBGRemoveAll(ChatHandler* handler)
static bool HandleDeserterBGRemoveAll(ChatHandler* handler, Optional<std::string> maxTime)
{
return HandleDeserterRemoveAll(handler, false);
return HandleDeserterRemoveAll(handler, false, maxTime);
}
};

View File

@@ -548,6 +548,8 @@ struct boss_nefarian : public BossAI
}
me->DespawnOrUnsummon();
}
classesPresent.clear();
}
void EnterCombat(Unit* /*who*/) override {}
@@ -675,16 +677,21 @@ struct boss_nefarian : public BossAI
events.ScheduleEvent(EVENT_TAILLASH, 10000);
break;
case EVENT_CLASSCALL:
std::set<uint8> classesPresent;
for (auto& ref : me->GetThreatMgr().getThreatList())
if (classesPresent.empty())
{
if (ref->getTarget() && ref->getTarget()->GetTypeId() == TYPEID_PLAYER)
for (auto& ref : me->GetThreatMgr().getThreatList())
{
classesPresent.insert(ref->getTarget()->getClass());
if (ref->getTarget() && ref->getTarget()->GetTypeId() == TYPEID_PLAYER)
{
classesPresent.insert(ref->getTarget()->getClass());
}
}
}
uint8 targetClass = Acore::Containers::SelectRandomContainerElement(classesPresent);
classesPresent.erase(targetClass);
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, ClassCallSelector(me, targetClass)))
{
switch (target->getClass())
@@ -755,6 +762,7 @@ struct boss_nefarian : public BossAI
private:
bool Phase3;
bool _introDone;
std::set<uint8> classesPresent;
};
enum TotemSpells

View File

@@ -145,11 +145,11 @@ public:
// Always running events
events.ScheduleEvent(EVENT_THRASH, 5000);
// Phase one events (regular form)
events.ScheduleEvent(EVENT_HOLY_NOVA, 5000, 0, PHASE_ONE);
events.ScheduleEvent(EVENT_HOLY_NOVA, urand(5000, 15000), 0, PHASE_ONE);
events.ScheduleEvent(EVENT_DISPEL_MAGIC, 35000, 0, PHASE_ONE);
events.ScheduleEvent(EVENT_HOLY_FIRE, 10000, 0, PHASE_ONE);
events.ScheduleEvent(EVENT_HOLY_FIRE, urand(10000,20000), 0, PHASE_ONE);
events.ScheduleEvent(EVENT_RENEW, 30000, 0, PHASE_ONE);
events.ScheduleEvent(EVENT_HOLY_WRATH, 60000, 0, PHASE_ONE);
events.ScheduleEvent(EVENT_HOLY_WRATH, urand(15000, 25000), 0, PHASE_ONE);
events.SetPhase(PHASE_ONE);
@@ -205,32 +205,19 @@ public:
DoCast(me, SPELL_RENEW);
events.ScheduleEvent(EVENT_RENEW, urand(25000, 30000), 0, PHASE_ONE);
break;
case EVENT_HOLY_NOVA:
_inMeleeRange = 0;
for (uint8 i = 0; i < 10; ++i)
{
if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, i))
// check if target is within melee-distance
if (me->IsWithinMeleeRange(target))
++_inMeleeRange;
}
// trigger spellcast only if we have 3 or more targets to affect
if (_inMeleeRange >= 3)
DoCastVictim(SPELL_HOLY_NOVA);
events.ScheduleEvent(EVENT_HOLY_NOVA, urand(45000, 75000), 0, PHASE_ONE);
case EVENT_HOLY_WRATH:
if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat))
DoCast(target, SPELL_HOLY_WRATH);
events.ScheduleEvent(EVENT_HOLY_WRATH, urand(12000, 22000), 0, PHASE_ONE);
break;
case EVENT_HOLY_FIRE:
if (Unit* target = SelectTarget(SelectTargetMethod::Random))
DoCast(target, SPELL_HOLY_FIRE);
events.ScheduleEvent(EVENT_HOLY_FIRE, urand(45000, 60000), 0, PHASE_ONE);
events.ScheduleEvent(EVENT_HOLY_FIRE, urand(10000, 24000), 0, PHASE_ONE);
break;
case EVENT_HOLY_WRATH:
if (Unit* target = SelectTarget(SelectTargetMethod::Random))
DoCast(target, SPELL_HOLY_WRATH);
events.ScheduleEvent(EVENT_HOLY_WRATH, urand(45000, 60000), 0, PHASE_ONE);
case EVENT_HOLY_NOVA:
DoCastSelf(SPELL_HOLY_NOVA);
events.ScheduleEvent(EVENT_HOLY_NOVA, urand(10000, 24000), 0, PHASE_ONE);
break;
//

View File

@@ -20,6 +20,12 @@
#include "ScriptedCreature.h"
#include "forge_of_souls.h"
BossBoundaryData const boundaries =
{
{ DATA_BRONJAHM, new CircleBoundary(Position(5297.3f, 2506.45f), 100.96) },
{ DATA_DEVOURER, new ParallelogramBoundary(Position(5663.56f, 2570.53f), Position(5724.39f, 2520.45f), Position(5570.36f, 2461.42f)) }
};
class instance_forge_of_souls : public InstanceMapScript
{
public:
@@ -32,7 +38,10 @@ public:
struct instance_forge_of_souls_InstanceScript : public InstanceScript
{
instance_forge_of_souls_InstanceScript(Map* map) : InstanceScript(map) {}
instance_forge_of_souls_InstanceScript(Map* map) : InstanceScript(map)
{
LoadBossBoundaries(boundaries);
}
uint32 m_auiEncounter[MAX_ENCOUNTER];
TeamId teamIdInInstance;

View File

@@ -273,24 +273,28 @@ class spell_item_with_mount_speed : public AuraScript
}
};
class spell_item_magic_dust : public AuraScript
class spell_item_magic_dust : public SpellScript
{
PrepareAuraScript(spell_item_magic_dust);
PrepareSpellScript(spell_item_magic_dust);
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
void HandlePreventAura(SpellEffIndex /*effIndex*/)
{
Unit* target = GetTarget();
if (target->getLevel() >= 30)
if (Unit* target = GetHitUnit())
{
uint8 chance = 100 - std::min<uint8>(100, target->getLevel() - 30 * urand(3, 10));
if (!roll_chance_i(chance))
PreventDefaultAction();
if (target->getLevel() >= 30)
{
uint8 chance = 100 - std::min<uint8>(100, target->getLevel() - 30 * urand(3, 10));
if (!roll_chance_i(chance))
{
PreventHitAura();
}
}
}
}
void Register() override
{
OnEffectApply += AuraEffectApplyFn(spell_item_magic_dust::OnApply, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL);
OnEffectHitTarget += SpellEffectFn(spell_item_magic_dust::HandlePreventAura, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
}
};