diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index 8205bbcf8..18dd0bbdb 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -1980,7 +1980,10 @@ namespace Game.Entities if (ssEntry != null && ssEntry.CreatureType > 0) return (CreatureType)ssEntry.CreatureType; else - return CreatureType.Humanoid; + { + var raceEntry = CliDB.ChrRacesStorage.LookupByKey(GetRace()); + return raceEntry.CreatureType; + } } else return ToCreature().GetCreatureTemplate().CreatureType; diff --git a/Source/Game/Handlers/CharacterHandler.cs b/Source/Game/Handlers/CharacterHandler.cs index 3c12304c7..9dac19594 100644 --- a/Source/Game/Handlers/CharacterHandler.cs +++ b/Source/Game/Handlers/CharacterHandler.cs @@ -356,6 +356,13 @@ namespace Game if (!HasPermission(RBACPermissions.SkipCheckCharacterCreationRacemask)) { + if (raceEntry.GetFlags().HasFlag(ChrRacesFlag.NPCOnly)) + { + Log.outError(LogFilter.Network, $"Race ({charCreate.CreateInfo.RaceId}) was not playable but requested while creating new char for account (ID: {GetAccountId()}): wrong DBC files or cheater?"); + SendCharCreate(ResponseCodes.CharCreateDisabled); + return; + } + ulong raceMaskDisabled = WorldConfig.GetUInt64Value(WorldCfg.CharacterCreatingDisabledRacemask); if (Convert.ToBoolean((ulong)SharedConst.GetMaskForRace(charCreate.CreateInfo.RaceId) & raceMaskDisabled)) {