diff options
-rwxr-xr-x | src/server/game/DataStores/DBCStores.cpp | 19 | ||||
-rwxr-xr-x | src/server/game/DataStores/DBCStores.h | 3 | ||||
-rwxr-xr-x | src/server/game/DataStores/DBCStructure.h | 16 | ||||
-rwxr-xr-x | src/server/game/DataStores/DBCfmt.h | 1 | ||||
-rwxr-xr-x | src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp | 26 | ||||
-rw-r--r--[-rwxr-xr-x] | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/Server/WorldSession.h | 2 |
7 files changed, 68 insertions, 1 deletions
diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index 9bdbce70acc..82e97e9f863 100755 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -146,6 +146,9 @@ MapDifficultyMap sMapDifficultyMap; DBCStorage <MovieEntry> sMovieStore(MovieEntryfmt); +DBCStorage <NameGenEntry> sNameGenStore(NameGenfmt); +GenNameVectorArraysMap sGenNameVectoArraysMap; + DBCStorage <OverrideSpellDataEntry> sOverrideSpellDataStore(OverrideSpellDatafmt); DBCStorage <PvPDifficultyEntry> sPvPDifficultyStore(PvPDifficultyfmt); @@ -425,6 +428,14 @@ void LoadDBCStores(const std::string& dataPath) sMapDifficultyMap[MAKE_PAIR32(entry->MapId, entry->Difficulty)] = MapDifficulty(entry->resetTime, entry->maxPlayers, entry->areaTriggerText[0] > 0); sMapDifficultyStore.Clear(); + LoadDBC(availableDbcLocales, bad_dbc_files, sNameGenStore, dbcPath, "NameGen.dbc");//14545 + for (uint32 i = 0; i < sNameGenStore.GetNumRows(); ++i) + { + if (NameGenEntry const* entry = sNameGenStore.LookupEntry(i)) + sGenNameVectoArraysMap[entry->race].stringVectorArray[entry->gender].push_back(std::string(entry->name)); + } + sNameGenStore.Clear(); + LoadDBC(availableDbcLocales, bad_dbc_files, sMovieStore, dbcPath, "Movie.dbc");//14545 LoadDBC(availableDbcLocales, bad_dbc_files, sOverrideSpellDataStore, dbcPath, "OverrideSpellData.dbc");//14545 @@ -722,6 +733,14 @@ void LoadDBCStores(const std::string& dataPath) sLog->outString(); } +const std::string* GetRandomCharacterName(uint8 race, uint8 gender) +{ + uint32 size = sGenNameVectoArraysMap[race].stringVectorArray[gender].size(); + uint32 randPos = urand(0,size-1); + + return &sGenNameVectoArraysMap[race].stringVectorArray[gender][randPos]; +} + SimpleFactionsList const* GetFactionTeamList(uint32 faction) { FactionTeamMap::const_iterator itr = sFactionTeamMap.find(faction); diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index aee179af3b2..ea2ddf0ae4b 100755 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -44,6 +44,8 @@ WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId); +const std::string* GetRandomCharacterName(uint8 race, uint8 gender); + enum ContentLevels { CONTENT_1_60 = 0, @@ -137,6 +139,7 @@ extern DBCStorage <LFGDungeonEntry> sLFGDungeonStore; extern DBCStorage <LockEntry> sLockStore; extern DBCStorage <MailTemplateEntry> sMailTemplateStore; extern DBCStorage <MapEntry> sMapStore; +extern DBCStorage <NameGenEntry> sNameGenStore; extern DBCStorage <PhaseEntry> sPhaseStore; //extern DBCStorage <MapDifficultyEntry> sMapDifficultyStore; -- use GetMapDifficultyData insteed extern MapDifficultyMap sMapDifficultyMap; diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 03f3f1b1145..08740a44f48 100755 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -2275,6 +2275,22 @@ struct WorldStateUI #pragma pack(pop) #endif +// NamesGen.dbc +struct NameGenEntry +{ + uint32 id; + char* name; + uint32 race; + uint32 gender; +}; + +struct VectorArray +{ + std::vector<std::string> stringVectorArray[2]; +}; + +typedef std::map<uint32, VectorArray> GenNameVectorArraysMap; + // Structures not used for casting to loaded DBC data and not required then packing struct MapDifficulty { diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index 28df75f185b..eeaeadfdfe4 100755 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -99,6 +99,7 @@ const char MailTemplateEntryfmt[]="nxs"; const char MapEntryfmt[]="nxixxxsixxixiffxiixx"; const char MapDifficultyEntryfmt[]="diisiix"; const char MovieEntryfmt[]="nxxx"; +const char NameGenfmt[] = "nsii"; const char OverrideSpellDatafmt[]="niiiiiiiiiixx"; const char QuestSortEntryfmt[]="nx"; const char QuestXPfmt[]="niiiiiiiiii"; diff --git a/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp b/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp index 3a9245cd8f4..ee724b25326 100755 --- a/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp @@ -43,6 +43,7 @@ #include "ScriptMgr.h" #include "Battleground.h" #include "AccountMgr.h" +#include "DBCStores.h" class LoginQueryHolder : public SQLQueryHolder { @@ -1984,3 +1985,28 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data) data << uint8(race); SendPacket(&data); } + +void WorldSession::HandleRandomizeCharNameOpcode(WorldPacket& recv_data) +{ + uint8 gender, race; + + recv_data >> gender; + recv_data >> race; + + if (!(1 << race-1) & RACEMASK_ALL_PLAYABLE) + { + sLog->outError("Invalid race sent by accountId: %u", GetAccountId()); + return; + } + + if (!Player::IsValidGender(gender)) + { + sLog->outError("Invalid gender sent by accountId: %u", GetAccountId()); + return; + } + + WorldPacket data(SMSG_RANDOMIZE_CHAR_NAME, 10); + data << uint8(128); // unk1 + data << *GetRandomCharacterName(race, gender); + SendPacket(&data); +}
\ No newline at end of file diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 4fa60812a45..468f85b3bde 100755..100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1373,7 +1373,7 @@ void InitOpcodes() DEFINE_OPCODE_HANDLER(CMSG_VERIFY_CONNECTIVITY_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess ); //DEFINE_OPCODE_HANDLER(CMSG_LOG_DISCONNECT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess ); DEFINE_OPCODE_HANDLER(CMSG_RETURN_TO_GRAVEYARD, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleReturnToGraveyard ); - + DEFINE_OPCODE_HANDLER(CMSG_RANDOMIZE_CHAR_NAME, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleRandomizeCharNameOpcode ); #undef DEFINE_OPCODE_HANDLER }; diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index f30065886f4..97ea0173545 100755 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -408,6 +408,8 @@ class WorldSession void HandleCharEnum(QueryResult result); void HandlePlayerLogin(LoginQueryHolder * holder); void HandleCharFactionOrRaceChange(WorldPacket& recv_data); + void HandleRandomizeCharNameOpcode(WorldPacket& recv_data); + // played time void HandlePlayedTime(WorldPacket& recvPacket); |