Merge branch 'azerothcore:master' into Playerbot
This commit is contained in:
@@ -0,0 +1,6 @@
|
|||||||
|
-- DB update 2025_09_29_00 -> 2025_09_30_00
|
||||||
|
DELETE FROM `creature_formations` WHERE (`leaderGUID` = 127046);
|
||||||
|
INSERT INTO `creature_formations` (`leaderGUID`, `memberGUID`, `dist`, `angle`, `groupAI`, `point_1`, `point_2`) VALUES
|
||||||
|
(127046, 127046, 0, 0, 1, 0, 0),
|
||||||
|
(127046, 127080, 0, 0, 1, 0, 0),
|
||||||
|
(127046, 127081, 0, 0, 1, 0, 0);
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
-- DB update 2025_09_30_00 -> 2025_09_30_01
|
||||||
|
-- Drakkari Colossus - Mortal Strike spell difficulty
|
||||||
|
DELETE FROM `spelldifficulty_dbc` WHERE `ID` = 54715;
|
||||||
|
INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`, `DifficultySpellID_3`, `DifficultySpellID_4`) VALUES (54715, 54715, 59454, 0, 0);
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
-- DB update 2025_09_30_01 -> 2025_09_30_02
|
||||||
|
--
|
||||||
|
UPDATE `creature_template` SET `type` = 8 WHERE `entry` = 8881;
|
||||||
@@ -663,51 +663,46 @@ void WorldSession::HandleCharDeleteOpcode(WorldPacket& recvData)
|
|||||||
|
|
||||||
void WorldSession::HandlePlayerLoginOpcode(WorldPacket& recvData)
|
void WorldSession::HandlePlayerLoginOpcode(WorldPacket& recvData)
|
||||||
{
|
{
|
||||||
m_playerLoading = true;
|
if (!sWorld->getBoolConfig(CONFIG_REALM_LOGIN_ENABLED))
|
||||||
|
{
|
||||||
|
SendCharLoginFailed(LoginFailureReason::NoWorld);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PlayerLoading() || GetPlayer() != nullptr)
|
||||||
|
{
|
||||||
|
LOG_ERROR("network", "Player tried to login again, AccountId = {}", GetAccountId());
|
||||||
|
KickPlayer("WorldSession::HandlePlayerLoginOpcode Another client logging in");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ObjectGuid playerGuid;
|
ObjectGuid playerGuid;
|
||||||
recvData >> playerGuid;
|
recvData >> playerGuid;
|
||||||
|
|
||||||
if (PlayerLoading() || GetPlayer() != nullptr || !playerGuid.IsPlayer())
|
if (!IsLegitCharacterForAccount(playerGuid))
|
||||||
{
|
|
||||||
// limit player interaction with the world
|
|
||||||
if (!sWorld->getBoolConfig(CONFIG_REALM_LOGIN_ENABLED))
|
|
||||||
{
|
|
||||||
WorldPacket data(SMSG_CHARACTER_LOGIN_FAILED, 1);
|
|
||||||
// see LoginFailureReason enum for more reasons
|
|
||||||
data << uint8(LoginFailureReason::NoWorld);
|
|
||||||
SendPacket(&data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!playerGuid.IsPlayer() || !IsLegitCharacterForAccount(playerGuid))
|
|
||||||
{
|
{
|
||||||
LOG_ERROR("network", "Account ({}) can't login with that character ({}).", GetAccountId(), playerGuid.ToString());
|
LOG_ERROR("network", "Account ({}) can't login with that character ({}).", GetAccountId(), playerGuid.ToString());
|
||||||
KickPlayer("Account can't login with this character");
|
KickPlayer("Account can't login with this character");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto SendCharLogin = [&](ResponseCodes result)
|
|
||||||
{
|
|
||||||
WorldPacket data(SMSG_CHARACTER_LOGIN_FAILED, 1);
|
|
||||||
data << uint8(result);
|
|
||||||
SendPacket(&data);
|
|
||||||
};
|
|
||||||
|
|
||||||
// pussywizard:
|
// pussywizard:
|
||||||
if (WorldSession* sess = sWorldSessionMgr->FindOfflineSessionForCharacterGUID(playerGuid.GetCounter()))
|
if (WorldSession* sess = sWorldSessionMgr->FindOfflineSessionForCharacterGUID(playerGuid.GetCounter()))
|
||||||
|
{
|
||||||
if (sess->GetAccountId() != GetAccountId())
|
if (sess->GetAccountId() != GetAccountId())
|
||||||
{
|
{
|
||||||
SendCharLogin(CHAR_LOGIN_DUPLICATE_CHARACTER);
|
SendCharLoginFailed(LoginFailureReason::DuplicateCharacter);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// pussywizard:
|
// pussywizard:
|
||||||
if (WorldSession* sess = sWorldSessionMgr->FindOfflineSession(GetAccountId()))
|
if (WorldSession* sess = sWorldSessionMgr->FindOfflineSession(GetAccountId()))
|
||||||
{
|
{
|
||||||
Player* p = sess->GetPlayer();
|
Player* p = sess->GetPlayer();
|
||||||
if (!p || sess->IsKicked())
|
if (!p || sess->IsKicked())
|
||||||
{
|
{
|
||||||
SendCharLogin(CHAR_LOGIN_DUPLICATE_CHARACTER);
|
SendCharLoginFailed(LoginFailureReason::DuplicateCharacter);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -718,7 +713,7 @@ void WorldSession::HandlePlayerLoginOpcode(WorldPacket& recvData)
|
|||||||
// pussywizard: players stay ingame no matter what (prevent abuse), but allow to turn it off to stop crashing
|
// pussywizard: players stay ingame no matter what (prevent abuse), but allow to turn it off to stop crashing
|
||||||
if (!sWorld->getBoolConfig(CONFIG_ENABLE_LOGIN_AFTER_DC))
|
if (!sWorld->getBoolConfig(CONFIG_ENABLE_LOGIN_AFTER_DC))
|
||||||
{
|
{
|
||||||
SendCharLogin(CHAR_LOGIN_DUPLICATE_CHARACTER);
|
SendCharLoginFailed(LoginFailureReason::DuplicateCharacter);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -760,7 +755,7 @@ void WorldSession::HandlePlayerLoginOpcode(WorldPacket& recvData)
|
|||||||
}
|
}
|
||||||
if (!p->FindMap() || !p->IsInWorld() || sess->IsKicked())
|
if (!p->FindMap() || !p->IsInWorld() || sess->IsKicked())
|
||||||
{
|
{
|
||||||
SendCharLogin(CHAR_LOGIN_DUPLICATE_CHARACTER);
|
SendCharLoginFailed(LoginFailureReason::DuplicateCharacter);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -776,11 +771,9 @@ void WorldSession::HandlePlayerLoginOpcode(WorldPacket& recvData)
|
|||||||
|
|
||||||
std::shared_ptr<LoginQueryHolder> holder = std::make_shared<LoginQueryHolder>(GetAccountId(), playerGuid);
|
std::shared_ptr<LoginQueryHolder> holder = std::make_shared<LoginQueryHolder>(GetAccountId(), playerGuid);
|
||||||
if (!holder->Initialize())
|
if (!holder->Initialize())
|
||||||
{
|
|
||||||
m_playerLoading = false;
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
|
m_playerLoading = true;
|
||||||
AddQueryHolderCallback(CharacterDatabase.DelayQueryHolder(holder)).AfterComplete([this](SQLQueryHolderBase const& holder)
|
AddQueryHolderCallback(CharacterDatabase.DelayQueryHolder(holder)).AfterComplete([this](SQLQueryHolderBase const& holder)
|
||||||
{
|
{
|
||||||
HandlePlayerLoginFromDB(static_cast<LoginQueryHolder const&>(holder));
|
HandlePlayerLoginFromDB(static_cast<LoginQueryHolder const&>(holder));
|
||||||
@@ -2570,6 +2563,13 @@ void WorldSession::SendCharDelete(ResponseCodes result)
|
|||||||
SendPacket(&data);
|
SendPacket(&data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WorldSession::SendCharLoginFailed(LoginFailureReason reason)
|
||||||
|
{
|
||||||
|
WorldPacket data(SMSG_CHARACTER_LOGIN_FAILED, 1);
|
||||||
|
data << uint8(reason);
|
||||||
|
SendPacket(&data);
|
||||||
|
};
|
||||||
|
|
||||||
void WorldSession::SendCharRename(ResponseCodes result, CharacterRenameInfo const* renameInfo)
|
void WorldSession::SendCharRename(ResponseCodes result, CharacterRenameInfo const* renameInfo)
|
||||||
{
|
{
|
||||||
WorldPacket data(SMSG_CHAR_RENAME, 1 + 8 + renameInfo->Name.size() + 1);
|
WorldPacket data(SMSG_CHAR_RENAME, 1 + 8 + renameInfo->Name.size() + 1);
|
||||||
|
|||||||
@@ -621,6 +621,7 @@ public: // opcodes handlers
|
|||||||
|
|
||||||
void SendCharCreate(ResponseCodes result);
|
void SendCharCreate(ResponseCodes result);
|
||||||
void SendCharDelete(ResponseCodes result);
|
void SendCharDelete(ResponseCodes result);
|
||||||
|
void SendCharLoginFailed(LoginFailureReason reason);
|
||||||
void SendCharRename(ResponseCodes result, CharacterRenameInfo const* renameInfo);
|
void SendCharRename(ResponseCodes result, CharacterRenameInfo const* renameInfo);
|
||||||
void SendCharCustomize(ResponseCodes result, CharacterCustomizeInfo const* customizeInfo);
|
void SendCharCustomize(ResponseCodes result, CharacterCustomizeInfo const* customizeInfo);
|
||||||
void SendCharFactionChange(ResponseCodes result, CharacterFactionChangeInfo const* factionChangeInfo);
|
void SendCharFactionChange(ResponseCodes result, CharacterFactionChangeInfo const* factionChangeInfo);
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ enum Spells
|
|||||||
SPELL_MOJO_WAVE = 55626,
|
SPELL_MOJO_WAVE = 55626,
|
||||||
SPELL_FREEZE_ANIM = 52656,
|
SPELL_FREEZE_ANIM = 52656,
|
||||||
SPELL_MIGHTY_BLOW = 54719,
|
SPELL_MIGHTY_BLOW = 54719,
|
||||||
|
SPELL_MORTAL_STRIKE = 54715,
|
||||||
|
|
||||||
SPELL_ELEMENTAL_SPAWN_EFFECT = 54888,
|
SPELL_ELEMENTAL_SPAWN_EFFECT = 54888,
|
||||||
SPELL_EMERGE = 54850,
|
SPELL_EMERGE = 54850,
|
||||||
@@ -54,9 +55,10 @@ enum Misc
|
|||||||
EMOTE_ALTAR = 1,
|
EMOTE_ALTAR = 1,
|
||||||
|
|
||||||
EVENT_COLOSSUS_MIGHTY_BLOW = 1,
|
EVENT_COLOSSUS_MIGHTY_BLOW = 1,
|
||||||
EVENT_COLOSSUS_HEALTH_1 = 2,
|
EVENT_COLOSSUS_MORTAL_STRIKE = 2,
|
||||||
EVENT_COLOSSUS_HEALTH_2 = 3,
|
EVENT_COLOSSUS_HEALTH_1 = 3,
|
||||||
EVENT_COLOSSUS_START_FIGHT = 4,
|
EVENT_COLOSSUS_HEALTH_2 = 4,
|
||||||
|
EVENT_COLOSSUS_START_FIGHT = 5,
|
||||||
|
|
||||||
EVENT_ELEMENTAL_HEALTH = 10,
|
EVENT_ELEMENTAL_HEALTH = 10,
|
||||||
EVENT_ELEMENTAL_SURGE = 11,
|
EVENT_ELEMENTAL_SURGE = 11,
|
||||||
@@ -146,6 +148,7 @@ public:
|
|||||||
{
|
{
|
||||||
BossAI::JustEngagedWith(who);
|
BossAI::JustEngagedWith(who);
|
||||||
events.ScheduleEvent(EVENT_COLOSSUS_MIGHTY_BLOW, 10s);
|
events.ScheduleEvent(EVENT_COLOSSUS_MIGHTY_BLOW, 10s);
|
||||||
|
events.ScheduleEvent(EVENT_COLOSSUS_MORTAL_STRIKE, 7s);
|
||||||
events.ScheduleEvent(EVENT_COLOSSUS_HEALTH_1, 1s);
|
events.ScheduleEvent(EVENT_COLOSSUS_HEALTH_1, 1s);
|
||||||
events.ScheduleEvent(EVENT_COLOSSUS_HEALTH_2, 1s);
|
events.ScheduleEvent(EVENT_COLOSSUS_HEALTH_2, 1s);
|
||||||
}
|
}
|
||||||
@@ -212,6 +215,10 @@ public:
|
|||||||
me->CastSpell(me->GetVictim(), SPELL_MIGHTY_BLOW, false);
|
me->CastSpell(me->GetVictim(), SPELL_MIGHTY_BLOW, false);
|
||||||
events.ScheduleEvent(EVENT_COLOSSUS_MIGHTY_BLOW, 10s);
|
events.ScheduleEvent(EVENT_COLOSSUS_MIGHTY_BLOW, 10s);
|
||||||
break;
|
break;
|
||||||
|
case EVENT_COLOSSUS_MORTAL_STRIKE:
|
||||||
|
DoCastVictim(SPELL_MORTAL_STRIKE);
|
||||||
|
events.ScheduleEvent(EVENT_COLOSSUS_MORTAL_STRIKE, 7s);
|
||||||
|
break;
|
||||||
case EVENT_COLOSSUS_HEALTH_1:
|
case EVENT_COLOSSUS_HEALTH_1:
|
||||||
if (me->HealthBelowPct(51))
|
if (me->HealthBelowPct(51))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -51,14 +51,7 @@ enum Misc
|
|||||||
MAX_CONSTRICTOR = 3,
|
MAX_CONSTRICTOR = 3,
|
||||||
MAX_SUMMONS = 5,
|
MAX_SUMMONS = 5,
|
||||||
|
|
||||||
EVENT_POISON_NOVA = 1,
|
EVENT_KILL_TALK = 1
|
||||||
EVENT_POWERFULL_BITE = 2,
|
|
||||||
EVENT_VENOM_BOLT = 3,
|
|
||||||
EVENT_CHECK_HEALTH1 = 4,
|
|
||||||
EVENT_CHECK_HEALTH2 = 5,
|
|
||||||
EVENT_SUMMON1 = 6,
|
|
||||||
EVENT_SUMMON2 = 7,
|
|
||||||
EVENT_KILL_TALK = 8
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const Position SpawnLoc[] =
|
const Position SpawnLoc[] =
|
||||||
@@ -121,17 +114,17 @@ public:
|
|||||||
Talk(SAY_AGGRO);
|
Talk(SAY_AGGRO);
|
||||||
BossAI::JustEngagedWith(who);
|
BossAI::JustEngagedWith(who);
|
||||||
|
|
||||||
ScheduleTimedEvent(10s, [&]{
|
ScheduleTimedEvent(16s, 53s, [&]{
|
||||||
Talk(EMOTE_NOVA);
|
Talk(EMOTE_NOVA);
|
||||||
DoCastAOE(SPELL_POISON_NOVA);
|
DoCastAOE(SPELL_POISON_NOVA);
|
||||||
}, 15s);
|
}, 16s, 53s);
|
||||||
|
|
||||||
ScheduleTimedEvent(3s, [&] {
|
ScheduleTimedEvent(3s, [&] {
|
||||||
DoCastVictim(SPELL_POWERFULL_BITE);
|
DoCastVictim(SPELL_POWERFULL_BITE);
|
||||||
}, 10s);
|
}, 10s);
|
||||||
|
|
||||||
ScheduleTimedEvent(15s, [&] {
|
ScheduleTimedEvent(15s, [&] {
|
||||||
DoCastVictim(SPELL_VENOM_BOLT);
|
DoCastRandomTarget(SPELL_VENOM_BOLT, 0, 45.0f, false);
|
||||||
}, 10s);
|
}, 10s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4010,14 +4010,15 @@ enum ServerProcessTypes
|
|||||||
// Login Failure Reasons
|
// Login Failure Reasons
|
||||||
enum class LoginFailureReason : uint8
|
enum class LoginFailureReason : uint8
|
||||||
{
|
{
|
||||||
Failed = 0,
|
Failed = 0, // Login failed
|
||||||
NoWorld = 1,
|
NoWorld = 1, // World server down
|
||||||
DuplicateCharacter = 2,
|
DuplicateCharacter = 2, // A character with that name already exists
|
||||||
NoInstances = 3,
|
NoInstances = 3, // No instance servers are available
|
||||||
Disabled = 4,
|
Disabled = 4, // Login for that race, class or character is currently disabled.
|
||||||
NoCharacter = 5,
|
NoCharacter = 5, // Character not found
|
||||||
LockedForTransfer = 6,
|
LockedForTransfer = 6, // You cannot log in until the character update process you recently initiated is complete.
|
||||||
LockedByBilling = 7
|
LockedByBilling = 7, // Character locked. Contact billing for more information
|
||||||
|
UsingRemote = 8, // You cannot log in while using World of Warcraft Remote.
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace Acore::Impl
|
namespace Acore::Impl
|
||||||
|
|||||||
Reference in New Issue
Block a user