diff options
author | HelloKitty <andrew.blakely@ymail.com> | 2020-05-15 13:41:16 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-15 20:41:16 +0200 |
commit | 43b595111dce03258c29fd926201660b9d3acb8d (patch) | |
tree | d47f71e018ea1ba6c3a1d34580d52ef695672388 | |
parent | 1d43003cfa29cee2c7921fdeaa5c1714d085c770 (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
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 7 | ||||
-rw-r--r-- | src/server/shared/DataStores/DBCStructure.h | 20 | ||||
-rw-r--r-- | src/server/shared/DataStores/DBCfmt.h | 2 |
4 files changed, 31 insertions, 5 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 31ca50eb70b..0001af2fc13 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -8842,7 +8842,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; @@ -8896,7 +8899,7 @@ bool Unit::IsInDisallowedMountForm() const ChrRacesEntry const* race = sChrRacesStore.LookupEntry(displayExtra->Race); if (model && !(model->HasFlag(CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT))) - if (race && !(race->Flags & 0x4)) + if (race && !(race->HasFlag(CHRRACES_FLAGS_CAN_MOUNT))) return true; return false; diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index ed3923ca971..85b43125068 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -341,6 +341,13 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData) if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RACEMASK)) { + if (raceEntry->Alliance == CHRRACES_ALLIANCE_TYPE_NOT_PLAYABLE || raceEntry->HasFlag(CHRRACES_FLAGS_NOT_PLAYABLE)) + { + TC_LOG_ERROR("network", "Race (%u) was not playable but requested while creating new char for account (ID: %u): wrong DBC files or cheater?", createInfo->Race, GetAccountId()); + SendCharCreate(CHAR_CREATE_DISABLED); + return; + } + uint32 raceMaskDisabled = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_DISABLED_RACEMASK); if ((1 << (createInfo->Race - 1)) & raceMaskDisabled) { diff --git a/src/server/shared/DataStores/DBCStructure.h b/src/server/shared/DataStores/DBCStructure.h index cd71c310f30..e2d828f37a7 100644 --- a/src/server/shared/DataStores/DBCStructure.h +++ b/src/server/shared/DataStores/DBCStructure.h @@ -392,6 +392,20 @@ struct ChrClassesEntry uint32 expansion; // 59 (0 - original race, 1 - tbc addon, ...) }; +enum ChrRacesAllianceType +{ + CHRRACES_ALLIANCE_TYPE_ALLIANCE = 0, + CHRRACES_ALLIANCE_TYPE_HORDE = 1, + CHRRACES_ALLIANCE_TYPE_NOT_PLAYABLE = 2, +}; + +enum ChrRacesFlags +{ + CHRRACES_FLAGS_NOT_PLAYABLE = 0x01, + CHRRACES_FLAGS_BARE_FEET = 0x02, + CHRRACES_FLAGS_CAN_MOUNT = 0x04 +}; + struct ChrRacesEntry { uint32 RaceID; // 0 @@ -402,11 +416,11 @@ struct ChrRacesEntry uint32 model_f; // 5 // 6 unused uint32 TeamID; // 7 (7-Alliance 1-Horde) - // 8 unused + uint32 CreatureType; // 8 Blizzlike Always 7 (humanoid). uint32 ResSicknessSpellID; // 9 Blizzlike DBC always 15007. // 10-11 unused uint32 CinematicSequence; // 12 id from CinematicSequences.dbc - //uint32 unk_322; // 13 faction (0 alliance, 1 horde, 2 not available?) + uint32 Alliance; // 13 faction (0 alliance, 1 horde, 2 not available?) char* name[16]; // 14-29 used for DBC language detection/selection // 30 string flags, unused //char* nameFemale[16]; // 31-46, if different from base (male) case @@ -415,6 +429,8 @@ struct ChrRacesEntry // 64 string flags, unused // 65-67 unused uint32 expansion; // 68 (0 - original race, 1 - tbc addon, ...) + + inline bool HasFlag(ChrRacesFlags flag) const { return !!(Flags & flag); } }; struct CinematicCameraEntry diff --git a/src/server/shared/DataStores/DBCfmt.h b/src/server/shared/DataStores/DBCfmt.h index 00267759742..0370fea071b 100644 --- a/src/server/shared/DataStores/DBCfmt.h +++ b/src/server/shared/DataStores/DBCfmt.h @@ -37,7 +37,7 @@ char constexpr CharSectionsEntryfmt[] = "diiixxxiii"; char constexpr CharTitlesEntryfmt[] = "nxssssssssssssssssxssssssssssssssssxi"; char constexpr ChatChannelsEntryfmt[] = "nixssssssssssssssssxxxxxxxxxxxxxxxxxx"; char constexpr ChrClassesEntryfmt[] = "nxixssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixii"; -char constexpr ChrRacesEntryfmt[] = "niixiixixixxixssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi"; +char constexpr ChrRacesEntryfmt[] = "niixiixiiixxiissssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi"; char constexpr CinematicCameraEntryfmt[] = "nsiffff"; char constexpr CinematicSequencesEntryfmt[] = "nxixxxxxxx"; char constexpr CreatureDisplayInfofmt[] = "nixifxxxxxxxxxxx"; |