diff --git a/src/game/Guild.cpp b/src/game/Guild.cpp index e138c0364..be996eb88 100644 --- a/src/game/Guild.cpp +++ b/src/game/Guild.cpp @@ -204,7 +204,7 @@ bool Guild::AddMember(ObjectGuid plGuid, uint32 plRank) newmember.accountId = fields[4].GetInt32(); delete result; if (newmember.Level < 1 || newmember.Level > STRONG_MAX_LEVEL || - newmember.Class < CLASS_WARRIOR || newmember.Class >= MAX_CLASSES) + !((1 << (newmember.Class-1)) & CLASSMASK_ALL_PLAYABLE)) { sLog.outError("%s has a broken data in field `characters` table, cannot add him to guild.", plGuid.GetString().c_str()); return false; @@ -456,7 +456,7 @@ bool Guild::LoadMembersFromDB(QueryResult *guildMembersResult) // the zone through xy coords .. this is a bit redundant, but shouldn't be called often newmember.ZoneId = Player::GetZoneIdFromDB(newmember.guid); } - if (newmember.Class < CLASS_WARRIOR || newmember.Class >= MAX_CLASSES) // can be at broken `class` field + if (!((1 << (newmember.Class-1)) & CLASSMASK_ALL_PLAYABLE)) // can be at broken `class` field { sLog.outError("%s has a broken data in field `characters`.`class`, deleting him from guild!", newmember.guid.GetString().c_str()); CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guid = '%u'", lowguid); diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 8b18ae4e6..1b5bab656 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -2764,26 +2764,15 @@ void ObjectMgr::LoadPlayerInfo() float positionZ = fields[6].GetFloat(); float orientation = fields[7].GetFloat(); - if(current_race >= MAX_RACES) - { - sLog.outErrorDb("Wrong race %u in `playercreateinfo` table, ignoring.",current_race); - continue; - } - ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(current_race); - if(!rEntry) + if(!rEntry || !((1 << (current_race-1)) & RACEMASK_ALL_PLAYABLE)) { sLog.outErrorDb("Wrong race %u in `playercreateinfo` table, ignoring.",current_race); continue; } - if(current_class >= MAX_CLASSES) - { - sLog.outErrorDb("Wrong class %u in `playercreateinfo` table, ignoring.",current_class); - continue; - } - - if(!sChrClassesStore.LookupEntry(current_class)) + ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(current_class); + if(!cEntry || !((1 << (current_class-1)) & CLASSMASK_ALL_PLAYABLE)) { sLog.outErrorDb("Wrong class %u in `playercreateinfo` table, ignoring.",current_class); continue; @@ -2850,14 +2839,17 @@ void ObjectMgr::LoadPlayerInfo() Field* fields = result->Fetch(); uint32 current_race = fields[0].GetUInt32(); - if(current_race >= MAX_RACES) + uint32 current_class = fields[1].GetUInt32(); + + ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(current_race); + if(!rEntry || !((1 << (current_race-1)) & RACEMASK_ALL_PLAYABLE)) { sLog.outErrorDb("Wrong race %u in `playercreateinfo_item` table, ignoring.",current_race); continue; } - uint32 current_class = fields[1].GetUInt32(); - if(current_class >= MAX_CLASSES) + ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(current_class); + if(!cEntry || !((1 << (current_class-1)) & CLASSMASK_ALL_PLAYABLE)) { sLog.outErrorDb("Wrong class %u in `playercreateinfo_item` table, ignoring.",current_class); continue; @@ -2919,14 +2911,17 @@ void ObjectMgr::LoadPlayerInfo() Field* fields = result->Fetch(); uint32 current_race = fields[0].GetUInt32(); - if(current_race >= MAX_RACES) + uint32 current_class = fields[1].GetUInt32(); + + ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(current_race); + if(!rEntry || !((1 << (current_race-1)) & RACEMASK_ALL_PLAYABLE)) { sLog.outErrorDb("Wrong race %u in `playercreateinfo_spell` table, ignoring.",current_race); continue; } - uint32 current_class = fields[1].GetUInt32(); - if(current_class >= MAX_CLASSES) + ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(current_class); + if(!cEntry || !((1 << (current_class-1)) & CLASSMASK_ALL_PLAYABLE)) { sLog.outErrorDb("Wrong class %u in `playercreateinfo_spell` table, ignoring.",current_class); continue; @@ -2978,14 +2973,17 @@ void ObjectMgr::LoadPlayerInfo() Field* fields = result->Fetch(); uint32 current_race = fields[0].GetUInt32(); - if(current_race >= MAX_RACES) + uint32 current_class = fields[1].GetUInt32(); + + ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(current_race); + if(!rEntry || !((1 << (current_race-1)) & RACEMASK_ALL_PLAYABLE)) { sLog.outErrorDb("Wrong race %u in `playercreateinfo_action` table, ignoring.",current_race); continue; } - uint32 current_class = fields[1].GetUInt32(); - if(current_class >= MAX_CLASSES) + ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(current_class); + if(!cEntry || !((1 << (current_class-1)) & CLASSMASK_ALL_PLAYABLE)) { sLog.outErrorDb("Wrong class %u in `playercreateinfo_action` table, ignoring.",current_class); continue; @@ -3136,14 +3134,17 @@ void ObjectMgr::LoadPlayerInfo() Field* fields = result->Fetch(); uint32 current_race = fields[0].GetUInt32(); - if(current_race >= MAX_RACES) + uint32 current_class = fields[1].GetUInt32(); + + ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(current_race); + if(!rEntry || !((1 << (current_race-1)) & RACEMASK_ALL_PLAYABLE)) { sLog.outErrorDb("Wrong race %u in `player_levelstats` table, ignoring.",current_race); continue; } - uint32 current_class = fields[1].GetUInt32(); - if(current_class >= MAX_CLASSES) + ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(current_class); + if(!cEntry || !((1 << (current_class-1)) & CLASSMASK_ALL_PLAYABLE)) { sLog.outErrorDb("Wrong class %u in `player_levelstats` table, ignoring.",current_class); continue; @@ -3189,13 +3190,13 @@ void ObjectMgr::LoadPlayerInfo() for (int race = 0; race < MAX_RACES; ++race) { // skip nonexistent races - if(!sChrRacesStore.LookupEntry(race)) + if(!((1 << (race-1)) & RACEMASK_ALL_PLAYABLE) || !sChrRacesStore.LookupEntry(race)) continue; for (int class_ = 0; class_ < MAX_CLASSES; ++class_) { // skip nonexistent classes - if(!sChrClassesStore.LookupEntry(class_)) + if(!((1 << (class_-1)) & CLASSMASK_ALL_PLAYABLE) || !sChrClassesStore.LookupEntry(class_)) continue; PlayerInfo* pInfo = &playerInfo[race][class_]; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 95c97deeb..c953ac92e 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "10940" + #define REVISION_NR "10941" #endif // __REVISION_NR_H__