aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorManuel Carrasco <manue.l@live.com.ar>2011-11-28 23:06:50 -0300
committerManuel Carrasco <manue.l@live.com.ar>2011-11-28 23:06:50 -0300
commite2d303dc2639f22207c78adcb53cabb2a79eec25 (patch)
treeffbf23542ee3d4df178d677c45cb4dd5551af4f1 /src
parent36a90f7098c27279521b6668067bb2e0bbe628de (diff)
Core/Packets: Restored functionality of "Randomize" button at character creation. Now it is server-side.
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/DataStores/DBCStores.cpp19
-rwxr-xr-xsrc/server/game/DataStores/DBCStores.h3
-rwxr-xr-xsrc/server/game/DataStores/DBCStructure.h16
-rwxr-xr-xsrc/server/game/DataStores/DBCfmt.h1
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/CharacterHandler.cpp26
-rw-r--r--[-rwxr-xr-x]src/server/game/Server/Protocol/Opcodes.cpp2
-rwxr-xr-xsrc/server/game/Server/WorldSession.h2
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);