PlayerCreator.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:10k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #include "stdafx.h"
  2. #include "PlayerCreator.h"
  3. #include "inifile.h"
  4. #include "utils.h"
  5. #include "tstring.h"
  6. #include "Macro.h"
  7. #include "GameDatadef.h"
  8. using OnlineGameLib::Win32::CIniFile;
  9. using OnlineGameLib::Win32::GetAppFullPath;
  10. using OnlineGameLib::Win32::_tstring;
  11. using OnlineGameLib::Win32::ToBool;
  12. CPlayerCreator::CPlayerCreator()
  13. {
  14. for (int i = 0; i < MAX_PLAYERTYPE_VALUE; i++)
  15. {
  16. m_pRoleData[i] = NULL;
  17. }
  18. Init();
  19. }
  20. CPlayerCreator::~CPlayerCreator()
  21. {
  22. for (int i = 0; i < MAX_PLAYERTYPE_VALUE; i++)
  23. {
  24. if (!m_pRoleData[i])
  25. {
  26. delete [] m_pRoleData[i];
  27. m_pRoleData[i] = NULL;
  28. }
  29. }
  30. stdMapID2RID::iterator it;
  31. for ( it = m_theMapID2RID.begin(); it != m_theMapID2RID.end(); it ++ )
  32. {
  33. stdRevivalID &SL = ( *it ).second;
  34. SL.clear();
  35. }
  36. m_theMapID2RID.erase( m_theMapID2RID.begin(), m_theMapID2RID.end() );
  37. }
  38. bool CPlayerCreator::Init()
  39. {
  40. CIniFile theIniFile;
  41. _tstring sIniFilePathName;
  42. sIniFilePathName = GetAppFullPath( NULL );
  43. char szFileName[MAX_PATH];
  44. for (int i = 0; i < MAX_PLAYERTYPE_VALUE; i++)
  45. {
  46. sprintf(szFileName, PLAYERCREATOR_FILE, i);
  47. _tstring sIniFileName = sIniFilePathName + szFileName;
  48. if (!m_pRoleData[i])
  49. m_pRoleData[i] = new BYTE[MAX_NEWPLAYER_BUFFER];
  50. ZeroMemory(m_pRoleData[i], MAX_NEWPLAYER_BUFFER * sizeof(BYTE));
  51. GetRoleDataFromIni(m_pRoleData[i], sIniFileName.c_str());
  52. }
  53. _tstring sRevivalFileName = sIniFilePathName + REVIVALID_FILENAME;
  54. CIniFile cFile;
  55. cFile.SetFile( sRevivalFileName.c_str() );
  56. CIniFile::_VETSTR theIniVetstr;
  57. cFile.ReadSections( theIniVetstr );
  58. char szBuffer[64];
  59. CIniFile::_VETSTR::iterator it;
  60. for ( it = theIniVetstr.begin(); it != theIniVetstr.end(); it ++ )
  61. {
  62. _tstring info = ( *it );
  63. if ( info.empty() )
  64. {
  65. continue;
  66. }
  67. int nSection = atoi( info.c_str() );
  68. int nCount = cFile.ReadInteger( info.c_str(), "Count", 0 );
  69. if ( nCount > 0 )
  70. {
  71. stdRevivalID rid;
  72. for ( int i=0; i<nCount; i++ )
  73. {
  74. sprintf( szBuffer, "RevivalId%2.2d", i );
  75. int nID = cFile.ReadInteger( info.c_str(), szBuffer, 0 );
  76. rid.push_back( nID );
  77. }
  78. m_theMapID2RID.insert( stdMapID2RID::value_type( nSection, rid ) );
  79. }
  80. }
  81. return false;
  82. }
  83. unsigned CPlayerCreator::GetRevivalID( size_t nMapID, UINT nType /*= enumRandom*/ )
  84. {
  85. stdMapID2RID::iterator it;
  86. if ( m_theMapID2RID.end() != ( it = m_theMapID2RID.find( nMapID ) ) )
  87. {
  88. stdRevivalID& sl = ( *it ).second;
  89. /*
  90.  * TODO : Don't get the server when it can't carry anyone
  91.  */
  92. if ( !sl.empty() )
  93. {
  94. int nCount = sl.size();
  95. ASSERT( nCount > 0 );
  96. int nIndex = rand() % nCount;
  97. nIndex = ( nIndex >= 0 && nIndex < nCount ) ? nIndex : 0;
  98. return sl[nIndex];
  99. }
  100. }
  101. return 0;
  102. }
  103. const TRoleData* CPlayerCreator::GetRoleData(unsigned int &uDataLength, LPROLEPARAM lpParam)
  104. {
  105. int nIndex = lpParam->nSeries * ROLE_NO + lpParam->nSex;
  106. if (nIndex < 0 || nIndex >= MAX_PLAYERTYPE_VALUE)
  107. {
  108. uDataLength = 0;
  109. return NULL;
  110. }
  111. if (m_pRoleData[nIndex])
  112. {
  113. TRoleData *pData = ( TRoleData * )m_pRoleData[nIndex];
  114. ASSERT( pData );
  115. strncpy(pData->BaseInfo.szName, lpParam->szName, sizeof(pData->BaseInfo.szName));
  116.         pData->BaseInfo.szName[sizeof(pData->BaseInfo.szName) - 1] = '';
  117. strncpy(pData->BaseInfo.caccname, lpParam->szAccName,  sizeof(pData->BaseInfo.caccname));
  118.         pData->BaseInfo.caccname[sizeof(pData->BaseInfo.caccname) - 1] = '';
  119. pData->BaseInfo.bSex = ( bool )( 0 != lpParam->nSex );
  120. pData->BaseInfo.ifiveprop = lpParam->nSeries;
  121. unsigned nNativeID = GetRevivalID( lpParam->nMapID );
  122. pData->BaseInfo.irevivalid = lpParam->nMapID;
  123. pData->BaseInfo.irevivalx = nNativeID;
  124. pData->BaseInfo.irevivaly = 0;
  125. uDataLength = pData->dwDataLen;
  126. return ( const TRoleData * )pData;
  127. }
  128. uDataLength = 0;
  129. return NULL;
  130. }
  131. bool CPlayerCreator::GetRoleDataFromIni(BYTE* pData, const char* szFileName)
  132. {
  133. CIniFile cFile;
  134. cFile.SetFile( szFileName );
  135. TRoleData* pRoleData = (TRoleData *)pData;
  136. pRoleData->bBaseNeedUpdate = 1;
  137. pRoleData->dwVersion = 0;
  138. //玩家信息
  139. pRoleData->BaseInfo.ileftprop = cFile.ReadInteger("ROLE", "ileftprop", 0);
  140. pRoleData->BaseInfo.ileftfight = cFile.ReadInteger("ROLE", "ileftfight", 0);
  141. pRoleData->BaseInfo.ipower = cFile.ReadInteger("ROLE", "ipower", 0);
  142. pRoleData->BaseInfo.iagility = cFile.ReadInteger("ROLE", "iagility", 0);
  143. pRoleData->BaseInfo.iouter = cFile.ReadInteger("ROLE", "iouter", 0);
  144. pRoleData->BaseInfo.iinside = cFile.ReadInteger("ROLE", "iinside", 0);
  145. pRoleData->BaseInfo.iluck = cFile.ReadInteger("ROLE", "iluck", 0);
  146. //玩家的显示信息 -- remark by spe because client ui display changed 2003/07/21
  147. // pRoleData->BaseInfo.ihelmres = cFile.ReadInteger("ROLE", "ihelmres", 0);
  148. // pRoleData->BaseInfo.iarmorres = cFile.ReadInteger("ROLE", "iarmorres", 0);
  149. // pRoleData->BaseInfo.iweaponres = cFile.ReadInteger("ROLE", "iweaponres", 0);
  150. //玩家等级信息
  151. pRoleData->BaseInfo.fightexp = cFile.ReadInteger("ROLE", "ifightexp", 0);
  152. pRoleData->BaseInfo.ifightlevel = cFile.ReadInteger("ROLE", "ifightlevel", 0);
  153. pRoleData->BaseInfo.ileadlevel = cFile.ReadInteger("ROLE", "ileadlevel", 0);
  154. pRoleData->BaseInfo.ileadexp = cFile.ReadInteger("ROLE", "ileadexp", 0);
  155. //门派信息
  156. pRoleData->BaseInfo.nSect = cFile.ReadInteger("ROLE", "isect", 0);
  157. pRoleData->BaseInfo.nFirstSect = cFile.ReadInteger("ROLE", "ifirstsect", 0);
  158. pRoleData->BaseInfo.ijoincount = cFile.ReadInteger("ROLE", "ijoincount", 0);
  159. //现金和贮物箱中的钱
  160. pRoleData->BaseInfo.imoney = cFile.ReadInteger("ROLE", "imoney", 0);
  161. pRoleData->BaseInfo.isavemoney = cFile.ReadInteger("ROLE", "isavemoney", 0);
  162. //
  163. pRoleData->BaseInfo.ifiveprop = cFile.ReadInteger("ROLE", "ifiveprop", 0);
  164. pRoleData->BaseInfo.iteam = cFile.ReadInteger("ROLE", "iteam", 0);
  165. pRoleData->BaseInfo.bSex = ( 0 != cFile.ReadInteger("ROLE", "bsex", 0) );
  166. pRoleData->BaseInfo.imaxlife = cFile.ReadInteger("ROLE", "imaxlife", 0);
  167. pRoleData->BaseInfo.imaxstamina = cFile.ReadInteger("ROLE", "imaxstamina", 0);
  168. pRoleData->BaseInfo.imaxinner = cFile.ReadInteger("ROLE", "imaxinner", 0);
  169. pRoleData->BaseInfo.icurlife = pRoleData->BaseInfo.imaxlife;
  170. pRoleData->BaseInfo.icurinner = pRoleData->BaseInfo.imaxinner;
  171. pRoleData->BaseInfo.icurstamina = pRoleData->BaseInfo.imaxstamina;
  172. //登入点
  173. pRoleData->BaseInfo.irevivalid = cFile.ReadInteger("ROLE", "irevivalid", 0);
  174. pRoleData->BaseInfo.irevivalx = cFile.ReadInteger("ROLE", "irevivalx", 0);
  175. pRoleData->BaseInfo.irevivaly = cFile.ReadInteger("ROLE", "irevivaly", 0);
  176. pRoleData->BaseInfo.cUseRevive = 1;
  177. pRoleData->BaseInfo.cFightMode = 0;
  178. pRoleData->BaseInfo.cIsExchange = 0;
  179. pRoleData->BaseInfo.ientergameid = 0;
  180. pRoleData->BaseInfo.ientergamex = 0;
  181. pRoleData->BaseInfo.ientergamey = 0;
  182. //PK相关
  183. pRoleData->BaseInfo.cPkStatus = 1;
  184. pRoleData->BaseInfo.ipkvalue = 0;
  185. //帮会相关
  186. pRoleData->BaseInfo.dwTongID = 0;
  187. pRoleData->dwFSkillOffset = (BYTE * )pRoleData->pBuffer - pData;
  188. //  Skill
  189. int nSkillCount = 0;
  190. char szSkillId[100];
  191. char szSkillLevel[100];
  192. nSkillCount = cFile.ReadInteger(SECTION_FIGHTSKILLLIST, KEY_COUNT, 0);
  193. TDBSkillData *pSkillData = (TDBSkillData *)(pData + pRoleData->dwFSkillOffset);
  194. for (int i = 0 ; i < nSkillCount; i ++, pSkillData ++)
  195. {
  196. int nSkillId = 0;
  197. int nSkillLevel = 0;
  198. sprintf(szSkillId, "%s%d", KEY_FIGHTSKILL, i+1);
  199. sprintf(szSkillLevel, "%s%d", KEY_FIGHTSKILLLEVEL, i+1);
  200. pSkillData->m_nSkillId = cFile.ReadInteger(SECTION_FIGHTSKILLLIST, szSkillId, 0);
  201. pSkillData->m_nSkillLevel = cFile.ReadInteger(SECTION_FIGHTSKILLLIST, szSkillLevel, 0);
  202. }
  203. pRoleData->nFightSkillCount = nSkillCount;
  204. pRoleData->dwLSkillOffset = (BYTE *)pSkillData - pData;
  205. nSkillCount = cFile.ReadInteger(SECTION_LIFESKILLLIST, KEY_COUNT, 0);
  206. pSkillData = (TDBSkillData *)(pData + pRoleData->dwLSkillOffset);
  207. for (i = 0 ; i < nSkillCount; i ++, pSkillData ++)
  208. {
  209. int nSkillId = 0;
  210. int nSkillLevel = 0;
  211. sprintf(szSkillId, "%s%d", KEY_FIGHTSKILL, i+1);
  212. sprintf(szSkillLevel, "%s%d", KEY_FIGHTSKILLLEVEL, i+1);
  213. pSkillData->m_nSkillId = cFile.ReadInteger(SECTION_FIGHTSKILLLIST, szSkillId, 0);
  214. pSkillData->m_nSkillLevel = cFile.ReadInteger(SECTION_FIGHTSKILLLIST, szSkillLevel, 0);
  215. }
  216. pRoleData->nLiveSkillCount = nSkillCount;
  217. pRoleData->dwTaskOffset = (BYTE*)pSkillData - pData;
  218. pRoleData->nTaskCount = 0;
  219. pRoleData->dwItemOffset = pRoleData->dwTaskOffset;
  220. //Item
  221. TDBItemData * pItemData = (TDBItemData *)pSkillData;
  222. int nItemCount = 0;
  223. nItemCount = cFile.ReadInteger(SECTION_ITEMLIST, KEY_COUNT, 0);
  224. char szSection[100];
  225. for ( i = 0 ; i < nItemCount; i ++)
  226. {
  227. sprintf(szSection, "%s%d", SECTION_ITEM, i + 1 );
  228. //物件基本信息**************************************************************
  229. pItemData->iequipclasscode = cFile.ReadInteger(szSection, "iequipclasscode", 0);
  230. pItemData->idetailtype = cFile.ReadInteger(szSection, "idetailtype", 0);
  231. pItemData->iparticulartype = cFile.ReadInteger(szSection, "iparticulartype", 0);
  232. pItemData->ilevel = cFile.ReadInteger(szSection, "ilevel", 0);
  233. pItemData->iseries = cFile.ReadInteger(szSection, "iseries", 0);
  234. pItemData->ix = cFile.ReadInteger(szSection, "ix", 0);
  235. pItemData->iy = cFile.ReadInteger(szSection, "iy", 0);
  236. pItemData->ilocal = cFile.ReadInteger(szSection, "ilocal", 0);
  237. pItemData->iparam1 = cFile.ReadInteger(szSection, "iparam1", 0);
  238. pItemData->iparam2 = cFile.ReadInteger(szSection, "iparam2", 0);
  239. pItemData->iparam3 = cFile.ReadInteger(szSection, "iparam3", 0);
  240. pItemData->iparam4 = cFile.ReadInteger(szSection, "iparam4", 0);
  241. pItemData->iparam5 = cFile.ReadInteger(szSection, "iparam5", 0);
  242. pItemData->iparam6 = cFile.ReadInteger(szSection, "iparam6", 0);
  243. pItemData->iequipversion = cFile.ReadInteger(szSection, "iequipversion", 0);
  244. pItemData->irandseed = cFile.ReadInteger(szSection, "irandseed", 0);
  245. pItemData->ilucky = cFile.ReadInteger(szSection, "ilucky", 0);
  246. pItemData->idurability = 0;
  247. pItemData->iidentify = 0;
  248. pItemData ++;
  249. }
  250. pRoleData->dwFriendOffset = (BYTE *)pItemData - pData;
  251. pRoleData->nItemCount = nItemCount;
  252. pRoleData->nFriendCount = 0;
  253. pRoleData->dwDataLen = (BYTE *)pItemData - pData;
  254. return true;
  255. }