Index: src/game/BattleGroundMgr.cpp =================================================================== --- src/game/BattleGroundMgr.cpp (revision 3653) +++ src/game/BattleGroundMgr.cpp (working copy) @@ -279,7 +279,7 @@ HStartLoc[3] = 2.27452f; // todo: find correct coords sLog.outDetail("Creating battleground %s, %u-%u", bl->name, bl->minlvl, bl->maxlvl); - CreateBattleGround(bg_ID, bl->maxplayersperteam, bl->minlvl, bl->maxlvl, bl->name, bl->mapid1, AStartLoc[0], AStartLoc[1], AStartLoc[2], AStartLoc[3], HStartLoc[0], HStartLoc[1], HStartLoc[2], HStartLoc[3]); + CreateBattleGround(bg_ID, bl->maxplayersperteam, bl->minlvl, bl->maxlvl, bl->name[sWorld.GetDBClang()], bl->mapid1, AStartLoc[0], AStartLoc[1], AStartLoc[2], AStartLoc[3], HStartLoc[0], HStartLoc[1], HStartLoc[2], HStartLoc[3]); // Create BG, WSG bg_ID = 2; @@ -295,7 +295,7 @@ HStartLoc[3] = 3.141593f; sLog.outDetail("Creating battleground %s, %u-%u", bl->name, bl->minlvl, bl->maxlvl); - CreateBattleGround(bg_ID, bl->maxplayersperteam, bl->minlvl, bl->maxlvl, bl->name, bl->mapid1, AStartLoc[0], AStartLoc[1], AStartLoc[2], AStartLoc[3], HStartLoc[0], HStartLoc[1], HStartLoc[2], HStartLoc[3]); + CreateBattleGround(bg_ID, bl->maxplayersperteam, bl->minlvl, bl->maxlvl, bl->name[sWorld.GetDBClang()], bl->mapid1, AStartLoc[0], AStartLoc[1], AStartLoc[2], AStartLoc[3], HStartLoc[0], HStartLoc[1], HStartLoc[2], HStartLoc[3]); // Create BG, AB bg_ID = 3; @@ -311,7 +311,7 @@ HStartLoc[3] = 0.263892f; // todo: find correct coords sLog.outDetail("Creating battleground %s, %u-%u", bl->name, bl->minlvl, bl->maxlvl); - CreateBattleGround(bg_ID, bl->maxplayersperteam, bl->minlvl, bl->maxlvl, bl->name, bl->mapid1, AStartLoc[0], AStartLoc[1], AStartLoc[2], AStartLoc[3], HStartLoc[0], HStartLoc[1], HStartLoc[2], HStartLoc[3]); + CreateBattleGround(bg_ID, bl->maxplayersperteam, bl->minlvl, bl->maxlvl, bl->name[sWorld.GetDBClang()], bl->mapid1, AStartLoc[0], AStartLoc[1], AStartLoc[2], AStartLoc[3], HStartLoc[0], HStartLoc[1], HStartLoc[2], HStartLoc[3]); // Create BG, EotS bg_ID = 7; @@ -327,7 +327,7 @@ HStartLoc[3] = 0.263892f; // todo: find coords sLog.outDetail("Creating battleground %s, %u-%u", bl->name, bl->minlvl, bl->maxlvl); - CreateBattleGround(bg_ID, bl->maxplayersperteam, bl->minlvl, bl->maxlvl, bl->name, bl->mapid1, AStartLoc[0], AStartLoc[1], AStartLoc[2], AStartLoc[3], HStartLoc[0], HStartLoc[1], HStartLoc[2], HStartLoc[3]); + CreateBattleGround(bg_ID, bl->maxplayersperteam, bl->minlvl, bl->maxlvl, bl->name[sWorld.GetDBClang()], bl->mapid1, AStartLoc[0], AStartLoc[1], AStartLoc[2], AStartLoc[3], HStartLoc[0], HStartLoc[1], HStartLoc[2], HStartLoc[3]); sLog.outDetail("Created initial battlegrounds."); } Index: src/game/Level2.cpp =================================================================== --- src/game/Level2.cpp (revision 3653) +++ src/game/Level2.cpp (working copy) @@ -1118,7 +1118,7 @@ { FactionEntry const *factionEntry = sFactionStore.LookupEntry(itr->ID); if (factionEntry) - FactionName = factionEntry->name; + FactionName = factionEntry->name[sWorld.GetDBClang()]; else FactionName = "#Not found#"; ReputationRank Rank = target->GetReputationRank(factionEntry); Index: src/game/Level3.cpp =================================================================== --- src/game/Level3.cpp (revision 3653) +++ src/game/Level3.cpp (working copy) @@ -1659,7 +1659,7 @@ ItemSetEntry const *set = sItemSetStore.LookupEntry(id); if(set) { - std::string name = set->name; + std::string name = set->name[sWorld.GetDBClang()]; // converting name to lower case std::transform( name.begin(), name.end(), name.begin(), ::tolower ); @@ -1670,7 +1670,7 @@ if (name.find(namepart) != std::string::npos) { // send item set in "id - name" format - PSendSysMessage("%d - %s",id,set->name); + PSendSysMessage("%d - %s",id,set->name[sWorld.GetDBClang()]); counter++; } } @@ -1695,7 +1695,7 @@ if(skillInfo) { // name - is first name field from dbc (English localized) - std::string name = skillInfo->name[0]; + std::string name = skillInfo->name[sWorld.GetDBClang()]; // converting SkillName to lower case std::transform( name.begin(), name.end(), name.begin(), ::tolower ); @@ -1706,7 +1706,7 @@ { uint16 skill = m_session->GetPlayer()->GetPureSkillValue(id); // send skill in "id - name" format - PSendSysMessage("%d - %s%s",id,skillInfo->name[0],(skill == 0 ? "" : " [known]")); + PSendSysMessage("%d - %s%s",id,skillInfo->name[sWorld.GetDBClang()],(skill == 0 ? "" : " [known]")); counter++; } @@ -1731,7 +1731,7 @@ if(spellInfo) { // name - is first name field from dbc (English localized) - std::string name = spellInfo->SpellName[0]; + std::string name = spellInfo->SpellName[sWorld.GetDBClang()]; // converting SpellName to lower case std::transform( name.begin(), name.end(), name.begin(), ::tolower ); @@ -1741,7 +1741,7 @@ if (name.find(namepart) != std::string::npos) { - std::string rank = spellInfo->Rank[0]; + std::string rank = spellInfo->Rank[sWorld.GetDBClang()]; bool known = m_session->GetPlayer()->HasSpell(id); @@ -1749,13 +1749,13 @@ if (!rank.empty()) { // send spell in "id - name - rank" format - PSendSysMessage("%d - %s - %s%s",id,spellInfo->SpellName[0],rank.c_str(),(known ? " [known]" : "")); + PSendSysMessage("%d - %s - %s%s",id,spellInfo->SpellName[sWorld.GetDBClang()],rank.c_str(),(known ? " [known]" : "")); counter++; } else { // send spell in "id - name" format - PSendSysMessage("%d - %s%s",id,spellInfo->SpellName[0],(known ? " [known]" : "")); + PSendSysMessage("%d - %s%s",id,spellInfo->SpellName[sWorld.GetDBClang()],(known ? " [known]" : "")); counter++; } } Index: src/game/World.h =================================================================== --- src/game/World.h (revision 3653) +++ src/game/World.h (working copy) @@ -184,6 +184,8 @@ /// Get the current Message of the Day const char* GetMotd() const { return m_motd.c_str(); } + uint32 GetDBClang() const { return m_langid; } + void SetDBClang(uint32 lang) { m_langid = lang; } /// Get the path where data (dbc, maps) are stored on disk std::string GetDataPath() const { return m_dataPath; } @@ -266,6 +268,7 @@ multimap scriptSchedule; float rate_values[MAX_RATES]; + uint32 m_langid; uint32 m_configs[CONFIG_VALUE_COUNT]; uint32 m_playerLimit; bool m_allowMovement; Index: src/shared/Database/DBCfmt.cpp =================================================================== --- src/shared/Database/DBCfmt.cpp (revision 3653) +++ src/shared/Database/DBCfmt.cpp (working copy) @@ -18,19 +18,19 @@ const char AreaTableEntryfmt[]="iiinixxxxxixxxxxxxxxixxxxxx"; const char BankBagSlotPricesEntryfmt[]="ni"; -const char BattlemasterListEntryfmt[]="niixxxxxxiiiixxsxxxxxxxx"; -const char ChatChannelsEntryfmt[]="iixsxxxxxxxxsxxxxxxxx"; // data not sorted (more compact store) -const char ChrClassesEntryfmt[]="nxxixsxxxxxxxxxxxx"; -const char ChrRacesEntryfmt[]="nxixiixxixxxxisxxxxxxxxxxxx"; -const char CreatureFamilyfmt[]="nxxxxxiisxxxxxxxxx"; +const char BattlemasterListEntryfmt[]="niixxxxxxiiiixxssssssssx"; +const char ChatChannelsEntryfmt[]="iixssssssssxssssssssx"; // data not sorted (more compact store) +const char ChrClassesEntryfmt[]="nxxixssssssssxxxxx"; +const char ChrRacesEntryfmt[]="nxixiixxixxxxissssssssxxxxx"; +const char CreatureFamilyfmt[]="nxxxxxiissssssssxx"; const char EmoteEntryfmt[]="nxixxxxxxxxxxxxxxxx"; -const char FactionEntryfmt[]="niiiiixxxxiiiixxxxisxxxxxxxxxxxxxxxxx"; +const char FactionEntryfmt[]="niiiiixxxxiiiixxxxissssssssxxxxxxxxxx"; const char FactionTemplateEntryfmt[]="nixiiiiixxiiii"; const char GemPropertiesEntryfmt[]="nixxi"; const char ItemDisplayTemplateEntryfmt[]="nxxxxxxxxxxixxxxxxxxxxx"; const char ItemExtendedCostEntryfmt[]="niiiiixxiiixx"; const char ItemRandomPropertiesfmt[]="nxiiixxxxxxxxxxx"; -const char ItemSetEntryfmt[]="dsxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiiiiiiiiii"; +const char ItemSetEntryfmt[]="dssssssssxxxxxxxxxxxxxxxxxxiiiiiiiiiiiiiiiiii"; const char LockEntryfmt[]="nxxxxxxxxixxxxxxxiixxxxxxxxxxxxxx"; const char MapEntryfmt[]="nsixxxxxxxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char SkillLinefmt[]="nixssssssssxssssssssxi"; @@ -38,15 +38,15 @@ const char SpellCastTimefmt[]="nixx"; const char SpellDurationfmt[]="niii"; const char SpellEntryfmt[]="niixiiiiiiixixiiixixxiiiiiiiiiiiiiiiiiiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiixxxiiiiiiiiiiiiiiifffiiiiiiiiiiiifffixiiissssssssissssssssixxxxxxxxxxxxxxxxxxiiiiiiixixxfffxxxiii"; -const char SpellFocusObjectfmt[]="nsxxxxxxxx"; -const char SpellItemEnchantmentfmt[]="niiiiiixxxiiisxxxxxxxxiiii"; +const char SpellFocusObjectfmt[]="nssssssssx"; +const char SpellItemEnchantmentfmt[]="niiiiiixxxiiissssssssxiiii"; const char SpellItemEnchantmentConditionfmt[]="nbbbbbxxxxxbbbbbbbbbbiiiiiXXXXX"; const char SpellRadiusfmt[]="nfxf"; const char SpellRangefmt[]="nffxxxxxxxxxxxxxxxxxxx"; const char StableSlotPricesfmt[] = "ni"; const char TalentEntryfmt[]="niiiiiiiixxxxixxixxxx"; const char TalentTabEntryfmt[]="nxxxxxxxxxxxixx"; -const char TaxiNodesEntryfmt[]="nifffsxxxxxxxxii"; +const char TaxiNodesEntryfmt[]="nifffssssssssxii"; const char TaxiPathEntryfmt[]="niii"; const char TaxiPathNodeEntryfmt[]="diiifffii"; const char WorldSafeLocsEntryfmt[]="nifffxxxxxxxxx"; Index: src/shared/Database/DBCStores.cpp =================================================================== --- src/shared/Database/DBCStores.cpp (revision 3653) +++ src/shared/Database/DBCStores.cpp (working copy) @@ -21,6 +21,7 @@ #include "Policies/SingletonImp.h" #include "Log.h" #include "ProgressBar.h" +#include "../../game/World.h" #include "DBCfmt.cpp" @@ -282,6 +283,17 @@ exit(1); } + ChrRacesEntry const* race = sChrRacesStore.LookupEntry(1); + for (int i = 0; i < 8; i++) + { + if ( strlen(race->name[i]) > 0) + { + sWorld.SetDBClang(i); + sLog.outString("Detected DBC Locale: %d", i); + break; + } + } + sLog.outString( "" ); sLog.outString( ">> Loaded %d data stores", DBCFilesCount ); sLog.outString( "" ); @@ -346,7 +358,7 @@ CreatureFamilyEntry const *pet_family = sCreatureFamilyStore.LookupEntry(petfamily); if(!pet_family) return NULL; - return pet_family->Name?pet_family->Name:NULL; + return pet_family->Name[sWorld.GetDBClang()]?pet_family->Name[sWorld.GetDBClang()]:NULL; } bool IsPassiveSpell(uint32 spellId) @@ -645,14 +657,14 @@ { if((ch->flags & 4) == 4) // global channel without zone name in pattern { - if(strcmp(name,ch->pattern)==0) + if(strcmp(name,ch->pattern[sWorld.GetDBClang()])==0) return ch; } else { // compare pattern (something - %s) char zone_name_buf[50]; - if(sscanf(name,ch->pattern,zone_name_buf)>0) + if(sscanf(name,ch->pattern[sWorld.GetDBClang()],zone_name_buf)>0) return ch; } } Index: src/shared/Database/DBCStructure.h =================================================================== --- src/shared/Database/DBCStructure.h (revision 3653) +++ src/shared/Database/DBCStructure.h (working copy) @@ -58,22 +58,22 @@ uint32 minlvl; uint32 maxlvl; uint32 maxplayersperteam; - char* name; + char* name[8]; }; struct ChatChannelsEntry { uint32 ChannelID; uint32 flags; - char* pattern; - char* name; + char* pattern[8]; + char* name[8]; }; struct ChrClassesEntry { uint32 ClassID; uint32 powerType; - char* name; + char* name[8]; }; struct ChrRacesEntry @@ -85,7 +85,7 @@ uint32 TeamID; // 7-Alliance 1-Horde //uint32 startingTaxiMask; // removed in 2.0.1 uint32 startmovie; - char* name; + char* name[8]; }; struct CreatureFamilyEntry @@ -93,7 +93,7 @@ uint32 ID; uint32 tamable; //if this = 270 then "is tamable Creature" (or 0 is non-tamable) uint32 petFoodMask; - char* Name; + char* Name[8]; }; struct EmotesTextEntry @@ -109,7 +109,7 @@ uint32 BaseRepMask[4]; // Base reputation masks (see enum Races) int32 BaseRepValue[4]; // Base reputation values uint32 team; - char* name; + char* name[8]; }; enum FactionMasks @@ -194,7 +194,7 @@ struct ItemSetEntry { - char* name; + char* name[8]; uint32 spells[8]; uint32 items_to_triggerspell[8]; uint32 required_skill_id; @@ -347,7 +347,7 @@ struct SpellFocusObjectEntry { uint32 ID; - char* Name; + char* Name[8]; }; // stored in SQL table @@ -443,7 +443,7 @@ float x; float y; float z; - char* name; + char* name[8]; uint32 horde_mount_type; uint32 alliance_mount_type; };