diff options
author | ModoX <moardox@gmail.com> | 2022-01-14 19:52:56 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-14 19:52:56 +0100 |
commit | 8a61024cfad05279791badf33fcdb5a608ad6e94 (patch) | |
tree | e9348ead197bb70545506166205b567099106880 | |
parent | 425a1f01893624a947eb830e502f97e4371ef209 (diff) |
Core/Player: Added PlayerCreateMode field to playercreateinfo_cast_spell to only cast spells based on related mode (#27593)
-rw-r--r-- | sql/updates/world/master/2022_01_14_03_world.sql | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 7 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.h | 10 | ||||
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 2 |
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 |