Core/Packets: Restored functionality of "Randomize" button at character creation. Now it is server-side.

This commit is contained in:
Manuel Carrasco
2011-11-28 23:06:50 -03:00
parent 36a90f7098
commit e2d303dc26
7 changed files with 68 additions and 1 deletions

View File

@@ -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);

View File

@@ -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;

View File

@@ -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
{

View File

@@ -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";

View File

@@ -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);
}

2
src/server/game/Server/Protocol/Opcodes.cpp Executable file → Normal file
View File

@@ -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
};

View File

@@ -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);