aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2022_01_14_03_world.sql4
-rw-r--r--src/server/game/Entities/Player/Player.h7
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp11
-rw-r--r--src/server/game/Globals/ObjectMgr.h10
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp2
5 files changed, 24 insertions, 10 deletions
diff --git a/sql/updates/world/master/2022_01_14_03_world.sql b/sql/updates/world/master/2022_01_14_03_world.sql
new file mode 100644
index 00000000000..609f4b576a4
--- /dev/null
+++ b/sql/updates/world/master/2022_01_14_03_world.sql
@@ -0,0 +1,4 @@
+--
+ALTER TABLE `playercreateinfo_cast_spell` DROP PRIMARY KEY;
+ALTER TABLE `playercreateinfo_cast_spell` ADD `createMode` tinyint(4) NOT NULL DEFAULT '0' AFTER `classMask`;
+ALTER TABLE `playercreateinfo_cast_spell` ADD PRIMARY KEY(`raceMask`,`classMask`,`createMode`,`spell`);
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index d26b5abdaaa..56d70c4eb11 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -97,6 +97,7 @@ enum LootError : uint8;
enum LootType : uint8;
enum PlayerRestState : uint8;
enum RestTypes : uint8;
+enum class PlayerCreateMode : int8;
namespace BattlePets
{
@@ -119,12 +120,6 @@ namespace WorldPackets
TC_GAME_API uint32 GetBagSize(Bag const* bag);
TC_GAME_API Item* GetItemInBag(Bag const* bag, uint8 slot);
-enum class PlayerCreateMode : int8
-{
- Normal = 0,
- NPE = 1
-};
-
typedef std::deque<Mail*> PlayerMails;
#define PLAYER_MAX_SKILLS 256
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index ec0bff126d2..01cbae72fd8 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -4048,7 +4048,7 @@ void ObjectMgr::LoadPlayerInfo()
{
uint32 oldMSTime = getMSTime();
- QueryResult result = WorldDatabase.PQuery("SELECT raceMask, classMask, spell FROM playercreateinfo_cast_spell");
+ QueryResult result = WorldDatabase.PQuery("SELECT raceMask, classMask, spell, createMode FROM playercreateinfo_cast_spell");
if (!result)
TC_LOG_INFO("server.loading", ">> Loaded 0 player create cast spells. DB table `playercreateinfo_cast_spell` is empty.");
@@ -4062,6 +4062,7 @@ void ObjectMgr::LoadPlayerInfo()
Trinity::RaceMask<uint64> raceMask = { fields[0].GetUInt64() };
uint32 classMask = fields[1].GetUInt32();
uint32 spellId = fields[2].GetUInt32();
+ int8 playerCreateMode = fields[3].GetInt8();
if (raceMask && !(raceMask.RawValue & RACEMASK_ALL_PLAYABLE))
{
@@ -4075,6 +4076,12 @@ void ObjectMgr::LoadPlayerInfo()
continue;
}
+ if (playerCreateMode < 0 || playerCreateMode >= AsUnderlyingType(PlayerCreateMode::Max))
+ {
+ TC_LOG_ERROR("sql.sql", "Uses invalid createMode %u in `playercreateinfo_cast_spell` table, ignoring.", playerCreateMode);
+ continue;
+ }
+
for (uint32 raceIndex = RACE_HUMAN; raceIndex < MAX_RACES; ++raceIndex)
{
if (!raceMask || raceMask.HasRace(raceIndex))
@@ -4085,7 +4092,7 @@ void ObjectMgr::LoadPlayerInfo()
{
if (auto& info = _playerInfo[raceIndex][classIndex])
{
- info->castSpells.push_back(spellId);
+ info->castSpells[playerCreateMode].push_back(spellId);
++count;
}
}
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 4443d8ba018..852dd68e121 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -611,6 +611,14 @@ struct QuestRelationResult
typedef std::multimap<int32, uint32> ExclusiveQuestGroups; // exclusiveGroupId -> quest
typedef std::pair<ExclusiveQuestGroups::const_iterator, ExclusiveQuestGroups::const_iterator> ExclusiveQuestGroupsBounds;
+enum class PlayerCreateMode : int8
+{
+ Normal = 0,
+ NPE = 1,
+
+ Max
+};
+
struct PlayerCreateInfoItem
{
PlayerCreateInfoItem(uint32 id, uint32 amount) : item_id(id), item_amount(amount) { }
@@ -655,7 +663,7 @@ struct PlayerInfo
PlayerCreateInfoItems item;
PlayerCreateInfoSpells customSpells;
- PlayerCreateInfoSpells castSpells;
+ PlayerCreateInfoSpells castSpells[size_t(PlayerCreateMode::Max)];
PlayerCreateInfoActions action;
PlayerCreateInfoSkills skills;
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index 57a98bf1338..b6970b5f6e9 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -1295,7 +1295,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
pCurrChar->RemoveAtLoginFlag(AT_LOGIN_FIRST);
PlayerInfo const* info = sObjectMgr->GetPlayerInfo(pCurrChar->GetRace(), pCurrChar->GetClass());
- for (uint32 spellId : info->castSpells)
+ for (uint32 spellId : info->castSpells[AsUnderlyingType(pCurrChar->GetCreateMode())])
pCurrChar->CastSpell(pCurrChar, spellId, true);
// start with every map explored