Merge branch 'master' into Playerbot
This commit is contained in:
@@ -297,11 +297,9 @@ public:
|
||||
// Display the 'Message of the day' for the realm
|
||||
static bool HandleServerMotdCommand(ChatHandler* handler)
|
||||
{
|
||||
LocaleConstant localeConstant = DEFAULT_LOCALE;
|
||||
if (Player* player = handler->GetPlayer())
|
||||
localeConstant = player->GetSession()->GetSessionDbLocaleIndex();
|
||||
|
||||
handler->PSendSysMessage(LANG_MOTD_CURRENT, sMotdMgr->GetMotd(localeConstant));
|
||||
handler->PSendSysMessage(LANG_MOTD_CURRENT);
|
||||
for (uint32 i = 0; i < TOTAL_LOCALES; ++i)
|
||||
handler->PSendSysMessage(LANG_GENERIC_TWO_CURLIES_WITH_COLON, GetNameByLocaleConstant(LocaleConstant(i)), sMotdMgr->GetMotd(LocaleConstant(i)));
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -533,7 +531,7 @@ public:
|
||||
}
|
||||
|
||||
// Define the 'Message of the day' for the realm
|
||||
static bool HandleServerSetMotdCommand(ChatHandler* handler, Optional<int32> realmId, Optional<std::string> locale, Tail motd)
|
||||
static bool HandleServerSetMotdCommand(ChatHandler* handler, Optional<int32> realmId, std::string locale, Tail motd)
|
||||
{
|
||||
std::wstring wMotd = std::wstring();
|
||||
std::string strMotd = std::string();
|
||||
@@ -542,39 +540,21 @@ public:
|
||||
if (!realmId)
|
||||
realmId = static_cast<int32>(realm.Id.Realm);
|
||||
|
||||
// Determine the locale; default to "enUS" if not provided
|
||||
LocaleConstant localeConstant;
|
||||
if (IsLocaleValid(locale))
|
||||
localeConstant = GetLocaleByName(locale);
|
||||
else
|
||||
{
|
||||
handler->SendErrorMessage("locale ({}) is not valid. Valid locales: enUS, koKR, frFR, deDE, zhCN, zhWE, esES, esMX, ruRU.", locale);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (motd.empty())
|
||||
return false;
|
||||
|
||||
// Convert Tail (motd) to std::string
|
||||
std::ostringstream motdStream;
|
||||
motdStream << motd;
|
||||
std::string motdString = motdStream.str(); // Convert Tail to std::string
|
||||
// Determine the locale; default to "enUS" if not provided
|
||||
LocaleConstant localeConstant = DEFAULT_LOCALE;
|
||||
if (locale.has_value())
|
||||
{
|
||||
if (sMotdMgr->IsValidLocale(locale.value()))
|
||||
{
|
||||
localeConstant = GetLocaleByName(locale.value());
|
||||
}
|
||||
else
|
||||
{
|
||||
motdStream.str("");
|
||||
motdStream << locale.value() << " " << motd;
|
||||
motdString = motdStream.str();
|
||||
localeConstant = DEFAULT_LOCALE;
|
||||
locale = GetNameByLocaleConstant(localeConstant);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Set to default locale string
|
||||
localeConstant = DEFAULT_LOCALE;
|
||||
locale = GetNameByLocaleConstant(localeConstant);
|
||||
}
|
||||
|
||||
// Convert the concatenated motdString to UTF-8 and ensure encoding consistency
|
||||
if (!Utf8toWStr(motdString, wMotd))
|
||||
if (!Utf8toWStr(motd, wMotd))
|
||||
return false;
|
||||
|
||||
if (!WStrToUtf8(wMotd, strMotd))
|
||||
@@ -583,34 +563,29 @@ public:
|
||||
// Start a transaction for the database operations
|
||||
LoginDatabaseTransaction trans = LoginDatabase.BeginTransaction();
|
||||
|
||||
if (localeConstant == DEFAULT_LOCALE)
|
||||
if (localeConstant == LOCALE_enUS)
|
||||
{
|
||||
// Insert or update in the main motd table for enUS
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_MOTD);
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_REP_MOTD);
|
||||
stmt->SetData(0, realmId.value()); // realmId for insertion
|
||||
stmt->SetData(1, strMotd); // motd text for insertion
|
||||
stmt->SetData(2, strMotd); // motd text for ON DUPLICATE KEY UPDATE
|
||||
trans->Append(stmt);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Insert or update in the motd_localized table for other locales
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_MOTD_LOCALE);
|
||||
LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_REP_MOTD_LOCALE);
|
||||
stmt->SetData(0, realmId.value()); // realmId for insertion
|
||||
stmt->SetData(1, locale.value()); // locale for insertion
|
||||
stmt->SetData(1, locale); // locale for insertion
|
||||
stmt->SetData(2, strMotd); // motd text for insertion
|
||||
stmt->SetData(3, strMotd); // motd text for ON DUPLICATE KEY UPDATE
|
||||
trans->Append(stmt);
|
||||
}
|
||||
|
||||
// Commit the transaction & update db
|
||||
LoginDatabase.CommitTransaction(trans);
|
||||
|
||||
// Update the in-memory maps for the current realm. Otherwise, do not update
|
||||
if (realmId == -1 || realmId == static_cast<int32>(realm.Id.Realm))
|
||||
sMotdMgr->SetMotd(strMotd, localeConstant);
|
||||
|
||||
handler->PSendSysMessage(LANG_MOTD_NEW, realmId.value(), locale.value(), strMotd);
|
||||
sMotdMgr->SetMotd(strMotd, localeConstant);
|
||||
handler->PSendSysMessage(LANG_MOTD_NEW, realmId.value(), locale, strMotd);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -52,7 +52,12 @@ enum Spells
|
||||
SPELL_GRAVITY_LAPSE_FLY = 44227,
|
||||
SPELL_GRAVITY_LAPSE_DOT = 44226,
|
||||
SPELL_GRAVITY_LAPSE_CHANNEL = 44251,
|
||||
SPELL_POWER_FEEDBACK = 44233
|
||||
SPELL_POWER_FEEDBACK = 44233,
|
||||
SPELL_CLEAR_FLIGHT = 44232, // Does nothing currently
|
||||
|
||||
SPELL_EMOTE_EXCLAMATION = 48348,
|
||||
SPELL_EMOTE_POINT = 48349,
|
||||
SPELL_EMOTE_ROAR = 48350
|
||||
};
|
||||
|
||||
enum Misc
|
||||
@@ -67,19 +72,13 @@ enum Misc
|
||||
|
||||
struct boss_felblood_kaelthas : public BossAI
|
||||
{
|
||||
boss_felblood_kaelthas(Creature* creature) : BossAI(creature, DATA_KAELTHAS)
|
||||
{
|
||||
_hasDoneIntro = false;
|
||||
}
|
||||
boss_felblood_kaelthas(Creature* creature) : BossAI(creature, DATA_KAELTHAS) { }
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
BossAI::Reset();
|
||||
_OOCScheduler.CancelAll();
|
||||
_gravityLapseCounter = 0;
|
||||
me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false);
|
||||
me->SetImmuneToAll(false);
|
||||
summons.DespawnAll();
|
||||
|
||||
ScheduleHealthCheckEvent(50, [&]{
|
||||
me->CastStop();
|
||||
@@ -101,12 +100,6 @@ struct boss_felblood_kaelthas : public BossAI
|
||||
});
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
{
|
||||
BossAI::JustSummoned(summon);
|
||||
summon->SetReactState(REACT_PASSIVE);
|
||||
}
|
||||
|
||||
void GravityLapseSequence(bool firstTime)
|
||||
{
|
||||
Talk(firstTime ? SAY_GRAVITY_LAPSE : SAY_RECAST_GRAVITY);
|
||||
@@ -132,12 +125,6 @@ struct boss_felblood_kaelthas : public BossAI
|
||||
});
|
||||
}
|
||||
|
||||
void InitializeAI() override
|
||||
{
|
||||
BossAI::InitializeAI();
|
||||
me->SetImmuneToAll(true);
|
||||
}
|
||||
|
||||
void JustDied(Unit* killer) override
|
||||
{
|
||||
BossAI::JustDied(killer);
|
||||
@@ -168,20 +155,32 @@ struct boss_felblood_kaelthas : public BossAI
|
||||
}, 50s);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
void DoAction(int32 actionId) override
|
||||
{
|
||||
if (!_hasDoneIntro && me->IsWithinDistInMap(who, 40.0f) && who->IsPlayer())
|
||||
if (actionId == DATA_KAEL_INTRO)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
Talk(SAY_AGGRO_2, 20s);
|
||||
_hasDoneIntro = true;
|
||||
_OOCScheduler.Schedule(35s, [this](TaskContext){
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->SetImmuneToAll(false);
|
||||
me->SetInCombatWithZone();
|
||||
});
|
||||
uint32 counter = instance->GetPersistentData(DATA_KAEL_INTRO);
|
||||
instance->StorePersistentData(DATA_KAEL_INTRO, ++counter);
|
||||
|
||||
if (counter == 6 && !me->IsInCombat())
|
||||
{
|
||||
me->SetEmoteState(EMOTE_STATE_TALK);
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH_NO_SHEATHE);
|
||||
}, 15s);
|
||||
|
||||
Talk(SAY_AGGRO_2, 20s);
|
||||
me->SetImmuneToAll(true);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
me->ClearEmoteState();
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->SetImmuneToAll(false);
|
||||
}, 35s);
|
||||
}
|
||||
}
|
||||
BossAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask) override
|
||||
@@ -191,19 +190,35 @@ struct boss_felblood_kaelthas : public BossAI
|
||||
damage = me->GetHealth() - 1;
|
||||
if (me->isRegeneratingHealth())
|
||||
{
|
||||
me->CombatStop();
|
||||
me->CastStop();
|
||||
me->SetRegeneratingHealth(false);
|
||||
me->SetUnitFlag(UNIT_FLAG_DISABLE_MOVE);
|
||||
me->SetImmuneToAll(true);
|
||||
me->SetStandState(UNIT_STAND_STATE_KNEEL);
|
||||
me->CombatStop();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
LapseAction(ACTION_REMOVE_FLY);
|
||||
scheduler.CancelAll();
|
||||
_OOCScheduler.Schedule(6s, [this](TaskContext){
|
||||
me->KillSelf();
|
||||
});
|
||||
summons.DespawnAll();
|
||||
|
||||
Talk(SAY_DEATH);
|
||||
DoCastSelf(SPELL_EMOTE_EXCLAMATION);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
DoCastSelf(SPELL_EMOTE_POINT);
|
||||
}, 3s);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
DoCastSelf(SPELL_EMOTE_ROAR);
|
||||
}, 7s);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
DoCastSelf(SPELL_EMOTE_ROAR);
|
||||
DoCastSelf(SPELL_CLEAR_FLIGHT);
|
||||
}, 9s);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
me->KillSelf();
|
||||
}, 11s);
|
||||
}
|
||||
}
|
||||
BossAI::DamageTaken(attacker, damage, damagetype, damageSchoolMask);
|
||||
@@ -214,6 +229,9 @@ struct boss_felblood_kaelthas : public BossAI
|
||||
_gravityLapseCounter = 0;
|
||||
me->GetMap()->DoForAllPlayers([&](Player* player)
|
||||
{
|
||||
if (player->IsGameMaster())
|
||||
return;
|
||||
|
||||
if (action == ACTION_TELEPORT_PLAYERS)
|
||||
DoCast(player, SPELL_GRAVITY_LAPSE_PLAYER + _gravityLapseCounter, true);
|
||||
else if (action == ACTION_KNOCKUP)
|
||||
@@ -228,15 +246,7 @@ struct boss_felblood_kaelthas : public BossAI
|
||||
++_gravityLapseCounter;
|
||||
});
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
_OOCScheduler.Update(diff);
|
||||
BossAI::UpdateAI(diff);
|
||||
}
|
||||
private:
|
||||
TaskScheduler _OOCScheduler;
|
||||
bool _hasDoneIntro;
|
||||
uint8 _gravityLapseCounter;
|
||||
};
|
||||
|
||||
|
||||
@@ -48,6 +48,7 @@ DoorData const doorData[] =
|
||||
{ GO_SELIN_ENCOUNTER_DOOR, DATA_SELIN_FIREHEART, DOOR_TYPE_ROOM },
|
||||
{ GO_VEXALLUS_DOOR, DATA_VEXALLUS, DOOR_TYPE_PASSAGE },
|
||||
{ GO_DELRISSA_DOOR, DATA_DELRISSA, DOOR_TYPE_PASSAGE },
|
||||
{ GO_KAEL_DOOR, DATA_KAELTHAS, DOOR_TYPE_ROOM },
|
||||
{ 0, 0, DOOR_TYPE_ROOM } // END
|
||||
};
|
||||
|
||||
@@ -64,6 +65,7 @@ public:
|
||||
{
|
||||
SetHeaders(DataHeader);
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
SetPersistentDataCount(MAX_PERSISTENT_DATA);
|
||||
LoadObjectData(creatureData, gameobjectData);
|
||||
LoadDoorData(doorData);
|
||||
LoadSummonData(summonerData);
|
||||
|
||||
@@ -32,7 +32,11 @@ enum MTData
|
||||
MAX_ENCOUNTER = 4,
|
||||
|
||||
DATA_KALECGOS = 5,
|
||||
DATA_ESCAPE_ORB = 6
|
||||
DATA_ESCAPE_ORB = 6,
|
||||
|
||||
// Persistent data
|
||||
DATA_KAEL_INTRO = 0,
|
||||
MAX_PERSISTENT_DATA = 1
|
||||
};
|
||||
|
||||
enum MTCreatures
|
||||
@@ -40,8 +44,8 @@ enum MTCreatures
|
||||
NPC_DELRISSA = 24560,
|
||||
NPC_FEL_CRYSTAL = 24722,
|
||||
NPC_KAEL_THAS = 24664,
|
||||
NPC_PHOENIX = 21362,
|
||||
NPC_PHOENIX_EGG = 21364,
|
||||
NPC_PHOENIX = 24674,
|
||||
NPC_PHOENIX_EGG = 24675,
|
||||
NPC_KALECGOS = 24844
|
||||
};
|
||||
|
||||
|
||||
@@ -189,10 +189,12 @@ struct npc_madrigosa : public NullCreatureAI
|
||||
{
|
||||
if (param == ACTION_START_EVENT)
|
||||
{
|
||||
me->NearTeleportTo(1570.97f, 725.51f, 79.77f, 3.82f);
|
||||
me->SetDisableGravity(true);
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
me->RemoveDynamicFlag(UNIT_DYNFLAG_DEAD);
|
||||
me->NearTeleportTo(1570.97f, 725.51f, 79.77f, 3.82f);
|
||||
me->SendMovementFlagUpdate();
|
||||
|
||||
events.ScheduleEvent(EVENT_MAD_1, 2000);
|
||||
}
|
||||
else if (param == ACTION_SPAWN_FELMYST)
|
||||
@@ -212,9 +214,9 @@ struct npc_madrigosa : public NullCreatureAI
|
||||
brutallus->SetReactState(REACT_PASSIVE);
|
||||
brutallus->setActive(true);
|
||||
}
|
||||
me->GetMotionMaster()->MovePoint(1, 1477.94f, 643.22f, 21.21f);
|
||||
me->GetMotionMaster()->MoveTakeoff(1, 1477.94f, 643.22f, 21.21f);
|
||||
me->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD);
|
||||
events.ScheduleEvent(EVENT_MAD_2, 6000);
|
||||
events.ScheduleEvent(EVENT_MAD_2, 4000);
|
||||
break;
|
||||
case EVENT_MAD_2:
|
||||
Talk(SAY_MAD_1);
|
||||
|
||||
@@ -333,11 +333,11 @@ struct boss_felmyst : public BossAI
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
scheduler.Update(diff);
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
scheduler.Update(diff);
|
||||
|
||||
if (!me->HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY))
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
@@ -61,7 +61,6 @@ enum Spells
|
||||
enum Misc
|
||||
{
|
||||
EVENT_SPELL_BERSERK = 1,
|
||||
|
||||
GROUP_DELAY = 1
|
||||
};
|
||||
|
||||
@@ -103,6 +102,7 @@ struct boss_gurtogg_bloodboil : public BossAI
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 40.0f, true))
|
||||
{
|
||||
me->RemoveAurasByType(SPELL_AURA_MOD_TAUNT);
|
||||
me->RemoveAurasDueToSpell(SPELL_ACIDIC_WOUND);
|
||||
DoCastSelf(SPELL_FEL_RAGE_SELF, true);
|
||||
DoCast(target, SPELL_FEL_RAGE_TARGET, true);
|
||||
DoCast(target, SPELL_FEL_RAGE_2, true);
|
||||
@@ -118,6 +118,10 @@ struct boss_gurtogg_bloodboil : public BossAI
|
||||
DoCastVictim(SPELL_CHARGE);
|
||||
}, 2s);
|
||||
|
||||
me->m_Events.AddEventAtOffset([&] {
|
||||
DoCastSelf(SPELL_ACIDIC_WOUND, true);
|
||||
}, 28s);
|
||||
|
||||
scheduler.DelayGroup(GROUP_DELAY, 30s);
|
||||
}
|
||||
}, 90s);
|
||||
@@ -139,7 +143,7 @@ struct boss_gurtogg_bloodboil : public BossAI
|
||||
return !who->IsImmunedToDamage(SPELL_SCHOOL_MASK_ALL) && !who->HasUnitState(UNIT_STATE_CONFUSED);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) override
|
||||
void KilledUnit(Unit* /*victim*/) override
|
||||
{
|
||||
if (!_recentlySpoken)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user