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

模拟服务器

开发平台:

C/C++

  1. /*******************************************************************************
  2. // FileName : S3DBInterface.cpp
  3. // FileAuthor : RomanDou
  4. // FileCreateDate : 2002-10-16 15:32:22
  5. // FileDescription :
  6. // Revision Count :
  7. *******************************************************************************/
  8. #include "Kstdafx.h"
  9. #include "S3DBInterface.h"
  10. #include "GlobalDTD.h"
  11. #include "s3ptableinfocatch.h"
  12. #include "s3pdbconnectionpool.h"
  13. #include "s3pdbconnector.h"
  14. #include "s3pManipulator.h"
  15. #include "S3pEquipBaseInfo.h"
  16. #include "S3pEquipEfficInfo.h"
  17. #include "s3pEquipRequireInfo.h"
  18. #include "s3pEquipment.h"
  19. #include "s3pFightSkill.h"
  20. #include "s3pFriend.h"
  21. #include "s3pLifeSkill.h"
  22. #include "s3pRole.h"
  23. #include "s3pTask.h"
  24. #include "s3pTaskList.h"
  25. #include "S3PTableObjList.h"
  26. #include "kengine.h"
  27. #include "ktabfileCtrl.h"
  28. #include "KIniFile.h"
  29. #include "s3pRoleList.h"
  30. #include "stdio.h"
  31. #pragma warning(disable:4786)
  32. #define MAX_FRIENDNAMELEN 100
  33. //DBTableKeyMap  g_RoleTableKeyMap;
  34. //DBTableKeyMap  g_ItemTableKeyMap;
  35. S3PManipulator * GetTableFromString(S3_DB_TABLENAME tablename, std::string strUser);
  36. S3PManipulator * GetTableFromID(S3_DB_TABLENAME tablename, int nId);
  37. #ifdef _DEBUG
  38. extern FILE * g_pOutFile;
  39. #endif
  40. S3DBI_API BOOL S3DBI_InitDBInterface()
  41. {
  42. #ifdef _DEBUG
  43. g_pOutFile = fopen("c:\swsql.txt", "wa");
  44. #endif
  45. int iRet = 0;
  46. TCHAR szINIPath[MAX_PATH+1];
  47. KPIGetExePath( szINIPath, MAX_PATH );
  48. _tcscat( szINIPath, "DataBase.ini" );
  49. S3PTableInfoCatch::Instance();
  50. S3PDBConnectionPool::Init( szINIPath );
  51. S3PDBConnectionPool::Instance();
  52. S3PDBConnector::Instance();
  53. return TRUE;
  54. }
  55. S3DBI_API void S3DBI_ReleaseDBInterface()
  56. {
  57. S3PDBConnectionPool::ReleaseInstance();
  58. S3PDBConnector::ReleaseInstance();
  59. S3PTableInfoCatch::Release();
  60. }
  61. BOOL Cav2TableFile(ColumnAndValue *pCav, KTabFileCtrl * pTabFile)
  62. {
  63. if ((!pCav) || (!pTabFile)) return FALSE;
  64. if (pCav->size() == 0) return FALSE;
  65. // pTabFile->Clear();
  66. int nt = 1;
  67. ColumnAndValue::iterator i;
  68. for(i=pCav->begin(); i!=pCav->end(); i++)
  69. {
  70. std::string key   = i->first;
  71. std::string value = i->second;
  72. pTabFile->WriteString(1, nt, (char *)key.c_str() );
  73. pTabFile->WriteString(2, nt++, (char *)value.c_str());
  74. }
  75. return TRUE;
  76. }
  77. BOOL TabFile2Cav(KTabFileCtrl * pTabFile, ColumnAndValue * pCav)
  78. {
  79. if ((!pCav) || (!pTabFile)) return FALSE;
  80. int nRow = pTabFile->GetHeight();
  81. int nWidth = pTabFile->GetWidth();
  82. for (int i =  0; i < nWidth; i ++)
  83. {
  84. char szValue[200];
  85. pTabFile->GetString(nRow, i + 1 , "", szValue, 200);
  86. (*pCav)[pTabFile->GetColName(i + 1)] = szValue;
  87. }
  88. return TRUE;
  89. }
  90. /*
  91. [ROLE]
  92. Name= DOUHAO
  93. OLD= SJDLJFSDJF
  94.   [ITEMS]
  95.   COUNT=10
  96.   
  97. [ITEM1]
  98. ...
  99. ...
  100.   [ITEMN]
  101.   BLISTS=1
  102.   ELISTS=3
  103.   RLISTS=4
  104.   
  105. [IBN_1]
  106. ..
  107. [IBN_N]
  108.   
  109. [FRIENDS]
  110. COUNT=10
  111. F1=
  112. F2=
  113. F3=
  114.   [TASKS]
  115.   T1=
  116.   TV1=
  117.   T2=
  118.   TV2=
  119.   
  120. [FSKILLS]
  121. COUNT=10
  122. S1=
  123. L1=
  124. S2=
  125. L2
  126. */
  127. void Item_BaseDataConversion(IN TDBItemData * pItemData, ColumnAndValue &ItemValue)
  128. {
  129. pItemData->iid = atoi( ItemValue["iid"].c_str());   
  130. // strcpy(pItemData->cusercode,   ItemValue["cusercode"].c_str());             
  131. pItemData->iequipclasscode = atoi(   ItemValue["iequipclasscode"].c_str());       
  132. pItemData->ilocal = atoi( ItemValue["ilocal"].c_str());                
  133. pItemData->ix = atoi(   ItemValue["ix"].c_str());                    
  134. pItemData->iy = atoi(   ItemValue["iy"].c_str());                    
  135. pItemData->iequipcode = atoi(   ItemValue["iequipcode"].c_str());            
  136. pItemData->idetailtype = atoi(   ItemValue["idetailtype"].c_str());           
  137. pItemData->iparticulartype = atoi(   ItemValue["iparticulartype"].c_str());       
  138. pItemData->ilevel = atoi(   ItemValue["ilevel"].c_str());                
  139. pItemData->iseries = atoi(   ItemValue["iseries"].c_str());               
  140. pItemData->iequipversion = atoi(   ItemValue["iequipversion"].c_str());         
  141. pItemData->irandseed = atoi(   ItemValue["irandseed"].c_str());             
  142. pItemData->iparam2 = atoi(   ItemValue["iparam2"].c_str());               
  143. pItemData->iparam3 = atoi(   ItemValue["iparam3"].c_str());               
  144. pItemData->iparam5 = atoi(   ItemValue["iparam5"].c_str());               
  145. pItemData->iparam4 = atoi(   ItemValue["iparam4"].c_str());               
  146. pItemData->iparam6 = atoi(   ItemValue["iparam6"].c_str());               
  147. pItemData->iparam1 = atoi(   ItemValue["iparam1"].c_str());               
  148. pItemData->ilucky = atoi(   ItemValue["ilucky"].c_str());                
  149. }
  150. void Role_BaseDataConversion(IN TRoleBaseInfo * pRoleData, IN ColumnAndValue &RoleValue)
  151. {
  152. pRoleData->dwId = atoi(RoleValue["iid"].c_str());
  153. strcpy(pRoleData->szName, RoleValue["cusercode"].c_str());
  154. const char * pSex = RoleValue["bsex"].c_str();
  155. if (!strcmp(pSex , "男")) pRoleData->bSex = 0;
  156. else pRoleData->bSex = 1;
  157. //pRoleData->bSex = atoi(RoleValue["bsex"].c_str());
  158. strcpy(pRoleData->szAlias, RoleValue["calias"].c_str());
  159. pRoleData->nFirstSect = atoi(RoleValue["ifirstsect"].c_str());
  160. pRoleData->nSect = atoi(RoleValue["isect"].c_str());
  161. pRoleData->ijoincount = atoi(RoleValue["ijoincount"].c_str());
  162. pRoleData->isectrole = atoi(RoleValue["isectrole"].c_str());
  163. pRoleData->igrouprole = atoi(RoleValue["igroupcode"].c_str());
  164. pRoleData->igrouprole = atoi(RoleValue["igrouprole"].c_str());
  165. pRoleData->irevivalid = atoi(RoleValue["irevivalid"].c_str());
  166. strcpy(pRoleData->cpartnercode , RoleValue["cpartnercode"].c_str());
  167. pRoleData->isavemoney = atoi(RoleValue["isavemoney"].c_str());
  168. pRoleData->imoney = atoi(RoleValue["imoney"].c_str());
  169. pRoleData->ifiveprop = atoi(RoleValue["ifiveprop"].c_str());
  170. pRoleData->iteam = atoi(RoleValue["iteam"].c_str());
  171. pRoleData->ifightlevel = atoi(RoleValue["ifightlevel"].c_str());
  172. pRoleData->fightexp = atoi(RoleValue["ifightexp"].c_str());
  173. pRoleData->ileadlevel = atoi(RoleValue["ileadlevel"].c_str());
  174. pRoleData->ileadexp = atoi(RoleValue["ileadexp"].c_str());
  175. pRoleData->iliveexp = atoi(RoleValue["iliveexp"].c_str());
  176. pRoleData->ipower = atoi(RoleValue["ipower"].c_str());
  177. pRoleData->iagility = atoi(RoleValue["iagility"].c_str());
  178. pRoleData->iouter = atoi(RoleValue["iouter"].c_str());
  179. pRoleData->iinside = atoi(RoleValue["iinside"].c_str());
  180. pRoleData->iluck = atoi(RoleValue["iluck"].c_str());
  181. pRoleData->imaxlife = atoi(RoleValue["imaxlife"].c_str());
  182. pRoleData->imaxstamina = atoi(RoleValue["imaxstamina"].c_str());
  183. pRoleData->imaxinner = atoi(RoleValue["imaxinner"].c_str());
  184. pRoleData->ileftprop = atoi(RoleValue["ileftprop"].c_str());
  185. pRoleData->ileftfight = atoi(RoleValue["ileftfight"].c_str());
  186. pRoleData->ileftlife = atoi(RoleValue["ileftlife"].c_str());
  187. strcpy(pRoleData->caccname ,RoleValue["caccname"].c_str());
  188. pRoleData->ifinishgame = atoi(RoleValue["ifinishgame"].c_str());
  189. pRoleData->irevivalx = atoi(RoleValue["irevivalx"].c_str());
  190. pRoleData->irevivaly = atoi(RoleValue["irevivaly"].c_str());
  191. pRoleData->iarmorres = atoi(RoleValue["iarmorres"].c_str());
  192. pRoleData->iweaponres = atoi(RoleValue["iweaponres"].c_str());
  193. pRoleData->ihelmres = atoi(RoleValue["ihelmres"].c_str());
  194. }
  195. S3DBI_API void * S3DBI_GetRoleInfo(IN OUT BYTE * pRoleBuffer, IN char * strUser, IN OUT int &nBufLen)
  196. {
  197. int  nFriendBufferLen;
  198. TRoleData* pRoleData = (TRoleData*) pRoleBuffer;
  199. //*************************************************
  200. // 加载玩家的基本信息//
  201. S3PRole Role(strUser);
  202. if (Role.GetLastResult()<0) return NULL;
  203. ColumnAndValue &RoleInfo  = Role.GetProperties();
  204. pRoleData->bBaseNeedUpdate = 1;
  205. Role_BaseDataConversion((TRoleBaseInfo*)pRoleBuffer,RoleInfo);
  206. //*************************************************
  207. pRoleData->dwFSkillOffset = (BYTE*)&pRoleData->pBuffer - (BYTE*)pRoleData;
  208. //*************************************************
  209. // 加载玩家的战斗技能列表
  210. S3PTableObjList<S3PFightSkill> * pFightSkillList = Role.GetFightSkillList();
  211. int nFightSkillCount =  pFightSkillList->Size();
  212. pRoleData->nFightSkillCount = nFightSkillCount;
  213. int nFightSkillBufferLen = nFightSkillCount * sizeof(TDBSkillData);
  214. BYTE * pFightSkillBuffer = (BYTE*)pRoleData + pRoleData->dwFSkillOffset;
  215. TDBSkillData * pFSkillData = (TDBSkillData * )pFightSkillBuffer;
  216. for (int t = 0; t < nFightSkillCount; t++, pFSkillData ++)
  217. {
  218. ColumnAndValue &FightSkillValue = ((*pFightSkillList)[t])->GetProperties();
  219. pFSkillData->m_nSkillId = atoi(FightSkillValue["ifightskill"].c_str());
  220. pFSkillData->m_nSkillLevel = atoi(FightSkillValue["ifightskilllevel"].c_str());
  221. }
  222. //*************************************************
  223. pRoleData->dwLSkillOffset = pRoleData->dwFSkillOffset + nFightSkillBufferLen;
  224. //*************************************************
  225. // 加载玩家的生活技能列表
  226. S3PTableObjList<S3PLifeSkill> * pLifeSkillList = Role.GetLifeSkillList();
  227. int nLifeSkillCount =  pLifeSkillList->Size();
  228. pRoleData->nLiveSkillCount = nLifeSkillCount;
  229. int nLifeSkillBufferLen = nLifeSkillCount * sizeof(TDBSkillData);
  230. BYTE * pLifeSkillBuffer = (BYTE*)pRoleData + pRoleData->dwLSkillOffset;
  231. TDBSkillData * pLSkillData = (TDBSkillData * )pLifeSkillBuffer;
  232. for (t = 0; t < nLifeSkillCount; t++, pLSkillData ++)
  233. {
  234. ColumnAndValue &LifeSkillValue = ((*pLifeSkillList)[t])->GetProperties();
  235. pLSkillData->m_nSkillId = atoi(LifeSkillValue["ilifeskill"].c_str());
  236. pLSkillData->m_nSkillLevel = atoi(LifeSkillValue["ilifeskilllevel"].c_str());
  237. }
  238. //*************************************************
  239. pRoleData->dwTaskOffset = pRoleData->dwLSkillOffset + nLifeSkillBufferLen;
  240. //*************************************************
  241. // 加载玩家的任务列表
  242. S3PTableObjList<S3PTask> * pTaskList = Role.GetTaskList();
  243. int nTaskCount = pTaskList->Size();
  244. pRoleData->nTaskCount = nTaskCount;
  245. int nTaskBufferLen = nTaskCount * sizeof(TDBTaskData);
  246. TDBTaskData * pTaskData = (TDBTaskData*)((BYTE *)pRoleData + pRoleData->dwTaskOffset);
  247. for (t= 0; t < nTaskCount; t++, pTaskData ++)
  248. {
  249. ColumnAndValue &TaskValue = (*pTaskList)[t]->GetProperties();
  250. pTaskData->m_nTaskId = atoi(TaskValue["itaskcode"].c_str());
  251. pTaskData->m_nTaskValue = atoi(TaskValue["idegree"].c_str());
  252. }
  253. //*************************************************
  254. pRoleData->dwItemOffset = pRoleData->dwTaskOffset + nTaskBufferLen;
  255. //*************************************************
  256. // 加载玩家的物品列表
  257. S3PTableObjList<S3PEquipment> *EquipList =  Role.GetEquipmentList();
  258. int nEquiptListCount = EquipList->Size();
  259. pRoleData->nItemCount = nEquiptListCount;
  260. TDBItemData * pItemData = (TDBItemData*)((BYTE*)pRoleData + pRoleData->dwItemOffset);
  261. KMagicAttrib * pMagicAttrib = NULL;
  262. //
  263. for (int j = 0 ; j < nEquiptListCount; j ++)
  264. {
  265. //基本信息加载
  266. ColumnAndValue &BaseInfoValue = (*EquipList)[j]->GetProperties();
  267. Item_BaseDataConversion(pItemData, BaseInfoValue);
  268. #ifdef SAVE_ITEM_MAGICATTRIB_TO_DB
  269. //基本属性加载
  270. S3PTableObjList<S3PEquipBaseInfo> *EquipBaseInfoList = (*EquipList)[j]->GetEquipBaseInfoList();
  271. int nEquipBaseInfoListCount = EquipBaseInfoList->Size();
  272. pItemData->BaseInfoCount = nEquipBaseInfoListCount;
  273. pMagicAttrib = (KMagicAttrib*) &pItemData->pBuffer;
  274. for (int k = 0; k < nEquipBaseInfoListCount; k ++, pMagicAttrib ++)
  275. {
  276. ColumnAndValue &BaseValue = (*EquipBaseInfoList)[k]->GetProperties();
  277. pMagicAttrib->nAttribType = atoi(BaseValue["iclass"].c_str());
  278. pMagicAttrib->nValue[0] = atoi(BaseValue["ivalue1"].c_str());
  279. pMagicAttrib->nValue[1] = atoi(BaseValue["ivalue2"].c_str());
  280. pMagicAttrib->nValue[2] = atoi(BaseValue["ivalue3"].c_str());
  281. }
  282. // 效果数据加载
  283. S3PTableObjList<S3PEquipEfficInfo> *EquipEfficInfoList = (*EquipList)[j]->GetEquipEfficInfoList();
  284. int nEquipEfficInfoListCount = EquipEfficInfoList->Size();
  285. pItemData->EfficCount = nEquipEfficInfoListCount;
  286. for ( k = 0; k < nEquipEfficInfoListCount; k ++, pMagicAttrib ++)
  287. {
  288. ColumnAndValue &EfficValue = (*EquipEfficInfoList)[k]->GetProperties();
  289. pMagicAttrib->nAttribType = atoi(EfficValue["iclass"].c_str());
  290. pMagicAttrib->nValue[0] = atoi(EfficValue["ivalue1"].c_str());
  291. pMagicAttrib->nValue[1] = atoi(EfficValue["ivalue2"].c_str());
  292. pMagicAttrib->nValue[2] = atoi(EfficValue["ivalue3"].c_str());
  293. }
  294. //需求属性加载
  295. S3PTableObjList<S3PEquipRequireInfo> *EquipRequireInfoList = (*EquipList)[j]->GetEquipRequireInfoList();
  296. int nEquipRequireInfoListCount = EquipRequireInfoList->Size();
  297. pItemData->RequireInfoCount = nEquipRequireInfoListCount;
  298. for (k = 0; k < nEquipRequireInfoListCount; k ++, pMagicAttrib ++)
  299. {
  300. ColumnAndValue &RequireValue = (*EquipRequireInfoList)[k]->GetProperties();
  301. pMagicAttrib->nAttribType = atoi(RequireValue["iclass"].c_str());
  302. pMagicAttrib->nValue[0] = atoi(RequireValue["ivalue1"].c_str());
  303. pMagicAttrib->nValue[1] = atoi(RequireValue["ivalue2"].c_str());
  304. pMagicAttrib->nValue[2] = atoi(RequireValue["ivalue3"].c_str());
  305. }
  306. pItemData = (TDBItemData *)pMagicAttrib;
  307. #else
  308. pItemData ++;
  309. #endif
  310. }
  311. //*************************************************
  312. //*************************************************
  313. // 加载玩家的好友列表//
  314. // 玩家的姓名列表放在唯一的一块Buffer上,通过0标计间隔开
  315. if (pItemData)
  316. pRoleData->dwFriendOffset = (BYTE*)pItemData - (BYTE*)pRoleData;
  317. else
  318. pRoleData->dwFriendOffset = pRoleData->dwItemOffset;
  319. S3PTableObjList<S3PFriend> * pFriendList = Role.GetFriendList();
  320. int nFriendCount =  pFriendList->Size();
  321. pRoleData->nFriendCount = nFriendCount;
  322. void * pFriendBuffer = (BYTE *)pRoleData + pRoleData->dwFriendOffset;
  323. BYTE * pCurFriend = (BYTE*)pFriendBuffer;
  324. for (t = 0; t < nFriendCount; t++)
  325. {
  326. ColumnAndValue &FriendValue = ((*pFriendList)[t])->GetProperties();
  327. const char * pFriendName = FriendValue["cfriendcode"].c_str();
  328. int nCurNameLen = strlen(pFriendName);
  329. memcpy(pCurFriend, pFriendName, nCurNameLen);
  330. pCurFriend = (BYTE *)((char *)pCurFriend + nCurNameLen);
  331. *(pCurFriend++) = 0;
  332. }
  333. nFriendBufferLen = pCurFriend - (BYTE*)pFriendBuffer;
  334. //*************************************************
  335. nBufLen = pRoleData->dwFriendOffset + nFriendBufferLen;
  336. return pRoleBuffer;
  337. }
  338. void Item_SaveBaseInfo(ColumnAndValue &ItemValue, TDBItemData * pItemData)
  339. {
  340. char szValue[100];
  341. //ItemValue["iid"]    = itoa(pItemData->iid, szValue, 10);
  342.    //ItemValue["cusercode"]              = pItemData->cusercode;
  343.    ItemValue["iequipclasscode"]        = itoa(pItemData->iequipclasscode, szValue, 10);
  344.    ItemValue["ilocal"]                 = itoa(pItemData->ilocal, szValue, 10);
  345.    ItemValue["ix"]                     = itoa(pItemData->ix, szValue, 10);
  346.    ItemValue["iy"]                     = itoa(pItemData->iy, szValue, 10);
  347.    ItemValue["iequipcode"]             = itoa(pItemData->iequipcode, szValue, 10);
  348.    ItemValue["idetailtype"]            = itoa(pItemData->idetailtype, szValue, 10);
  349.    ItemValue["iparticulartype"]        = itoa(pItemData->iparticulartype, szValue, 10);
  350.    ItemValue["ilevel"]                 = itoa(pItemData->ilevel, szValue, 10);
  351.    ItemValue["iseries"]                = itoa(pItemData->iseries, szValue, 10);
  352.    ItemValue["iequipversion"]          = itoa(pItemData->iequipversion, szValue, 10);
  353.    ItemValue["irandseed"]              = itoa(pItemData->irandseed, szValue, 10);
  354.    ItemValue["iparam2"]                = itoa(pItemData->iparam2, szValue, 10);
  355.    ItemValue["iparam3"]                = itoa(pItemData->iparam3, szValue, 10);
  356.    ItemValue["iparam5"]                = itoa(pItemData->iparam5, szValue, 10);
  357.    ItemValue["iparam4"]                = itoa(pItemData->iparam4, szValue, 10);
  358.    ItemValue["iparam6"]                = itoa(pItemData->iparam6, szValue, 10);
  359.    ItemValue["iparam1"]                = itoa(pItemData->iparam1, szValue, 10);
  360.    ItemValue["ilucky"]                 = itoa(pItemData->ilucky, szValue, 10);
  361. }
  362. void Role_SaveBaseInfo(ColumnAndValue &RoleValue, TRoleData * pRoleData )
  363. {
  364. char szValue[100];
  365. RoleValue["cusercode"] = pRoleData->BaseInfo.szName;
  366. if (pRoleData->BaseInfo.bSex) RoleValue["bsex"] = "女";
  367. else
  368. RoleValue["bsex"] = "男";
  369. RoleValue["calias"] = pRoleData->BaseInfo.szAlias;
  370. RoleValue["ifirstsect"] = itoa(pRoleData->BaseInfo.nFirstSect , szValue, 10);
  371. RoleValue["isect"] = itoa(pRoleData->BaseInfo.nSect , szValue, 10);
  372. RoleValue["ijoincount"] = itoa(pRoleData->BaseInfo.ijoincount , szValue, 10);
  373. RoleValue["isectrole"] = itoa(pRoleData->BaseInfo.isectrole , szValue, 10);
  374. RoleValue["igroupcode"] = itoa(pRoleData->BaseInfo.igrouprole , szValue, 10);
  375. RoleValue["igrouprole"] = itoa(pRoleData->BaseInfo.igrouprole , szValue, 10);
  376. RoleValue["irevivalid"] = itoa(pRoleData->BaseInfo.irevivalid , szValue, 10);
  377. RoleValue["cpartnercode"] = pRoleData->BaseInfo.cpartnercode;
  378. RoleValue["isavemoney"] = itoa(pRoleData->BaseInfo.isavemoney , szValue, 10);
  379. RoleValue["imoney"] = itoa(pRoleData->BaseInfo.imoney , szValue, 10);
  380. RoleValue["ifiveprop"] = itoa(pRoleData->BaseInfo.ifiveprop , szValue, 10);
  381. RoleValue["iteam"] = itoa(pRoleData->BaseInfo.iteam , szValue, 10);
  382. RoleValue["ifightlevel"] = itoa(pRoleData->BaseInfo.ifightlevel , szValue, 10);
  383. RoleValue["ifightexp"] = itoa(pRoleData->BaseInfo.fightexp , szValue, 10);
  384. RoleValue["ileadlevel"] = itoa(pRoleData->BaseInfo.ileadlevel , szValue, 10);
  385. RoleValue["ileadexp"] = itoa(pRoleData->BaseInfo.ileadexp , szValue, 10);
  386. RoleValue["iliveexp"] = itoa(pRoleData->BaseInfo.iliveexp , szValue, 10);
  387. RoleValue["ipower"] = itoa(pRoleData->BaseInfo.ipower , szValue, 10);
  388. RoleValue["iagility"] = itoa(pRoleData->BaseInfo.iagility , szValue, 10);
  389. RoleValue["iouter"] = itoa(pRoleData->BaseInfo.iouter , szValue, 10);
  390. RoleValue["iinside"] = itoa(pRoleData->BaseInfo.iinside , szValue, 10);
  391. RoleValue["iluck"] = itoa(pRoleData->BaseInfo.iluck , szValue, 10);
  392. RoleValue["imaxlife"] = itoa(pRoleData->BaseInfo.imaxlife , szValue, 10);
  393. RoleValue["imaxstamina"] = itoa(pRoleData->BaseInfo.imaxstamina , szValue, 10);
  394. RoleValue["imaxinner"] = itoa(pRoleData->BaseInfo.imaxinner , szValue, 10);
  395. RoleValue["ileftprop"] = itoa(pRoleData->BaseInfo.ileftprop , szValue, 10);
  396. RoleValue["ileftfight"] = itoa(pRoleData->BaseInfo.ileftfight , szValue, 10);
  397. RoleValue["ileftlife"] = itoa(pRoleData->BaseInfo.ileftlife , szValue, 10);
  398. RoleValue["caccname"] = pRoleData->BaseInfo.caccname;
  399. RoleValue["ifinishgame"] = itoa(pRoleData->BaseInfo.ifinishgame , szValue, 10);
  400. RoleValue["irevivalx"] = itoa(pRoleData->BaseInfo.irevivalx , szValue, 10);
  401. RoleValue["irevivaly"] = itoa(pRoleData->BaseInfo.irevivaly , szValue, 10);
  402. RoleValue["iarmorres"] = itoa(pRoleData->BaseInfo.iarmorres , szValue, 10);
  403. RoleValue["iweaponres"] = itoa(pRoleData->BaseInfo.iweaponres , szValue, 10);
  404. RoleValue["ihelmres"] = itoa(pRoleData->BaseInfo.ihelmres , szValue, 10);
  405. }
  406. #ifdef SHOWDEBUGINFO
  407. {
  408. }
  409. #endif
  410. S3DBI_API void S3DBI_ShowDebugInfo(IN BYTE * pRoleBuffer, char * pShowString)
  411. {
  412. if (!pShowString) return;
  413. //检查入口有效性
  414. if (!pRoleBuffer) return ;
  415. //获得数据库中玩家基本信息表
  416. TRoleData *pRoleData = (TRoleData*)pRoleBuffer;
  417. ColumnAndValue RoleValue ;//= Role.GetProperties();
  418. Role_SaveBaseInfo(RoleValue, pRoleData);
  419. ColumnAndValue::iterator II;
  420. sprintf(pShowString, "---------------RoleBaseINfo-------------n");
  421. for (II = RoleValue.begin(); II != RoleValue.end(); II ++)
  422. {
  423. sprintf(pShowString , "%s %s = %sn",  pShowString, II->first.c_str(), II->second.c_str());
  424. }
  425. //*************************************************
  426. //更新玩家的战斗技能列表
  427. sprintf(pShowString, "%s---------------FightSkill-------------n", pShowString);
  428. if (pRoleData->dwFSkillOffset > 0)
  429. {
  430. int nFightCount = pRoleData->nFightSkillCount;
  431. TDBSkillData * pSkillData = (TDBSkillData *)((BYTE *)pRoleData + pRoleData->dwFSkillOffset);
  432. for (int nT = 0; nT < nFightCount; nT ++, pSkillData ++)
  433. {
  434. sprintf(pShowString, "%sFight SkillId = %d, SkillLevel = %dn",pShowString, pSkillData->m_nSkillId, pSkillData->m_nSkillLevel);
  435. }
  436. }
  437. //*************************************************
  438. //*************************************************
  439. // 更新玩家的生活技能列表
  440. sprintf(pShowString, "%s---------------LifeSkill-------------n",pShowString);
  441. if (pRoleData->dwLSkillOffset > 0)
  442. {
  443. TDBSkillData * pSkillData = (TDBSkillData *)((BYTE *) pRoleData + pRoleData->dwLSkillOffset);
  444. int nLifeCount = pRoleData->nLiveSkillCount;
  445. for (int nT = 0; nT < nLifeCount; nT ++, pSkillData ++)
  446. {
  447. sprintf(pShowString,"%sLive SkillId = %d, SkillLevel = %dn",pShowString, pSkillData->m_nSkillId, pSkillData->m_nSkillLevel);
  448. }
  449. }
  450. //*************************************************
  451. //*************************************************
  452. // 更新玩家的任务列表
  453. sprintf(pShowString, "%s---------------Task-------------n", pShowString);
  454. if (pRoleData->dwTaskOffset > 0)
  455. {
  456. int nTaskCount = pRoleData->nTaskCount;
  457. TDBTaskData * pTaskData = (TDBTaskData *)((BYTE*)pRoleData + pRoleData->dwTaskOffset);
  458. for (int nT = 0; nT < nTaskCount; nT ++, pTaskData ++)
  459. {
  460. sprintf(pShowString, "%sTask%d Value%dn", pShowString, pTaskData->m_nTaskId, pTaskData->m_nTaskValue);
  461. }
  462. }
  463. //*************************************************
  464. //*************************************************
  465. // 更新玩家的物品列表
  466. //存在物品列表则更新物品列表
  467. sprintf(pShowString, "%s---------------ItemList-------------n", pShowString);
  468. if (pRoleData->dwItemOffset > 0)
  469. {
  470. int nEquipListCount = pRoleData->nItemCount;
  471. TDBItemData * pItemData = (TDBItemData *)((BYTE * ) pRoleData + pRoleData->dwItemOffset);
  472. {
  473. //依次保存每一个物件
  474. sprintf(pShowString, "%s---------------ItemBase-------------n", pShowString);
  475. for (int j = 0; j < nEquipListCount; j ++)
  476. {
  477. sprintf(pShowString, "%sn", pShowString);
  478. int nEquipBaseInfoListCount  = 0;//某个物件的基本属性列表数目
  479. ColumnAndValue InfoValue;
  480. Item_SaveBaseInfo(InfoValue, pItemData);
  481. ColumnAndValue::iterator II;
  482. for (II = InfoValue.begin(); II != InfoValue.end(); II ++)
  483. {
  484. sprintf(pShowString, "%s%s = %sn", pShowString, II->first.c_str(), II->second.c_str());
  485. }
  486. #ifdef SAVE_ITEM_MAGICATTRIB_TO_DB
  487. //基本属性更新
  488. nEquipBaseInfoListCount = pItemData->BaseInfoCount;
  489. KMagicAttrib * pMagicAttrib = (KMagicAttrib *)&pItemData->pBuffer;
  490. //保存物件基本属性
  491. for (int  t = 0; t < nEquipBaseInfoListCount; t++, pMagicAttrib ++)
  492. {
  493. //物件列表中第j+1物件的基本信息的t+1项
  494. sprintf(pShowString, "%sBaseInfo[%d] %d, %d, %d, %dn",pShowString, t, pMagicAttrib->nAttribType, pMagicAttrib->nValue[0], pMagicAttrib->nValue[1], pMagicAttrib->nValue[2] );
  495. }
  496. //更新效果属性
  497. int nEquipEfficInfoListCount = pItemData->EfficCount;
  498. //保存物件
  499. for ( t = 0; t < nEquipEfficInfoListCount; t++, pMagicAttrib ++)
  500. {
  501. //物件列表中第j+1物件的基本信息的t+1项
  502. sprintf(pShowString, "%sEfficInfo[%d] %d, %d, %d, %dn", pShowString, t, pMagicAttrib->nAttribType, pMagicAttrib->nValue[0], pMagicAttrib->nValue[1], pMagicAttrib->nValue[2] );
  503. }
  504. //更新需求属性
  505. int nEquipRequireInfoListCount = pItemData->RequireInfoCount;
  506. //保存物件
  507. for ( t = 0; t < nEquipRequireInfoListCount; t++, pMagicAttrib ++)
  508. {
  509. //物件列表中第j+1物件的基本信息的t+1项
  510. sprintf(pShowString, "%sRequireInfo[%d] %d, %d, %d, %dn",pShowString, t, pMagicAttrib->nAttribType, pMagicAttrib->nValue[0], pMagicAttrib->nValue[1], pMagicAttrib->nValue[2] );
  511. }
  512. pItemData = (TDBItemData*)pMagicAttrib;
  513. #else
  514. pItemData ++;
  515. #endif
  516. }
  517. }
  518. }
  519. //*************************************************
  520. //************************************************
  521. // 更新玩家的好友列表//
  522. sprintf(pShowString, "%s---------------Friend-------------n", pShowString);
  523. if (pRoleData->dwFriendOffset > 0)
  524. {
  525. int nFriendCount = pRoleData->nFriendCount;
  526. char * pFriendBuffer = (char *)((BYTE *)pRoleData + pRoleData->dwFriendOffset);
  527. for (int nT = 0; nT < nFriendCount; nT ++)
  528. {
  529. sprintf(pShowString, "%sFriend%d is %sn", pShowString, nT, pFriendBuffer);
  530. pFriendBuffer += strlen(pFriendBuffer) + 1;
  531. }
  532. }
  533. //*************************************************
  534. }
  535. // result -1 othererror
  536. // -4 have or no user exist
  537. // 
  538. S3DBI_API int S3DBI_SaveRoleInfo(IN BYTE * pRoleBuffer, IN char * strUser, BOOL bAutoInsertWhenNoExistUser)
  539. {
  540. //检查入口有效性
  541. char strRoleName[50];
  542. if (!pRoleBuffer) return -1;
  543. if ((!strUser )|| (!strUser[0])) 
  544. {
  545. TRoleData * ptmpRoleData = (TRoleData*) pRoleBuffer;
  546. strcpy(strRoleName, ptmpRoleData->BaseInfo.szName);
  547. }
  548. else
  549. strcpy(strRoleName, strUser);
  550. int bSaveRole = FALSE;//保存角色基本信息是否成功
  551. int nLastResult = 0;
  552. BOOL bNewUser = FALSE;//是否是新创建该玩家
  553. //获得数据库中玩家基本信息表
  554. S3PRole Role(strRoleName);
  555. if ((nLastResult = Role.GetLastResult()) < 0 )
  556. {
  557. //-4表示不存在该用户,需增加
  558. if (nLastResult == -4)
  559. {
  560. if (bAutoInsertWhenNoExistUser)//当已设定成角色在数据库中不存在自动增加时,增加。否则返回
  561. bNewUser = TRUE;
  562. else 
  563. return -1;
  564. }
  565. else
  566. return -1;//其它错误返回
  567. }
  568. TRoleData *pRoleData = (TRoleData*)pRoleBuffer;
  569. if (pRoleData->bBaseNeedUpdate)
  570. {
  571. if (!bNewUser) //非新用户,直接更新!
  572. {
  573. char szCurKey[100] = "";
  574. char szPrevKey[100] = "";
  575. ColumnAndValue &RoleValue = Role.GetProperties();
  576. RoleValue.clear();
  577. Role_SaveBaseInfo(RoleValue, pRoleData);
  578. bSaveRole = Role.Save();
  579. if (bSaveRole < 0 ) return -1;
  580. }
  581. else //新用户,增加数据!
  582. {
  583. char szCurKey[100] = "";
  584. char szPrevKey[100] = "";
  585. //S3PRole NewRole;
  586. ColumnAndValue RoleValue ;//= Role.GetProperties();
  587. Role_SaveBaseInfo(RoleValue, pRoleData);
  588. bSaveRole = Role.Add(RoleValue);
  589. if (bSaveRole < 0 ) return -1;
  590. //Role = NewRole;
  591. }
  592. }
  593. else
  594. {
  595. if (bNewUser) return -1;//新用户必须含有基本信息!
  596. }
  597. //*************************************************
  598. //更新玩家的战斗技能列表
  599. if (pRoleData->dwFSkillOffset > 0)
  600. {
  601. int nFightCount = pRoleData->nFightSkillCount;
  602. Role.GetFightSkillList()->DeleteAll();
  603. TDBSkillData * pSkillData = (TDBSkillData *)((BYTE *)pRoleData + pRoleData->dwFSkillOffset);
  604. for (int nT = 0; nT < nFightCount; nT ++, pSkillData ++)
  605. {
  606. char szValue[100];
  607. ColumnAndValue FightSkillValue;
  608. FightSkillValue["ifightskill"] = itoa(pSkillData->m_nSkillId, szValue, 10);
  609. FightSkillValue["ifightskilllevel"] = itoa(pSkillData->m_nSkillLevel, szValue, 10);
  610. Role.GetFightSkillList()->Add(FightSkillValue);
  611. }
  612. }
  613. //*************************************************
  614. //*************************************************
  615. // 更新玩家的生活技能列表
  616. if (pRoleData->dwLSkillOffset > 0)
  617. {
  618. TDBSkillData * pSkillData = (TDBSkillData *)((BYTE *) pRoleData + pRoleData->dwLSkillOffset);
  619. int nLifeCount = pRoleData->nLiveSkillCount;
  620. Role.GetLifeSkillList()->DeleteAll();
  621. for (int nT = 0; nT < nLifeCount; nT ++, pSkillData ++)
  622. {
  623. char szValue[100];
  624. ColumnAndValue LifeSkillValue;
  625. LifeSkillValue["ilifeskill"] = itoa(pSkillData->m_nSkillId, szValue, 10);
  626. LifeSkillValue["ilifeskilllevel"] = itoa(pSkillData->m_nSkillLevel, szValue, 10);
  627. Role.GetLifeSkillList()->Add(LifeSkillValue);
  628. }
  629. }
  630. //*************************************************
  631. //*************************************************
  632. // 更新玩家的任务列表
  633. if (pRoleData->dwTaskOffset > 0)
  634. {
  635. int nTaskCount = pRoleData->nTaskCount;
  636. Role.GetTaskList()->DeleteAll();
  637. TDBTaskData * pTaskData = (TDBTaskData *)((BYTE*)pRoleData + pRoleData->dwTaskOffset);
  638. for (int nT = 0; nT < nTaskCount; nT ++, pTaskData ++)
  639. {
  640. char szValue[200] ;
  641. ColumnAndValue TaskValue;
  642. TaskValue["itaskcode"] = itoa(pTaskData->m_nTaskId, szValue, 10);
  643. TaskValue["idegree"] = itoa(pTaskData->m_nTaskValue, szValue, 10);
  644. Role.GetTaskList()->Add(TaskValue);
  645. }
  646. }
  647. //*************************************************
  648. //*************************************************
  649. // 更新玩家的物品列表
  650. //存在物品列表则更新物品列表
  651. if (pRoleData->dwItemOffset > 0)
  652. {
  653. int nEquipListCount = pRoleData->nItemCount;
  654. S3PTableObjList<S3PEquipment> * pEquipList = Role.GetEquipmentList();
  655. TDBItemData * pItemData = (TDBItemData *)((BYTE * ) pRoleData + pRoleData->dwItemOffset);
  656. if (pEquipList)
  657. {
  658. pEquipList->DeleteAll();//清除所有物件
  659. //依次保存每一个物件
  660. for (int j = 0; j < nEquipListCount; j ++)
  661. {
  662. int nEquipBaseInfoListCount  = 0;//某个物件的基本属性列表数目
  663. //基本信息更新
  664. ColumnAndValue InfoValue;
  665. Item_SaveBaseInfo(InfoValue, pItemData);
  666. if (pEquipList->Add(InfoValue) < 0 ) continue; //如果保存失败,则该物件的其它数据不用再更新了
  667. std::string  szIid = (*pEquipList)[pEquipList->Size() - 1]->GetProperties()["iid"];
  668. #ifdef SAVE_ITEM_MAGICATTRIB_TO_DB
  669. //基本属性更新
  670. nEquipBaseInfoListCount = pItemData->BaseInfoCount;
  671. char szValue[200];
  672. KMagicAttrib * pMagicAttrib = (KMagicAttrib *)&pItemData->pBuffer;
  673. //保存物件基本属性
  674. for (int  t = 0; t < nEquipBaseInfoListCount; t++, pMagicAttrib ++)
  675. {
  676. //物件列表中第j+1物件的基本信息的t+1项
  677. ColumnAndValue BaseValue;
  678. BaseValue["iclass"] = itoa(pMagicAttrib->nAttribType, szValue, 10);
  679. BaseValue["ivalue1"] = itoa(pMagicAttrib->nValue[0], szValue, 10);
  680. BaseValue["ivalue2"] = itoa(pMagicAttrib->nValue[1], szValue, 10);
  681. BaseValue["ivalue3"] = itoa(pMagicAttrib->nValue[2], szValue, 10);
  682. BaseValue["imainid"] = szIid;//不一定要写
  683. (*pEquipList)[pEquipList->Size() - 1]->GetEquipBaseInfoList()->Add(BaseValue);
  684. }
  685. //更新效果属性
  686. int nEquipEfficInfoListCount = pItemData->EfficCount;
  687. //保存物件
  688. for ( t = 0; t < nEquipEfficInfoListCount; t++, pMagicAttrib ++)
  689. {
  690. //物件列表中第j+1物件的基本信息的t+1项
  691. ColumnAndValue EfficValue;
  692. EfficValue["iclass"] = itoa(pMagicAttrib->nAttribType, szValue, 10);
  693. EfficValue["ivalue1"] = itoa(pMagicAttrib->nValue[0], szValue, 10);
  694. EfficValue["ivalue2"] = itoa(pMagicAttrib->nValue[1], szValue, 10);
  695. EfficValue["ivalue3"] = itoa(pMagicAttrib->nValue[2], szValue, 10);
  696. EfficValue["imainid"] = szIid;//不一定要写
  697. (*pEquipList)[pEquipList->Size() - 1]->GetEquipEfficInfoList()->Add(EfficValue);
  698. }
  699. //更新需求属性
  700. int nEquipRequireInfoListCount = pItemData->RequireInfoCount;
  701. //保存物件
  702. for ( t = 0; t < nEquipRequireInfoListCount; t++, pMagicAttrib ++)
  703. {
  704. //物件列表中第j+1物件的基本信息的t+1项
  705. ColumnAndValue RequireValue;
  706. RequireValue["iclass"] = itoa(pMagicAttrib->nAttribType, szValue, 10);
  707. RequireValue["ivalue1"] = itoa(pMagicAttrib->nValue[0], szValue, 10);
  708. RequireValue["ivalue2"] = itoa(pMagicAttrib->nValue[1], szValue, 10);
  709. RequireValue["ivalue3"] = itoa(pMagicAttrib->nValue[2], szValue, 10);
  710. RequireValue["imainid"] = szIid;//不一定要写
  711. (*pEquipList)[pEquipList->Size() - 1]->GetEquipRequireInfoList()->Add(RequireValue);
  712. }
  713. pItemData = (TDBItemData *) pMagicAttrib;
  714. #else
  715. pItemData ++;
  716. #endif
  717. }
  718. }
  719. }
  720. //*************************************************
  721. //************************************************
  722. // 更新玩家的好友列表//
  723. if (pRoleData->dwFriendOffset > 0)
  724. {
  725. int nFriendCount = pRoleData->nFriendCount;
  726. Role.GetFriendList()->DeleteAll();
  727. char * pFriendBuffer = (char *)((BYTE *)pRoleData + pRoleData->dwFriendOffset);
  728. for (int nT = 0; nT < nFriendCount; nT ++)
  729. {
  730. ColumnAndValue FriendValue;
  731. FriendValue["cfriendcode"] = pFriendBuffer;
  732. FriendValue["cusercode"] = strRoleName;
  733. pFriendBuffer += strlen(pFriendBuffer) + 1;
  734. Role.GetFriendList()->Add(FriendValue);
  735. }
  736. }
  737. //*************************************************
  738. return 1;
  739. }
  740. S3DBI_API int S3DBI_DeleteRole(char * strUser)
  741. {
  742. if (!strUser || !strUser[0])  return -1;
  743. S3PRole Role(strUser);
  744. int nLastResult = 0;
  745. //查询不到就返回!
  746. if ((nLastResult = Role.GetLastResult()) < 0 ) return -1;
  747. //************************************************
  748. // 删除玩家的好友列表//
  749. nLastResult = Role.GetFriendList()->DeleteAll();
  750. if (nLastResult < 0) g_DebugLog("Delete[%s]Player FriendList Error!,Result = %d", strUser, nLastResult);
  751. //*************************************************
  752. //*************************************************
  753. // 玩家的战斗技能列表
  754. nLastResult = Role.GetFightSkillList()->DeleteAll();
  755. if (nLastResult < 0) g_DebugLog("Delete[%s]Player FightSkillList Error!,Result = %d", strUser, nLastResult);
  756. //*************************************************
  757. //*************************************************
  758. // 玩家的生活技能列表
  759. nLastResult = Role.GetLifeSkillList()->DeleteAll();
  760. if (nLastResult < 0) g_DebugLog("Delete[%s]Player LifeSkillList Error!,Result = %d", strUser, nLastResult);
  761. //*************************************************
  762. //*************************************************
  763. // 玩家的物品列表
  764. nLastResult = Role.GetEquipmentList()->DeleteAll();
  765. if (nLastResult < 0) g_DebugLog("Delete[%s]Player Item List Error!,Result = %d", strUser, nLastResult);
  766. //*************************************************
  767. //*************************************************
  768. // 玩家的任务列表
  769. nLastResult = Role.GetTaskList()->DeleteAll();
  770. if (nLastResult < 0) g_DebugLog("Delete[%s]Player TaskList Error!,Result = %d", strUser, nLastResult);
  771. //*************************************************
  772. //数据库中玩家基本信息表
  773. nLastResult = Role.Delete();
  774. if (nLastResult < 0) g_DebugLog("Delete[%s]Player InfoData Error!,Result = %d", strUser, nLastResult);
  775. return nLastResult;
  776. }
  777. S3DBI_API int S3DBI_GetRoleListOfAccount(char * szAccountName, S3DBI_RoleBaseInfo * RoleBaseList, int nMaxCount)
  778. {
  779. if (!szAccountName || (!szAccountName[0])) return 0;
  780. S3PRoleList RoleList(szAccountName);
  781. int nCount = RoleList.Size();
  782. if (nCount <= 0) return 0;
  783. if (nCount > nMaxCount) nCount = nMaxCount;
  784. for (int i  = 0; i < nCount; i ++)
  785. {
  786. ColumnAndValue &RoleValue = (*RoleList[i]).GetProperties();
  787. strcpy((RoleBaseList + i)->szName,RoleValue["cusercode"].c_str()); 
  788. (RoleBaseList + i)->Level = atoi(RoleValue["ifightlevel"].c_str());
  789. (RoleBaseList + i)->ArmorType = atoi(RoleValue["iarmorres"].c_str());
  790. (RoleBaseList + i)->WeaponType = atoi(RoleValue["iweaponres"].c_str());
  791. (RoleBaseList + i)->HelmType = atoi(RoleValue["ihelmres"].c_str());
  792. if (!strcmp(RoleValue["bsex"].c_str(), "男")) 
  793. (RoleBaseList + i)->Sex = 0;
  794. else
  795. (RoleBaseList + i)->Sex = 1;
  796. }
  797. return nCount;
  798. }
  799. S3DBI_API BOOL S3DBI_IsRoleNameExisted(char * strUser)
  800. {
  801. if ((!strUser) || (!strUser[0])) return FALSE;
  802. //获得数据库中玩家基本信息表
  803. S3PRole Role(strUser);
  804. int nLastResult = Role.GetLastResult();
  805. if (nLastResult > 0)
  806.  return TRUE;
  807. return FALSE;
  808. }
  809. //获得数据库中玩家基本信息表
  810. //************************************************
  811. // 更新玩家的好友列表//
  812. //*************************************************
  813. //*************************************************
  814. // 加载玩家的战斗技能列表
  815. //*************************************************
  816. //*************************************************
  817. // 加载玩家的生活技能列表
  818. //*************************************************
  819. //*************************************************
  820. // 加载玩家的物品列表
  821. //*************************************************
  822. //*************************************************
  823. // 加载玩家的任务列表
  824. //*************************************************