mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
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
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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";
|
||||
|
||||
Reference in New Issue
Block a user