aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHelloKitty <andrew.blakely@ymail.com>2020-05-15 13:41:16 -0500
committerShauren <shauren.trinity@gmail.com>2022-01-04 15:33:04 +0100
commit406c7219ad6454a3f3855c9e0732245dcc34b2dc (patch)
tree09a3d0d4dcf5e63734aa235461445564fba646fe /src
parent5e37b1cd5d3f96f69f695b2314f16ee92c66297a (diff)
Further improve ChrRace DBC handling (#24508)
* Core/DBC: Added ChrRacesAllianceType for ChrRaces.dbc * Core/Character: Check ChrRace DBC playable in HandleCharCreateOpcode * Core/DBC: Implement ChrRacesFlags removing literals Cannot take credit for this enum, derived from documentation in https://wowdev.wiki/DB/ChrRaces * Core/Character: Check CHRRACES_FLAGS_NOT_PLAYABLE on creation * Core/DBC: Fix formatting of ChrRaces enums * Core/DBC: Use ChrRaces CreatureType instead of hardcoded humanoid assumption * Address enum style code changes (cherry picked from commit 43b595111dce03258c29fd926201660b9d3acb8d)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp5
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp7
2 files changed, 11 insertions, 1 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 3aa228d409d..6537c31c890 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -8459,7 +8459,10 @@ uint32 Unit::GetCreatureType() const
if (ssEntry && ssEntry->CreatureType > 0)
return ssEntry->CreatureType;
else
- return CREATURE_TYPE_HUMANOID;
+ {
+ ChrRacesEntry const* raceEntry = sChrRacesStore.AssertEntry(GetRace());
+ return raceEntry->CreatureType;
+ }
}
else
return ToCreature()->GetCreatureTemplate()->type;
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index 4297cc4e79e..61cc65af1c3 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -664,6 +664,13 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact
if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RACEMASK))
{
+ if (raceEntry->GetFlags().HasFlag(ChrRacesFlag::NPCOnly))
+ {
+ TC_LOG_ERROR("network", "Race (%u) was not playable but requested while creating new char for account (ID: %u): wrong DBC files or cheater?", charCreate.CreateInfo->Race, GetAccountId());
+ SendCharCreate(CHAR_CREATE_DISABLED);
+ return;
+ }
+
Trinity::RaceMask<uint64> raceMaskDisabled{ sWorld->GetUInt64Config(CONFIG_CHARACTER_CREATING_DISABLED_RACEMASK) };
if (raceMaskDisabled.HasRace(charCreate.CreateInfo->Race))
{